From e61d80b4d232327f04ec562f833579359450f29e Mon Sep 17 00:00:00 2001 From: han2015 <1019850453@qq.com> Date: Tue, 27 Jan 2026 15:13:26 +0800 Subject: [PATCH] =?UTF-8?q?=E6=99=BA=E8=83=BD=E4=BD=93=EF=BC=9A=E4=BC=98?= =?UTF-8?q?=E5=8C=96=E8=81=94=E7=BD=91=E6=9F=A5=E8=AF=A2URL=E7=BB=84?= =?UTF-8?q?=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/views/doc/spacesimpletable.vue | 71 +++++++++++++++++++++++++++++- 1 file changed, 69 insertions(+), 2 deletions(-) diff --git a/src/views/doc/spacesimpletable.vue b/src/views/doc/spacesimpletable.vue index 66f1158..e526300 100644 --- a/src/views/doc/spacesimpletable.vue +++ b/src/views/doc/spacesimpletable.vue @@ -13,13 +13,78 @@ const props = withDefaults(defineProps<{ }>(),{}) const weburls=ref([]) +const tags = ref([]) + +const extractLtag = (url: string) => { + if(!url) return '' + try { + const u = new URL(url) + return u.searchParams.get('ltag') || '' + } catch (e) { + // fallback for non-absolute urls + const qIdx = url.indexOf('?') + if (qIdx === -1) return '' + const qs = url.slice(qIdx + 1) + const params = new URLSearchParams(qs) + return params.get('ltag') || '' + } +} + +const updateUrlWithTag = (url: string, tag: string) => { + try { + const u = new URL(url || 'http://example.com') // base for relative fallback + if (tag) u.searchParams.set('ltag', tag) + else u.searchParams.delete('ltag') + // if original url had no origin and we used example.com, strip it + if (!/^[a-zA-Z]+:\/\//.test(url || '')) { + const path = u.pathname + (u.search ? u.search : '') + (u.hash ? u.hash : '') + return path === '/' ? (u.search ? u.search.slice(1) : '') : path + } + return u.toString() + } catch (e) { + const hasQ = url.includes('?') + const parts = url.split('?') + const base = parts[0] + const qs = parts[1] || '' + const params = new URLSearchParams(qs) + if (tag) params.set('ltag', tag) + else params.delete('ltag') + const qsStr = params.toString() + return qsStr ? `${base}?${qsStr}` : base + } +} + +// 新增:只允许文字/数字字符(含中文),去除符号 +const sanitizeTag = (val: string) => { + if (!val) return '' + try { + // 优先使用 Unicode property escapes,保留字母和数字 + return val.replace(/[^\p{L}\p{N}]+/gu, '') + } catch (e) { + // fallback:允许 ASCII 字母/数字 与 常见中日韩汉字区间 + return val.replace(/[^0-9a-zA-Z\u4e00-\u9fff]+/g, '') + } +} const addUrl = () => { weburls.value.push('') + tags.value.push('') } const removeUrl = (index: number) => { weburls.value.splice(index, 1) + tags.value.splice(index, 1) +} + +const onTagChange = (index: number, val: string) => { + const clean = sanitizeTag(val) + tags.value[index] = clean + weburls.value[index] = updateUrlWithTag(weburls.value[index] || '', clean) +} + +const onUrlChange = (index: number, val: string) => { + weburls.value[index] = val + tags.value[index] = extractLtag(val) } const onSaveChange = () => { @@ -29,17 +94,19 @@ const onSaveChange = () => { onMounted(() => { weburls.value = props.urlstr ? props.urlstr.split(",") : [] + tags.value = weburls.value.map(extractLtag) })