feat: 支持编辑线路图署名并固定 CC BY 4.0

This commit is contained in:
2026-07-19 00:16:20 +08:00
parent 6195ebb6be
commit 847957be61
6 changed files with 106 additions and 12 deletions
+19 -1
View File
@@ -43,6 +43,8 @@
let lineIdxsByCanonical = {};
let activeLineIdx = -1;
let routeMapUrl = '';
let routeMapCredit = '';
let routeMapLicense = 'CC BY 4.0';
const piePath = (cx, cy, r, a0, a1) => {
const x0 = cx + r * Math.cos(a0);
@@ -84,6 +86,20 @@
return `/assets/${encodeURIComponent(name)}?v=${encodeURIComponent(version)}`;
};
const escapeHtml = (value) => String(value || '')
.replace(/&/g, '&')
.replace(/</g, '&lt;')
.replace(/>/g, '&gt;')
.replace(/"/g, '&quot;')
.replace(/'/g, '&#39;');
const buildCreditHtml = (credit, license, linkColor = '') => {
const safeCredit = escapeHtml(credit || '未填写');
const safeLicense = escapeHtml(license || 'CC BY 4.0');
const colorStyle = linkColor ? ` style="color: ${linkColor};"` : '';
return `<div class="jr-asset-credit"><span>线路图署名:${safeCredit}</span><span>许可协议:</span><a href="https://creativecommons.org/licenses/by/4.0/" target="_blank" rel="noopener noreferrer"${colorStyle}>${safeLicense}</a></div>`;
};
function renderStationNode(x, y, code, i, forceColor = null) {
const canonical = stationCanonicalByCode[code] || code;
const codes = stationCodesByCanonical[canonical] || [canonical];
@@ -183,7 +199,7 @@
const li = lineStops[activeLineIdx];
if (!li) {
if (routeMapUrl) {
container.innerHTML = `<div class="tvm-overview tvm-animate"><div class="tvm-overview-frame"><img src="${routeMapUrl}" alt="线路图总览"><div class="jr-asset-credit">线路图署名:CC-BY 4.0</div></div></div>`;
container.innerHTML = `<div class="tvm-overview tvm-animate"><div class="tvm-overview-frame"><img src="${routeMapUrl}" alt="线路图总览">${buildCreditHtml(routeMapCredit, routeMapLicense)}</div></div>`;
} else {
container.innerHTML = '<div class="tvm-overview-empty">暂未选择线路,且暂无已上传线路图。</div>';
}
@@ -388,6 +404,8 @@
}
routeMapUrl = (assetsData && assetsData.routeMap) ? buildAssetUrl(assetsData.routeMap, assetsData.updatedAt) : '';
routeMapCredit = assetsData ? String(assetsData.routeMapCredit || '') : '';
routeMapLicense = assetsData ? String(assetsData.routeMapLicense || 'CC BY 4.0') : 'CC BY 4.0';
const fadeStyle = `<style>
@keyframes tvmFadeIn {