diff --git a/docs/docs/javascripts/modify-lang-a-href.js b/docs/docs/javascripts/modify-lang-a-href.js new file mode 100644 index 0000000..6348e7b --- /dev/null +++ b/docs/docs/javascripts/modify-lang-a-href.js @@ -0,0 +1,50 @@ +window.addEventListener('DOMContentLoaded', function() { + // Handles language URL rewrites for: + // 1) Versioned docs (e.g. /v0.1.1/...). + // 2) Special channels such as /latest/. + // 3) Pages that already contain a language segment. + // 4) Root-level pages without explicit versioning. + const CONFIG = Object.freeze({ + languages: ['en', 'zh'], + langSelector: 'a[hreflang="en"], a[hreflang="zh"]', + versionPattern: /^v?\d+(\.\d+)*$/i, + specialVersions: ['latest'], + }); + + const langAnchors = document.querySelectorAll(CONFIG.langSelector); + const currentPath = window.location.pathname || '/'; + const hasTrailingSlash = currentPath.endsWith('/') && currentPath !== '/'; + const rawSegments = currentPath.split('/').filter(Boolean); + let languageRemoved = false; + const sanitizedSegments = rawSegments.filter(function(segment) { + if (!languageRemoved && CONFIG.languages.includes(segment)) { + languageRemoved = true; + return false; + } + return true; + }); + const insertIndex = + sanitizedSegments.length && + (CONFIG.versionPattern.test(sanitizedSegments[0]) || + CONFIG.specialVersions.includes(sanitizedSegments[0].toLowerCase())) + ? 1 + : 0; + const searchAndHash = (window.location.search || '') + (window.location.hash || ''); + + function buildLocalizedPath(lang) { + const segments = sanitizedSegments.slice(); + segments.splice(insertIndex, 0, lang); + const basePath = '/' + segments.join('/'); + const normalizedPath = segments.length ? basePath : '/'; + const finalPath = hasTrailingSlash && normalizedPath !== '/' ? normalizedPath + '/' : normalizedPath; + return finalPath + searchAndHash; + } + + langAnchors.forEach(function(anchor) { + const lang = anchor.getAttribute('hreflang'); + if (!lang || !CONFIG.languages.includes(lang)) { + return; + } + anchor.setAttribute('href', buildLocalizedPath(lang)); + }); +}); \ No newline at end of file diff --git a/docs/scripts/mkdocs_template.yml b/docs/scripts/mkdocs_template.yml index bed5e00..0725e3e 100644 --- a/docs/scripts/mkdocs_template.yml +++ b/docs/scripts/mkdocs_template.yml @@ -250,3 +250,4 @@ extra_javascript: - javascripts/mathjax.js - javascripts/polyfill.min.js - javascripts/tex-mml-chtml.js + - javascripts/modify-lang-a-href.js