This is an automated email from the ASF dual-hosted git repository.

sushuang pushed a commit to branch geo-base-map
in repository https://gitbox.apache.org/repos/asf/echarts-handbook.git

commit 342c5f9823524bae5e5baad76de4119826939b53
Author: 100pah <[email protected]>
AuthorDate: Sat Aug 23 19:26:24 2025 +0800

    infra: (1) Support declare id for each heading. A unique id is used for the 
external link to a heading in an article. Previously id is auto-generated by 
heading text, which is unstable and varies across different languages.  (2) add 
built-in variable `${apiPath}`
---
 configs/config.asf.js       |  1 +
 configs/config.dev.js       |  3 +++
 configs/config.gh.js        |  1 +
 configs/config.local.js     |  1 +
 configs/config.localsite.js |  1 +
 package-lock.json           | 18 ++++++++++++++++++
 package.json                |  3 ++-
 pages/_.vue                 | 15 ++++++++++++---
 8 files changed, 39 insertions(+), 4 deletions(-)

diff --git a/configs/config.asf.js b/configs/config.asf.js
index f86e00a..be05fde 100644
--- a/configs/config.asf.js
+++ b/configs/config.asf.js
@@ -6,5 +6,6 @@ export default {
     'https://echarts.apache.org/examples/${lang}/editor.html?c=',
   mainSitePath: 'https://echarts.apache.org/',
   optionPath: 'https://echarts.apache.org/option.html#',
+  apiPath: 'https://echarts.apache.org/api.html#',
   gitRepo: 'apache/echarts-handbook'
 }
diff --git a/configs/config.dev.js b/configs/config.dev.js
index 7539c76..e2cf1c1 100644
--- a/configs/config.dev.js
+++ b/configs/config.dev.js
@@ -1,5 +1,6 @@
 export default {
   routerBase: '/echarts-handbook/dist',
+
   rootPath: 'http://localhost:3000/echarts-handbook/dist/',
   exampleViewPath:
     'http://localhost/echarts-examples/public/${lang}/view.html?c=',
@@ -7,5 +8,7 @@ export default {
     'http://localhost/echarts-examples/public/${lang}/editor.html?c=',
   mainSitePath: 'http://localhost/echarts-website/',
   optionPath: 'http://localhost/echarts-website/option.html#',
+  apiPath: 'http://localhost/echarts/charts-website/api.html#',
+
   gitRepo: 'apache/echarts-handbook'
 }
diff --git a/configs/config.gh.js b/configs/config.gh.js
index 870ee1a..5098a1b 100644
--- a/configs/config.gh.js
+++ b/configs/config.gh.js
@@ -6,5 +6,6 @@ export default {
     'https://echarts.apache.org/examples/${lang}/editor.html?c=',
   mainSitePath: 'https://echarts.apache.org/',
   optionPath: 'https://echarts.apache.org/option.html#',
+  apiPath: 'https://echarts.apache.org/api.html#',
   gitRepo: 'apache/echarts-handbook'
 }
diff --git a/configs/config.local.js b/configs/config.local.js
index 103546c..364e42e 100644
--- a/configs/config.local.js
+++ b/configs/config.local.js
@@ -7,5 +7,6 @@ export default {
     'http://localhost/echarts-website/examples/${lang}/editor.html?c=',
   mainSitePath: 'http://localhost/echarts-website/',
   optionPath: 'http://localhost/echarts-website/option.html#',
+  apiPath: 'http://localhost/echarts-website/api.html#',
   gitRepo: 'apache/echarts-handbook'
 }
diff --git a/configs/config.localsite.js b/configs/config.localsite.js
index f5b703e..abe8e61 100644
--- a/configs/config.localsite.js
+++ b/configs/config.localsite.js
@@ -7,5 +7,6 @@ export default {
     'http://localhost/echarts-website/examples/${lang}/editor.html?c=',
   mainSitePath: 'http://localhost/echarts-website/',
   optionPath: 'http://localhost/echarts-website/option.html#',
+  apiPath: 'http://localhost/echarts-website/api.html#',
   gitRepo: 'apache/echarts-handbook'
 }
diff --git a/package-lock.json b/package-lock.json
index 61d3693..4daf37f 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -18,6 +18,7 @@
         "lodash": "^4.17.21",
         "markdown-it": "^12.2.0",
         "markdown-it-anchor": "^8.1.2",
+        "markdown-it-attrs": "^4.3.1",
         "nuxt": "^2.15.8",
         "nuxt-i18n": "^6.28.1",
         "prism-themes": "^1.9.0",
@@ -10783,6 +10784,17 @@
         "markdown-it": "*"
       }
     },
