This is an automated email from the ASF dual-hosted git repository. sushuang pushed a commit to branch v6-examples-supplement in repository https://gitbox.apache.org/repos/asf/echarts-examples.git
commit f2e66f25f4e7cb843d231e1ea5dc0d3f70436a1c Author: 100pah <[email protected]> AuthorDate: Thu Aug 7 04:40:03 2025 +0800 infra: (1) Rename 'excludeFromGallery' to 'noExplore'. (2) Support metadata in doc-example/xxx . --- README.md | 8 +-- src/explore/Explore.vue | 3 + tool/build-example.js | 170 ++++++++++++++++++++++++++---------------------- 3 files changed, 101 insertions(+), 80 deletions(-) diff --git a/README.md b/README.md index 0b3bef9b..19a267df 100644 --- a/README.md +++ b/README.md @@ -40,20 +40,20 @@ since: 6.0.0 Note: - The metadata, i.e., the first JavaScript comment block, will be removed when displaying the source code in editor page. -- If you want the example to be included in the [example gallery page](https://echarts.apache.org/examples/en/index.html) +- If you want the example to be included in the [example exploration page](https://echarts.apache.org/examples/en/index.html) - metadata properies `title` and `category` must be provided. - - must no `excludeFromGallery: true`. + - must no `noExplore: true`. - The example should under `public/examples/ts/` folder directly, rather than in folder `public/examples/ts/doc-example/`. - **Do not modify the file path of existing examples**, unless you search and update all the links in `echarts-doc` correspondingly. Metadata properties can be: + `title`: Optional. String. + `titleCN`: Optional. String. -+ `category`: Optional. String list. That is the main categories in [example gallery page](https://echarts.apache.org/examples/en/index.html). If multiple categories need to be specified, use quotation marks and commas like `/* category: 'line, visualMap' */` ++ `category`: Optional. String list. That is the main categories in [example exploration page](https://echarts.apache.org/examples/en/index.html). If multiple categories need to be specified, use quotation marks and commas like `/* category: 'line, visualMap' */` + `since`: Optional. Semver version string. Recommended to add it to hint users the available echarts versions. For example, `/* since: 6.0.0 */`. Do not use `v6.0.0`, must follow Semver format. + `difficulty`: Optional. Number. + `theme`: Optional. String. -+ `excludeFromGallery`: Optional. Boolean. Indicate that exclude this example from [example gallery page](https://echarts.apache.org/examples/en/index.html). ++ `noExplore`: Optional. Boolean. Indicate that exclude this example from [example exploration page](https://echarts.apache.org/examples/en/index.html). + `videoStart` and `videoEnd`: Optional. Number. Record a video to show the animation when genering screenshot. For example, ```js /* diff --git a/src/explore/Explore.vue b/src/explore/Explore.vue index 2f9902b9..cb3c36e4 100644 --- a/src/explore/Explore.vue +++ b/src/explore/Explore.vue @@ -146,6 +146,9 @@ export default { if (BLACK_MAP.hasOwnProperty(example.id)) { continue; } + if (example.noExplore) { + continue; + } if (typeof example.category === 'string') { example.category = [example.category]; } diff --git a/tool/build-example.js b/tool/build-example.js index 321ac327..362f506e 100644 --- a/tool/build-example.js +++ b/tool/build-example.js @@ -14,6 +14,7 @@ const { compareImage } = require('../common/compareImage'); const { runTasks } = require('../common/task'); const nStatic = require('node-static'); const shell = require('shelljs'); +const assert = require('assert'); function optionToJson(obj, prop) { let json = JSON.stringify( @@ -275,96 +276,113 @@ async function takeScreenshot( let server; // Declare server at function scope const examplesRoot = `${rootDir}public/examples`; - const files = await globby(`js/${isGL ? 'gl/' : ''}*.js`, { + const filesPrimary = await globby(`js/${isGL ? 'gl/' : ''}*.js`, { + cwd: examplesRoot, + absolute: true + }); + const filesInDocExampleFolder = isGL ? [] : await globby(`js/doc-example/*.js`, { cwd: examplesRoot, absolute: true }); const exampleList = []; + const thumbTasks = []; - let thumbTasks = []; - - for (let theme of themeList) { - for (let fileName of files) { - const basename = path.basename(fileName, '.js'); - - // Remove mapbox temporary - if ( - basename.indexOf('mapbox') >= 0 || - basename.indexOf('shanghai') >= 0 || - basename === 'lines3d-taxi-routes-of-cape-town' || - basename === 'lines3d-taxi-chengdu' || - basename === 'map3d-colorful-cities' || - // TODO Examples that can't work temporary. - basename === 'bar3d-music-visualization' - ) { - continue; - } + for (const theme of themeList) { + for (const fileAbsPath of filesPrimary) { + handleSingleFile(fileAbsPath, theme, false); + } + } + for (const fileAbsPath of filesInDocExampleFolder) { + handleSingleFile(fileAbsPath, null, true); + } - const tsFile = `${examplesRoot}/ts/${isGL ? 'gl/' : ''}${basename}.ts`; - const hasTs = fs.existsSync(tsFile); + function handleSingleFile(fileAbsPath, thumbTheme, noThumb) { + const relativePath = path.relative(path.join(examplesRoot, 'js'), fileAbsPath); + assert(relativePath !== '' && relativePath.indexOf('.') !== 0 && !path.isAbsolute(relativePath)); + const exampleId = relativePath.replace(/\.js$/, ''); + + // Remove mapbox temporary + if ( + exampleId.indexOf('mapbox') >= 0 || + exampleId.indexOf('shanghai') >= 0 || + exampleId === 'lines3d-taxi-routes-of-cape-town' || + exampleId === 'lines3d-taxi-chengdu' || + exampleId === 'map3d-colorful-cities' || + // TODO Examples that can't work temporary. + exampleId === 'bar3d-music-visualization' + ) { + return; + } - let fmResult; - try { - const code = fs.readFileSync(fileName, 'utf-8'); - fmResult = matter(code, { - delimiters: ['/*', '*/'] - }); - } catch (e) { - fmResult = { - data: {} - }; - } + const tsFile = path.normalize(`${examplesRoot}/ts/${isGL ? 'gl/' : ''}${exampleId}.ts`); + const hasTs = fs.existsSync(tsFile); - if (fmResult.data.excludeFromGallery) { - // `fmResult.data.excludeFromGallery` is boolean if writing `/* excludeFromGallery: true */` in code. - continue; - } + let fmResult; + try { + const code = fs.readFileSync(fileAbsPath, 'utf-8'); + fmResult = matter(code, { + delimiters: ['/*', '*/'] + }); + } catch (e) { + fmResult = { + data: {} + }; + } - try { - const difficulty = - fmResult.data.difficulty != null ? fmResult.data.difficulty : 10; - const category = (fmResult.data.category || '') - .split(/,/g) - .map((a) => a.trim()) - .filter((a) => !!a); - - if (!exampleList.find((item) => item.id === basename)) { - // Avoid add multiple times when has multiple themes. - exampleList.push({ - category: category, - id: basename, - ts: hasTs, - tags: (fmResult.data.tags || '') - .split(/,/g) - .map((a) => a.trim()) - .filter((a) => !!a), - theme: fmResult.data.theme, - title: fmResult.data.title, - titleCN: fmResult.data.titleCN, - difficulty: +difficulty, - since: fmResult.data.since, - }); - } - } catch (e) { - throw new Error(e.toString()); - } + // `fmResult.data.noExplore` is boolean if writing `/* noExplore: true */` in code. + const noExplore = fmResult.data.noExplore; - if ( - !matchPattern || - (matchPattern.some(function (pattern) { - return minimatch(basename, pattern); - }) && - screenshotBlackList.indexOf(basename) < 0) - ) { - thumbTasks.push({ - theme, - fmResult, - basename + try { + const difficulty = + fmResult.data.difficulty != null ? fmResult.data.difficulty : 10; + const category = (fmResult.data.category || '') + .split(/,/g) + .map((a) => a.trim()) + .filter((a) => !!a); + + if (!exampleList.find((item) => item.id === exampleId)) { + // Avoid add multiple times when has multiple themes. + exampleList.push({ + category: category, + id: exampleId, + ts: hasTs, + tags: (fmResult.data.tags || '') + .split(/,/g) + .map((a) => a.trim()) + .filter((a) => !!a), + noExplore: noExplore, + theme: fmResult.data.theme, + title: fmResult.data.title, + titleCN: fmResult.data.titleCN, + difficulty: +difficulty, + since: fmResult.data.since, }); } + } catch (e) { + throw new Error(e.toString()); } - } + + if ( + !noThumb + && !noExplore + && ( + !matchPattern + || ( + matchPattern.some(function (pattern) { + return minimatch(exampleId, pattern); + }) + && screenshotBlackList.indexOf(exampleId) < 0 + ) + ) + ) { + thumbTasks.push({ + thumbTheme, + fmResult, + exampleId + }); + } + } // End of handleSingleFile exampleList.sort(function (a, b) { if (a.difficulty === b.difficulty) { --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
