diff --git a/.eslintignore b/.eslintignore index 846f112d..4d6ea4e2 100644 --- a/.eslintignore +++ b/.eslintignore @@ -1,10 +1,9 @@ .git -packages/docsify-server-renderer/build.js -node_modules -build -server.js -lib -themes -build -docs/ **/*.md +build +docs +lib +node_modules +packages/docsify-server-renderer/build.js +server.js +themes diff --git a/build/html.js b/build/html.js new file mode 100644 index 00000000..d7ddf1b4 --- /dev/null +++ b/build/html.js @@ -0,0 +1,29 @@ +const fs = require('fs'); +const nunjucks = require('nunjucks'); +const path = require('path'); +const prettier = require('prettier'); + +const renderJobs = [ + // Preview index.html + { + isProduction: false, + inputPath: path.resolve(__dirname, '../src/html/index.njk'), + outputPath: path.resolve(__dirname, '../index.html'), + }, + // Production index.html + { + isProduction: true, + inputPath: path.resolve(__dirname, '../src/html/index.njk'), + outputPath: path.resolve(__dirname, '../docs/index.html'), + }, +]; + +for (const job of renderJobs) { + console.log(`[Build HTML] ${job.outputPath}`); + + const template = fs.readFileSync(job.inputPath, 'utf8').toString(); + const html = nunjucks.renderString(template, job); + const htmlFormatted = prettier.format(html, { parser: 'html' }); + + fs.writeFileSync(job.outputPath, htmlFormatted); +} diff --git a/docs/helpers.md b/docs/helpers.md index 46ff81d3..27a8ced9 100644 --- a/docs/helpers.md +++ b/docs/helpers.md @@ -96,29 +96,29 @@ Only when you both set the `routerMode: 'history'` and `externalLinkTarget: '_se ### Resizing ```md -![logo](https://docsify.js.org/_media/icon.svg ':size=WIDTHxHEIGHT') -![logo](https://docsify.js.org/_media/icon.svg ':size=50x100') -![logo](https://docsify.js.org/_media/icon.svg ':size=100') +![logo](_media/icon.svg ':size=WIDTHxHEIGHT') +![logo](_media/icon.svg ':size=50x100') +![logo](_media/icon.svg ':size=100') -![logo](https://docsify.js.org/_media/icon.svg ':size=10%') +![logo](_media/icon.svg ':size=10%') ``` -![logo](https://docsify.js.org/_media/icon.svg ':size=50x100') -![logo](https://docsify.js.org/_media/icon.svg ':size=100') -![logo](https://docsify.js.org/_media/icon.svg ':size=10%') +![logo](_media/icon.svg ':size=50x100') +![logo](_media/icon.svg ':size=100') +![logo](_media/icon.svg ':size=10%') ### Customise class ```md -![logo](https://docsify.js.org/_media/icon.svg ':class=someCssClass') +![logo](_media/icon.svg ':class=someCssClass') ``` ### Customise ID ```md -![logo](https://docsify.js.org/_media/icon.svg ':id=someCssId') +![logo](_media/icon.svg ':id=someCssId') ``` ## Customise ID for headings diff --git a/docs/index.html b/docs/index.html index 0a83d114..abe42efb 100644 --- a/docs/index.html +++ b/docs/index.html @@ -45,87 +45,70 @@ nav.app-nav li ul { min-width: 100px; } - + + -
Loading ...
+ + + + - diff --git a/index.html b/index.html index bfe0778b..aa96d441 100644 --- a/index.html +++ b/index.html @@ -1,99 +1,188 @@ - - - - docsify - - - - - - - - - - - -
- - - - - - - - - - + vueGlobalOptions: { + data() { + return { + count: 0, + message: "Hello, World!", + // Fake API response + images: [ + { title: "Image 1", url: "https://picsum.photos/150?random=1" }, + { title: "Image 2", url: "https://picsum.photos/150?random=2" }, + { title: "Image 3", url: "https://picsum.photos/150?random=3" } + ] + }; + }, + computed: { + timeOfDay() { + const date = new Date(); + const hours = date.getHours(); + if (hours < 12) { + return "morning"; + } else if (hours < 18) { + return "afternoon"; + } else { + return "evening"; + } + } + }, + methods: { + hello: function() { + alert(this.message); + } + } + }, + vueMounts: { + "#counter": { + data() { + return { + count: 0 + }; + } + } + }, + + // Plugins (docsify) + search: { + noData: { + "/de-de/": "Keine Ergebnisse!", + "/zh-cn/": "没有结果!", + "/": "No results!" + }, + paths: "auto", + placeholder: { + "/de-de/": "Suche", + "/zh-cn/": "搜索", + "/": "Search" + } + }, + // Plugins (custom) + plugins: [ + // Edit Document + function(hook, vm) { + hook.beforeEach(function(html) { + var url = + "https://github.com/docsifyjs/docsify/blob/master/docs/" + + vm.route.file; + + if (/githubusercontent\.com/.test(vm.route.file)) { + url = vm.route.file + .replace("raw.githubusercontent.com", "github.com") + .replace(/\/master/, "/blob/master"); + } else if (/jsdelivr\.net/.test(vm.route.file)) { + url = vm.route.file + .replace("cdn.jsdelivr.net/gh", "github.com") + .replace("@master", "/blob/master"); + } + + return [ + html, + '
', + "[:memo: Edit Document](" + url + ")", + "
" + ].join("\n\n"); + }); + }, + // Fix prevew paths to local /docs resources + function(hook, vm) { + hook.afterEach(function(html) { + const reDocsDirs = /(=\s*"\/?)(_media|_image)\//gm; + + html = html.replace(reDocsDirs, "$1docs/$2/"); + + return html; + }); + } + ] + }; + + + + + + + + + + diff --git a/package-lock.json b/package-lock.json index 474a084f..f826bac7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -4340,96 +4340,6 @@ } } }, - "@vue/compiler-core": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.0.2.tgz", - "integrity": "sha512-GOlEMTlC/OdzBkKaKOniYErbkjoKxkBOmulxGmMR10I2JJX6TvXd/peaO/kla2xhpliV/M6Z4TLJp0yjAvRIAw==", - "dev": true, - "requires": { - "@babel/parser": "^7.12.0", - "@babel/types": "^7.12.0", - "@vue/shared": "3.0.2", - "estree-walker": "^2.0.1", - "source-map": "^0.6.1" - }, - "dependencies": { - "@babel/parser": { - "version": "7.12.5", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.12.5.tgz", - "integrity": "sha512-FVM6RZQ0mn2KCf1VUED7KepYeUWoVShczewOCfm3nzoBybaih51h+sYVVGthW9M6lPByEPTQf+xm27PBdlpwmQ==", - "dev": true - }, - "@babel/types": { - "version": "7.12.6", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.6.tgz", - "integrity": "sha512-hwyjw6GvjBLiyy3W0YQf0Z5Zf4NpYejUnKFcfcUhZCSffoBBp30w6wP2Wn6pk31jMYZvcOrB/1b7cGXvEoKogA==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.10.4", - "lodash": "^4.17.19", - "to-fast-properties": "^2.0.0" - } - }, - "estree-walker": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.1.tgz", - "integrity": "sha512-tF0hv+Yi2Ot1cwj9eYHtxC0jB9bmjacjQs6ZBTj82H8JwUywFuc+7E83NWfNMwHXZc11mjfFcVXPe9gEP4B8dg==", - "dev": true - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, - "@vue/compiler-dom": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.0.2.tgz", - "integrity": "sha512-jvaL4QF2yXBJVD+JLbM2YA3e5fNfflJnfQ+GtfYk46ENGsEetqbkZqcX7fO+RHdG8tZBo7LCNBvgD0QLr+V4sg==", - "dev": true, - "requires": { - "@vue/compiler-core": "3.0.2", - "@vue/shared": "3.0.2" - } - }, - "@vue/reactivity": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.0.2.tgz", - "integrity": "sha512-GdRloNcBar4yqWGXOcba1t//j/WizwfthfPUYkjcIPHjYnA/vTEQYp0C9+ZjPdinv1WRK1BSMeN/xj31kQES4A==", - "dev": true, - "requires": { - "@vue/shared": "3.0.2" - } - }, - "@vue/runtime-core": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.0.2.tgz", - "integrity": "sha512-3m/jOs2xSipEFah9FgpEzvC9nERFonVGLN06+pf8iYPIy54Nlv7D2cyrk3Lhbjz4w3PbIrkxJnoTJYvJM7HDfA==", - "dev": true, - "requires": { - "@vue/reactivity": "3.0.2", - "@vue/shared": "3.0.2" - } - }, - "@vue/runtime-dom": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.0.2.tgz", - "integrity": "sha512-vqC1KK1yWthTw1FKzajT0gYQaEqAq7bpeeXQC473nllGC5YHbJhNAJLSmrDun1tjXqGF0UNCWYljYm+++BJv6w==", - "dev": true, - "requires": { - "@vue/runtime-core": "3.0.2", - "@vue/shared": "3.0.2", - "csstype": "^2.6.8" - } - }, - "@vue/shared": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.0.2.tgz", - "integrity": "sha512-Zx869zlNoujFOclKIoYmkh8ES2RcS/+Jn546yOiPyZ+3+Ejivnr+fb8l+DdXUEFjo+iVDNR3KyLzg03aBFfZ4Q==", - "dev": true - }, "@zkochan/cmd-shim": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/@zkochan/cmd-shim/-/cmd-shim-3.1.0.tgz", @@ -4451,6 +4361,12 @@ "through": ">=2.2.7 <3" } }, + "a-sync-waterfall": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/a-sync-waterfall/-/a-sync-waterfall-1.0.1.tgz", + "integrity": "sha512-RYTOHHdWipFUliRFMCS4X2Yn2X8M87V/OpSqWzKKOGhzqyUxzyVmhHDH9sAvG+ZuQf/TAOFsLCpMw09I1ufUnA==", + "dev": true + }, "abab": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.5.tgz", @@ -6860,12 +6776,6 @@ } } }, - "csstype": { - "version": "2.6.14", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-2.6.14.tgz", - "integrity": "sha512-2mSc+VEpGPblzAxyeR+vZhJKgYg0Og0nnRi7pmRXFYYxSfnOnW8A5wwQb4n4cE2nIOzqKOAzLCaEX6aBmNEv8A==", - "dev": true - }, "currently-unhandled": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", @@ -14504,6 +14414,26 @@ "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", "dev": true }, + "nunjucks": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/nunjucks/-/nunjucks-3.2.2.tgz", + "integrity": "sha512-KUi85OoF2NMygwODAy28Lh9qHmq5hO3rBlbkYoC8v377h4l8Pt5qFjILl0LWpMbOrZ18CzfVVUvIHUIrtED3sA==", + "dev": true, + "requires": { + "a-sync-waterfall": "^1.0.0", + "asap": "^2.0.3", + "chokidar": "^3.3.0", + "commander": "^5.1.0" + }, + "dependencies": { + "commander": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz", + "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==", + "dev": true + } + } + }, "nwsapi": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.0.tgz", @@ -19338,17 +19268,6 @@ "integrity": "sha512-uhmLFETqPPNyuLLbsKz6ioJ4q7AZHzD8ZVFNATNyICSZouqP2Sz0rotWQC8UNBF6VGSCs5abnKJoStA6JbCbfg==", "dev": true }, - "vue3": { - "version": "npm:vue@3.0.2", - "resolved": "https://registry.npmjs.org/vue/-/vue-3.0.2.tgz", - "integrity": "sha512-ciKFjutKRs+2Vbvgrist1oDd5wZQqtOel/K//ku54zLbf8tcTV+XbyAfanTHcTkML9CUj09vnC+y+5uaOz2/9g==", - "dev": true, - "requires": { - "@vue/compiler-dom": "3.0.2", - "@vue/runtime-dom": "3.0.2", - "@vue/shared": "3.0.2" - } - }, "w3c-hr-time": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz", diff --git a/package.json b/package.json index 1a0eb825..7b7ce703 100644 --- a/package.json +++ b/package.json @@ -21,29 +21,30 @@ ], "scripts": { "bootstrap": "npm i && lerna bootstrap && npm run build:ssr", - "serve": "node server", - "serve:ssr": "cross-env SSR=1 node server", - "dev": "run-p serve watch:*", - "dev:ssr": "run-p serve:ssr watch:*", - "lint": "eslint .", - "fixlint": "eslint . --fix", - "test": "jest", - "test:e2e": "jest --selectProjects e2e", - "test:integration": "jest --selectProjects integration", - "test:unit": "jest --selectProjects unit", - "css": "node build/css", - "watch:css": "npm run css -- -o themes -w", - "watch:js": "node build/build.js", + "build:cover": "node build/cover.js", "build:css:min": "mkdirp lib/themes && npm run css -- -o lib/themes && node build/mincss.js", "build:css": "mkdirp themes && npm run css -- -o themes", + "build:html": "node build/html.js", "build:js": "cross-env NODE_ENV=production node build/build.js", "build:ssr": "node build/ssr.js", - "build:cover": "node build/cover.js", - "build": "rimraf lib themes && run-s build:js build:css build:css:min build:ssr build:cover", + "build": "rimraf lib themes && run-s build:html build:js build:css build:css:min build:ssr build:cover", + "css": "node build/css", + "dev:ssr": "run-p serve:ssr watch:*", + "dev": "run-p serve watch:*", + "fixlint": "eslint . --fix", + "lint": "eslint .", + "postinstall": "opencollective-postinstall", "prepare": "npm run build", "pub:next": "cross-env RELEASE_TAG=next sh build/release.sh", "pub": "sh build/release.sh", - "postinstall": "opencollective-postinstall" + "serve:ssr": "cross-env SSR=1 node server", + "serve": "node server", + "test:e2e": "jest --selectProjects e2e", + "test:integration": "jest --selectProjects integration", + "test:unit": "jest --selectProjects unit", + "test": "jest", + "watch:css": "npm run css -- -o themes -w", + "watch:js": "node build/build.js" }, "husky": { "hooks": { @@ -91,6 +92,7 @@ "live-server": "^1.2.1", "mkdirp": "^0.5.1", "npm-run-all": "^4.1.5", + "nunjucks": "^3.2.2", "playwright": "^1.4.1", "prettier": "^1.19.1", "rimraf": "^3.0.0", diff --git a/src/html/index.njk b/src/html/index.njk new file mode 100644 index 00000000..ca26b0d8 --- /dev/null +++ b/src/html/index.njk @@ -0,0 +1,236 @@ +{% set _mediaPath = "_media" if isProduction else "docs/_media" %} +{% set libPath = "//cdn.jsdelivr.net/npm/docsify@4/lib" if isProduction else "/lib" %} + + + + + + docsify{{ " (Preview)" if not isProduction }} + + + + + + + + + + + + {%- if isProduction %} + + {% endif %} + + +
Loading ...
+ + + + {#- #} + + + + + + {%- if isProduction %} + + + + + + {% endif -%} + + {#- #} + +