Compare commits

..
Author SHA1 Message Date
anikethsaha b0b3de0a66 chore: changed the opencollective cli to light 2019-12-17 02:48:47 +05:30
anikethsaha 589a5732d3 chore: add changelog 4.10.0 2019-12-16 23:00:23 +05:30
anikethsaha b62b213435 [build] 4.10.0 2019-12-16 22:58:51 +05:30
AnixandGitHub a59328719b Merge pull request #977 from docsifyjs/prerelease
Prerelease changes
2019-12-16 22:39:16 +05:30
anikethsaha 4a8f2c5bfa chore: fixed the npm script and added css build file 2019-12-16 22:32:32 +05:30
AnixandGitHub 79f8211a45 Merge pull request #965 from docsifyjs/develop
Develop -> Master : tracking changes PR
2019-12-16 19:29:09 +05:30
AnixandGitHub 68327c5c9a Merge branch 'master' into develop 2019-12-12 20:32:28 +05:30
AnixandGitHub 1622578045 Merge pull request #974 from Koooooo-7/develop
[fix]#972 when 'logo' is set, 'name' is not set correctly inside the 'alt' as same as without 'logo' set.
2019-12-11 13:54:31 +05:30
koooooo-7 c403318ac6 [fix] when 'logo' is set, 'name' is not set correctly inside the 'alt' field. 2019-12-07 21:55:42 +08:00
AnixandGitHub 8bf4b06d3a Merge pull request #952 from xmedeko/buble-patch-2
buble theme: fix strong font-weight increased to 600 (onto master branch)
2019-12-03 20:18:21 +05:30
AnixandGitHub 378d7bb492 Merge pull request #917 from vkallore/develop
Fix #914
2019-12-02 18:39:32 +05:30
Vaishak Kallore 11762cbb73 Merged upstream develop and resolved the conflict 2019-12-02 18:04:59 +05:30
AnixandGitHub 8f496d84ce Merge pull request #969 from PicchiKevin/fix-markdown-bracket
Fix: #967 token position markdown
2019-12-02 16:43:33 +05:30
AnixandGitHub 98525c4a2d Merge pull request #842 from Koooooo-7/develop
fix #835 :Link target of repo's GitHub Corner add new independent config `cornerExternalLinkTarget`.
2019-12-02 16:35:29 +05:30
Mt e61410a757 add new config cornerExternalLinkTarget for the corner link target
rm   CNAME

add CNAME

add repo test

back to the origin index.html

fix: the Git corner displayed bigger when the externalLinkTarget = ''

[update] a new independent config for corner link target attribute.