+    "node_modules/markdown-it-attrs": {
+      "version": "4.3.1",
+      "resolved": 
"https://registry.npmjs.org/markdown-it-attrs/-/markdown-it-attrs-4.3.1.tgz";,
+      "integrity": 
"sha512-/ko6cba+H6gdZ0DOw7BbNMZtfuJTRp9g/IrGIuz8lYc/EfnmWRpaR3CFPnNbVz0LDvF8Gf1hFGPqrQqq7De0rg==",
+      "engines": {
+        "node": ">=6"
+      },
+      "peerDependencies": {
+        "markdown-it": ">= 9.0.0"
+      }
+    },
     "node_modules/markdown-it/node_modules/entities": {
       "version": "2.1.0",
       "resolved": "https://registry.npmjs.org/entities/-/entities-2.1.0.tgz";,
@@ -28212,6 +28224,12 @@
       "integrity": 
"sha512-PI1qEHHkTNWT+X6Ip9w+paonfIQ+QZP9sCeMYi47oqhH+EsW8CrJ8J7CzV19QVOj6il8ATGbK2nTECj22ZHGvQ==",
       "requires": {}
     },
+    "markdown-it-attrs": {
+      "version": "4.3.1",
+      "resolved": 
"https://registry.npmjs.org/markdown-it-attrs/-/markdown-it-attrs-4.3.1.tgz";,
+      "integrity": 
"sha512-/ko6cba+H6gdZ0DOw7BbNMZtfuJTRp9g/IrGIuz8lYc/EfnmWRpaR3CFPnNbVz0LDvF8Gf1hFGPqrQqq7De0rg==",
+      "requires": {}
+    },
     "math-intrinsics": {
       "version": "1.1.0",
       "resolved": 
"https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz";,
diff --git a/package.json b/package.json
index 1a9ad15..0b8c90e 100644
--- a/package.json
+++ b/package.json
@@ -4,7 +4,7 @@
   "description": "Apache ECharts Handbook",
   "license": "Apache-2.0",
   "scripts": {
-    "dev": "cross-env NODE_OPTIONS=--openssl-legacy-provider nuxt",
+    "dev": "cross-env NODE_OPTIONS=--openssl-legacy-provider DEBUG=nuxt:*  
nuxt dev",
     "start": "cross-env NODE_OPTIONS=--openssl-legacy-provider nuxt start",
     "prepare-generate": "node build/generate-contributors.js && node 
build/generate",
     "build:gh": "npm run prepare-generate && cross-env 
NODE_OPTIONS=--openssl-legacy-provider NUXT_ENV_DEPLOY=gh nuxt generate",
@@ -22,6 +22,7 @@
     "lodash": "^4.17.21",
     "markdown-it": "^12.2.0",
     "markdown-it-anchor": "^8.1.2",
+    "markdown-it-attrs": "^4.3.1",
     "nuxt": "^2.15.8",
     "nuxt-i18n": "^6.28.1",
     "prism-themes": "^1.9.0",
diff --git a/pages/_.vue b/pages/_.vue
index 0f359ec..f02f0ad 100644
--- a/pages/_.vue
+++ b/pages/_.vue
@@ -29,6 +29,7 @@
 import '~/components/markdown/global'
 import markdown from 'markdown-it'
 import anchor from 'markdown-it-anchor'
+import markdownItAttrs from 'markdown-it-attrs'
 import Contributors from '~/components/partials/Contributors.vue'
 import PostContent from '~/components/partials/PostContent'
 import * as base64 from 'js-base64'
@@ -62,6 +63,7 @@ function replaceVars(md: string, lang: string) {
   // Replace variables
   ;[
     'optionPath',
+    'apiPath',
     'mainSitePath',
     'exampleViewPath',
     'exampleEditorPath'
@@ -122,12 +124,13 @@ export default {
       // @ts-ignore
       this.$el.querySelector('.post-inner')?.querySelectorAll('h2,h3') || []
     for (let i = 0; i < headers.length; i++) {
-      const title = (headers[i] as HTMLHeadingElement).innerText
+      const headerItem = headers[i] as HTMLHeadingElement
+      const title = headerItem.innerText
       // @ts-ignore
       this.toc.push({
         title,
-        depth: +headers[i].nodeName.replace(/\D/g, ''),
-        id: slugify(title)
+        depth: +headerItem.nodeName.replace(/\D/g, ''),
+        id: headerItem.id != null ? headerItem.id : slugify(title)
       })
     }
     setTimeout(() => {
@@ -181,6 +184,12 @@ export default {
         permalinkSymbol: '#',
         permalinkClass: 'permalink'
       })
+      .use(markdownItAttrs, {
+        leftDelimiter: '[[[',
+        rightDelimiter: ']]]',
+        // empty array = all attributes are allowed
+        allowedAttributes: ['id']
+      })
       .use(function(md) {
         const defaultImageRenderer = md.renderer.rules.image!
         md.renderer.rules.image = function(tokens, idx, options, env, self) {


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to