[update doc] add the `cornerExternalLinkTarget` config in the doc.
2019-12-02 18:10:42 +08:00
Kevin Picchi 745e5ffa54 Fix #967 token position markdown 2019-12-02 09:47:17 +00:00
AnixandGitHub 8d5787eabe Merge pull request #960 from PicchiKevin/improve-accessibility
fix #945 - Improve accessibility
2019-12-02 14:40:05 +05:30
AnixandGitHub dd9e5f98e0 Merge pull request #870 from gaurav-nelson/patch-1
Fix #753
2019-12-02 12:45:57 +05:30
Kevin Picchi 229a63c2e8 Add :focus styling 2019-11-29 11:25:26 +00:00
AnixandGitHub 5b575441e9 Merge pull request #956 from docsifyjs/fix-sponsor-button
Fixed FUNDING.yml
2019-11-23 21:36:34 +05:30
AnixandGitHub 0bd4f05034 Update FUNDING.yml 2019-11-23 21:33:54 +05:30
AnixandGitHub cc3f30b582 Merge pull request #954 from docsifyjs/sponser-button
chore: added sponsor button
2019-11-23 21:30:16 +05:30
AnixandGitHub 64e460aaed Merge pull request #953 from docsifyjs/revert-950-master-npm-audit-fixes
Revert "[master branch ] fix: package security alerts"
2019-11-23 21:29:32 +05:30
AnixandGitHub 52fcc6f081 chore: added sponsor button 2019-11-23 13:21:24 +05:30
AnixandGitHub 3f53b7166e Revert "[master branch ] fix: package security alerts" 2019-11-23 02:46:45 +05:30
Felix AngelovandGitHub d9ec246508 improve emoji support (#930) 2019-11-22 13:09:51 -06:00
Ondrej Medek 7b871006e6 buble theme: fix strong font-weight increased to 600 2019-11-22 08:05:24 +01:00
AnixandGitHub 5a6289d504 Merge pull request #950 from anikethsaha/master-npm-audit-fixes
fix: package security alerts
2019-11-22 02:54:37 +05:30
anikethsaha a62b037bec fix: fixed security alert for chokidar(update dep) 2019-11-22 02:24:30 +05:30
anikethsaha d7d5c8f302 fix: security alerts of cssnano 2019-11-22 01:43:27 +05:30
anikethsaha f5f15619f1 fix: package security alerts 2019-11-22 01:17:18 +05:30
AnixandGitHub 236c9a29b4 Merge pull request #948 from styfle/patch-2
[Develop] : Add deployment instructions for ZEIT Now
2019-11-22 00:08:21 +05:30
AnixandGitHub b95f8d2884 Merge pull request #931 from styfle/patch-1
Add deployment instructions for ZEIT Now
2019-11-21 20:00:08 +05:30
StevenandGitHub 79a54b462b Add deployment instructions for ZEIT Now 2019-11-21 09:27:50 -05:00
StevenandGitHub 6b8773fbb0 Move instructions up 2019-11-21 09:13:36 -05:00
AnixandGitHub 8ea7e32e14 Merge pull request #943 from rizdaprasetya/patch-1
fix netlify-redirects-file typo on docs and improve wording
2019-11-21 19:12:05 +05:30
Kevin Picchi 83f9b01852 Form elements must have labels 2019-11-12 16:55:32 +00:00
Kevin Picchi 8454889f63 Buttons must have discernible text 2019-11-12 16:55:00 +00:00
Rizda Dwi PrasetyaandGitHub 77c3fc8bcd fix and improve netlify redirects file typo 2019-11-11 16:12:04 +07:00
Andrey ChalkinandFelix Angelov 615205cfdb fix: npm audit issues (#934) 2019-10-16 09:20:54 -04:00
StevenandGitHub c6fde53f91 Add deployment instructions for ZEIT Now 2019-10-04 11:44:49 -04:00
Vaishak Kallore 4769018e26 Added support for rel='noopener' 2019-09-06 11:13:40 +05:30
Gaurav NelsonandGitHub 84384eeab3 Fixes documentation for page routes
Fixes #753
2019-06-19 13:34:26 +10:00
James HegedusandGitHub 1d3246a26f Fix typo in docs #869
Fix typo
2019-06-18 09:02:10 +10:00
Parkjunwoo 8ea4865c84 Fix typo 2019-06-18 00:30:43 +09:00
Mt 12d80f64c9 fix:Link target of repo's GitHub Corner according to externalLinkTarget config. #835 2019-05-10 10:26:01 +08:00
Anton WilhelmandAnton Wilhelm 2fb5a1128e chore: add changelog 4.9.4 2019-05-05 18:50:31 +02:00
Anton WilhelmandAnton Wilhelm c78f2117e3 [build] 4.9.4 next 2019-05-05 18:50:31 +02:00
Anton WilhelmandAnton Wilhelm e8dc5229de Do not commit any files in lib during release 2019-05-05 18:50:31 +02:00
Anton WilhelmandAnton Wilhelm 7a838d1b24 Cleanup gitignore 2019-05-05 18:50:31 +02:00
Anton WilhelmandAnton Wilhelm f8f46108dd Add matomo plugin to build script 2019-05-05 18:50:31 +02:00
Anton WilhelmandAnton Wilhelm 669f243a7a Remove lib files from version control 2019-05-05 18:50:31 +02:00
Rodrigo Bermudez SchettinoandAnton Wilhelm 11bbd4cd27 Readme: Improve outdated links to showcase
Link to Showcase in awesome-docsify.
2019-05-05 18:50:31 +02:00
Gorgi KosevandAnton Wilhelm 76825a7b55 add scoring and sort to search plugin 2019-05-05 18:50:31 +02:00
Alexandru CamboseandAnton Wilhelm 72763398c3 Updated to remove all headers under it 2019-05-05 18:50:31 +02:00
Alexandru CamboseandAnton Wilhelm fd4a42c3b5 Added filtering in sidebar for ignoreSubHeading 2019-05-05 18:50:31 +02:00
Anton WilhelmandAnton Wilhelm 25e3cac66a chore: add changelog 4.9.2 2019-05-05 18:50:31 +02:00
Anton WilhelmandAnton Wilhelm 6162eb234d [build] 4.9.2 next 2019-05-05 18:50:31 +02:00
Anton WilhelmandAnton Wilhelm cb3f4865e2 Keep themes directory which is required for npm run dev 2019-05-05 18:50:31 +02:00
Anton WilhelmandAnton Wilhelm 80d5ac061f add execute access to release.sh 2019-05-05 18:50:31 +02:00
Anton WilhelmandAnton Wilhelm 0515b4d925 Add link to develop branch preview on netlify 2019-05-05 18:50:31 +02:00
Anton WilhelmandAnton Wilhelm b95c254f81 Remove lib directory from version control 2019-05-05 18:50:31 +02:00
Anton WilhelmandAnton Wilhelm 5a75bf6cb6 provide plugin for matomo 2019-05-05 18:50:31 +02:00
Anton WilhelmandAnton Wilhelm 2671d189fb align dev index.html to production 2019-05-05 18:50:31 +02:00
Anton Wilhelm 6e6b4e1b66 Minor update of bug template 2019-05-05 18:50:31 +02:00
Anton Wilhelm 676f84cffa chore: add changelog 4.9.4 2019-05-05 18:41:18 +02:00
Anton Wilhelm 7bdcadc7d7 [build] 4.9.4 next 2019-05-05 18:41:17 +02:00
Anton Wilhelm 5bd24fb83c Do not commit any files in lib during release 2019-05-05 18:35:34 +02:00
Anton Wilhelm 76cc0f672b Cleanup gitignore 2019-05-05 18:12:20 +02:00
Anton Wilhelm 3f50381090 Add matomo plugin to build script 2019-05-05 18:12:13 +02:00
Anton Wilhelm b847c20cab Remove lib files from version control 2019-05-05 13:29:56 +02:00
James HegedusandGitHub ce829b24d6 Merge pull request #827 from rodrigobdz/link-showcase
Fix #826: Link directly to showcase in readme and website
2019-04-26 17:01:22 +10:00
Rodrigo Bermudez Schettino 1ce53cf9ec Readme: Improve outdated links to showcase
Link to Showcase in awesome-docsify.
2019-04-26 11:25:17 +08:00
Gorgi KosevandAnton Wilhelm bc1d8e4bda add scoring and sort to search plugin 2019-04-23 16:29:30 +02:00
Alexandru CamboseandAnton Wilhelm 78f5564a30 Updated to remove all headers under it 2019-04-23 07:08:29 +02:00
Alexandru CamboseandAnton Wilhelm 6cc069cb9f Added filtering in sidebar for ignoreSubHeading 2019-04-23 07:08:29 +02:00
Anton Wilhelm d355272461 chore: add changelog 4.9.2 2019-04-21 12:06:17 +02:00
Anton Wilhelm af161cd3b4 [build] 4.9.2 next 2019-04-21 12:06:16 +02:00
Anton Wilhelm 5bcb016bee Keep themes directory which is required for npm run dev 2019-04-21 12:05:41 +02:00
Anton Wilhelm b38c2065e0 add execute access to release.sh 2019-04-21 12:01:04 +02:00
Anton Wilhelm e5bab8d967 Add link to develop branch preview on netlify 2019-04-21 11:58:07 +02:00
Anton Wilhelm da3e2d7b18 Remove lib directory from version control 2019-04-21 11:53:30 +02:00
Anton Wilhelm b93a667f24 provide plugin for matomo 2019-04-21 11:17:14 +02:00
Anton WilhelmandAnton Wilhelm e8d850c9ba align dev index.html to production 2019-04-14 21:03:34 +02:00
Anton WilhelmandGitHub 514a027991 Minor update of bug template 2019-04-14 21:01:24 +02:00
Anton WilhelmandGitHub 314e2d9d39 Align IE support from root README.md 2019-04-14 11:27:03 +02:00
Anton Wilhelm a86de3d81a Remove IE10 from supported browsers 2019-04-13 23:37:11 +02:00
Persevere VonandAnton Wilhelm 5f960102e7 Create .gitkeep
Fix #812
2019-04-13 17:38:57 +02:00
Anton Wilhelm 0bd5c8b020 fix #812 add empty themes directory for local watch setup 2019-04-13 15:42:22 +02:00
Anton Wilhelm 044a5ec2b8 add OS to GitHub template 2019-04-13 15:41:35 +02:00
Anton Wilhelm b15eccfac0 add npm and nodejs version to template 2019-04-13 15:33:49 +02:00
Anton WilhelmandGitHub 4e0298088b Merge pull request #817 from docsifyjs/update-github-templates
Update GitHub templates
2019-04-13 15:29:11 +02:00
Anton Wilhelm 09616dec06 Update GitHub templates 2019-04-13 15:28:12 +02:00
Anton WilhelmandGitHub f74b53f53e Merge pull request #733 from jthegedus/master
document customising page title with sidebar
2019-04-08 08:26:36 +02:00
Anton WilhelmandGitHub bba44fb536 Merge pull request #714 from ENOVACOM/relative-path
feat: allows relative path, fixed #590
2019-04-07 22:23:18 +02:00
Anton WilhelmandGitHub 270fa6cb41 Merge pull request #807 from cyrilf/patch-1
Fix typo in edit button example
2019-04-05 19:58:06 +02:00
cyrilfandGitHub 24e61f5e2f Fix typo in Edit Button example
Missing trailing slash in the Edit button url
2019-04-06 00:11:54 +10:00
Sylvain Brocard ca8ae50717 IE compatibility and add unit tests 2019-03-25 17:20:09 +01:00
Sylvain Brocard 31654f12ec feat: allows relative path, fixed #590 2019-03-25 16:33:03 +01:00
jthegedus 99dbaa3050 document customising page title with sidebar 2019-01-05 19:19:54 +11:00
48 changed files with 8512 additions and 4676 deletions
+2
View File
@@ -0,0 +1,2 @@
open_collective: docsify
-2
View File
@@ -1,2 +0,0 @@
<!-- Love docsify? Please consider supporting our collective:
👉 https://opencollective.com/docsify/donate -->
+38
View File
@@ -0,0 +1,38 @@
---
name: Bug report
about: Create a report to help us improve
---
<!-- Please don't delete this template or we'll close your issue -->
<!-- Please use English language -->
<!-- Before creating an issue please make sure you are using the latest version of Docsify. -->
<!-- Please ask questions on StackOverflow: https://stackoverflow.com/questions/ask?tags=docsify -->
## Bug Report
#### Steps to reproduce
#### What is current behaviour
#### What is the expected behaviour
#### Other relevant information
<!-- (Update "[ ]" to "[x]" to check a box) -->
- [ ] Bug does still occur when all/other plugins are disabled?
- Your OS:
- Node.js version:
- npm/yarn version:
- Browser version:
- Docsify version:
- Docsify plugins:
<!-- Love docsify? Please consider supporting our collective:
👉 https://opencollective.com/docsify/donate -->
+25
View File
@@ -0,0 +1,25 @@
---
name: Feature request
about: Suggest an idea for this project
---
<!-- Please don't delete this template or we'll close your issue -->
<!-- Please use English language -->
<!-- Before creating an issue please make sure you are using the latest version of Docsify. -->
<!-- Please ask questions on StackOverflow 👉 https://stackoverflow.com/questions/ask?tags=docsify -->
## Feature request
#### What problem does this feature solve?
#### What does the proposed API look like?
#### How should this be implemented in your opinion?
#### Are you willing to work on this yourself?
+52 -3
View File
@@ -1,5 +1,54 @@
Please makes sure these boxes are checked before submitting your PR, thank you!
<!-- Please use English language -->
<!-- Please don't delete this template -->
<!-- PULL REQUEST TEMPLATE -->
<!-- (Update "[ ]" to "[x]" to check a box) -->
**Summary**
**What kind of change does this PR introduce?** (check at least one)
- [ ] Bugfix
- [ ] Feature
- [ ] Code style update
- [ ] Refactor
- [ ] Docs
- [ ] Build-related changes
- [ ] Other, please describe:
If changing the UI of default theme, please provide the **before/after** screenshot:
**Does this PR introduce a breaking change?** (check one)
- [ ] Yes
- [ ] No
If yes, please describe the impact and migration path for existing applications:
**The PR fulfills these requirements:**
- [ ] When resolving a specific issue, it's referenced in the PR's title (e.g. `fix #xxx[,#xxx]`, where "xxx" is the issue number)
You have tested in the following browsers: (Providing a detailed version will be better.)
- [ ] Chrome
- [ ] Firefox
- [ ] Safari
- [ ] Edge
- [ ] IE
If adding a **new feature**, the PR's description includes:
- [ ] A convincing reason for adding this feature
- [ ] Related documents have been updated
- [ ] Related tests have been updated
To avoid wasting your time, it's best to open a **feature request issue** first and wait for approval before working on it.
**Other information:**
---
* [ ] Make sure you are merging your commits to `master` branch.
* [ ] Add some descriptions and refer relative issues for you PR.
* [ ] DO NOT include files inside `lib` directory.
+5 -4
View File
@@ -1,8 +1,9 @@
*.log
.DS_Store
/themes/*
!.gitkeep
node_modules
lib
.idea
node_modules
themes/
lib/
# exceptions
!.gitkeep
+2 -1
View File
@@ -1,3 +1,4 @@
{
"prettier.eslintIntegration": true
"editor.defaultFormatter": "esbenp.prettier-vscode",
"editor.formatOnSave": true
}
+32
View File
@@ -1,3 +1,35 @@
# [4.10.0](https://github.com/docsifyjs/docsify/compare/v4.9.4...v4.10.0) (2019-12-16)
### Bug Fixes
* fixed security alert for chokidar(update dep) ([a62b037](https://github.com/docsifyjs/docsify/commit/a62b037becb36941c11c8eab6e4d83df8db85af3))
* npm audit issues ([#934](https://github.com/docsifyjs/docsify/issues/934)) ([615205c](https://github.com/docsifyjs/docsify/commit/615205cfdb7aea8f37a1ec5dd928105eeef56357))
* package security alerts ([f5f1561](https://github.com/docsifyjs/docsify/commit/f5f15619f1a239d6ce12a2f83ad8817352a3352b))
* security alerts of cssnano ([d7d5c8f](https://github.com/docsifyjs/docsify/commit/d7d5c8f302d7c18dbb32e982202a07b73badf6f6))
<a name="4.9.4"></a>
## [4.9.4](https://github.com/docsifyjs/docsify/compare/v4.9.2...v4.9.4) (2019-05-05)
<a name="4.9.2"></a>
## [4.9.2](https://github.com/docsifyjs/docsify/compare/v4.9.1...v4.9.2) (2019-04-21)
### Bug Fixes
* re-render gitalk when router changed ([11ea1f8](https://github.com/docsifyjs/docsify/commit/11ea1f8))
### Features
* allows relative path, fixed [#590](https://github.com/docsifyjs/docsify/issues/590) ([31654f1](https://github.com/docsifyjs/docsify/commit/31654f1))
<a name="4.9.1"></a>
## [4.9.1](https://github.com/docsifyjs/docsify/compare/v4.9.0...v4.9.1) (2019-02-21)
+3 -2
View File
@@ -27,6 +27,7 @@
## Links
- [`develop` branch preview](https://docsifyjs.netlify.com/)
- [Documentation](https://docsify.js.org)
- [CLI](https://github.com/docsifyjs/docsify-cli)
- CDN: [UNPKG](https://unpkg.com/docsify/) | [jsDelivr](https://cdn.jsdelivr.net/npm/docsify/) | [cdnjs](https://cdnjs.com/libraries/docsify)
@@ -40,7 +41,7 @@
- Smart full-text search plugin
- Multiple themes
- Useful plugin API
- Compatible with IE10+
- Compatible with IE11
- Support SSR ([example](https://github.com/docsifyjs/docsify-ssr-demo))
- Support embedded files
@@ -54,7 +55,7 @@ Look at [this tutorial](https://docsify.js.org/#/quickstart)
These projects are using docsify to generate their sites. Pull requests welcome :blush:
Move to [awesome-docsify](https://github.com/docsifyjs/awesome-docsify)
Move to [awesome-docsify](https://github.com/docsifyjs/awesome-docsify#showcase)
## Similar projects
+2 -1
View File
@@ -2,7 +2,7 @@ const rollup = require('rollup')
const buble = require('rollup-plugin-buble')
const commonjs = require('rollup-plugin-commonjs')
const nodeResolve = require('rollup-plugin-node-resolve')
const uglify = require('rollup-plugin-uglify')
const { uglify } = require('rollup-plugin-uglify')
const replace = require('rollup-plugin-replace')
const isProd = process.env.NODE_ENV === 'production'
const version = process.env.VERSION || require('../package.json').version
@@ -55,6 +55,7 @@ const buildAllPlugin = function () {
var plugins = [
{name: 'search', input: 'search/index.js'},
{name: 'ga', input: 'ga.js'},
{name: 'matomo', input: 'matomo.js'},
{name: 'emoji', input: 'emoji.js'},
{name: 'external-script', input: 'external-script.js'},
{name: 'front-matter', input: 'front-matter/index.js'},
+41
View File
@@ -0,0 +1,41 @@
const fs = require('fs')
const path = require('path')
const {spawn} = require('child_process')
const args = process.argv.slice(2)
fs.readdir(path.join(__dirname, '../src/themes'), (err, files) => {
if (err) {
console.log('err', err)
return
}
files.map(async (file) => {
if (/\.styl/g.test(file)) {
var stylusCMD;
const stylusBin = ['node_modules', 'stylus', 'bin', 'stylus'].join(path.sep)
var cmdargs = [
stylusBin,
`src/themes/${file}`,
'-u',
'autoprefixer-stylus'
]
cmdargs = cmdargs.concat(args)
stylusCMD = spawn('node', cmdargs, { shell: true })
stylusCMD.stdout.on('data', (data) => {
console.log(`[Stylus Build ] stdout: ${data}`);
});
stylusCMD.stderr.on('data', (data) => {
console.error(`[Stylus Build ] stderr: ${data}`);
});
stylusCMD.on('close', (code) => {
console.log(`[Stylus Build ] child process exited with code ${code}`);
});
} else {
return
}
})
})
Regular → Executable
+3 -2
View File
@@ -12,7 +12,9 @@ echo
if [[ $REPLY =~ ^[Yy]$ ]]; then
echo "Releasing $VERSION ..."
npm run test
# Removing test script as non - availibity of tests. Will Add it once tests are completed
# npm run test
# build
VERSION=$VERSION npm run build
@@ -29,7 +31,6 @@ if [[ $REPLY =~ ^[Yy]$ ]]; then
# commit
git add -A
git add -f lib/ -A
git commit -m "[build] $VERSION $RELEASE_TAG"
npm --no-git-tag-version version $VERSION --message "[release] $VERSION $RELEASE_TAG"
+2 -2
View File
@@ -16,12 +16,12 @@ See the [Quick start](quickstart.md) guide for more details.
- Multiple themes
- Useful plugin API
- Emoji support
- Compatible with IE10+
- Compatible with IE11
- Support server-side rendering ([example](https://github.com/docsifyjs/docsify-ssr-demo))
## Examples
Check out the [Showcase](https://github.com/docsifyjs/docsify/#showcase) to see docsify in use.
Check out the [Showcase](https://github.com/docsifyjs/awesome-docsify#showcase) to see docsify in use.
## Donate
+1 -1
View File
@@ -1,6 +1,6 @@
![logo](_media/icon.svg)
# docsify <small>4.9.1</small>
# docsify <small>4.10.0</small>
> A magical documentation site generator.
-1
View File
@@ -23,7 +23,6 @@
- [Offline Mode(PWA)](pwa.md)
- [Server-Side Rendering(SSR)](ssr.md)
- [Embed Files](embed-files.md)
- [Generate static html](static.md)
- [Awesome docsify](awesome.md)
- [Changelog](changelog.md)
+67 -1
View File
@@ -150,6 +150,46 @@ window.$docsify = {
};
```
## relativePath
- Type: `Boolean`
- Default: `false`
If **true** links are relative to the current context.
For example, the directory structure is as follows:
```text
.
└── docs
├── README.md
├── guide.md
└── zh-cn
├── README.md
├── guide.md
└── config
└── example.md
```
With relative path **enabled** and current URL `http://domain.com/zh-cn/README`, given links will resolve to:
```text
guide.md => http://domain.com/zh-cn/guide
config/example.md => http://domain.com/zh-cn/config/example
../README.md => http://domain.com/README
/README.md => http://domain.com/README
```
```js
window.$docsify = {
// Relative path enabled
relativePath: true,
// Relative path disabled (default value)
relativePath: false
};
```
## coverpage
- Type: `Boolean|String|String[]|Object`
@@ -357,7 +397,7 @@ window.$docsify = {
- type: `String`
- default: `_blank`
Target to open external links. Default `'_blank'` (new window/tab)
Target to open external links inside the markdown. Default `'_blank'` (new window/tab)
```js
window.$docsify = {
@@ -365,6 +405,32 @@ window.$docsify = {
};
```
## cornerExternalLinkTarget
- type:`String`
- default:`_blank`
Target to open external link at the top right corner. Default `'_blank'` (new window/tab)
```js
window.$docsify = {
cornerExternalLinkTarget: '_self' // default: '_blank'
};
```
## externalLinkRel
- type: `String`
- default: `noopener`
Default `'noopener'` (no opener) prevents the newly opened external page (when [externalLinkTarget](#externallinktarget) is `'_blank'`) from having the ability to control our page. No `rel` is set when its not `'_blank'`.
```js
window.$docsify = {
externalLinkTarget: '' // default: 'noopener'
};
```
## routerMode
- type: `String`
+8 -3
View File
@@ -15,7 +15,7 @@ It is recommended that you save your files to the `./docs` subfolder of the `mas
![github pages](_images/deploy-github-pages.png)
!> You can also save files in the root directory and select `master branch`.
You'll need to place a `.nojekyll` file in the deploy location (such as `/docs` or the gh-pages branch
You'll need to place a `.nojekyll` file in the deploy location (such as `/docs` or the gh-pages branch)
## GitLab Pages
@@ -82,12 +82,18 @@ server {
### HTML5 router
When using the HTML5 router, you need to set up redirect rules that redirect all requests to your `index.html`, it's pretty simple when you're using Netlify, populate a `\redirects` file in the docs directory and you're all set:
When using the HTML5 router, you need to set up redirect rules that redirect all requests to your `index.html`, it's pretty simple when you're using Netlify, create a file named `_redirects` in the docs directory, add this snippet to the file and you're all set:
```sh
/* /index.html 200
```
## ZEIT Now
1. Install [Now CLI](https://zeit.co/download), `npm i -g now`
2. Change directory to your docsify website, for example `cd docs`
3. Deploy with a single command, `now`
## AWS Amplify
1. Set the routerMode in the Docsify project `index.html` to *history* mode.
@@ -128,4 +134,3 @@ frontend:
|----------------|----------------|---------------|
| /<*>.md | /<*>.md | 200 (Rewrite) |
| /<*> | /index.html | 200 (Rewrite) |
+15 -63
View File
@@ -7,72 +7,24 @@ docsify extends Markdown syntax to make your documents more readable.
Important content like:
```markdown
> [!] **Time** is money, my friend!
!> **Time** is money, my friend!
```
is rendered as:
> [!] **Time** is money, my friend!
!> **Time** is money, my friend!
## General tips
General tips like:
```markdown
> [?] _TODO_ unit test
?> _TODO_ unit test
```
are rendered as:
> [?] _TODO_ unit test
## More tips
```markdown
> [x] bad
> [v] good
```
> [x] bad
> [v] good
## Details
````markdown
> [details] Sample code
>
> js code
>
> ```javascript
> console.log("foo");
> ```
> [details:open] Sample code open
>
> js code
>
> ```javascript
> console.log("foo");
> ```
````
> [details] Sample code
>
> js code
>
> ```javascript
> console.log("foo");
> ```
> [details:open] Sample code open
>
> js code
>
> ```javascript
> console.log("foo");
> ```
?> _TODO_ unit test
## Ignore to compile link
@@ -87,13 +39,13 @@ It will be compiled to `<a href="/#/demo/">link</a>` and will be loaded `/demo/R
Now you can do that
```md
[link](/demo/ ":ignore")
[link](/demo/ ':ignore')
```
You will get `<a href="/demo/">link</a>`html. Do not worry, you can still set title for link.
```md
[link](/demo/ ":ignore title")
[link](/demo/ ':ignore title')
<a href="/demo/" title="title">link</a>
```
@@ -101,14 +53,14 @@ You will get `<a href="/demo/">link</a>`html. Do not worry, you can still set ti
## Set target attribute for link
```md
[link](/demo ":target=_blank")
[link](/demo2 ":target=_self")
[link](/demo ':target=_blank')
[link](/demo2 ':target=_self')
```
## Disable link
```md
[link](/demo ":disabled")
[link](/demo ':disabled')
```
## Github Task Lists
@@ -132,17 +84,17 @@ You will get `<a href="/demo/">link</a>`html. Do not worry, you can still set ti
## Image resizing
```md
![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=50x100')
![logo](https://docsify.js.org/_media/icon.svg ':size=100')
<!-- Support percentage -->
![logo](https://docsify.js.org/_media/icon.svg ":size=10%")
![logo](https://docsify.js.org/_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](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%')
## Customise ID for headings
+98 -131
View File
@@ -1,137 +1,104 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<title>docsify</title>
<link rel="icon" href="_media/favicon.ico" />
<meta
name="google-site-verification"
content="6t0LoIeFksrjF4c9sqUEsVXiQNxLp2hgoqo0KryT-sE"
/>
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" />
<meta
name="keywords"
content="doc,docs,documentation,gitbook,creator,generator,github,jekyll,github-pages"
/>
<meta name="description" content="A magical documentation generator." />
<meta
name="viewport"
content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0"
/>
<link
rel="stylesheet"
href="//unpkg.com/docsify/lib/themes/vue.css"
title="vue"
/>
<link
rel="stylesheet"
href="//unpkg.com/docsify/lib/themes/dark.css"
title="dark"
disabled
/>
<link
rel="stylesheet"
href="//unpkg.com/docsify/lib/themes/buble.css"
title="buble"
disabled
/>
<link
rel="stylesheet"
href="//unpkg.com/docsify/lib/themes/pure.css"
title="pure"
disabled
/>
<script src="//unpkg.com/docsify-plugin-codefund/index.js"></script>
<style>
nav.app-nav li ul {
min-width: 100px;
}
</style>
</head>
<body>
<div id="app">Loading ...</div>
<script>
window.$docsify = {
alias: {
".*?/awesome":
"https://raw.githubusercontent.com/docsifyjs/awesome-docsify/master/README.md",
".*?/changelog":
"https://raw.githubusercontent.com/docsifyjs/docsify/master/CHANGELOG.md",
"/.*/_navbar.md": "/_navbar.md",
"/zh-cn/(.*)":
"https://raw.githubusercontent.com/docsifyjs/docs-zh/master/$1",
"/de-de/(.*)":
"https://raw.githubusercontent.com/docsifyjs/docs-de/master/$1",
"/ru/(.*)":
"https://raw.githubusercontent.com/docsifyjs/docs-ru/master/$1",
"/es/(.*)":
"https://raw.githubusercontent.com/docsifyjs/docs-es/master/$1"
<head>
<meta charset="UTF-8">
<title>docsify</title>
<link rel="icon" href="_media/favicon.ico">
<meta name="google-site-verification" content="6t0LoIeFksrjF4c9sqUEsVXiQNxLp2hgoqo0KryT-sE" />
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" />
<meta name="keywords" content="doc,docs,documentation,gitbook,creator,generator,github,jekyll,github-pages">
<meta name="description" content="A magical documentation generator.">
<meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
<link rel="stylesheet" href="//unpkg.com/docsify/lib/themes/vue.css" title="vue">
<link rel="stylesheet" href="//unpkg.com/docsify/lib/themes/dark.css" title="dark" disabled>
<link rel="stylesheet" href="//unpkg.com/docsify/lib/themes/buble.css" title="buble" disabled>
<link rel="stylesheet" href="//unpkg.com/docsify/lib/themes/pure.css" title="pure" disabled>
<script src="//unpkg.com/docsify-plugin-codefund/index.js"></script>
<style>
nav.app-nav li ul {
min-width: 100px;
}
</style>
</head>
<body>
<div id="app">Loading ...</div>
<script>
window.$docsify = {
alias: {
'.*?/awesome': 'https://raw.githubusercontent.com/docsifyjs/awesome-docsify/master/README.md',
'.*?/changelog': 'https://raw.githubusercontent.com/docsifyjs/docsify/master/CHANGELOG.md',
'/.*/_navbar.md': '/_navbar.md',
'/zh-cn/(.*)': 'https://raw.githubusercontent.com/docsifyjs/docs-zh/master/$1',
'/de-de/(.*)': 'https://raw.githubusercontent.com/docsifyjs/docs-de/master/$1',
'/ru/(.*)': 'https://raw.githubusercontent.com/docsifyjs/docs-ru/master/$1',
'/es/(.*)': 'https://raw.githubusercontent.com/docsifyjs/docs-es/master/$1'
},
auto2top: true,
coverpage: true,
executeScript: true,
loadSidebar: true,
loadNavbar: true,
mergeNavbar: true,
maxLevel: 4,
subMaxLevel: 2,
ga: 'UA-106147152-1',
matomo: {
host: '//matomo.thunderwave.de',
id: 6
},
name: 'docsify',
search: {
noData: {
'/de-de/': 'Keine Ergebnisse!',
'/zh-cn/': '没有结果!',
'/': 'No results!'
},
auto2top: true,
coverpage: true,
executeScript: true,
loadSidebar: true,
loadNavbar: true,
mergeNavbar: true,
maxLevel: 4,
subMaxLevel: 2,
ga: "UA-106147152-1",
name: "docsify",
search: {
noData: {
"/de-de/": "Keine Ergebnisse!",
"/zh-cn/": "没有结果!",
"/": "No results!"
},
paths: "auto",
placeholder: {
"/de-de/": "Suche",
"/zh-cn/": "搜索",
"/": "Search"
}
paths: 'auto',
placeholder: {
'/de-de/': 'Suche',
'/zh-cn/': '搜索',
'/': 'Search'
}
},
formatUpdated: '{MM}/{DD} {HH}:{mm}',
plugins: [
function (hook, vm) {
hook.beforeEach(function (html) {
if (/githubusercontent\.com/.test(vm.route.file)) {
url = vm.route.file
.replace('raw.githubusercontent.com', 'github.com')
.replace(/\/master/, '/blob/master')
} else {
url = 'https://github.com/docsifyjs/docsify/blob/master/docs/' + vm.route.file
}
var editHtml = '[:memo: Edit Document](' + url + ')\n'
return editHtml
+ html
+ '\n\n----\n\n'
+ '<a href="https://docsify.js.org" target="_blank" style="color: inherit; font-weight: normal; text-decoration: none;">Powered by docsify</a>'
})
},
formatUpdated: "{MM}/{DD} {HH}:{mm}",
plugins: [
function(hook, vm) {
hook.beforeEach(function(html) {
if (/githubusercontent\.com/.test(vm.route.file)) {
url = vm.route.file
.replace("raw.githubusercontent.com", "github.com")
.replace(/\/master/, "/blob/master");
} else {
url =
"https://github.com/docsifyjs/docsify/blob/master/docs/" +
vm.route.file;
}
var editHtml = "[:memo: Edit Document](" + url + ")\n";
return (
editHtml +
html +
"\n\n----\n\n" +
'<a href="https://docsify.js.org" target="_blank" style="color: inherit; font-weight: normal; text-decoration: none;">Powered by docsify</a>'
);
});
},
DocsifyCodefund.create("fae1f9a4-870c-4c25-b8e0-c80464f7a95c")
]
};
</script>
<script src="//unpkg.com/docsify/lib/docsify.min.js"></script>
<script src="//unpkg.com/docsify/lib/plugins/search.min.js"></script>
<script src="//unpkg.com/docsify/lib/plugins/ga.min.js"></script>
<script src="//unpkg.com/prismjs/components/prism-bash.min.js"></script>
<script src="//unpkg.com/prismjs/components/prism-markdown.min.js"></script>
<script src="//unpkg.com/prismjs/components/prism-nginx.min.js"></script>
<script>
((window.gitter = {}).chat = {}).options = {
room: "docsifyjs/Lobby"
};
</script>
<script
src="https://sidecar.gitter.im/dist/sidecar.v1.js"
async
defer
></script>
</body>
DocsifyCodefund.create('fae1f9a4-870c-4c25-b8e0-c80464f7a95c')
]
}
</script>
<script src="//unpkg.com/docsify/lib/docsify.min.js"></script>
<script src="//unpkg.com/docsify/lib/plugins/search.min.js"></script>
<script src="//unpkg.com/docsify/lib/plugins/ga.min.js"></script>
<script src="//unpkg.com/docsify/lib/plugins/matomo.min.js"></script>
<script src="//unpkg.com/prismjs/components/prism-bash.min.js"></script>
<script src="//unpkg.com/prismjs/components/prism-markdown.min.js"></script>
<script src="//unpkg.com/prismjs/components/prism-nginx.min.js"></script>
<script>
((window.gitter = {}).chat = {}).options = {
room: 'docsifyjs/Lobby'
};
</script>
<script src="https://sidecar.gitter.im/dist/sidecar.v1.js" async defer></script>
</body>
</html>
+13 -3
View File
@@ -18,9 +18,9 @@ Matching routes
```text
docs/README.md => http://domain.com
docs/guide.md => http://domain.com/guide
docs/zh-cn/README.md => http://domain.com/zh-cn/
docs/zh-cn/guide.md => http://domain.com/zh-cn/guide
docs/guide.md => http://domain.com/#/guide
docs/zh-cn/README.md => http://domain.com/#/zh-cn/
docs/zh-cn/guide.md => http://domain.com/#/zh-cn/guide
```
## Sidebar
@@ -72,6 +72,16 @@ You can specify `alias` to avoid unnecessary fallback.
!> You can create a `README.md` file in a subdirectory to use it as the landing page for the route.
## Set Page Titles from Sidebar Selection
A page's `title` tag is generated from the _selected_ sidebar item name. For better SEO, you can customize the title by specifying a string after the filename.
```markdown
<!-- docs/_sidebar.md -->
* [Home](/)
* [Guide](guide.md "The greatest guide in the world")
```
## Table of Contents
Once you've created `_sidebar.md`, the sidebar content is automatically generated based on the headers in the markdown files.
-50
View File
@@ -1,50 +0,0 @@
# Generate static html
> _Experimental feature_
Generating static html files is good for SEO and speeds up the first rendering.
But this is not an advantage of docsify. If you only need powerful static documentation, choose another documentation tool like Gitbook or Vuepress.
## Configuration
You can configure it in a special config file.
_config.js_
```js
module.exports = {
template: `<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>My Doc</title>
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" />
<meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
<link rel="stylesheet" href="//unpkg.com/docsify/lib/themes/vue.css" title="vue">
</head>
<body>
<!--inject-app-->
<!--inject-config-->
<script src="//unpkg.com/docsify/lib/docsify.min.js"></script>
</body>
</html>`, // or html file path
config: {
// docsify config
coverpage: true
}
};
```
## Generate
Please use docsify-cli 5.0+ and run this command.
```sh
docsify static docs -c config.js
```
## Simple Demo
This is an example showing the docsify official documentation generating static files. [docsify-static-demo](https://github.com/docsifyjs/docsify-static-demo)
+1 -1
View File
@@ -79,7 +79,7 @@ window.$docsify = {
function(hook, vm) {
hook.beforeEach(function(html) {
var url =
'https://github.com/docsifyjs/docsify/blob/master/docs' +
'https://github.com/docsifyjs/docsify/blob/master/docs/' +
vm.route.file;
var editHtml = '[📝 EDIT DOCUMENT](' + url + ')\n';
+28 -12
View File
@@ -21,48 +21,64 @@
<script>
window.$docsify = {
alias: {
'.*?/changelog': 'https://raw.githubusercontent.com/docsifyjs/docsify/master/CHANGELOG',
'.*?/awesome': 'https://raw.githubusercontent.com/docsifyjs/awesome-docsify/master/README.md',
'.*?/changelog': 'https://raw.githubusercontent.com/docsifyjs/docsify/master/CHANGELOG.md',
'/.*/_navbar.md': '/_navbar.md',
'/zh-cn/(.*)': 'https://raw.githubusercontent.com/docsifyjs/docs-zh/master/$1',
'/de-de/(.*)': 'https://raw.githubusercontent.com/docsifyjs/docs-de/master/$1',
'/ru/(.*)': 'https://raw.githubusercontent.com/docsifyjs/docs-ru/master/$1',
'/es/(.*)': 'https://raw.githubusercontent.com/docsifyjs/docs-es/master/$1'
},
notFoundPage: '_404.html',
auto2top: true,
basePath: '/docs/',
executeScript: true,
loadNavbar: true,
loadSidebar: true,
coverpage: true,
name: 'docsify',
subMaxLevel: 2,
executeScript: true,
loadSidebar: true,
loadNavbar: true,
mergeNavbar: true,
maxLevel: 4,
subMaxLevel: 2,
name: 'docsify',
search: {
noData: {
'/de-de/': 'Keine Ergebnisse!',
'/zh-cn/': '没有结果!',
'/': 'No results!'
},
paths: 'auto',
placeholder: {
'/de-de/': 'Suche',
'/zh-cn/': '搜索',
'/': 'Search'
}
},
formatUpdated: '{MM}/{DD} {HH}:{mm}',
plugins: [
function (hook, vm) {
hook.beforeEach(function (html) {
var url
if (/githubusercontent\.com/.test(vm.route.file)) {
url = vm.route.file
.replace('raw.githubusercontent.com', 'github.com')
.replace(/\/master/, '/blob/master')
} else {
url = 'https://github.com/docsifyjs/docsify/blob/master/' + vm.route.file
url = 'https://github.com/docsifyjs/docsify/blob/master/docs/' + vm.route.file
}
var editHtml = '[:memo: Edit Document](' + url + ')\n'
return editHtml
+ html
+ '\n\n----\n\n'
+ 'Last modified {docsify-updated} '
+ editHtml
+ '<a href="https://docsify.js.org" target="_blank" style="color: inherit; font-weight: normal; text-decoration: none;">Powered by docsify</a>'
})
}
},
]
}
</script>
<script src="/lib/docsify.js"></script>
<script src="/lib/plugins/search.js"></script>
<script src="//unpkg.com/prismjs/components/prism-bash.min.js"></script>
<script src="//unpkg.com/prismjs/components/prism-markdown.min.js"></script>
<script src="//unpkg.com/prismjs/components/prism-nginx.min.js"></script>
</body>
</html>
+6679 -4108
View File
File diff suppressed because it is too large Load Diff
+27 -28
View File
@@ -1,6 +1,6 @@
{
"name": "docsify",
"version": "4.9.1",
"version": "4.10.0",
"description": "A magical documentation generator.",
"author": {
"name": "qingwei-li",
@@ -28,50 +28,51 @@
"dev:ssr": "run-p serve:ssr watch:*",
"lint": "eslint {src,packages} --fix",
"test": "mocha test/*/**",
"css": "stylus src/themes/*.styl -u autoprefixer-stylus",
"watch:css": "run-p 'css -- -o themes -w'",
"css": "node build/css",
"watch:css": "npm run css -- -o themes -w",
"watch:js": "node build/build.js",
"build:css:min": "mkdir lib/themes && run-p 'css -- -o lib/themes' && node build/mincss.js",
"build:css": "mkdir themes && run-p 'css -- -o themes'",
"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: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",
"pub:next": "cross-env RELEASE_TAG=next sh build/release.sh",
"pub": "sh build/release.sh",
"postinstall": "opencollective postinstall"
"postinstall": "opencollective-postinstall"
},
"dependencies": {
"marked": "^0.5.1",
"medium-zoom": "^0.4.0",
"opencollective": "^1.0.3",
"marked": "^0.7.0",
"medium-zoom": "^1.0.4",
"opencollective-postinstall": "^2.0.2",
"prismjs": "^1.15.0",
"tinydate": "^1.0.0",
"tweezer.js": "^1.4.0"
},
"devDependencies": {
"autoprefixer-stylus": "^0.14.0",
"autoprefixer-stylus": "^1.0.0",
"chai": "^4.2.0",
"chokidar": "^2.0.2",
"conventional-changelog-cli": "^1.3.5",
"cross-env": "^5.1.3",
"cssnano": "^3.10.0",
"eslint": "^4.14.0",
"eslint-config-xo-space": "^0.18.0",
"chokidar": "^3.2.1",
"conventional-changelog-cli": "^2.0.25",
"cross-env": "^6.0.3",
"cssnano": "^4.1.10",
"eslint": "^5.16.0",
"eslint-config-xo-space": "^0.21.0",
"esm": "^3.1.4",
"jsdom": "^13.2.0",
"lerna": "^2.5.1",
"jsdom": "^15.1.1",
"lerna": "^3.17.0",
"live-server": "^1.2.1",
"mkdirp": "^0.5.1",
"mocha": "^5.2.0",
"npm-run-all": "^4.1.5",
"rimraf": "^2.6.2",
"rollup": "^0.53.3",
"rimraf": "^3.0.0",
"rollup": "^1.23.1",
"rollup-plugin-async": "^1.2.0",
"rollup-plugin-buble": "^0.18.0",
"rollup-plugin-commonjs": "^8.2.6",
"rollup-plugin-node-resolve": "^3.0.0",
"rollup-plugin-replace": "^2.0.0",
"rollup-plugin-uglify": "^2.0.1",
"rollup-plugin-buble": "^0.19.8",
"rollup-plugin-commonjs": "^10.1.0",
"rollup-plugin-node-resolve": "^5.2.0",
"rollup-plugin-replace": "^2.2.0",
"rollup-plugin-uglify": "^6.0.4",
"stylus": "^0.54.5"
},
"keywords": [
@@ -82,8 +83,6 @@
"generator"
],
"collective": {
"type": "opencollective",
"url": "https://opencollective.com/docsify",
"logo": "https://docsify.js.org/_media/icon.svg"
"url": "https://opencollective.com/docsify"
}
}
+16 -32
View File
@@ -22,7 +22,7 @@ function mainTpl(config) {
html += tpl.corner(config.repo)
}
if (config.coverpage) {
html += '<!--cover-->'
html += tpl.cover()
}
html += tpl.main(config)
@@ -31,13 +31,12 @@ function mainTpl(config) {
}
export default class Renderer {
constructor({template, config, cache, path}) {
constructor({template, config, cache}) {
this.html = template
this.config = config = Object.assign({}, config, {
routerMode: 'history'
})
this.cache = cache
this.path = path
this.router = new AbstractHistory(config)
this.compiler = new Compiler(config, this.router)
@@ -53,19 +52,9 @@ export default class Renderer {
}
_getPath(url) {
const path = resolve(this.path, url)
const file = this.router.getFile(path)
return file
}
const file = this.router.getFile(url)
async render(url) {
const content = await this.renderToString(url)
return {
content,
url: this.router.parse(url).path,
path: this._getPath(url)
}
return isAbsolutePath(file) ? file : cwd(`./${file}`)
}
async renderToString(url) {
@@ -77,35 +66,32 @@ export default class Renderer {
if (loadSidebar) {
const name = loadSidebar === true ? '_sidebar.md' : loadSidebar
const sidebarFile = this._getPath(resolvePathname(name, url))
const sidebarFile = this._getPath(resolve(url, `./${name}`))
this._renderHtml('sidebar', await this._render(sidebarFile, 'sidebar'))
}
if (loadNavbar) {
const name = loadNavbar === true ? '_navbar.md' : loadNavbar
const navbarFile = this._getPath(resolvePathname(name, url))
const navbarFile = this._getPath(resolve(url, `./${name}`))
this._renderHtml('navbar', await this._render(navbarFile, 'navbar'))
}
if (coverpage) {
let name = null
if (typeof coverpage === 'string' || coverpage === true) {
if (url === 'README.md') {
name = coverpage === true ? '_coverpage.md' : coverpage
let path = null
if (typeof coverpage === 'string') {
if (url === '/') {
path = coverpage
}
} else if (Array.isArray(coverpage)) {
name = coverpage.indexOf(url) > -1 && '_coverpage.md'
path = coverpage.indexOf(url) > -1 && '_coverpage.md'
} else {
const cover = coverpage[url]
name = cover === true ? '_coverpage.md' : cover
path = cover === true ? '_coverpage.md' : cover
}
if (name) {
const coverFile = this._getPath(resolvePathname(name, url))
const coverFile = this._getPath(resolve(url, `./${path}`))
this._renderHtml('cover', await this._render(coverFile, 'cover'))
}
this._renderHtml('cover', await this._render(coverFile), 'cover')
}
const html = this.html
@@ -122,7 +108,6 @@ export default class Renderer {
async _render(path, type) {
let html = await this._loadFile(path)
const {subMaxLevel, maxLevel} = this.config
let tokens
@@ -141,8 +126,7 @@ export default class Renderer {
tokens = await new Promise(r => {
prerenderEmbed(
{
// Url is absolute path
fetch: url => this._loadFile(this._getPath('.' + url)),
fetch: url => this._loadFile(this._getPath(url)),
compiler: this.compiler,
raw: html
},
@@ -179,7 +163,7 @@ export default class Renderer {
return content
} catch (e) {
this.lock = this.lock || 0
if (++this.lock > 4) {
if (++this.lock > 10) {
this.lock = 0
return
}
+437 -39
View File
@@ -1,41 +1,439 @@
{
"lockfileVersion": 1,
"dependencies": {
"debug": {
"version": "2.6.8",
"resolved": "https://registry.npmjs.org/debug/-/debug-2.6.8.tgz",
"integrity": "sha1-5zFTHKLt4n0YgiJCfaF4IdaP9Pw="
},
"encoding": {
"version": "0.1.12",
"resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.12.tgz",
"integrity": "sha1-U4tm8+5izRq1HsMjgp0flIDHS+s="
},
"iconv-lite": {
"version": "0.4.18",
"resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.18.tgz",
"integrity": "sha512-sr1ZQph3UwHTR0XftSbK85OvBbxe/abLGzEnPENCQwmHf7sck8Oyu4ob3LgBxWWxRoM+QszeUyl7jbqapu2TqA=="
},
"is-stream": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz",
"integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ="
},
"ms": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
"integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
},
"node-fetch": {
"version": "1.7.1",
"resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-1.7.1.tgz",
"integrity": "sha512-j8XsFGCLw79vWXkZtMSmmLaOk9z5SQ9bV/tkbZVCqvgwzrjAGq66igobLofHtF63NvMTp2WjytpsNTGKa+XRIQ=="
},
"resolve-pathname": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/resolve-pathname/-/resolve-pathname-2.1.0.tgz",
"integrity": "sha1-6DWIAbhrg7F1YNTjw4LXrvIQCUQ="
}
},
"version": "4.9.1"
"name": "docsify-server-renderer",
"version": "4.10.0",
"lockfileVersion": 1,
"requires": true,
"dependencies": {
"ansi-escapes": {
"version": "1.4.0",
"resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-1.4.0.tgz",
"integrity": "sha1-06ioOzGapneTZisT52HHkRQiMG4="
},
"ansi-regex": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
"integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8="
},
"ansi-styles": {
"version": "2.2.1",
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
"integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4="
},
"babel-polyfill": {
"version": "6.23.0",
"resolved": "https://registry.npmjs.org/babel-polyfill/-/babel-polyfill-6.23.0.tgz",
"integrity": "sha1-g2TKYt+Or7gwSZ9pkXdGbDsDSZ0=",
"requires": {
"babel-runtime": "^6.22.0",
"core-js": "^2.4.0",
"regenerator-runtime": "^0.10.0"
}
},
"babel-runtime": {
"version": "6.26.0",
"resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz",
"integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=",
"requires": {
"core-js": "^2.4.0",
"regenerator-runtime": "^0.11.0"
},
"dependencies": {
"regenerator-runtime": {
"version": "0.11.1",
"resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz",
"integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg=="
}
}
},
"chalk": {
"version": "1.1.3",
"resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
"integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
"requires": {
"ansi-styles": "^2.2.1",
"escape-string-regexp": "^1.0.2",
"has-ansi": "^2.0.0",
"strip-ansi": "^3.0.0",
"supports-color": "^2.0.0"
}
},
"chardet": {
"version": "0.4.2",
"resolved": "https://registry.npmjs.org/chardet/-/chardet-0.4.2.tgz",
"integrity": "sha1-tUc7M9yXxCTl2Y3IfVXU2KKci/I="
},
"cli-cursor": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz",
"integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=",
"requires": {
"restore-cursor": "^2.0.0"
}
},
"cli-width": {
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz",
"integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk="
},
"clipboard": {
"version": "2.0.4",
"resolved": "https://registry.npmjs.org/clipboard/-/clipboard-2.0.4.tgz",
"integrity": "sha512-Vw26VSLRpJfBofiVaFb/I8PVfdI1OxKcYShe6fm0sP/DtmiWQNCjhM/okTvdCo0G+lMMm1rMYbk4IK4x1X+kgQ==",
"optional": true,
"requires": {
"good-listener": "^1.2.2",
"select": "^1.1.2",
"tiny-emitter": "^2.0.0"
}
},
"core-js": {
"version": "2.6.9",
"resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.9.tgz",
"integrity": "sha512-HOpZf6eXmnl7la+cUdMnLvUxKNqLUzJvgIziQ0DiF3JwSImNphIqdGqzj6hIKyX04MmV0poclQ7+wjWvxQyR2A=="
},
"debug": {
"version": "4.1.1",
"resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz",
"integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==",
"requires": {
"ms": "^2.1.1"
}
},
"delegate": {
"version": "3.2.0",
"resolved": "https://registry.npmjs.org/delegate/-/delegate-3.2.0.tgz",
"integrity": "sha512-IofjkYBZaZivn0V8nnsMJGBr4jVLxHDheKSW88PyxS5QC4Vo9ZbZVvhzlSxY87fVq3STR6r+4cGepyHkcWOQSw==",
"optional": true
},
"docsify": {
"version": "4.9.4",
"resolved": "https://registry.npmjs.org/docsify/-/docsify-4.9.4.tgz",
"integrity": "sha512-Xtm6sfrNU7cqOViWMewDhscn0cySF60q2KTKok9OaPmzt6nRkTAIvYU4dj916IT21o/b336Or3vO2hsvmaQzxg==",
"requires": {
"marked": "^0.5.1",
"medium-zoom": "^0.4.0",
"opencollective": "^1.0.3",
"prismjs": "^1.15.0",
"tinydate": "^1.0.0",
"tweezer.js": "^1.4.0"
}
},
"encoding": {
"version": "0.1.12",
"resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.12.tgz",
"integrity": "sha1-U4tm8+5izRq1HsMjgp0flIDHS+s=",
"requires": {
"iconv-lite": "~0.4.13"
}
},
"escape-string-regexp": {
"version": "1.0.5",
"resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
"integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ="
},
"external-editor": {
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/external-editor/-/external-editor-2.2.0.tgz",
"integrity": "sha512-bSn6gvGxKt+b7+6TKEv1ZycHleA7aHhRHyAqJyp5pbUFuYYNIzpZnQDk7AsYckyWdEnTeAnay0aCy2aV6iTk9A==",
"requires": {
"chardet": "^0.4.0",
"iconv-lite": "^0.4.17",
"tmp": "^0.0.33"
}
},
"figures": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz",
"integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=",
"requires": {
"escape-string-regexp": "^1.0.5"
}
},
"good-listener": {
"version": "1.2.2",
"resolved": "https://registry.npmjs.org/good-listener/-/good-listener-1.2.2.tgz",
"integrity": "sha1-1TswzfkxPf+33JoNR3CWqm0UXFA=",
"optional": true,
"requires": {
"delegate": "^3.1.2"
}
},
"has-ansi": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz",
"integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=",
"requires": {
"ansi-regex": "^2.0.0"
}
},
"iconv-lite": {
"version": "0.4.24",
"resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
"integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
"requires": {
"safer-buffer": ">= 2.1.2 < 3"
}
},
"inquirer": {
"version": "3.0.6",
"resolved": "https://registry.npmjs.org/inquirer/-/inquirer-3.0.6.tgz",
"integrity": "sha1-4EqqnQW3o8ubD0B9BDdfBEcZA0c=",
"requires": {
"ansi-escapes": "^1.1.0",
"chalk": "^1.0.0",
"cli-cursor": "^2.1.0",
"cli-width": "^2.0.0",
"external-editor": "^2.0.1",
"figures": "^2.0.0",
"lodash": "^4.3.0",
"mute-stream": "0.0.7",
"run-async": "^2.2.0",
"rx": "^4.1.0",
"string-width": "^2.0.0",
"strip-ansi": "^3.0.0",
"through": "^2.3.6"
}
},
"is-fullwidth-code-point": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
"integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8="
},
"is-promise": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz",
"integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o="
},
"is-stream": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz",
"integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ="
},
"lodash": {
"version": "4.17.15",
"resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz",
"integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A=="
},
"marked": {
"version": "0.5.2",
"resolved": "https://registry.npmjs.org/marked/-/marked-0.5.2.tgz",
"integrity": "sha512-fdZvBa7/vSQIZCi4uuwo2N3q+7jJURpMVCcbaX0S1Mg65WZ5ilXvC67MviJAsdjqqgD+CEq4RKo5AYGgINkVAA=="
},
"medium-zoom": {
"version": "0.4.0",
"resolved": "https://registry.npmjs.org/medium-zoom/-/medium-zoom-0.4.0.tgz",
"integrity": "sha512-0z7yMfd6I1BTCAa8QaR4cp5AqDkQD571GzhHIbbfefKEssGLSvs+4Xai/itOAncm4FBlF5gUoMQ22yW9/f8Sig=="
},
"mimic-fn": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz",
"integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ=="
},
"minimist": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz",
"integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ="
},
"ms": {
"version": "2.1.2",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
"integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
},
"mute-stream": {
"version": "0.0.7",
"resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz",
"integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s="
},
"node-fetch": {
"version": "2.6.0",
"resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.0.tgz",
"integrity": "sha512-8dG4H5ujfvFiqDmVu9fQ5bOHUC15JMjMY/Zumv26oOvvVJjM67KF8koCWIabKQ1GJIa9r2mMZscBq/TbdOcmNA=="
},
"object-assign": {
"version": "4.1.1",
"resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
"integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM="
},
"onetime": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz",
"integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=",
"requires": {
"mimic-fn": "^1.0.0"
}
},
"opencollective": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/opencollective/-/opencollective-1.0.3.tgz",
"integrity": "sha1-ruY3K8KBRFg2kMPKja7PwSDdDvE=",
"requires": {
"babel-polyfill": "6.23.0",
"chalk": "1.1.3",
"inquirer": "3.0.6",
"minimist": "1.2.0",
"node-fetch": "1.6.3",
"opn": "4.0.2"
},
"dependencies": {
"node-fetch": {
"version": "1.6.3",
"resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-1.6.3.tgz",
"integrity": "sha1-3CNO3WSJmC1Y6PDbT2lQKavNjAQ=",
"requires": {
"encoding": "^0.1.11",
"is-stream": "^1.0.1"
}
}
}
},
"opn": {
"version": "4.0.2",
"resolved": "https://registry.npmjs.org/opn/-/opn-4.0.2.tgz",
"integrity": "sha1-erwi5kTf9jsKltWrfyeQwPAavJU=",
"requires": {
"object-assign": "^4.0.1",
"pinkie-promise": "^2.0.0"
}
},
"os-tmpdir": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz",
"integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ="
},
"pinkie": {
"version": "2.0.4",
"resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz",
"integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA="
},
"pinkie-promise": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz",
"integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=",
"requires": {
"pinkie": "^2.0.0"
}
},
"prismjs": {
"version": "1.17.1",
"resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.17.1.tgz",
"integrity": "sha512-PrEDJAFdUGbOP6xK/UsfkC5ghJsPJviKgnQOoxaDbBjwc8op68Quupwt1DeAFoG8GImPhiKXAvvsH7wDSLsu1Q==",
"requires": {
"clipboard": "^2.0.0"
}
},
"regenerator-runtime": {
"version": "0.10.5",
"resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz",
"integrity": "sha1-M2w+/BIgrc7dosn6tntaeVWjNlg="
},
"resolve-pathname": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/resolve-pathname/-/resolve-pathname-3.0.0.tgz",
"integrity": "sha512-C7rARubxI8bXFNB/hqcp/4iUeIXJhJZvFPFPiSPRnhU5UPxzMFIl+2E6yY6c4k9giDJAhtV+enfA+G89N6Csng=="
},
"restore-cursor": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz",
"integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=",
"requires": {
"onetime": "^2.0.0",
"signal-exit": "^3.0.2"
}
},
"run-async": {
"version": "2.3.0",
"resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz",
"integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=",
"requires": {
"is-promise": "^2.1.0"
}
},
"rx": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/rx/-/rx-4.1.0.tgz",
"integrity": "sha1-pfE/957zt0D+MKqAP7CfmIBdR4I="
},
"safer-buffer": {
"version": "2.1.2",
"resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
"integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
},
"select": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/select/-/select-1.1.2.tgz",
"integrity": "sha1-DnNQrN7ICxEIUoeG7B1EGNEbOW0=",
"optional": true
},
"signal-exit": {
"version": "3.0.2",
"resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz",
"integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0="
},
"string-width": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz",
"integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==",
"requires": {
"is-fullwidth-code-point": "^2.0.0",
"strip-ansi": "^4.0.0"
},
"dependencies": {
"ansi-regex": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz",
"integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg="
},
"strip-ansi": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz",
"integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=",
"requires": {
"ansi-regex": "^3.0.0"
}
}
}
},
"strip-ansi": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
"integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
"requires": {
"ansi-regex": "^2.0.0"
}
},
"supports-color": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
"integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc="
},
"through": {
"version": "2.3.8",
"resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz",
"integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU="
},
"tiny-emitter": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/tiny-emitter/-/tiny-emitter-2.1.0.tgz",
"integrity": "sha512-NB6Dk1A9xgQPMoGqC5CVXn123gWyte215ONT5Pp5a0yt4nlEoO1ZWeCwpncaekPHXO60i47ihFnZPiRPjRMq4Q==",
"optional": true
},
"tinydate": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/tinydate/-/tinydate-1.2.0.tgz",
"integrity": "sha512-3GwPk8VhDFnUZ2TrgkhXJs6hcMAIIw4x/xkz+ayK6dGoQmp2nUwKzBXK0WnMsqkh6vfUhpqQicQF3rbshfyJkg=="
},
"tmp": {
"version": "0.0.33",
"resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz",
"integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==",
"requires": {
"os-tmpdir": "~1.0.2"
}
},
"tweezer.js": {
"version": "1.5.0",
"resolved": "https://registry.npmjs.org/tweezer.js/-/tweezer.js-1.5.0.tgz",
"integrity": "sha512-aSiJz7rGWNAQq7hjMK9ZYDuEawXupcCWgl3woQQSoDP2Oh8O4srWb/uO1PzzHIsrPEOqrjJ2sUb9FERfzuBabQ=="
}
}
}
@@ -1,6 +1,6 @@
{
"name": "docsify-server-renderer",
"version": "4.9.1",
"version": "4.10.0",
"description": "docsify server renderer",
"author": {
"name": "qingwei-li",
@@ -15,9 +15,9 @@
"test": "echo 'hello'"
},
"dependencies": {
"debug": "^2.6.8",
"debug": "^4.1.1",
"docsify": "^4.8.0",
"node-fetch": "^1.7.0",
"resolve-pathname": "^2.1.0"
"node-fetch": "^2.6.0",
"resolve-pathname": "^3.0.0"
}
}
+6 -1
View File
@@ -23,9 +23,14 @@ export default function () {
ext: '.md',
mergeNavbar: false,
formatUpdated: '',
// this config for the links inside markdown
externalLinkTarget: '_blank',
// this config for the corner
cornerExternalLinkTarget: '_blank',
externalLinkRel: 'noopener',
routerMode: 'hash',
noCompileLinks: []
noCompileLinks: [],
relativePath: false
},
window.$docsify
)
+28 -92
View File
@@ -1,12 +1,6 @@
import marked from 'marked'
import Prism from 'prismjs'
import {
helper as helperTpl,
newHelper as newHelperTpl,
tree as treeTpl,
cover as coverTpl,
details as detailsTpl
} from './tpl'
import {helper as helperTpl, tree as treeTpl} from './tpl'
import {genTree} from './gen-tree'
import {slugify} from './slugify'
import {emojify} from './emojify'
@@ -84,6 +78,7 @@ export class Compiler {
this.toc = []
this.cacheTOC = {}
this.linkTarget = config.externalLinkTarget || '_blank'
this.linkRel = this.linkTarget === '_blank' ? (config.externalLinkRel || 'noopener') : ''
this.contentBase = router.getBasePath()
const renderer = this._initRenderer()
@@ -191,13 +186,13 @@ export class Compiler {
_initRenderer() {
const renderer = new marked.Renderer()
const {linkTarget, router, contentBase} = this
const {linkTarget, linkRel, router, contentBase} = this
const _self = this
const origin = {}
/**
* Render anchor tag
* @link https://marked.js.org/#/USING_PRO.md#renderer
* @link https://github.com/markedjs/marked#overriding-renderer-methods
*/
origin.heading = renderer.heading = function (text, level) {
let {str, config} = getAndRemoveConfig(text)
@@ -249,6 +244,7 @@ export class Compiler {
href = router.toURL(href, null, router.getCurrentPath())
} else {
attrs += href.indexOf('mailto:') === 0 ? '' : ` target="${linkTarget}"`
attrs += href.indexOf('mailto:') === 0 ? '' : (linkRel !== '' ? ` rel="${linkRel}"` : '')
}
if (config.target) {
@@ -309,68 +305,22 @@ export class Compiler {
return `<img src="${url}"data-origin="${href}" alt="${text}"${attrs}>`
}
origin.list = renderer.list = function (body, ordered, start) {
const isTaskList = /<li class="task-list-item">/.test(
body.split('class="task-list"')[0]
)
const isTaskList = /<li class="task-list-item">/.test(body.split('class="task-list"')[0])
const isStartReq = start && start > 1
const tag = ordered ? 'ol' : 'ul'
const tagAttrs = [
isTaskList ? 'class="task-list"' : '',
isStartReq ? `start="${start}"` : ''
]
.join(' ')
.trim()
(isTaskList ? 'class="task-list"' : ''),
(isStartReq ? `start="${start}"` : '')
].join(' ').trim()
return `<${tag} ${tagAttrs}>${body}</${tag}>`
}
origin.listitem = renderer.listitem = function (text) {
const isTaskItem = /^(<input.*type="checkbox"[^>]*>)/.test(text)
const html = isTaskItem ?
`<li class="task-list-item"><label>${text}</label></li>` :
`<li>${text}</li>`
const html = isTaskItem ? `<li class="task-list-item"><label>${text}</label></li>` : `<li>${text}</li>`
return html
}
origin.blockquote = renderer.blockquote = function (quote) {
const m = quote.match(/^\<p\>(\[\S+\])/)
if (m) {
const text = quote.replace(m[1], '')
switch (m[1]) {
case '[!]':
result = newHelperTpl('docsify-tip', text)
break
case '[?]':
result = newHelperTpl('docsify-warn', text)
break
case '[x]':
result = newHelperTpl('docsify-error', text)
break
case '[v]':
result = newHelperTpl('docsify-success', text)
break
case '[details]':
case '[details:open]':
let summary = false
const html = text.replace(
/^\<p\>([^<]+)<\/p>([\s\S]+)/,
(m, m1, m2) => {
summary = m1
return m2
}
)
const open = Boolean(/:open/.test(m[1]))
result = detailsTpl({open, summary, html})
break
default:
return quote
}
return result
}
return quote
}
renderer.origin = origin
@@ -381,13 +331,25 @@ export class Compiler {
* Compile sidebar
*/
sidebar(text, level) {
const {toc} = this
const currentPath = this.router.getCurrentPath()
let html = ''
if (text) {
html = this.compile(text)
} else {
const tree = this.cacheTree[currentPath] || genTree(this.toc, level)
for (let i = 0; i < toc.length; i++) {
if (toc[i].ignoreSubHeading) {
const deletedHeaderLevel = toc[i].level
toc.splice(i, 1)
// Remove headers who are under current header
for (let j = i; deletedHeaderLevel < toc[j].level && j < toc.length; j++) {
toc.splice(j, 1) && j-- && i++
}
i--
}
}
const tree = this.cacheTree[currentPath] || genTree(toc, level)
html = treeTpl(tree, '<ul>{inner}</ul>')
this.cacheTree[currentPath] = tree
}
@@ -412,7 +374,6 @@ export class Compiler {
for (let i = 0; i < toc.length; i++) {
toc[i].ignoreSubHeading && toc.splice(i, 1) && i--
}
const tree = cacheTree[currentPath] || genTree(toc, level)
cacheTree[currentPath] = tree
@@ -427,37 +388,12 @@ export class Compiler {
/**
* Compile cover page
*/
cover(text, isHTML = false) {
let html = text
if (!isHTML) {
const cacheToc = this.toc.slice()
html = this.compile(text) || ''
this.toc = cacheToc.slice()
}
cover(text) {
const cacheToc = this.toc.slice()
const html = this.compile(text)
const m = html
.trim()
.match('<p><img.*?data-origin="(.*?)"[^a]+alt="(.*?)">([^<]*?)</p>$')
let style = ''
let hasMask = false
if (m) {
if (m[2] === 'color') {
style = `background: ${m[1] + (m[3] || '')}`
} else {
let path = m[1]
hasMask = true
if (!isAbsolutePath(m[1])) {
path = getPath(this.router.getBasePath(), m[1])
}
style = `background-image: url(${path}); background-size: cover; background-position: center center;`
}
html = html.replace(m[0], '')
}
this.toc = cacheToc.slice()
return coverTpl({
style,
hasMask,
text: html
})
return html
}
}
+2 -4
View File
@@ -22,10 +22,8 @@ function walkFetchEmbed({embedTokens, compile, fetch}, cb) {
} else if (token.embed.type === 'code') {
if (token.embed.fragment) {
const fragment = token.embed.fragment
const pattern = new RegExp(
`(?:###|\\/\\/\\/)\\s*\\[${fragment}\\]([\\s\\S]*)(?:###|\\/\\/\\/)\\s*\\[${fragment}\\]`
)
text = ((text.match(pattern) || [])[1] || '').trim()
const pattern = new RegExp(`(?:###|\\/\\/\\/)\\s*\\[${fragment}\\]([\\s\\S]*)(?:###|\\/\\/\\/)\\s*\\[${fragment}\\]`)
text = ((text.match(pattern) || [])[1] || '').trim()
}
embedToken = compile.lexer(
'```' +
+24 -5
View File
@@ -175,10 +175,30 @@ export function renderMixin(proto) {
}
dom.toggleClass(el, 'add', 'show')
let html = this.compiler.cover(text, this.coverIsHTML)
let html = this.coverIsHTML ? text : this.compiler.cover(text)
this._renderTo('.cover-placeholder', html, true)
const m = html
.trim()
.match('<p><img.*?data-origin="(.*?)"[^a]+alt="(.*?)">([^<]*?)</p>$')
if (m) {
if (m[2] === 'color') {
el.style.background = m[1] + (m[3] || '')
} else {
let path = m[1]
dom.toggleClass(el, 'add', 'has-mask')
if (!isAbsolutePath(m[1])) {
path = getPath(this.router.getBasePath(), m[1])
}
el.style.backgroundImage = `url(${path})`
el.style.backgroundSize = 'cover'
el.style.backgroundPosition = 'center center'
}
html = html.replace(m[0], '')
}
this._renderTo('.cover-main', html)
sticky()
}
@@ -206,11 +226,10 @@ export function initRender(vm) {
if (el) {
if (config.repo) {
html += tpl.corner(config.repo)
html += tpl.corner(config.repo, config.cornerExternalLinkTarge)
}
if (config.coverpage) {
html += '<div class=cover-placeholder></div>'
html += tpl.cover()
}
if (config.logo) {
+20 -30
View File
@@ -1,10 +1,11 @@
import {isMobile} from '../util/env'
import {escapeString} from '../util/core'
/**
* Render github corner
* @param {Object} data
* @return {String}
*/
export function corner(data) {
export function corner(data, cornerExternalLinkTarge) {
if (!data) {
return ''
}
@@ -12,9 +13,11 @@ export function corner(data) {
data = 'https://github.com/' + data
}
data = data.replace(/^git\+/, '')
// double check
cornerExternalLinkTarge = cornerExternalLinkTarge || '_blank'
return (
`<a href="${data}" class="github-corner" aria-label="View source on Github">` +
`<a href="${data}" target="${cornerExternalLinkTarge}" class="github-corner" aria-label="View source on Github">` +
'<svg viewBox="0 0 250 250" aria-hidden="true">' +
'<path d="M0,0 L115,115 L130,115 L142,142 L250,250 L250,0 Z"></path>' +
'<path d="M128.3,109.0 C113.8,99.7 119.0,89.6 119.0,89.6 C122.0,82.7 120.5,78.6 120.5,78.6 C119.2,72.0 123.4,76.3 123.4,76.3 C127.3,80.9 125.5,87.3 125.5,87.3 C122.9,97.6 130.6,101.9 134.4,103.2" fill="currentColor" style="transform-origin: 130px 106px;" class="octo-arm"></path>' +
@@ -28,8 +31,11 @@ export function corner(data) {
* Render main content
*/
export function main(config) {
const name = config.name? escapeString(config.name):''
const aside =
'<button class="sidebar-toggle">' +
'<button class="sidebar-toggle" aria-label="Menu">' +
'<div class="sidebar-toggle-button">' +
'<span></span><span></span><span></span>' +
'</div>' +
@@ -37,9 +43,9 @@ export function main(config) {
'<aside class="sidebar">' +
(config.name ?
`<h1 class="app-name"><a class="app-name-link" data-nosearch>${
config.logo ?
`<img alt=${config.name} src=${config.logo}>` :
config.name
config.logo ?
`<img alt="${name}" src=${config.logo}>` :
name
}</a></h1>` :
'') +
'<div class="sidebar-nav"><!--sidebar--></div>' +
@@ -57,19 +63,16 @@ export function main(config) {
/**
* Cover Page
*/
export function cover({style, text, hasMask}) {
export function cover() {
const SL = ', 100%, 85%'
style =
style ||
'background: linear-gradient(to left bottom, ' +
`hsl(${Math.floor(Math.random() * 255) + SL}) 0%,` +
`hsl(${Math.floor(Math.random() * 255) + SL}) 100%)`
const bgc =
'linear-gradient(to left bottom, ' +
`hsl(${Math.floor(Math.random() * 255) + SL}) 0%,` +
`hsl(${Math.floor(Math.random() * 255) + SL}) 100%)`
return (
`<section class="cover show ${
hasMask ? ' has-mask' : ''
}" style="${style}">` +
`<div class="cover-main">${text}</div>` +
`<section class="cover show" style="background: ${bgc}">` +
'<div class="cover-main"><!--cover--></div>' +
'<div class="mask"></div>' +
'</section>'
)
@@ -87,9 +90,7 @@ export function tree(toc, tpl = '<ul class="app-sub-sidebar">{inner}</ul>') {
}
let innerHTML = ''
toc.forEach(node => {
innerHTML += `<li><a class="section-link" href="${node.slug}">${
node.title
}</a></li>`
innerHTML += `<li><a class="section-link" href="${node.slug}">${node.title}</a></li>`
if (node.children) {
innerHTML += tree(node.children, tpl)
}
@@ -101,17 +102,6 @@ export function helper(className, content) {
return `<p class="${className}">${content.slice(5).trim()}</p>`
}
export function newHelper(className, content) {
return `<div class="${className}">${content}</div>`
}
export function theme(color) {
return `<style>:root{--theme-color: ${color};}</style>`
}
export function details({open, summary, html}) {
return `<details ${open ? 'open=open' : ''}>${
summary ? `<summary>${summary}</summary>` : ''
}
${html}</details>`
}
+1 -1
View File
@@ -7,7 +7,7 @@ export class AbstractHistory extends History {
this.mode = 'abstract'
}
parse(path = '') {
parse(path) {
let query = ''
const queryIndex = path.indexOf('?')
+9 -6
View File
@@ -3,7 +3,8 @@ import {
isAbsolutePath,
stringifyQuery,
cleanPath,
replaceSlug
replaceSlug,
resolvePath
} from '../util'
import {noop, merge} from '../../util/core'
@@ -21,11 +22,9 @@ function getAlias(path, alias, last) {
}
function getFileName(path, ext) {
return /\.\w+$/.test(path) ?
return new RegExp(`\\.(${ext.replace(/^\./, '')}|html)$`, 'g').test(path) ?
path :
/\/$/g.test(path) ?
`${path}README${ext}` :
`${path}${ext}`
/\/$/g.test(path) ? `${path}README${ext}` : `${path}${ext}`
}
export class History {
@@ -75,9 +74,13 @@ export class History {
if (local) {
const idIndex = currentRoute.indexOf('?')
path =
(idIndex > 0 ? currentRoute.substr(0, idIndex) : currentRoute) + path
(idIndex > 0 ? currentRoute.substring(0, idIndex) : currentRoute) + path
}
if (this.config.relativePath && path.indexOf('/') !== 0) {
const currentDir = currentRoute.substring(0, currentRoute.lastIndexOf('/') + 1)
return cleanPath(resolvePath(currentDir + path))
}
return cleanPath('/' + path)
}
}
+15 -3
View File
@@ -46,15 +46,27 @@ export const isAbsolutePath = cached(path => {
export const getParentPath = cached(path => {
return /\/$/g.test(path) ?
path :
(path = path.match(/(\S*\/)[^/]+$/)) ?
path[1] :
''
(path = path.match(/(\S*\/)[^/]+$/)) ? path[1] : ''
})
export const cleanPath = cached(path => {
return path.replace(/^\/+/, '/').replace(/([^:])\/{2,}/g, '$1/')
})
export const resolvePath = cached(path => {
const segments = path.replace(/^\//, '').split('/')
let resolved = []
for (let i = 0, len = segments.length; i < len; i++) {
const segment = segments[i]
if (segment === '..') {
resolved.pop()
} else if (segment !== '.') {
resolved.push(segment)
}
}
return '/' + resolved.join('/')
})
export function getPath(...args) {
return cleanPath(args.join('/'))
}
+16
View File
@@ -56,3 +56,19 @@ export function noop() {}
export function isFn(obj) {
return typeof obj === 'function'
}
/**
* escape String
*/
export function escapeString(string) {
const entityMap = {
'&': '&amp;',
'<': '&lt;',
'>': '&gt;',
'"': '&quot;',
'\'': '&#39;',
'/': '&#x2F;'
}
return String(string).replace(/[&<>"'/]/g, s => entityMap[s])
}
+629 -5
View File
File diff suppressed because it is too large Load Diff
+37
View File
@@ -0,0 +1,37 @@
function appendScript(options) {
const script = document.createElement('script')
script.async = true
script.src = options.host + '/matomo.js'
document.body.appendChild(script)
}
function init(options) {
window._paq = window._paq || []
window._paq.push(['trackPageView'])
window._paq.push(['enableLinkTracking'])
setTimeout(function() {
appendScript(options)
window._paq.push(['setTrackerUrl', options.host + '/matomo.php'])
window._paq.push(['setSiteId', options.id + ''])
}, 0)
}
function collect() {
if (!window._paq) {
init($docsify.matomo)
}
window._paq.push(['setCustomUrl', window.location.hash.substr(1)])
window._paq.push(['setDocumentTitle', document.title])
window._paq.push(['trackPageView'])
}
const install = function (hook) {
if (!$docsify.matomo) {
console.error('[Docsify] matomo is required.')
return
}
hook.beforeEach(collect)
}
$docsify.plugins = [].concat(install, $docsify.plugins)
+7 -1
View File
@@ -35,6 +35,12 @@ function style() {
padding: 0 7px;
line-height: 36px;
font-size: 14px;
border: 1px solid transparent;
}
.search input:focus {
box-shadow: 0 0 5px var(--theme-color, #42b983);
border: 1px solid var(--theme-color, #42b983);
}
.search input::-webkit-search-decoration,
@@ -99,7 +105,7 @@ function style() {
function tpl(defaultValue = '') {
const html =
`<div class="input-wrap">
<input type="search" value="${defaultValue}" />
<input type="search" value="${defaultValue}" aria-label="Search text" />
<div class="clear-button">
<svg width="26" height="24">
<circle cx="12" cy="12" r="11" fill="#ccc" />
+13 -14
View File
@@ -96,29 +96,27 @@ export function search(query) {
for (let i = 0; i < data.length; i++) {
const post = data[i]
let isMatch = false
let matchesScore = 0
let resultStr = ''
const postTitle = post.title && post.title.trim()
const postContent = post.body && post.body.trim()
const postUrl = post.slug || ''
if (postTitle && postContent) {
keywords.forEach(keyword => {
if (postTitle) {
keywords.forEach( keyword => {
// From https://github.com/sindresorhus/escape-string-regexp
const regEx = new RegExp(
keyword.replace(/[|\\{}()[\]^$+*?.]/g, '\\$&'),
'gi'
)
);
let indexTitle = -1
let indexContent = -1
indexTitle = postTitle && postTitle.search(regEx)
indexContent = postContent && postContent.search(regEx)
indexTitle = postTitle ? postTitle.search(regEx) : -1
indexContent = postContent ? postContent.search(regEx) : -1
if (indexTitle < 0 && indexContent < 0) {
isMatch = false
} else {
isMatch = true
if (indexTitle >= 0 || indexContent >= 0) {
matchesScore += indexTitle >= 0 ? 3 : indexContent >= 0 ? 2 : 0;
if (indexContent < 0) {
indexContent = 0
}
@@ -144,11 +142,12 @@ export function search(query) {
}
})
if (isMatch) {
if (matchesScore > 0) {
const matchingPost = {
title: escapeHtml(postTitle),
content: resultStr,
url: postUrl
content: postContent ? resultStr : '',
url: postUrl,
score: matchesScore
}
matchingResults.push(matchingPost)
@@ -156,7 +155,7 @@ export function search(query) {
}
}
return matchingResults
return matchingResults.sort((r1, r2) => r2.score - r1.score);
}
export function init(config, vm) {
-18
View File
@@ -321,9 +321,6 @@ body.sticky
border-bottom 1px solid #eee
margin 2em 0
.markdown-section summary
cursor pointer
.markdown-section iframe
border 1px solid #eee
/* fix horizontal overflow on iOS Safari */
@@ -354,7 +351,6 @@ body.sticky
background-color #f8f8f8
.markdown-section p.tip
.markdown-section .docsify-tip
background-color #f8f8f8
border-bottom-right-radius 2px
border-left 4px solid #f66
@@ -386,23 +382,9 @@ body.sticky
color $color-text
.markdown-section p.warn
.markdown-section .docsify-warn
background rgba($color-primary, 0.1)
border-radius 2px
padding 1rem
margin: 2em 0
.markdown-section .docsify-success
background rgba(#42b983, 0.1)
border-radius 2px
padding 1rem
margin: 2em 0
.markdown-section .docsify-error
background rgba(#f66, 0.1)
border-radius 2px
margin: 2em 0
padding 1rem
.markdown-section ul.task-list > li
list-style-type none
+6 -1
View File
@@ -35,9 +35,12 @@ $sidebar-width = 16rem
color #333
font-weight 400
.markdown-section strong
color #333
font-weight 600
.markdown-section a
color var(--theme-color, $color-primary)
font-weight 400
.markdown-section p, .markdown-section ul, .markdown-section ol
line-height 1.6rem
@@ -171,3 +174,5 @@ code .token
-webkit-font-smoothing initial
-moz-osx-font-smoothing initial
min-height 1.5rem
position: relative
left: auto
+2 -1
View File
@@ -201,6 +201,8 @@ code .token
-moz-osx-font-smoothing initial
-webkit-font-smoothing initial
min-height 1.5rem
position: relative
left: auto
pre::after
color #ccc
@@ -216,7 +218,6 @@ pre::after
top 0
.markdown-section p.tip
.markdown-section .docsify-tip
background-color #282828
color #657b83
+2
View File
@@ -213,6 +213,8 @@ code .token
-moz-osx-font-smoothing initial
-webkit-font-smoothing initial
min-height 1.5rem
position: relative
left: auto
pre::after
color #ccc
+2
View File
@@ -210,6 +210,8 @@ code .token
-moz-osx-font-smoothing initial
-webkit-font-smoothing initial
min-height 1.5rem
position: relative
left: auto
pre::after
color #ccc
+62
View File
@@ -0,0 +1,62 @@
/* eslint-env node, chai, mocha */
require = require('esm')(module/*, options*/)
const {expect} = require('chai')
const {History} = require('../../src/core/router/history/base')
class MockHistory extends History {
parse(path) {
return {path}
}
}
describe('router/history/base', function () {
describe('relativePath true', function () {
var history
beforeEach(function () {
history = new MockHistory({relativePath: true})
})
it('toURL', function () {
// WHEN
const url = history.toURL('guide.md', {}, '/zh-ch/')
// THEN
expect(url).equal('/zh-ch/guide')
})
it('toURL with double dot', function () {
// WHEN
const url = history.toURL('../README.md', {}, '/zh-ch/')
// THEN
expect(url).equal('/README')
})
it('toURL child path', function () {
// WHEN
const url = history.toURL('config/example.md', {}, '/zh-ch/')
// THEN
expect(url).equal('/zh-ch/config/example')
})
it('toURL absolute path', function () {
// WHEN
const url = history.toURL('/README', {}, '/zh-ch/')
// THEN
expect(url).equal('/README')
})
})
it('toURL without relative path', function () {
const history = new MockHistory({relativePath: false})
// WHEN
const url = history.toURL('README', {}, '/zh-ch/')
// THEN
expect(url).equal('/README')
})
})
+30
View File
@@ -0,0 +1,30 @@
/* eslint-env node, chai, mocha */
require = require('esm')(module/*, options*/)
const {expect} = require('chai')
const {resolvePath} = require('../../src/core/router/util')
describe('router/util', function () {
it('resolvePath', async function () {
// WHEN
const result = resolvePath('hello.md')
// THEN
expect(result).equal('/hello.md')
})
it('resolvePath with dot', async function () {
// WHEN
const result = resolvePath('./hello.md')
// THEN
expect(result).equal('/hello.md')
})
it('resolvePath with two dots', async function () {
// WHEN
const result = resolvePath('test/../hello.md')
// THEN
expect(result).equal('/hello.md')
})
})