Compare commits

...
133 Commits
Author SHA1 Message Date
qingwei.li 405349102f chore: add changelog 4.5.2 2017-11-09 13:06:59 +08:00
qingwei.li 9d6595d04b [build] 4.5.2 2017-11-09 13:06:57 +08:00
cinwell.liandGitHub d486eef6cc feat: github task lists, close #215 (#305) 2017-11-09 13:06:23 +08:00
qingwei.li b3c3180bab chore: add changelog 4.5.1 2017-11-07 20:03:42 +08:00
qingwei.li c30af850a1 [build] 4.5.1 2017-11-07 20:03:41 +08:00
qingwei.li 2a2ed96eb8 feat: fetch files with the query params, fixed #303 2017-11-07 20:03:11 +08:00
Desmondandcinwell.li 0d54c0cf83 Add zooming to showcase (#302) 2017-11-05 00:42:10 -05:00
qingwei.li f27ce7d2b2 chore: add changelog 4.5.0 2017-11-04 13:56:25 +08:00
qingwei.li 2e1a7367a8 [build] 4.5.0 2017-11-04 13:56:24 +08:00
qingwei.li 7510f75968 fix lint 2017-11-04 13:56:08 +08:00
qingwei.li fd7d4e0e4e feat: add disqus plugin, closed #123 2017-11-04 13:54:37 +08:00
qingwei.li 025bc5cddf chore: update all plugins.md, fixed #187 2017-11-02 10:48:09 +08:00
cinwell.liandGitHub 8f1066a035 chore: update doc
fixed #187
2017-11-01 21:43:09 -05:00
qingwei.li 800c0c503a chore: add changelog 4.4.1 2017-10-31 21:48:15 +08:00
qingwei.li d5194b4f6b [build] 4.4.1 2017-10-31 21:48:15 +08:00
cinwell.liandGitHub fa772cfa94 fix: zoom image plugin issue, fixed #187 (#300) 2017-10-31 08:20:08 -05:00
Li Xueliandcinwell.li cc98f56cdd fix: {docsify-ignore-all} and {docsify-ignore} bug (#299)
* fix {docsify-ignore-all} not work bug

* fix {docsify-ignore} bug
2017-10-31 08:19:48 -05:00
Li Xueliandcinwell.li 752f68e5f8 chore: {docsify-ignore-all} not working properly (#298) 2017-10-31 03:11:40 -05:00
qingwei.li bde17e1f10 chore: update template 2017-10-30 21:58:33 +08:00
qingwei.li 2db197f6dc chore: add changelog 4.4.0 2017-10-30 19:02:56 +08:00
qingwei.li e8b5b09f2c [build] 4.4.0 2017-10-30 19:02:55 +08:00
cinwell.liandGitHub 36bfc9d91d fix: sidebar style issue on firefox, fixed #184 (#297) 2017-10-30 06:01:01 -05:00
cinwell.liandGitHub 4ad96f3d12 feat: add helper for disabled link, fixed #295 (#296) 2017-10-30 06:00:31 -05:00
Aleksandr Filatovandcinwell.li 1f04912a8f Added IT-films project which is based on docsify in readme (#293) 2017-10-27 09:23:21 -05:00
Sanctuaryandcinwell.li 65f17b4753 Move script tags above closing body tag (#290) 2017-10-22 20:38:38 -05:00
Ron Hashimotoandcinwell.li b3419f3842 docs: fix a broken code block (#286) 2017-10-20 09:41:38 -05:00
Maxandcinwell.li 0bb7e18018 Add rnback website to showcase (#287) 2017-10-20 09:41:26 -05:00
qingwei.li 86583e19ab chore: add changelog 4.3.15 2017-10-20 12:55:30 +08:00
qingwei.li 0bef31951c [build] 4.3.15 2017-10-20 12:55:29 +08:00
qingwei.li a2b8eae8c4 fix: scroll active sidebar 2017-10-20 12:54:27 +08:00
qingwei.li 63d08369f6 chore: add changelog 4.3.14 2017-10-20 09:29:30 +08:00
qingwei.li 142623e87e [build] 4.3.14 2017-10-20 09:29:28 +08:00
qingwei.li ab682684ca fix: codesponsor style 2017-10-20 09:29:11 +08:00
qingwei.li e16c89e539 chore: add changelog 4.3.13 2017-10-17 10:28:28 +08:00
qingwei.li f1272a2f1c [build] 4.3.13 2017-10-17 10:28:26 +08:00
LaySentandcinwell.li 1b912272df feat: make whole search result clickable (#285) 2017-10-16 21:27:44 -05:00
Alexander Chibrikinandcinwell.li 3476f6ff1f fix: duplicate results in search fixed #257 (#284) 2017-10-16 21:16:37 -05:00
qingwei.li fac7ce693f chore: fix bootstrap script, fixed #282 2017-10-16 08:23:54 +08:00
Alexander Chibrikinandcinwell.li 470ee474d4 chore: ignore ./lib , force add ./lib on release (#283) 2017-10-15 19:20:35 -05:00
qingwei.li f7cf95a771 chore: add changelog 4.3.12 2017-10-15 21:26:50 +08:00
qingwei.li 4a9d594f7c [build] 4.3.12 2017-10-15 21:26:49 +08:00
LaySentandcinwell.li a3ab37952d fix: incorrect active link (#281)
* fix scroll issue in IE

* add meta tag for IE browser

* fix link render issue after page refreshing

* fix issue of incorrect active link

Should use both `path` and `id` to identify link, as `id` might not be unique under different paths
2017-10-15 08:25:49 -05:00
qingwei.li 6949455899 chore: add changelog 4.3.11 2017-10-15 10:44:35 +08:00
qingwei.li 4e52315564 [build] 4.3.11 2017-10-15 10:44:34 +08:00
qingwei.li 91d6337936 fix: broken links to same page heading, fix #278, fix #279 2017-10-15 10:43:35 +08:00
Gant Labordeandcinwell.li 26cc466420 chore: Add another fan of docsify! (#280)
* Add another fan of docsify!

Thanks for such a great documentation tool!

* Update README.md
2017-10-14 21:34:58 -05:00
Nicolas Gomes De Oliveiraandcinwell.li 6f92a871ca Update language-highlight.md (#277) 2017-10-13 02:46:32 -05:00
qingwei.li 538ee3d0dc chore: add changelog 4.3.10 2017-10-12 22:51:32 +08:00
qingwei.li 49fd30d73d [build] 4.3.10 2017-10-12 22:51:30 +08:00
LaySentandqingwei.li abd885e133 fix: link render issue after page refreshing (#276)
* fix scroll issue in IE

* add meta tag for IE browser

* fix link render issue after page refreshing
2017-10-12 22:48:07 +08:00
qingwei.li 69b2040571 chore: add changelog 4.3.9 2017-10-12 00:37:10 +08:00
qingwei.li e8d675c405 [build] 4.3.9 2017-10-12 00:37:09 +08:00
qingwei.li 5cc3e6c469 chore: update docs 2017-10-12 00:36:23 +08:00
LaySentandcinwell.li 3e94cb6d76 fix: scroll issue in IE (#275)
* fix scroll issue in IE

* add meta tag for IE browser
2017-10-11 11:33:59 -05:00
cinwell.liandGitHub 641e522779 Update deploy.md 2017-10-11 04:20:41 -05:00
Ho Chin Cheeandcinwell.li 026530de10 docs: Deployment guide for GitLab Pages (#274) 2017-10-10 20:59:00 -05:00
qingwei.li 1b74ef31a9 chore: add changelog 4.3.8 2017-10-07 10:08:28 +08:00
qingwei.li 25acd8ce77 [build] 4.3.8 2017-10-07 10:08:27 +08:00
qingwei.li 9b4e6669db fix(slugify): GitHub compatible heading links, fixed #272 2017-10-07 10:08:09 +08:00
qingwei.li 2e3fe59702 chore: add changelog 4.3.7 2017-10-02 13:27:16 +08:00
qingwei.li 7923608bc9 [build] 4.3.7 2017-10-02 13:27:15 +08:00
qingwei.li e307308a78 chore: add vscode config 2017-10-02 13:26:45 +08:00
qingwei.li c195d2d1a6 fix(slugify): GitHub compatible heading links, fixed #267 2017-10-02 13:26:36 +08:00
JP Erasmusandcinwell.li 0624e592d8 docs: Add new copy-to-clipboard plugin (#265) 2017-09-28 21:14:09 -05:00
qingwei.li aba2aec0d0 chore: prettier code 2017-09-22 10:07:10 +08:00
qingwei.li a9704b5156 chore: add changelog 4.3.6 2017-09-21 09:51:53 +08:00
qingwei.li 16d730ec3d [build] 4.3.6 2017-09-21 09:51:51 +08:00
qingwei.li 08afec7d2a fix: style for codesponsor plugin 2017-09-21 09:51:02 +08:00
qingwei.li fcee316d2c chore: use unpkg cdn 2017-09-20 10:06:23 +08:00
qingwei.li 1d2b546602 chore: add changelog 4.3.5 2017-09-20 09:03:55 +08:00
qingwei.li 97793bfd6c [build] 4.3.5 2017-09-20 09:03:54 +08:00
qingwei.li ae3f74bfd4 chore: add build script 2017-09-20 09:01:31 +08:00
qingwei.li 04eaf4026b chore: add doc for codesponsor 2017-09-20 09:01:06 +08:00
qingwei.li 46ac4c3fd2 feat(plugin): add codesponsor plugin 2017-09-20 09:00:34 +08:00
Ken Berkeleyandcinwell.li 44dc68c6b2 Add vue2-datatable-component in Showcase (#255)
In my humble opinion, the doc of this project might have a better file structure for multiple languages
2017-09-13 03:38:25 -05:00
Chikara Chanandcinwell.li 6c702d3362 fix: missed symbol (#254) 2017-09-13 03:38:09 -05:00
cinwell.liandGitHub c476e49164 Update README.md 2017-09-11 01:30:48 -05:00
Ying Zhongandcinwell.li 0329bab359 Add xTeko website to showcase (#250) 2017-09-10 22:44:38 -05:00
qingwei.li 62aa161bff chore: add ga 2017-09-11 07:13:46 +08:00
qingwei.li 3854692331 chore: add codesponsor 2017-09-11 07:03:19 +08:00
qingwei.li 2066cb672d chore: add changelog 4.3.4 2017-09-07 23:05:24 +08:00
qingwei.li 5b7b60c553 [build] 4.3.4 2017-09-07 23:05:23 +08:00
qingwei.li 388ed3d685 fix: scroll position issue, fixed #234 2017-09-07 23:04:58 +08:00
qingwei.li e898350a84 chore: update travisci 2017-09-06 18:25:56 +08:00
qingwei.li 9c62fb41b8 chore: add changelog 4.3.3 2017-09-06 17:18:33 +08:00
qingwei.li 9b73b0bf8a [build] 4.3.3 2017-09-06 17:18:32 +08:00
qingwei.li 9d43051791 fix(buble.css): tweaks code block style, fixed #249 2017-09-06 17:17:57 +08:00
Leon Zhangandcinwell.li f0aca1905c feat: add doc for react and vue demo box plugin (#247) 2017-09-05 09:46:05 +08:00
Jeremygaoandcinwell.li 2959497874 bugfix: config.js里面应为routerMode属性而非routerModel (#245) 2017-09-01 16:33:29 +08:00
qingwei.li 5a9921f5e7 chore: add changelog 4.3.2 2017-09-01 15:53:06 +08:00
qingwei.li c9d556d829 [build] 4.3.2 2017-09-01 15:53:04 +08:00
qingwei.li a0e1ea811a feat: add Edit on github plugin (thanks @njleonzhang) 2017-09-01 15:52:35 +08:00
qingwei.li f82f41900e fix: sidebar highlight 2017-09-01 15:50:53 +08:00
Leon Zhangandcinwell.li 7a4d9bc5cd add doc for Edit on github plugin (#244) 2017-09-01 15:43:43 +08:00
qingwei.li 5e522879dd chore: add changelog 4.3.1 2017-08-30 21:54:49 +08:00
qingwei.li a72e7a3a3f [build] 4.3.1 2017-08-30 21:54:48 +08:00
qingwei.li 26c22a9843 chore: add lockfile 2017-08-30 21:54:17 +08:00
fyandcinwell.li 4ce118d60f fixed sidebar item inactive issue & fixed _sidebar.md 404 issue & smooth scroll (#242)
* fixed sidebar item inactive issue & fixed _sidebar.md 404 issue & smooth scroll

* sidebar load fix
2017-08-30 21:48:36 +08:00
Jonasandcinwell.li 3ad1645b90 fix yarn add command (#237)
package is published at `docsify-server-renderer` but README.md refers to `docsify-server-render`
2017-08-18 09:06:34 +08:00
qingwei.li 41967fa8fa chore(docs): fix markdown demo 2017-08-17 17:18:41 +08:00
qingwei.li 48276db15d chore: add changelog 4.3.0 2017-08-17 16:54:12 +08:00
qingwei.li b67ea62c75 [build] 4.3.0 2017-08-17 16:54:10 +08:00
qingwei.li f4800e09f1 feat(markdown): supports mermaid #137 2017-08-17 16:52:54 +08:00
qingwei.li ac10de1c5b chore: update changelog 2017-08-15 23:48:53 +08:00
qingwei.li d6ac7031b0 chore: add changelog 4.2.9 2017-08-15 23:47:21 +08:00
qingwei.li 4417f4669d [build] 4.2.9 2017-08-15 23:47:20 +08:00
qingwei.li b7735066ff chore(*): remove document-ready 2017-08-15 23:46:47 +08:00
yeloandcinwell.li 10045249d3 ensure document ready before init Docsify (#233) 2017-08-15 23:35:27 +08:00
qingwei.li 190710733e chore: add changelog 4.2.8 2017-08-10 08:46:26 +08:00
qingwei.li b292d819fc [build] 4.2.8 2017-08-10 08:46:25 +08:00
qingwei.li 7f270f93c6 feat(compiler): support for setting target attribute for link, fixed #230 2017-08-10 08:45:49 +08:00
qingwei.li c3a149679a chore(*): tweaks changelog 2017-08-05 09:56:53 +08:00
qingwei.li 5efa763075 chore: add changelog 4.2.7 2017-08-05 09:54:25 +08:00
qingwei.li 03a04f7898 [build] 4.2.7 2017-08-05 09:54:24 +08:00
qingwei.li a88252c6b2 fix(style): nowrap => pre-wrap, fixed #228 2017-08-05 09:53:57 +08:00
Nedim Arabacıandcinwell.li 2f5f90750a Noty added to showcase (#226)
Nice documentation site generator! Thanks.
2017-07-28 13:30:09 +08:00
qingwei.li 709c152950 chore: add changelog 4.2.6 2017-07-27 10:03:18 +08:00
qingwei.li b09a5a317e [build] 4.2.6 2017-07-27 10:03:17 +08:00
qingwei.li 628e2115a3 fix(release): release shell 2017-07-27 10:02:49 +08:00
qingwei.li 271dde8f5e chore(*): fix changelog script 2017-07-27 09:58:37 +08:00
qingwei.li 1fa1619278 fix(css): hide the nav when the content has not yet been loaded 2017-07-27 09:50:21 +08:00
qingwei.li 3de3def8a8 chore(*): fix changelog script 2017-07-26 18:55:13 +08:00
qingwei.li fb25726426 chore: add changelog 4.2.4 2017-07-26 18:52:59 +08:00
qingwei.li 36ddc42e91 [release] 4.2.4 2017-07-26 18:52:58 +08:00
qingwei.li abb0f6019f [build] 4.2.4 2017-07-26 18:52:58 +08:00
qingwei.li b8dd346baf fix(render): Remove getRootNode to be compatible with the lower version of Chrome, fixed #225 2017-07-26 18:52:36 +08:00
qingwei.li 7191d702e1 chore(*): add cdn 2017-07-26 08:42:07 +08:00
qingwei.li c039f1bfc0 chore: add changelog 4.2.3 2017-07-26 08:37:36 +08:00
qingwei.li f859d2d0b2 [release] 4.2.3 2017-07-26 08:37:35 +08:00
qingwei.li 9735f4036e [build] 4.2.3 2017-07-26 08:37:35 +08:00
qingwei.li b8a96b867b Merge branch 'master' of github.com:qingwei-li/docsify 2017-07-26 08:37:02 +08:00
qingwei.li b7b589b1bf feat(search): Supports the max depth of the search headline, fixed #223, resolve #129 2017-07-26 08:36:35 +08:00
qingwei.li 761e38f6ad chore: add changelog 4.2.2 2017-07-24 19:06:24 +08:00
90 changed files with 7225 additions and 2340 deletions
+2 -1
View File
@@ -1,4 +1,5 @@
*.log *.log
.DS_Store .DS_Store
/themes /themes/
node_modules node_modules
/lib/
-6
View File
@@ -1,9 +1,3 @@
sudo: false sudo: false
cache:
directories:
- $HOME/.yarn-cache
language: node_js language: node_js
node_js: stable node_js: stable
os:
- linux
- osx
+3
View File
@@ -0,0 +1,3 @@
{
"prettier.eslintIntegration": true
}
+304
View File
@@ -1,3 +1,307 @@
<a name="4.5.2"></a>
## [4.5.2](https://github.com/QingWei-Li/docsify/compare/v4.5.1...v4.5.2) (2017-11-09)
### Features
* github task lists, close [#215](https://github.com/QingWei-Li/docsify/issues/215) ([#305](https://github.com/QingWei-Li/docsify/issues/305)) ([d486eef](https://github.com/QingWei-Li/docsify/commit/d486eef))
<a name="4.5.1"></a>
## [4.5.1](https://github.com/QingWei-Li/docsify/compare/v4.5.0...v4.5.1) (2017-11-07)
### Features
* fetch files with the query params, fixed [#303](https://github.com/QingWei-Li/docsify/issues/303) ([2a2ed96](https://github.com/QingWei-Li/docsify/commit/2a2ed96))
<a name="4.5.0"></a>
# [4.5.0](https://github.com/QingWei-Li/docsify/compare/v4.4.1...v4.5.0) (2017-11-04)
### Features
* add disqus plugin, closed [#123](https://github.com/QingWei-Li/docsify/issues/123) ([fd7d4e0](https://github.com/QingWei-Li/docsify/commit/fd7d4e0))
<a name="4.4.1"></a>
## [4.4.1](https://github.com/QingWei-Li/docsify/compare/v4.4.0...v4.4.1) (2017-10-31)
### Bug Fixes
* {docsify-ignore-all} and {docsify-ignore} bug ([#299](https://github.com/QingWei-Li/docsify/issues/299)) ([cc98f56](https://github.com/QingWei-Li/docsify/commit/cc98f56))
* zoom image plugin issue, fixed [#187](https://github.com/QingWei-Li/docsify/issues/187) ([#300](https://github.com/QingWei-Li/docsify/issues/300)) ([fa772cf](https://github.com/QingWei-Li/docsify/commit/fa772cf))
<a name="4.4.0"></a>
# [4.4.0](https://github.com/QingWei-Li/docsify/compare/v4.3.15...v4.4.0) (2017-10-30)
### Bug Fixes
* sidebar style issue on firefox, fixed [#184](https://github.com/QingWei-Li/docsify/issues/184) ([#297](https://github.com/QingWei-Li/docsify/issues/297)) ([36bfc9d](https://github.com/QingWei-Li/docsify/commit/36bfc9d))
### Features
* add helper for disabled link, fixed [#295](https://github.com/QingWei-Li/docsify/issues/295) ([#296](https://github.com/QingWei-Li/docsify/issues/296)) ([4ad96f3](https://github.com/QingWei-Li/docsify/commit/4ad96f3))
<a name="4.3.15"></a>
## [4.3.15](https://github.com/QingWei-Li/docsify/compare/v4.3.14...v4.3.15) (2017-10-20)
### Bug Fixes
* scroll active sidebar ([a2b8eae](https://github.com/QingWei-Li/docsify/commit/a2b8eae))
<a name="4.3.14"></a>
## [4.3.14](https://github.com/QingWei-Li/docsify/compare/v4.3.13...v4.3.14) (2017-10-20)
### Bug Fixes
* codesponsor style ([ab68268](https://github.com/QingWei-Li/docsify/commit/ab68268))
<a name="4.3.13"></a>
## [4.3.13](https://github.com/QingWei-Li/docsify/compare/v4.3.12...v4.3.13) (2017-10-17)
### Bug Fixes
* duplicate results in search fixed [#257](https://github.com/QingWei-Li/docsify/issues/257) ([#284](https://github.com/QingWei-Li/docsify/issues/284)) ([3476f6f](https://github.com/QingWei-Li/docsify/commit/3476f6f))
### Features
* make whole search result clickable ([#285](https://github.com/QingWei-Li/docsify/issues/285)) ([1b91227](https://github.com/QingWei-Li/docsify/commit/1b91227))
<a name="4.3.12"></a>
## [4.3.12](https://github.com/QingWei-Li/docsify/compare/v4.3.11...v4.3.12) (2017-10-15)
### Bug Fixes
* incorrect active link ([#281](https://github.com/QingWei-Li/docsify/issues/281)) ([a3ab379](https://github.com/QingWei-Li/docsify/commit/a3ab379))
<a name="4.3.11"></a>
## [4.3.11](https://github.com/QingWei-Li/docsify/compare/v4.3.10...v4.3.11) (2017-10-15)
### Bug Fixes
* broken links to same page heading, fix [#278](https://github.com/QingWei-Li/docsify/issues/278), fix [#279](https://github.com/QingWei-Li/docsify/issues/279) ([91d6337](https://github.com/QingWei-Li/docsify/commit/91d6337))
<a name="4.3.10"></a>
## [4.3.10](https://github.com/QingWei-Li/docsify/compare/v4.3.9...v4.3.10) (2017-10-12)
### Bug Fixes
* link render issue after page refreshing ([#276](https://github.com/QingWei-Li/docsify/issues/276)) ([abd885e](https://github.com/QingWei-Li/docsify/commit/abd885e))
<a name="4.3.9"></a>
## [4.3.9](https://github.com/QingWei-Li/docsify/compare/v4.3.8...v4.3.9) (2017-10-11)
### Bug Fixes
* scroll issue in IE ([#275](https://github.com/QingWei-Li/docsify/issues/275)) ([3e94cb6](https://github.com/QingWei-Li/docsify/commit/3e94cb6))
<a name="4.3.8"></a>
## [4.3.8](https://github.com/QingWei-Li/docsify/compare/v4.3.7...v4.3.8) (2017-10-07)
### Bug Fixes
* **slugify:** GitHub compatible heading links, fixed [#272](https://github.com/QingWei-Li/docsify/issues/272) ([9b4e666](https://github.com/QingWei-Li/docsify/commit/9b4e666))
<a name="4.3.7"></a>
## [4.3.7](https://github.com/QingWei-Li/docsify/compare/v4.3.6...v4.3.7) (2017-10-02)
### Bug Fixes
* **slugify:** GitHub compatible heading links, fixed [#267](https://github.com/QingWei-Li/docsify/issues/267) ([c195d2d](https://github.com/QingWei-Li/docsify/commit/c195d2d))
<a name="4.3.6"></a>
## [4.3.6](https://github.com/QingWei-Li/docsify/compare/v4.3.5...v4.3.6) (2017-09-21)
### Bug Fixes
* style for codesponsor plugin ([08afec7](https://github.com/QingWei-Li/docsify/commit/08afec7))
<a name="4.3.5"></a>
## [4.3.5](https://github.com/QingWei-Li/docsify/compare/v4.3.4...v4.3.5) (2017-09-20)
### Bug Fixes
* missed symbol ([#254](https://github.com/QingWei-Li/docsify/issues/254)) ([6c702d3](https://github.com/QingWei-Li/docsify/commit/6c702d3))
### Features
* **plugin:** add codesponsor plugin ([46ac4c3](https://github.com/QingWei-Li/docsify/commit/46ac4c3))
<a name="4.3.4"></a>
## [4.3.4](https://github.com/QingWei-Li/docsify/compare/v4.3.3...v4.3.4) (2017-09-07)
### Bug Fixes
* scroll position issue, fixed [#234](https://github.com/QingWei-Li/docsify/issues/234) ([388ed3d](https://github.com/QingWei-Li/docsify/commit/388ed3d))
<a name="4.3.3"></a>
## [4.3.3](https://github.com/QingWei-Li/docsify/compare/v4.3.2...v4.3.3) (2017-09-06)
### Bug Fixes
* **buble.css:** tweaks code block style, fixed [#249](https://github.com/QingWei-Li/docsify/issues/249) ([9d43051](https://github.com/QingWei-Li/docsify/commit/9d43051))
### Features
* add doc for react and vue demo box plugin ([#247](https://github.com/QingWei-Li/docsify/issues/247)) ([f0aca19](https://github.com/QingWei-Li/docsify/commit/f0aca19))
<a name="4.3.2"></a>
## [4.3.2](https://github.com/QingWei-Li/docsify/compare/v4.3.1...v4.3.2) (2017-09-01)
### Bug Fixes
* sidebar highlight ([f82f419](https://github.com/QingWei-Li/docsify/commit/f82f419))
### Features
* add Edit on github plugin (thanks [@njleonzhang](https://github.com/njleonzhang)) ([a0e1ea8](https://github.com/QingWei-Li/docsify/commit/a0e1ea8))
<a name="4.3.1"></a>
## [4.3.1](https://github.com/QingWei-Li/docsify/compare/v4.2.9...v4.3.1) (2017-08-30)
### Features
* **markdown:** supports mermaid [#137](https://github.com/QingWei-Li/docsify/issues/137) ([f4800e0](https://github.com/QingWei-Li/docsify/commit/f4800e0))
<a name="4.3.0"></a>
# [4.3.0](https://github.com/QingWei-Li/docsify/compare/v4.2.9...v4.3.0) (2017-08-17)
### Features
* **markdown:** supports mermaid [#137](https://github.com/QingWei-Li/docsify/issues/137) ([f4800e0](https://github.com/QingWei-Li/docsify/commit/f4800e0))
<a name="4.2.9"></a>
## [4.2.9](https://github.com/QingWei-Li/docsify/compare/v4.2.8...v4.2.9) (2017-08-15)
### Bug Fixes
* ensure document ready before init Docsify [#233](https://github.com/QingWei-Li/docsify/issues/233)
<a name="4.2.8"></a>
## [4.2.8](https://github.com/QingWei-Li/docsify/compare/v4.2.7...v4.2.8) (2017-08-10)
### Features
* **compiler:** support for setting target attribute for link, fixed [#230](https://github.com/QingWei-Li/docsify/issues/230) ([7f270f9](https://github.com/QingWei-Li/docsify/commit/7f270f9))
<a name="4.2.7"></a>
## [4.2.7](https://github.com/QingWei-Li/docsify/compare/v4.2.4...v4.2.7) (2017-08-05)
### Bug Fixes
* **release:** release shell ([628e211](https://github.com/QingWei-Li/docsify/commit/628e211))
* **style:** nowrap => pre-wrap, fixed [#228](https://github.com/QingWei-Li/docsify/issues/228) ([a88252c](https://github.com/QingWei-Li/docsify/commit/a88252c))
<a name="4.2.6"></a>
## [4.2.6](https://github.com/QingWei-Li/docsify/compare/v4.2.4...v4.2.6) (2017-07-27)
### Bug Fixes
* **css:** hide the nav when the content has not yet been loaded ([1fa1619](https://github.com/QingWei-Li/docsify/commit/1fa1619))
* **release:** release shell ([628e211](https://github.com/QingWei-Li/docsify/commit/628e211))
<a name="4.2.4"></a>
## [4.2.4](https://github.com/QingWei-Li/docsify/compare/v4.2.2...v4.2.4) (2017-07-26)
### Bug Fixes
* **render:** Remove getRootNode to be compatible with the lower version of Chrome, fixed [#225](https://github.com/QingWei-Li/docsify/issues/225) ([b8dd346](https://github.com/QingWei-Li/docsify/commit/b8dd346))
<a name="4.2.3"></a>
## [4.2.3](https://github.com/QingWei-Li/docsify/compare/v4.2.2...v4.2.3) (2017-07-26)
### Features
* **search:** Supports the max depth of the search headline, fixed [#223](https://github.com/QingWei-Li/docsify/issues/223), resolve [#129](https://github.com/QingWei-Li/docsify/issues/129) ([b7b589b](https://github.com/QingWei-Li/docsify/commit/b7b589b))
<a name="4.2.2"></a>
## [4.2.2](https://github.com/QingWei-Li/docsify/compare/v4.2.1...v4.2.2) (2017-07-24)
### Bug Fixes
* style rerender due to setting themeColor ([17ff3d1](https://github.com/QingWei-Li/docsify/commit/17ff3d1))
<a name="4.2.1"></a> <a name="4.2.1"></a>
## [4.2.1](https://github.com/QingWei-Li/docsify/compare/v4.2.0...v4.2.1) (2017-07-19) ## [4.2.1](https://github.com/QingWei-Li/docsify/compare/v4.2.0...v4.2.1) (2017-07-19)
+15 -1
View File
@@ -13,13 +13,17 @@
<a href="https://www.npmjs.com/package/docsify"><img alt="npm" src="https://img.shields.io/npm/v/docsify.svg?style=flat-square"></a> <a href="https://www.npmjs.com/package/docsify"><img alt="npm" src="https://img.shields.io/npm/v/docsify.svg?style=flat-square"></a>
<a href="https://cdnjs.com/libraries/docsify"><img alt="cdnjs" src="https://img.shields.io/cdnjs/v/docsify.svg?style=flat-square"></a> <a href="https://cdnjs.com/libraries/docsify"><img alt="cdnjs" src="https://img.shields.io/cdnjs/v/docsify.svg?style=flat-square"></a>
<a href="https://github.com/QingWei-Li/donate"><img alt="donate" src="https://img.shields.io/badge/%24-donate-ff69b4.svg?style=flat-square"></a> <a href="https://github.com/QingWei-Li/donate"><img alt="donate" src="https://img.shields.io/badge/%24-donate-ff69b4.svg?style=flat-square"></a>
<a href="https://app.fossa.io/projects/git%2Bhttps%3A%2F%2Fgithub.com%2FQingWei-Li%2Fdocsify?ref=badge_shield" alt="FOSSA Status"><img src="https://app.fossa.io/api/projects/git%2Bhttps%3A%2F%2Fgithub.com%2FQingWei-Li%2Fdocsify.svg?type=shield"/></a>
</p> </p>
<a target='_blank' rel='nofollow' href='https://app.codesponsor.io/link/YdWAqnN2kHQmLtFQhEddaaPT/QingWei-Li/docsify'> <img alt='Sponsor' width='888' height='68' src='https://app.codesponsor.io/embed/YdWAqnN2kHQmLtFQhEddaaPT/QingWei-Li/docsify.svg' /></a>
## Links ## Links
- [Documentation](https://docsify.js.org) - [Documentation](https://docsify.js.org)
- [CLI](https://github.com/QingWei-Li/docsify-cli) - [CLI](https://github.com/QingWei-Li/docsify-cli)
- CDN: [UNPKG](https://unpkg.com/docsify/) | [jsDelivr](https://cdn.jsdelivr.net/npm/docsify/)
## Features ## Features
@@ -41,6 +45,8 @@ Create an `index.html`.
<!DOCTYPE html> <!DOCTYPE html>
<html> <html>
<head> <head>
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<meta name="viewport" content="width=device-width,initial-scale=1">
<meta charset="UTF-8"> <meta charset="UTF-8">
<link rel="stylesheet" href="//cdn.jsdelivr.net/npm/docsify/lib/themes/vue.css"> <link rel="stylesheet" href="//cdn.jsdelivr.net/npm/docsify/lib/themes/vue.css">
</head> </head>
@@ -74,6 +80,13 @@ These projects are using docsify to generate their sites. Pull requests welcome
| [palettify](https://dobromir-hristov.github.io/palettify/) | A color palette effects assistant | | [palettify](https://dobromir-hristov.github.io/palettify/) | A color palette effects assistant |
| [commitlint](https://marionebl.github.io/commitlint/) | Lint commit messages | | [commitlint](https://marionebl.github.io/commitlint/) | Lint commit messages |
| [vue-data-tables](https://github.com/njleonzhang/vue-data-tables/) | A simple and customizable data tablebased on vue2 and element-ui. | | [vue-data-tables](https://github.com/njleonzhang/vue-data-tables/) | A simple and customizable data tablebased on vue2 and element-ui. |
| [Noty](http://ned.im/noty/) | A Dependency-free notification library |
| [xTeko](https://docs.xteko.com/) | Addins framework for Pin 3.0 |
| [vue2-datatable-component](https://github.com/OneWayTech/vue2-datatable) | The best Datatable for Vue.js 2.x which never sucks |
| [Solidarity](https://infinitered.github.io/solidarity/) | Environment enforcer for your projects across machines. |
| [rnback](https://rnback.com/) | Backend service for react-native applications. |
| [IT-films](https://greybax.github.com/IT-films/) | A curated list of awesome movies, documentaries and TV series about hackers, geeks and IT in common, sorted by IMDB rating. |
| [zooming](http://desmonding.me/zooming/docs) | Image zoom that makes sense. |
## Similar projects ## Similar projects
@@ -103,3 +116,4 @@ open http://localhost:3000
MIT MIT
[![FOSSA Status](https://app.fossa.io/api/projects/git%2Bhttps%3A%2F%2Fgithub.com%2FQingWei-Li%2Fdocsify.svg?type=large)](https://app.fossa.io/projects/git%2Bhttps%3A%2F%2Fgithub.com%2FQingWei-Li%2Fdocsify?ref=badge_large) [![FOSSA Status](https://app.fossa.io/api/projects/git%2Bhttps%3A%2F%2Fgithub.com%2FQingWei-Li%2Fdocsify.svg?type=large)](https://app.fossa.io/projects/git%2Bhttps%3A%2F%2Fgithub.com%2FQingWei-Li%2Fdocsify?ref=badge_large)
+11 -9
View File
@@ -30,22 +30,24 @@ var renderer = new Renderer({
alias: { alias: {
'/de-de/changelog': '/changelog', '/de-de/changelog': '/changelog',
'/zh-cn/changelog': '/changelog', '/zh-cn/changelog': '/changelog',
'/changelog': 'https://raw.githubusercontent.com/QingWei-Li/docsify/master/CHANGELOG' '/changelog':
'https://raw.githubusercontent.com/QingWei-Li/docsify/master/CHANGELOG'
} }
}, },
path: './' path: './'
}) })
http.createServer(function (req, res) { http
serveStatic('.')(req, res, function () { .createServer(function (req, res) {
// TEST SSR serveStatic('.')(req, res, function () {
// renderer.renderToString(req.url) // TEST SSR
// renderer.renderToString(req.url)
// .then(html => res.end(html)) // .then(html => res.end(html))
res.writeHead(404, { 'Content-Type': 'text/html' }) res.writeHead(404, { 'Content-Type': 'text/html' })
res.end(fs.readFileSync('dev.html')) res.end(fs.readFileSync('dev.html'))
})
}) })
}).listen(3000, '0.0.0.0') .listen(3000, '0.0.0.0')
console.log(`\nListening at http://0.0.0.0:3000\n`) console.log(`\nListening at http://0.0.0.0:3000\n`)
+4 -1
View File
@@ -7,5 +7,8 @@ var file = __dirname + '/../docs/_coverpage.md'
var cover = read(file, 'utf8').toString() var cover = read(file, 'utf8').toString()
console.log('Replace version number in cover page...') console.log('Replace version number in cover page...')
cover = cover.replace(/<small>(\S+)?<\/small>/g, '<small>' + version + '</small>') cover = cover.replace(
/<small>(\S+)?<\/small>/g,
'<small>' + version + '</small>'
)
write(file, cover) write(file, cover)
+15 -12
View File
@@ -4,15 +4,17 @@ var resolve = require('path').resolve
var postcss = require('postcss') var postcss = require('postcss')
var isProd = process.argv[process.argv.length - 1] !== '--dev' var isProd = process.argv[process.argv.length - 1] !== '--dev'
var processor = postcss([require('postcss-salad')({ var processor = postcss([
features: { require('postcss-salad')({
precss: { features: {
properties: { precss: {
preserve: true properties: {
preserve: true
}
} }
} }
} })
})]) ])
var saveMin = function (file, content) { var saveMin = function (file, content) {
fs.writeFileSync(resolve(__dirname, '../lib/themes/', file), content) fs.writeFileSync(resolve(__dirname, '../lib/themes/', file), content)
@@ -31,17 +33,18 @@ var list = fs.readdirSync(resolve(__dirname, '../src/themes'))
list.forEach(function (file) { list.forEach(function (file) {
if (!/\.css$/.test(file)) return if (!/\.css$/.test(file)) return
processor.process(load(file), { from: resolve(__dirname, '../src/themes/', file) }) processor
.process(load(file), { from: resolve(__dirname, '../src/themes/', file) })
.then(function (result) { .then(function (result) {
save(file, result.css) save(file, result.css)
console.log('salad - ' + file) console.log('salad - ' + file)
isProd && cssnano(loadLib(file)) isProd &&
.then(function (result) { cssnano(loadLib(file)).then(function (result) {
saveMin(file, result.css) saveMin(file, result.css)
console.log('cssnao - ' + file) console.log('cssnao - ' + file)
}) })
}).catch(function (err) { })
.catch(function (err) {
console.log(err) console.log(err)
}) })
}) })
+1 -1
View File
@@ -17,7 +17,7 @@ rollup
} }
}) })
], ],
onwarn: function() {} onwarn: function () {}
}) })
.then(function (bundle) { .then(function (bundle) {
var dest = 'packages/docsify-server-renderer/build.js' var dest = 'packages/docsify-server-renderer/build.js'
+3 -1
View File
@@ -47,7 +47,9 @@ var plugins = [
{ name: 'emoji', entry: 'emoji.js' }, { name: 'emoji', entry: 'emoji.js' },
{ name: 'external-script', entry: 'external-script.js' }, { name: 'external-script', entry: 'external-script.js' },
{ name: 'front-matter', entry: 'front-matter/index.js' }, { name: 'front-matter', entry: 'front-matter/index.js' },
{ name: 'zoom-image', entry: 'zoom-image.js' } { name: 'zoom-image', entry: 'zoom-image.js' },
{ name: 'codesponsor', entry: 'codesponsor.js' },
{ name: 'disqus', entry: 'disqus.js' }
] ]
plugins.forEach(item => { plugins.forEach(item => {
+3 -1
View File
@@ -29,8 +29,9 @@ if [[ $REPLY =~ ^[Yy]$ ]]; then
# commit # commit
git add -A git add -A
git add -f lib/ -A
git commit -m "[build] $VERSION $RELEASE_TAG" git commit -m "[build] $VERSION $RELEASE_TAG"
npm version $VERSION --message "[release] $VERSION $RELEASE_TAG" npm --no-git-tag-version version $VERSION --message "[release] $VERSION $RELEASE_TAG"
# changelog # changelog
node_modules/.bin/conventional-changelog -p angular -i CHANGELOG.md -s node_modules/.bin/conventional-changelog -p angular -i CHANGELOG.md -s
@@ -39,6 +40,7 @@ if [[ $REPLY =~ ^[Yy]$ ]]; then
git commit -m "chore: add changelog $VERSION" git commit -m "chore: add changelog $VERSION"
# publish # publish
git tag v$VERSION
git push origin refs/tags/v$VERSION git push origin refs/tags/v$VERSION
git push git push
if [[ -z $RELEASE_TAG ]]; then if [[ -z $RELEASE_TAG ]]; then
+35 -34
View File
@@ -3,7 +3,8 @@
<head> <head>
<meta charset="UTF-8"> <meta charset="UTF-8">
<title>docsify</title> <title>docsify</title>
<meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<meta name="viewport" content="width=device-width,initial-scale=1">
<link rel="stylesheet" href="/themes/vue.css" title="vue"> <link rel="stylesheet" href="/themes/vue.css" title="vue">
<link rel="stylesheet" href="/themes/dark.css" title="dark" disabled> <link rel="stylesheet" href="/themes/dark.css" title="dark" disabled>
<link rel="stylesheet" href="/themes/buble.css" title="buble" disabled> <link rel="stylesheet" href="/themes/buble.css" title="buble" disabled>
@@ -15,38 +16,38 @@
</head> </head>
<body> <body>
<div id="app"></div> <div id="app"></div>
<script>
window.$docsify = {
alias: {
'.*?/changelog': 'https://raw.githubusercontent.com/QingWei-Li/docsify/master/CHANGELOG',
'/.*/_navbar.md': '/_navbar.md'
},
auto2top: true,
basePath: '/docs/',
executeScript: true,
loadNavbar: true,
loadSidebar: true,
coverpage: true,
name: 'docsify',
subMaxLevel: 2,
mergeNavbar: true,
formatUpdated: '{MM}/{DD} {HH}:{mm}',
plugins: [
function(hook, vm) {
hook.beforeEach(function (html) {
var url = 'https://github.com/QingWei-Li/docsify/blob/master/' + vm.route.file
var editHtml = '[:memo: Edit Document](' + url + ')\n'
return editHtml
+ html
+ '\n----\n'
+ 'Last modified {docsify-updated} '
+ editHtml
})
}
]
}
</script>
<script src="/lib/docsify.js"></script>
</body> </body>
<script>
window.$docsify = {
alias: {
'.*?/changelog': 'https://raw.githubusercontent.com/QingWei-Li/docsify/master/CHANGELOG',
'/.*/_navbar.md': '/_navbar.md'
},
auto2top: true,
basePath: '/docs/',
executeScript: true,
loadNavbar: true,
loadSidebar: true,
coverpage: true,
name: 'docsify',
subMaxLevel: 0,
mergeNavbar: true,
formatUpdated: '{MM}/{DD} {HH}:{mm}',
plugins: [
function(hook, vm) {
hook.beforeEach(function (html) {
var url = 'https://github.com/QingWei-Li/docsify/blob/master/' + vm.route.file
var editHtml = '[:memo: Edit Document](' + url + ')\n'
return editHtml
+ html
+ '\n----\n'
+ 'Last modified {docsify-updated} '
+ editHtml
})
}
]
}
</script>
<script src="/lib/docsify.js"></script>
</html> </html>
+1 -1
View File
@@ -1,6 +1,6 @@
![logo](_media/icon.svg) ![logo](_media/icon.svg)
# docsify <small>4.2.2</small> # docsify <small>4.5.2</small>
> A magical documentation site generator. > A magical documentation site generator.
+24
View File
@@ -16,6 +16,30 @@ Es wird empfohlen, deine Dateien im `./docs` Unterordner im `master` branch dein
!> Du kannst die Dateien auch im Hauptverzeichnis speichern und dann `master branch` in den Einstellungen auswählen. !> Du kannst die Dateien auch im Hauptverzeichnis speichern und dann `master branch` in den Einstellungen auswählen.
## GitLab Pages
If you are deploying your master branch, include `.gitlab-ci.yml` with the following script:
?> The `.public` workaround is so `cp` doesn't also copy `public/` to itself in an infinite loop.
``` YAML
pages:
stage: deploy
script:
- mkdir .public
- cp -r * .public
- mv .public public
artifacts:
paths:
- public
only:
- master
```
!> You can replace script with `- cp -r docs/. public`, if `./docs` is your Docsify subfolder.
## VPS ## VPS
Verwende folgende nginx config. Verwende folgende nginx config.
+27
View File
@@ -49,3 +49,30 @@ You will get `<a href="/demo/">link</a>`html. Do not worry, you can still set ti
<a href="/demo/" title="title">link</a> <a href="/demo/" title="title">link</a>
``` ```
## Set target attribute for link
```md
[link](/demo ":target=_blank")
[link](/demo2 ":target=_self")
```
## Github Task Lists
```md
* [ ] foo
* bar
* [x] baz
* [] bam
* [ ] bim
* [ ] lim
```
* [ ] foo
* bar
* [x] baz
* [] bam
* [ ] bim
* [ ] lim
+27
View File
@@ -28,3 +28,30 @@ window.$docsify = {
} }
} }
``` ```
## Supports mermaid
```js
// Import mermaid
// <link rel="stylesheet" href="//cdn.jsdelivr.net/npm/mermaid/dist/mermaid.min.css">
// <script src="//cdn.jsdelivr.net/npm/mermaid/dist/mermaid.min.js"></script>
mermaid.initialize({ startOnLoad: false });
window.$docsify = {
markdown: {
renderer: {
code: function(code, lang) {
if (lang === "mermaid") {
return (
'<div class="mermaid">' + mermaid.render(lang, code) + "</div>"
);
}
return this.origin.code.apply(this, arguments);
}
}
}
}
```
+31 -2
View File
@@ -35,7 +35,10 @@ Als Standardeinstellung werden Hyperlinks auf der aktuellen Seite erkannt und de
noData: { noData: {
'/de-de/': 'Keine Ergebnisse', '/de-de/': 'Keine Ergebnisse',
'/': 'No Results' '/': 'No Results'
} },
// Headline depth, 1 - 6
depth: 2
} }
} }
</script> </script>
@@ -88,8 +91,34 @@ Wenn das Skript auf der Seite ein externes ist (eine Javascript Datei über das
## Bilder zoomen ## Bilder zoomen
Medium's Bilderzoom. Basierend auf [zoom-image](https://github.com/egoist/zoom-image). Medium's Bilderzoom. Basierend auf [medium-zoom](https://github.com/francoischalifour/medium-zoom).
```html ```html
<script src="//unpkg.com/docsify/lib/plugins/zoom-image.min.js"></script> <script src="//unpkg.com/docsify/lib/plugins/zoom-image.min.js"></script>
``` ```
Exclude the special image
```markdown
![](image.png ':no-zoom')
```
## Edit on github
Add `Edit on github` button on every pages. provided by 3rd party, check [document](https://github.com/njleonzhang/docsify-edit-on-github)
## CodeSponsor
See https://codesponsor.io
```html
<script>
window.$docsify = {
codesponsor: 'id'
}
</script>
<script src="//unpkg.com/docsify/lib/plugins/codesponsor.min.js"></script>
```
+3 -1
View File
@@ -44,7 +44,9 @@ Wenn du `npm` nicht verwenden möchtest, oder Probleme bei der Installation des
<!DOCTYPE html> <!DOCTYPE html>
<html> <html>
<head> <head>
<meta charset="UTF-8">dict. <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<meta name="viewport" content="width=device-width,initial-scale=1">
<meta charset="UTF-8">
<link rel="stylesheet" href="//unpkg.com/docsify/themes/vue.css"> <link rel="stylesheet" href="//unpkg.com/docsify/themes/vue.css">
</head> </head>
<body> <body>
+23 -1
View File
@@ -1,6 +1,6 @@
# Deploy # Deploy
Similar to [GitBook](https://www.gitbook.com), you can deploy files to GitHub Pages or VPS. Similar to [GitBook](https://www.gitbook.com), you can deploy files to GitHub Pages, GitLab Pages or VPS.
## GitHub Pages ## GitHub Pages
@@ -16,6 +16,28 @@ It is recommended that you save your files to the `./docs` subfolder of the `mas
!> You can also save files in the root directory and select `master branch`. !> You can also save files in the root directory and select `master branch`.
## GitLab Pages
If you are deploying your master branch, include `.gitlab-ci.yml` with the following script:
?> The `.public` workaround is so `cp` doesn't also copy `public/` to itself in an infinite loop.
``` YAML
pages:
stage: deploy
script:
- mkdir .public
- cp -r * .public
- mv .public public
artifacts:
paths:
- public
only:
- master
```
!> You can replace script with `- cp -r docs/. public`, if `./docs` is your Docsify subfolder.
## VPS ## VPS
Try following nginx config. Try following nginx config.
+32
View File
@@ -50,3 +50,35 @@ You will get `<a href="/demo/">link</a>`html. Do not worry, you can still set ti
<a href="/demo/" title="title">link</a> <a href="/demo/" title="title">link</a>
``` ```
## Set target attribute for link
```md
[link](/demo ":target=_blank")
[link](/demo2 ":target=_self")
```
## Disable link
```md
[link](/demo ":disabled")
```
## Github Task Lists
```md
* [ ] foo
* bar
* [x] baz
* [] bam
* [ ] bim
* [ ] lim
```
* [ ] foo
* bar
* [x] baz
* [] bam
* [ ] bim
* [ ] lim
+59 -54
View File
@@ -4,13 +4,14 @@
<meta charset="UTF-8"> <meta charset="UTF-8">
<title>docsify</title> <title>docsify</title>
<link rel="icon" href="_media/favicon.ico"> <link rel="icon" href="_media/favicon.ico">
<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="keywords" content="doc,docs,documentation,gitbook,creator,generator,github,jekyll,github-pages">
<meta name="description" content="A magical documentation generator."> <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"> <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="//cdn.jsdelivr.net/npm/docsify@latest/lib/themes/vue.css" title="vue"> <link rel="stylesheet" href="//unpkg.com/docsify/lib/themes/vue.css" title="vue">
<link rel="stylesheet" href="//cdn.jsdelivr.net/npm/docsify@latest/lib/themes/dark.css" title="dark" disabled> <link rel="stylesheet" href="//unpkg.com/docsify/lib/themes/dark.css" title="dark" disabled>
<link rel="stylesheet" href="//cdn.jsdelivr.net/npm/docsify@latest/lib/themes/buble.css" title="buble" disabled> <link rel="stylesheet" href="//unpkg.com/docsify/lib/themes/buble.css" title="buble" disabled>
<link rel="stylesheet" href="//cdn.jsdelivr.net/npm/docsify@latest/lib/themes/pure.css" title="pure" disabled> <link rel="stylesheet" href="//unpkg.com/docsify/lib/themes/pure.css" title="pure" disabled>
<style> <style>
nav.app-nav li ul { nav.app-nav li ul {
min-width: 100px; min-width: 100px;
@@ -19,55 +20,59 @@
</head> </head>
<body> <body>
<div id="app">Loading ...</div> <div id="app">Loading ...</div>
</body> <script>
<script> window.$docsify = {
window.$docsify = { alias: {
alias: { '.*?/changelog': 'https://raw.githubusercontent.com/QingWei-Li/docsify/master/CHANGELOG',
'.*?/changelog': 'https://raw.githubusercontent.com/QingWei-Li/docsify/master/CHANGELOG', '/.*/_navbar.md': '/_navbar.md'
'/.*/_navbar.md': '/_navbar.md'
},
auto2top: true,
coverpage: true,
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', auto2top: true,
placeholder: { coverpage: true,
'/de-de/': 'Suche', executeScript: true,
'/zh-cn/': '搜索', loadSidebar: true,
'/': 'Search' loadNavbar: true,
} mergeNavbar: true,
}, maxLevel: 4,
formatUpdated: '{MM}/{DD} {HH}:{mm}', subMaxLevel: 2,
plugins: [ codesponsor: '7c9Ms7xRs-j_y_8abU03DA',
function(hook, vm) { ga: 'UA-106147152-1',
hook.beforeEach(function (html) { name: 'docsify',
var url = 'https://github.com/QingWei-Li/docsify/blob/master/docs/' + vm.route.file search: {
var editHtml = '[:memo: Edit Document](' + url + ')\n' noData: {
'/de-de/': 'Keine Ergebnisse!',
return editHtml '/zh-cn/': '没有结果!',
+ html '/': 'No results!'
+ '\n----\n' },
+ 'Last modified {docsify-updated} ' paths: 'auto',
+ editHtml placeholder: {
}) '/de-de/': 'Suche',
} '/zh-cn/': '搜索',
] '/': 'Search'
} }
</script> },
<script src="//cdn.jsdelivr.net/npm/docsify@latest/lib/docsify.min.js"></script> formatUpdated: '{MM}/{DD} {HH}:{mm}',
<script src="//cdn.jsdelivr.net/npm/docsify@latest/lib/plugins/search.min.js"></script> plugins: [
<script src="//cdn.jsdelivr.net/npm/prismjs/components/prism-bash.min.js"></script> function(hook, vm) {
<script src="//cdn.jsdelivr.net/npm/prismjs/components/prism-markdown.min.js"></script> hook.beforeEach(function (html) {
<script src="//cdn.jsdelivr.net/npm/prismjs/components/prism-nginx.min.js"></script> var url = 'https://github.com/QingWei-Li/docsify/blob/master/docs/' + vm.route.file
var editHtml = '[:memo: Edit Document](' + url + ')\n'
return editHtml
+ html
+ '\n----\n'
+ 'Last modified {docsify-updated} '
+ editHtml
})
}
]
}
</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/codesponsor.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>
</body>
</html> </html>
+1 -1
View File
@@ -1,6 +1,6 @@
# language highlight # language highlight
**docsify** uses [Prism](https://github.com/PrismJS/prism) to highlight code blocks in your pages. By default it only supports CSS, JavaScipt and HTML. You can make **Prism** load additional languages: **docsify** uses [Prism](https://github.com/PrismJS/prism) to highlight code blocks in your pages. By default it only supports CSS, JavaScript and HTML. You can make **Prism** load additional languages:
```html ```html
<script src="//unpkg.com/docsify/lib/docsify.min.js"></script> <script src="//unpkg.com/docsify/lib/docsify.min.js"></script>
+25
View File
@@ -28,3 +28,28 @@ window.$docsify = {
} }
} }
``` ```
## Supports mermaid
```js
// Import mermaid
// <link rel="stylesheet" href="//cdn.jsdelivr.net/npm/mermaid/dist/mermaid.min.css">
// <script src="//cdn.jsdelivr.net/npm/mermaid/dist/mermaid.min.js"></script>
mermaid.initialize({ startOnLoad: false });
window.$docsify = {
markdown: {
renderer: {
code: function(code, lang) {
if (lang === "mermaid") {
return (
'<div class="mermaid">' + mermaid.render(lang, code) + "</div>"
);
}
return this.origin.code.apply(this, arguments);
}
}
}
}
```
+70 -2
View File
@@ -35,7 +35,10 @@ By default, the hyperlink on the current page is recognized and the content is s
noData: { noData: {
'/zh-cn/': '找不到结果', '/zh-cn/': '找不到结果',
'/': 'No Results' '/': 'No Results'
} },
// Headline depth, 1 - 6
depth: 2
} }
} }
</script> </script>
@@ -88,8 +91,73 @@ If the script on the page is an external one (imports a js file via `src` attrib
## Zoom image ## Zoom image
Medium's Image Zoom. Based on [zoom-image](https://github.com/egoist/zoom-image). Medium's image zoom. Based on [medium-zoom](https://github.com/francoischalifour/medium-zoom).
```html ```html
<script src="//unpkg.com/docsify/lib/plugins/zoom-image.min.js"></script> <script src="//unpkg.com/docsify/lib/plugins/zoom-image.min.js"></script>
``` ```
Exclude the special image
```markdown
![](image.png ':no-zoom')
```
## Edit on github
Add `Edit on github` button on every pages. provided by 3rd party, check [document](https://github.com/njleonzhang/docsify-edit-on-github)
## Demo code with instant preview and jsfiddle integration
With this plugin, sample code can be rendered on the page instantly, so that the readers can see the preview immediately.
When readers expand the demo box, the source code and description are shown there. if they click the button `Try in Jsfiddle`,
`jsfiddle.net` will be open with the code of this sample, which allow readers to revise the code and try on their own.
[Vue](https://njleonzhang.github.io/docsify-demo-box-vue/) and [React](https://njleonzhang.github.io/docsify-demo-box-react/) are both supported.
## CodeSponsor
See https://codesponsor.io
```html
<script>
window.$docsify = {
codesponsor: 'id'
}
</script>
<script src="//unpkg.com/docsify/lib/plugins/codesponsor.min.js"></script>
```
## Copy to Clipboard
Add a simple `Click to copy` button to all preformatted code blocks to effortlessly allow users to copy example code from your docs.
```html
<link rel="stylesheet" href="//unpkg.com/docsify-copy-code/styles.css">
<script src="//unpkg.com/docsify-copy-code/index.js"></script>
```
```javascript
window.$docsify = {
plugins: [
window.DocsifyCopyCodePlugin.init()
]
}
```
See [here](https://github.com/jperasmus/docsify-copy-code/blob/master/README.md) for more details.
## Disqus
Disqus comments. https://disqus.com/
```html
<script>
window.$docsify = {
disqus: 'shortname'
}
</script>
<script src="//unpkg.com/docsify/lib/plugins/disqus.min.js"></script>
```
+2
View File
@@ -44,6 +44,8 @@ If you don't like `npm` or have trouble installing the tool, you can manually cr
<!DOCTYPE html> <!DOCTYPE html>
<html> <html>
<head> <head>
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<meta name="viewport" content="width=device-width,initial-scale=1">
<meta charset="UTF-8"> <meta charset="UTF-8">
<link rel="stylesheet" href="//unpkg.com/docsify/themes/vue.css"> <link rel="stylesheet" href="//unpkg.com/docsify/themes/vue.css">
</head> </head>
+3 -3
View File
@@ -19,7 +19,7 @@ Then you can immediately write Vue code at Markdown file. `new Vue({ el: '#main'
*README.md* *README.md*
```markdown ````markdown
# Vue guide # Vue guide
`v-for` usage. `v-for` usage.
@@ -28,12 +28,12 @@ Then you can immediately write Vue code at Markdown file. `new Vue({ el: '#main'
<ul> <ul>
<li v-for="i in 10">{{ i }}</li> <li v-for="i in 10">{{ i }}</li>
</ul> </ul>
`` ```
<ul> <ul>
<li v-for="i in 10">{{ i }}</li> <li v-for="i in 10">{{ i }}</li>
</ul> </ul>
``` ````
You can manually initialize a Vue instance. You can manually initialize a Vue instance.
+24
View File
@@ -15,6 +15,30 @@ GitHub Pages 支持从三个地方读取文件
!> 可以将文档放在根目录下,然后选择 **master 分支** 作为文档目录。 !> 可以将文档放在根目录下,然后选择 **master 分支** 作为文档目录。
## GitLab Pages
If you are deploying your master branch, include `.gitlab-ci.yml` with the following script:
?> The `.public` workaround is so `cp` doesn't also copy `public/` to itself in an infinite loop.
``` YAML
pages:
stage: deploy
script:
- mkdir .public
- cp -r * .public
- mv .public public
artifacts:
paths:
- public
only:
- master
```
!> You can replace script with `- cp -r docs/. public`, if `./docs` is your Docsify subfolder.
## VPS ## VPS
和部署所有静态网站一样,只需将服务器的访问根目录设定为 `index.html` 文件。 和部署所有静态网站一样,只需将服务器的访问根目录设定为 `index.html` 文件。
+27
View File
@@ -49,3 +49,30 @@ You will get `<a href="/demo/">link</a>`html. Do not worry, you can still set ti
<a href="/demo/" title="title">link</a> <a href="/demo/" title="title">link</a>
``` ```
## Set target attribute for link
```md
[link](/demo ":target=_blank")
[link](/demo2 ":target=_self")
```
## Github Task Lists
```md
* [ ] foo
* bar
* [x] baz
* [] bam
* [ ] bim
* [ ] lim
```
* [ ] foo
* bar
* [x] baz
* [] bam
* [ ] bim
* [ ] lim
+27 -1
View File
@@ -27,4 +27,30 @@ window.$docsify = {
return marked return marked
} }
} }
``` ```
## Supports mermaid
```js
// Import mermaid
// <link rel="stylesheet" href="//cdn.jsdelivr.net/npm/mermaid/dist/mermaid.min.css">
// <script src="//cdn.jsdelivr.net/npm/mermaid/dist/mermaid.min.js"></script>
mermaid.initialize({ startOnLoad: false });
window.$docsify = {
markdown: {
renderer: {
code: function(code, lang) {
if (lang === "mermaid") {
return (
'<div class="mermaid">' + mermaid.render(lang, code) + "</div>"
);
}
return this.origin.code.apply(this, arguments);
}
}
}
}
```
+34 -2
View File
@@ -35,7 +35,10 @@
noData: { noData: {
'/zh-cn/': '找不到结果', '/zh-cn/': '找不到结果',
'/': 'No Results' '/': 'No Results'
} },
// 搜索标题的最大程级, 1 - 6
depth: 2
} }
} }
</script> </script>
@@ -82,8 +85,37 @@
## 图片缩放 - Zoom image ## 图片缩放 - Zoom image
Medium's 风格的图片缩放插件. 基于 [zoom-image](https://github.com/egoist/zoom-image)。 Medium's 风格的图片缩放插件. 基于 [medium-zoom](https://github.com/francoischalifour/medium-zoom)。
```html ```html
<script src="//unpkg.com/docsify/lib/plugins/zoom-image.js"></script> <script src="//unpkg.com/docsify/lib/plugins/zoom-image.js"></script>
``` ```
忽略某张图片
```markdown
![](image.png ':no-zoom')
```
## Edit on github
Add `Edit on github` button on every pages. provided by 3rd party, check [document](https://github.com/njleonzhang/docsify-edit-on-github)
## CodeSponsor
See https://codesponsor.io
```html
<script>
window.$docsify = {
codesponsor: 'id'
}
</script>
<script src="//unpkg.com/docsify/lib/plugins/codesponsor.min.js"></script>
```
+2
View File
@@ -44,6 +44,8 @@ docsify serve docs
<!DOCTYPE html> <!DOCTYPE html>
<html> <html>
<head> <head>
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<meta name="viewport" content="width=device-width,initial-scale=1">
<meta charset="UTF-8"> <meta charset="UTF-8">
<link rel="stylesheet" href="//unpkg.com/docsify/themes/vue.css"> <link rel="stylesheet" href="//unpkg.com/docsify/themes/vue.css">
</head> </head>
+450 -189
View File
File diff suppressed because it is too large Load Diff
+2 -2
View File
File diff suppressed because one or more lines are too long
+64
View File
@@ -0,0 +1,64 @@
(function () {
'use strict';
var DEFAULT_OPTIONS = {
theme: 'light',
image: 'show'
};
function tpl (id, options) {
var qs = [];
for (var key in options) {
qs.push((key + "=" + (options[key])));
}
var div = Docsify.dom.create('div');
Docsify.dom.toggleClass(div, 'codesponsor');
div.innerHTML = "<iframe\n scrolling=0\n frameborder=0\n width=250\n height=auto\n style=\"max-height: 250px;\"\n id=\"code-sponsor-embed-iframe\"\n src=\"https://app.codesponsor.io/widgets/" + id + "?" + (qs.join('&')) + "\">\n </iframe>";
return div
}
function appIframe (id, opts) {
var html = tpl(id, opts);
Docsify.dom.before(Docsify.dom.find('section.content'), html);
}
function appendStyle () {
Docsify.dom.style("\n .codesponsor {\n position: relative;\n float: right;\n right: 10px;\n top: 10px;\n }\n\n @media screen and (min-width: 1600px) {\n body.sticky .codesponsor {\n position: fixed;\n }\n\n .codesponsor {\n position: absolute;\n bottom: 10px;\n top: auto;\n float: none;\n }\n }\n ");
}
var install = function (hook, vm) {
var config = vm.config.codesponsor;
var id;
if (typeof config === 'string') {
id = config;
config = {};
} else {
id = config.id;
}
var opts = Docsify.util.merge(DEFAULT_OPTIONS, config);
if (!id) {
throw Error('codesponsor plugin need id')
}
if (Docsify.util.isMobile) {
return
}
// Append style
hook.ready(function () {
appendStyle();
appIframe(id, opts);
});
};
window.$docsify.plugins = [].concat(install, window.$docsify.plugins);
}());
+1
View File
@@ -0,0 +1 @@
!function(){"use strict";function o(o,n){var i=[];for(var e in n)i.push(e+"="+n[e]);var s=Docsify.dom.create("div");return Docsify.dom.toggleClass(s,"codesponsor"),s.innerHTML='<iframe\n scrolling=0\n frameborder=0\n width=250\n height=auto\n style="max-height: 250px;"\n id="code-sponsor-embed-iframe"\n src="https://app.codesponsor.io/widgets/'+o+"?"+i.join("&")+'">\n </iframe>',s}function n(n,i){var e=o(n,i);Docsify.dom.before(Docsify.dom.find("section.content"),e)}function i(){Docsify.dom.style("\n .codesponsor {\n position: relative;\n float: right;\n right: 10px;\n top: 10px;\n }\n\n @media screen and (min-width: 1600px) {\n body.sticky .codesponsor {\n position: fixed;\n }\n\n .codesponsor {\n position: absolute;\n bottom: 10px;\n top: auto;\n float: none;\n }\n }\n ")}var e={theme:"light",image:"show"},s=function(o,s){var t,r=s.config.codesponsor;"string"==typeof r?(t=r,r={}):t=r.id;var c=Docsify.util.merge(e,r);if(!t)throw Error("codesponsor plugin need id");Docsify.util.isMobile||o.ready(function(){i(),n(t,c)})};window.$docsify.plugins=[].concat(s,window.$docsify.plugins)}();
+53
View File
@@ -0,0 +1,53 @@
(function () {
'use strict';
location.href = location.href.replace('/-/', '/#/');
function install (hook, vm) {
var dom = Docsify.dom;
var disqus = vm.config.disqus;
if (!disqus) {
throw Error('$docsify.disqus is required')
}
hook.init(function (_) {
var script = dom.create('script');
script.async = true;
script.src = "https://" + disqus + ".disqus.com/embed.js";
script.setAttribute('data-timestamp', +new Date());
dom.appendTo(dom.body, script);
});
hook.mounted(function (_) {
var div = dom.create('div');
div.id = 'disqus_thread';
var main = dom.getNode('#main');
div.style = "width: " + (main.clientWidth) + "px; margin: 0 auto 20px;";
dom.appendTo(dom.find('.content'), div);
// eslint-disable-next-line
window.disqus_config = function() {
this.page.url = location.origin + '/-' + vm.route.path;
this.page.identifier = vm.route.path;
this.page.title = document.title;
};
});
hook.doneEach(function (_) {
if (typeof window.DISQUS !== 'undefined') {
window.DISQUS.reset({
reload: true,
config: function () {
this.page.url = location.origin + '/-' + vm.route.path;
this.page.identifier = vm.route.path;
this.page.title = document.title;
}
});
}
});
}
$docsify.plugins = [].concat(install, $docsify.plugins);
}());
+1
View File
@@ -0,0 +1 @@
!function(){"use strict";function i(i,t){var e=Docsify.dom,o=t.config.disqus;if(!o)throw Error("$docsify.disqus is required");i.init(function(i){var t=e.create("script");t.async=!0,t.src="https://"+o+".disqus.com/embed.js",t.setAttribute("data-timestamp",+new Date),e.appendTo(e.body,t)}),i.mounted(function(i){var o=e.create("div");o.id="disqus_thread";var n=e.getNode("#main");o.style="width: "+n.clientWidth+"px; margin: 0 auto 20px;",e.appendTo(e.find(".content"),o),window.disqus_config=function(){this.page.url=location.origin+"/-"+t.route.path,this.page.identifier=t.route.path,this.page.title=document.title}}),i.doneEach(function(i){void 0!==window.DISQUS&&window.DISQUS.reset({reload:!0,config:function(){this.page.url=location.origin+"/-"+t.route.path,this.page.identifier=t.route.path,this.page.title=document.title}})})}location.href=location.href.replace("/-/","/#/"),$docsify.plugins=[].concat(i,$docsify.plugins)}();
+893 -146
View File
File diff suppressed because it is too large Load Diff
+327 -331
View File
@@ -32,386 +32,381 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* @namespace * @namespace
*/ */
var errors = []; var errors = [];
var reference_blocks = []; var reference_blocks = [];
var processing_time = 0; var processing_time = 0;
var regex$1 = var regex$1 = {
{ regLevel: new RegExp('^([\\s\\-]+)'),
"regLevel" : new RegExp("^([\\s\\-]+)"), invalidLine: new RegExp('^\\-\\-\\-|^\\.\\.\\.|^\\s*#.*|^\\s*$'),
"invalidLine" : new RegExp("^\\-\\-\\-|^\\.\\.\\.|^\\s*#.*|^\\s*$"), dashesString: new RegExp('^\\s*\\"([^\\"]*)\\"\\s*$'),
"dashesString" : new RegExp("^\\s*\\\"([^\\\"]*)\\\"\\s*$"), quotesString: new RegExp("^\\s*\\'([^\\']*)\\'\\s*$"),
"quotesString" : new RegExp("^\\s*\\\'([^\\\']*)\\\'\\s*$"), float: new RegExp('^[+-]?[0-9]+\\.[0-9]+(e[+-]?[0-9]+(\\.[0-9]+)?)?$'),
"float" : new RegExp("^[+-]?[0-9]+\\.[0-9]+(e[+-]?[0-9]+(\\.[0-9]+)?)?$"), integer: new RegExp('^[+-]?[0-9]+$'),
"integer" : new RegExp("^[+-]?[0-9]+$"), array: new RegExp('\\[\\s*(.*)\\s*\\]'),
"array" : new RegExp("\\[\\s*(.*)\\s*\\]"), map: new RegExp('\\{\\s*(.*)\\s*\\}'),
"map" : new RegExp("\\{\\s*(.*)\\s*\\}"), key_value: new RegExp('([a-z0-9_-][ a-z0-9_-]*):( .+)', 'i'),
"key_value" : new RegExp("([a-z0-9_-][ a-z0-9_-]*):( .+)", "i"), single_key_value: new RegExp('^([a-z0-9_-][ a-z0-9_-]*):( .+?)$', 'i'),
"single_key_value" : new RegExp("^([a-z0-9_-][ a-z0-9_-]*):( .+?)$", "i"), key: new RegExp('([a-z0-9_-][ a-z0-9_-]+):( .+)?', 'i'),
"key" : new RegExp("([a-z0-9_-][ a-z0-9_-]+):( .+)?", "i"), item: new RegExp('^-\\s+'),
"item" : new RegExp("^-\\s+"), trim: new RegExp('^\\s+|\\s+$'),
"trim" : new RegExp("^\\s+|\\s+$"), comment: new RegExp('([^\\\'\\"#]+([\\\'\\"][^\\\'\\"]*[\\\'\\"])*)*(#.*)?')
"comment" : new RegExp("([^\\\'\\\"#]+([\\\'\\\"][^\\\'\\\"]*[\\\'\\\"])*)*(#.*)?") };
};
/** /**
* @class A block of lines of a given level. * @class A block of lines of a given level.
* @param {int} lvl The block's level. * @param {int} lvl The block's level.
* @private * @private
*/ */
function Block(lvl) { function Block(lvl) {
return { return {
/* The block's parent */ /* The block's parent */
parent: null, parent: null,
/* Number of children */ /* Number of children */
length: 0, length: 0,
/* Block's level */ /* Block's level */
level: lvl, level: lvl,
/* Lines of code to process */ /* Lines of code to process */
lines: [], lines: [],
/* Blocks with greater level */ /* Blocks with greater level */
children : [], children: [],
/* Add a block to the children collection */ /* Add a block to the children collection */
addChild : function(obj) { addChild: function(obj) {
this.children.push(obj); this.children.push(obj);
obj.parent = this; obj.parent = this;
++this.length; ++this.length;
} }
}; }
} }
function parser$1(str) { function parser$1(str) {
var regLevel = regex$1["regLevel"]; var regLevel = regex$1['regLevel'];
var invalidLine = regex$1["invalidLine"]; var invalidLine = regex$1['invalidLine'];
var lines = str.split("\n"); var lines = str.split('\n');
var m; var m;
var level = 0, curLevel = 0; var level = 0,
curLevel = 0;
var blocks = []; var blocks = [];
var result = new Block(-1); var result = new Block(-1);
var currentBlock = new Block(0); var currentBlock = new Block(0);
result.addChild(currentBlock); result.addChild(currentBlock);
var levels = []; var levels = [];
var line = ""; var line = '';
blocks.push(currentBlock); blocks.push(currentBlock);
levels.push(level); levels.push(level);
for(var i = 0, len = lines.length; i < len; ++i) { for (var i = 0, len = lines.length; i < len; ++i) {
line = lines[i]; line = lines[i];
if(line.match(invalidLine)) { if (line.match(invalidLine)) {
continue; continue
}
if(m = regLevel.exec(line)) {
level = m[1].length;
} else
{ level = 0; }
if(level > curLevel) {
var oldBlock = currentBlock;
currentBlock = new Block(level);
oldBlock.addChild(currentBlock);
blocks.push(currentBlock);
levels.push(level);
} else if(level < curLevel) {
var added = false;
var k = levels.length - 1;
for(; k >= 0; --k) {
if(levels[k] == level) {
currentBlock = new Block(level);
blocks.push(currentBlock);
levels.push(level);
if(blocks[k].parent!= null)
{ blocks[k].parent.addChild(currentBlock); }
added = true;
break;
}
}
if(!added) {
errors.push("Error: Invalid indentation at line " + i + ": " + line);
return;
}
}
currentBlock.lines.push(line.replace(regex$1["trim"], ""));
curLevel = level;
} }
return result; if ((m = regLevel.exec(line))) {
level = m[1].length;
} else { level = 0; }
if (level > curLevel) {
var oldBlock = currentBlock;
currentBlock = new Block(level);
oldBlock.addChild(currentBlock);
blocks.push(currentBlock);
levels.push(level);
} else if (level < curLevel) {
var added = false;
var k = levels.length - 1;
for (; k >= 0; --k) {
if (levels[k] == level) {
currentBlock = new Block(level);
blocks.push(currentBlock);
levels.push(level);
if (blocks[k].parent != null) { blocks[k].parent.addChild(currentBlock); }
added = true;
break
}
}
if (!added) {
errors.push('Error: Invalid indentation at line ' + i + ': ' + line);
return
}
}
currentBlock.lines.push(line.replace(regex$1['trim'], ''));
curLevel = level;
}
return result
} }
function processValue(val) { function processValue(val) {
val = val.replace(regex$1["trim"], ""); val = val.replace(regex$1['trim'], '');
var m = null; var m = null;
if(val == 'true') { if (val == 'true') {
return true; return true
} else if(val == 'false') { } else if (val == 'false') {
return false; return false
} else if(val == '.NaN') { } else if (val == '.NaN') {
return Number.NaN; return Number.NaN
} else if(val == 'null') { } else if (val == 'null') {
return null; return null
} else if(val == '.inf') { } else if (val == '.inf') {
return Number.POSITIVE_INFINITY; return Number.POSITIVE_INFINITY
} else if(val == '-.inf') { } else if (val == '-.inf') {
return Number.NEGATIVE_INFINITY; return Number.NEGATIVE_INFINITY
} else if(m = val.match(regex$1["dashesString"])) { } else if ((m = val.match(regex$1['dashesString']))) {
return m[1]; return m[1]
} else if(m = val.match(regex$1["quotesString"])) { } else if ((m = val.match(regex$1['quotesString']))) {
return m[1]; return m[1]
} else if(m = val.match(regex$1["float"])) { } else if ((m = val.match(regex$1['float']))) {
return parseFloat(m[0]); return parseFloat(m[0])
} else if(m = val.match(regex$1["integer"])) { } else if ((m = val.match(regex$1['integer']))) {
return parseInt(m[0]); return parseInt(m[0])
} else if( !isNaN(m = Date.parse(val))) { } else if (!isNaN((m = Date.parse(val)))) {
return new Date(m); return new Date(m)
} else if(m = val.match(regex$1["single_key_value"])) { } else if ((m = val.match(regex$1['single_key_value']))) {
var res = {}; var res = {};
res[m[1]] = processValue(m[2]); res[m[1]] = processValue(m[2]);
return res; return res
} else if(m = val.match(regex$1["array"])){ } else if ((m = val.match(regex$1['array']))) {
var count = 0, c = ' '; var count = 0,
var res = []; c = ' ';
var content = ""; var res = [];
var str = false; var content = '';
for(var j = 0, lenJ = m[1].length; j < lenJ; ++j) { var str = false;
c = m[1][j]; for (var j = 0, lenJ = m[1].length; j < lenJ; ++j) {
if(c == '\'' || c == '"') { c = m[1][j];
if(str === false) { if (c == "'" || c == '"') {
str = c; if (str === false) {
content += c; str = c;
continue; content += c;
} else if((c == '\'' && str == '\'') || (c == '"' && str == '"')) { continue
str = false; } else if ((c == "'" && str == "'") || (c == '"' && str == '"')) {
content += c; str = false;
continue; content += c;
} continue
} else if(str === false && (c == '[' || c == '{')) {
++count;
} else if(str === false && (c == ']' || c == '}')) {
--count;
} else if(str === false && count == 0 && c == ',') {
res.push(processValue(content));
content = "";
continue;
}
content += c;
} }
} else if (str === false && (c == '[' || c == '{')) {
++count;
} else if (str === false && (c == ']' || c == '}')) {
--count;
} else if (str === false && count == 0 && c == ',') {
res.push(processValue(content));
content = '';
continue
}
if(content.length > 0) content += c;
{ res.push(processValue(content)); } }
return res;
} else if(m = val.match(regex$1["map"])){
var count = 0, c = ' ';
var res = [];
var content = "";
var str = false;
for(var j = 0, lenJ = m[1].length; j < lenJ; ++j) {
c = m[1][j];
if(c == '\'' || c == '"') {
if(str === false) {
str = c;
content += c;
continue;
} else if((c == '\'' && str == '\'') || (c == '"' && str == '"')) {
str = false;
content += c;
continue;
}
} else if(str === false && (c == '[' || c == '{')) {
++count;
} else if(str === false && (c == ']' || c == '}')) {
--count;
} else if(str === false && count == 0 && c == ',') {
res.push(content);
content = "";
continue;
}
content += c; if (content.length > 0) { res.push(processValue(content)); }
return res
} else if ((m = val.match(regex$1['map']))) {
var count = 0,
c = ' ';
var res = [];
var content = '';
var str = false;
for (var j = 0, lenJ = m[1].length; j < lenJ; ++j) {
c = m[1][j];
if (c == "'" || c == '"') {
if (str === false) {
str = c;
content += c;
continue
} else if ((c == "'" && str == "'") || (c == '"' && str == '"')) {
str = false;
content += c;
continue
} }
} else if (str === false && (c == '[' || c == '{')) {
++count;
} else if (str === false && (c == ']' || c == '}')) {
--count;
} else if (str === false && count == 0 && c == ',') {
res.push(content);
content = '';
continue
}
if(content.length > 0) content += c;
{ res.push(content); } }
var newRes = {}; if (content.length > 0) { res.push(content); }
for(var j = 0, lenJ = res.length; j < lenJ; ++j) {
if(m = res[j].match(regex$1["key_value"])) {
newRes[m[1]] = processValue(m[2]);
}
}
return newRes; var newRes = {};
} else for (var j = 0, lenJ = res.length; j < lenJ; ++j) {
{ return val; } if ((m = res[j].match(regex$1['key_value']))) {
newRes[m[1]] = processValue(m[2]);
}
}
return newRes
} else { return val }
} }
function processFoldedBlock(block) { function processFoldedBlock(block) {
var lines = block.lines; var lines = block.lines;
var children = block.children; var children = block.children;
var str = lines.join(" "); var str = lines.join(' ');
var chunks = [str]; var chunks = [str];
for(var i = 0, len = children.length; i < len; ++i) { for (var i = 0, len = children.length; i < len; ++i) {
chunks.push(processFoldedBlock(children[i])); chunks.push(processFoldedBlock(children[i]));
} }
return chunks.join("\n"); return chunks.join('\n')
} }
function processLiteralBlock(block) { function processLiteralBlock(block) {
var lines = block.lines; var lines = block.lines;
var children = block.children; var children = block.children;
var str = lines.join("\n"); var str = lines.join('\n');
for(var i = 0, len = children.length; i < len; ++i) { for (var i = 0, len = children.length; i < len; ++i) {
str += processLiteralBlock(children[i]); str += processLiteralBlock(children[i]);
} }
return str; return str
} }
function processBlock(blocks) { function processBlock(blocks) {
var m = null; var m = null;
var res = {}; var res = {};
var lines = null; var lines = null;
var children = null; var children = null;
var currentObj = null; var currentObj = null;
var level = -1; var level = -1;
var processedBlocks = []; var processedBlocks = [];
var isMap = true; var isMap = true;
for(var j = 0, lenJ = blocks.length; j < lenJ; ++j) { for (var j = 0, lenJ = blocks.length; j < lenJ; ++j) {
if (level != -1 && level != blocks[j].level) { continue }
if(level != -1 && level != blocks[j].level) processedBlocks.push(j);
{ continue; }
processedBlocks.push(j); level = blocks[j].level;
lines = blocks[j].lines;
children = blocks[j].children;
currentObj = null;
level = blocks[j].level; for (var i = 0, len = lines.length; i < len; ++i) {
lines = blocks[j].lines; var line = lines[i];
children = blocks[j].children;
currentObj = null;
for(var i = 0, len = lines.length; i < len; ++i) { if ((m = line.match(regex$1['key']))) {
var line = lines[i]; var key = m[1];
if(m = line.match(regex$1["key"])) { if (key[0] == '-') {
var key = m[1]; key = key.replace(regex$1['item'], '');
if (isMap) {
if(key[0] == '-') { isMap = false;
key = key.replace(regex$1["item"], ""); if (typeof res.length === 'undefined') {
if (isMap) { res = [];
isMap = false;
if (typeof(res.length) === "undefined") {
res = [];
}
}
if(currentObj != null) { res.push(currentObj); }
currentObj = {};
isMap = true;
}
if(typeof m[2] != "undefined") {
var value = m[2].replace(regex$1["trim"], "");
if(value[0] == '&') {
var nb = processBlock(children);
if(currentObj != null) { currentObj[key] = nb; }
else { res[key] = nb; }
reference_blocks[value.substr(1)] = nb;
} else if(value[0] == '|') {
if(currentObj != null) { currentObj[key] = processLiteralBlock(children.shift()); }
else { res[key] = processLiteralBlock(children.shift()); }
} else if(value[0] == '*') {
var v = value.substr(1);
var no = {};
if(typeof reference_blocks[v] == "undefined") {
errors.push("Reference '" + v + "' not found!");
} else {
for(var k in reference_blocks[v]) {
no[k] = reference_blocks[v][k];
}
if(currentObj != null) { currentObj[key] = no; }
else { res[key] = no; }
}
} else if(value[0] == '>') {
if(currentObj != null) { currentObj[key] = processFoldedBlock(children.shift()); }
else { res[key] = processFoldedBlock(children.shift()); }
} else {
if(currentObj != null) { currentObj[key] = processValue(value); }
else { res[key] = processValue(value); }
}
} else {
if(currentObj != null) { currentObj[key] = processBlock(children); }
else { res[key] = processBlock(children); }
}
} else if(line.match(/^-\s*$/)) {
if (isMap) {
isMap = false;
if (typeof(res.length) === "undefined") {
res = [];
}
}
if(currentObj != null) { res.push(currentObj); }
currentObj = {};
isMap = true;
continue;
} else if(m = line.match(/^-\s*(.*)/)) {
if(currentObj != null)
{ currentObj.push(processValue(m[1])); }
else {
if (isMap) {
isMap = false;
if (typeof(res.length) === "undefined") {
res = [];
}
}
res.push(processValue(m[1]));
}
continue;
} }
}
if (currentObj != null) { res.push(currentObj); }
currentObj = {};
isMap = true;
} }
if(currentObj != null) { if (typeof m[2] != 'undefined') {
if (isMap) { var value = m[2].replace(regex$1['trim'], '');
isMap = false; if (value[0] == '&') {
if (typeof(res.length) === "undefined") { var nb = processBlock(children);
res = []; if (currentObj != null) { currentObj[key] = nb; }
} else { res[key] = nb; }
reference_blocks[value.substr(1)] = nb;
} else if (value[0] == '|') {
if (currentObj != null)
{ currentObj[key] = processLiteralBlock(children.shift()); }
else { res[key] = processLiteralBlock(children.shift()); }
} else if (value[0] == '*') {
var v = value.substr(1);
var no = {};
if (typeof reference_blocks[v] == 'undefined') {
errors.push("Reference '" + v + "' not found!");
} else {
for (var k in reference_blocks[v]) {
no[k] = reference_blocks[v][k];
}
if (currentObj != null) { currentObj[key] = no; }
else { res[key] = no; }
} }
res.push(currentObj); } else if (value[0] == '>') {
if (currentObj != null)
{ currentObj[key] = processFoldedBlock(children.shift()); }
else { res[key] = processFoldedBlock(children.shift()); }
} else {
if (currentObj != null) { currentObj[key] = processValue(value); }
else { res[key] = processValue(value); }
}
} else {
if (currentObj != null) { currentObj[key] = processBlock(children); }
else { res[key] = processBlock(children); }
} }
} else if (line.match(/^-\s*$/)) {
if (isMap) {
isMap = false;
if (typeof res.length === 'undefined') {
res = [];
}
}
if (currentObj != null) { res.push(currentObj); }
currentObj = {};
isMap = true;
continue
} else if ((m = line.match(/^-\s*(.*)/))) {
if (currentObj != null) { currentObj.push(processValue(m[1])); }
else {
if (isMap) {
isMap = false;
if (typeof res.length === 'undefined') {
res = [];
}
}
res.push(processValue(m[1]));
}
continue
}
} }
for(var j = processedBlocks.length - 1; j >= 0; --j) { if (currentObj != null) {
blocks.splice.call(blocks, processedBlocks[j], 1); if (isMap) {
isMap = false;
if (typeof res.length === 'undefined') {
res = [];
}
}
res.push(currentObj);
} }
}
return res; for (var j = processedBlocks.length - 1; j >= 0; --j) {
blocks.splice.call(blocks, processedBlocks[j], 1);
}
return res
} }
function semanticAnalysis(blocks) { function semanticAnalysis(blocks) {
var res = processBlock(blocks.children); var res = processBlock(blocks.children);
return res; return res
} }
function preProcess(src) { function preProcess(src) {
var m; var m;
var lines = src.split("\n"); var lines = src.split('\n');
var r = regex$1["comment"]; var r = regex$1['comment'];
for(var i in lines) { for (var i in lines) {
if(m = lines[i].match(r)) { if ((m = lines[i].match(r))) {
/* var cmt = ""; /* var cmt = "";
if(typeof m[3] != "undefined") if(typeof m[3] != "undefined")
lines[i] = m[1]; lines[i] = m[1];
else if(typeof m[3] != "undefined") else if(typeof m[3] != "undefined")
@@ -419,25 +414,25 @@ function preProcess(src) {
else else
lines[i] = ""; lines[i] = "";
*/ */
if(typeof m[3] !== "undefined") { if (typeof m[3] !== 'undefined') {
lines[i] = m[0].substr(0, m[0].length - m[3].length); lines[i] = m[0].substr(0, m[0].length - m[3].length);
} }
}
} }
}
return lines.join("\n"); return lines.join('\n')
} }
function load(str) { function load(str) {
errors = []; errors = [];
reference_blocks = []; reference_blocks = [];
processing_time = (new Date()).getTime(); processing_time = new Date().getTime();
var pre = preProcess(str); var pre = preProcess(str);
var doc = parser$1(pre); var doc = parser$1(pre);
var res = semanticAnalysis(doc); var res = semanticAnalysis(doc);
processing_time = (new Date()).getTime() - processing_time; processing_time = new Date().getTime() - processing_time;
return res; return res
} }
/** /**
@@ -445,7 +440,8 @@ function load(str) {
*/ */
/* eslint-disable */ /* eslint-disable */
var optionalByteOrderMark = '\\ufeff?'; var optionalByteOrderMark = '\\ufeff?';
var pattern = '^(' + var pattern =
'^(' +
optionalByteOrderMark + optionalByteOrderMark +
'(= yaml =|---)' + '(= yaml =|---)' +
'$([\\s\\S]*?)' + '$([\\s\\S]*?)' +
@@ -457,7 +453,7 @@ var pattern = '^(' +
// need to be moved down into the functions that use it. // need to be moved down into the functions that use it.
var regex = new RegExp(pattern, 'm'); var regex = new RegExp(pattern, 'm');
function extractor (string) { function extractor(string) {
string = string || ''; string = string || '';
var lines = string.split(/(\r?\n)/); var lines = string.split(/(\r?\n)/);
@@ -468,7 +464,7 @@ function extractor (string) {
} }
} }
function parse (string) { function parse(string) {
var match = regex.exec(string); var match = regex.exec(string);
if (!match) { if (!match) {
+5 -3
View File
@@ -11,9 +11,11 @@ function appendScript () {
function init (id) { function init (id) {
appendScript(); appendScript();
window.ga = window.ga || function () { window.ga =
(window.ga.q = window.ga.q || []).push(arguments); window.ga ||
}; function () {
(window.ga.q = window.ga.q || []).push(arguments);
};
window.ga.l = Number(new Date()); window.ga.l = Number(new Date());
window.ga('create', id, 'auto'); window.ga('create', id, 'auto');
} }
+24 -11
View File
@@ -41,7 +41,7 @@ function saveData (maxAge) {
localStorage.setItem('docsify.search.index', JSON.stringify(INDEXS)); localStorage.setItem('docsify.search.index', JSON.stringify(INDEXS));
} }
function genIndex (path, content, router) { function genIndex (path, content, router, depth) {
if ( content === void 0 ) content = ''; if ( content === void 0 ) content = '';
var tokens = window.marked.lexer(content); var tokens = window.marked.lexer(content);
@@ -50,7 +50,7 @@ function genIndex (path, content, router) {
var slug; var slug;
tokens.forEach(function (token) { tokens.forEach(function (token) {
if (token.type === 'heading' && token.depth <= 2) { if (token.type === 'heading' && token.depth <= depth) {
slug = router.toURL(path, { id: slugify(token.text) }); slug = router.toURL(path, { id: slugify(token.text) });
index[slug] = { slug: slug, title: token.text, body: '' }; index[slug] = { slug: slug, title: token.text, body: '' };
} else { } else {
@@ -70,14 +70,22 @@ function genIndex (path, content, router) {
return index return index
} }
function search (keywords) { /**
* @param {String} query
* @returns {Array}
*/
function search (query) {
var matchingResults = []; var matchingResults = [];
var data = []; var data = [];
Object.keys(INDEXS).forEach(function (key) { Object.keys(INDEXS).forEach(function (key) {
data = data.concat(Object.keys(INDEXS[key]).map(function (page) { return INDEXS[key][page]; })); data = data.concat(Object.keys(INDEXS[key]).map(function (page) { return INDEXS[key][page]; }));
}); });
keywords = [].concat(keywords, keywords.trim().split(/[\s\-\\\/]+/)); query = query.trim();
var keywords = query.split(/[\s\-\\\/]+/);
if (keywords.length !== 1) {
keywords = [].concat(query, keywords);
}
var loop = function ( i ) { var loop = function ( i ) {
var post = data[i]; var post = data[i];
@@ -161,7 +169,7 @@ function init$1 (config, vm) {
helper helper
.get(vm.router.getFile(path)) .get(vm.router.getFile(path))
.then(function (result) { .then(function (result) {
INDEXS[path] = genIndex(path, result, vm.router); INDEXS[path] = genIndex(path, result, vm.router, config.depth);
len === ++count && saveData(config.maxAge); len === ++count && saveData(config.maxAge);
}); });
}); });
@@ -171,8 +179,8 @@ var NO_DATA_TEXT = '';
function style () { function style () {
var code = "\n.sidebar {\n padding-top: 0;\n}\n\n.search {\n margin-bottom: 20px;\n padding: 6px;\n border-bottom: 1px solid #eee;\n}\n\n.search .results-panel {\n display: none;\n}\n\n.search .results-panel.show {\n display: block;\n}\n\n.search input {\n outline: none;\n border: none;\n width: 100%;\n padding: 7px;\n line-height: 22px;\n font-size: 14px;\n -webkit-appearance: none;\n -moz-appearance: none;\n appearance: none;\n}\n\n.search h2 {\n font-size: 17px;\n margin: 10px 0;\n}\n\n.search a {\n text-decoration: none;\n color: inherit;\n}\n\n.search .matching-post {\n border-bottom: 1px solid #eee;\n}\n\n.search .matching-post:last-child {\n border-bottom: 0;\n}\n\n.search p {\n font-size: 14px;\n overflow: hidden;\n text-overflow: ellipsis;\n display: -webkit-box;\n -webkit-line-clamp: 2;\n -webkit-box-orient: vertical;\n}\n\n.search p.empty {\n text-align: center;\n}"; var code = "\n.sidebar {\n padding-top: 0;\n}\n\n.search {\n margin-bottom: 20px;\n padding: 6px;\n border-bottom: 1px solid #eee;\n}\n\n.search .results-panel {\n display: none;\n}\n\n.search .results-panel.show {\n display: block;\n}\n\n.search input {\n outline: none;\n border: none;\n width: 100%;\n padding: 7px;\n line-height: 22px;\n font-size: 14px;\n -webkit-appearance: none;\n -moz-appearance: none;\n appearance: none;\n}\n\n.search h2 {\n font-size: 17px;\n margin: 10px 0;\n}\n\n.search a {\n text-decoration: none;\n color: inherit;\n}\n\n.search .matching-post {\n border-bottom: 1px solid #eee;\n}\n\n.search .matching-post:last-child {\n border-bottom: 0;\n}\n\n.search p {\n font-size: 14px;\n overflow: hidden;\n text-overflow: ellipsis;\n display: -webkit-box;\n -webkit-line-clamp: 2;\n -webkit-box-orient: vertical;\n}\n\n.search p.empty {\n text-align: center;\n}";
var style = Docsify.dom.create('style', code);
Docsify.dom.appendTo(Docsify.dom.head, style); Docsify.dom.style(code);
} }
function tpl (opts, defaultValue) { function tpl (opts, defaultValue) {
@@ -180,7 +188,7 @@ function tpl (opts, defaultValue) {
var html = var html =
"<input type=\"search\" value=\"" + defaultValue + "\" />" + "<input type=\"search\" value=\"" + defaultValue + "\" />" +
'<div class="results-panel"></div>' + '<div class="results-panel"></div>' +
'</div>'; '</div>';
var el = Docsify.dom.create('div', html); var el = Docsify.dom.create('div', html);
var aside = Docsify.dom.find('aside'); var aside = Docsify.dom.find('aside');
@@ -202,7 +210,7 @@ function doSearch (value) {
var html = ''; var html = '';
matchs.forEach(function (post) { matchs.forEach(function (post) {
html += "<div class=\"matching-post\">\n<h2><a href=\"" + (post.url) + "\">" + (post.title) + "</a></h2>\n<p>" + (post.content) + "</p>\n</div>"; html += "<div class=\"matching-post\">\n<a href=\"" + (post.url) + "\"> \n<h2>" + (post.title) + "</h2>\n<p>" + (post.content) + "</p>\n</a>\n</div>";
}); });
$panel.classList.add('show'); $panel.classList.add('show');
@@ -215,8 +223,11 @@ function bindEvents () {
var timeId; var timeId;
// Prevent to Fold sidebar // Prevent to Fold sidebar
Docsify.dom.on($search, 'click', Docsify.dom.on(
function (e) { return e.target.tagName !== 'A' && e.stopPropagation(); }); $search,
'click',
function (e) { return e.target.tagName !== 'A' && e.stopPropagation(); }
);
Docsify.dom.on($input, 'input', function (e) { Docsify.dom.on($input, 'input', function (e) {
clearTimeout(timeId); clearTimeout(timeId);
timeId = setTimeout(function (_) { return doSearch(e.target.value.trim()); }, 100); timeId = setTimeout(function (_) { return doSearch(e.target.value.trim()); }, 100);
@@ -262,6 +273,7 @@ var CONFIG = {
placeholder: 'Type to search', placeholder: 'Type to search',
noData: 'No Results!', noData: 'No Results!',
paths: 'auto', paths: 'auto',
depth: 2,
maxAge: 86400000 // 1 day maxAge: 86400000 // 1 day
}; };
@@ -276,6 +288,7 @@ var install = function (hook, vm) {
CONFIG.maxAge = util.isPrimitive(opts.maxAge) ? opts.maxAge : CONFIG.maxAge; CONFIG.maxAge = util.isPrimitive(opts.maxAge) ? opts.maxAge : CONFIG.maxAge;
CONFIG.placeholder = opts.placeholder || CONFIG.placeholder; CONFIG.placeholder = opts.placeholder || CONFIG.placeholder;
CONFIG.noData = opts.noData || CONFIG.noData; CONFIG.noData = opts.noData || CONFIG.noData;
CONFIG.depth = opts.depth || CONFIG.depth;
} }
var isAuto = CONFIG.paths === 'auto'; var isAuto = CONFIG.paths === 'auto';
+1 -1
View File
@@ -1 +1 @@
!function(){"use strict";function e(e){var n={"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#39;","/":"&#x2F;"};return String(e).replace(/[&<>"'\/]/g,function(e){return n[e]})}function n(e){var n=[];return h.dom.findAll("a:not([data-nosearch])").map(function(t){var o=t.href,i=t.getAttribute("href"),r=e.parse(o).path;r&&-1===n.indexOf(r)&&!Docsify.util.isAbsolutePath(i)&&n.push(r)}),n}function t(e){localStorage.setItem("docsify.search.expires",Date.now()+e),localStorage.setItem("docsify.search.index",JSON.stringify(y))}function o(e,n,t){void 0===n&&(n="");var o,i=window.marked.lexer(n),r=window.Docsify.slugify,a={};return i.forEach(function(n){if("heading"===n.type&&n.depth<=2)o=t.toURL(e,{id:r(n.text)}),a[o]={slug:o,title:n.text,body:""};else{if(!o)return;a[o]?a[o].body?a[o].body+="\n"+(n.text||""):a[o].body=n.text:a[o]={slug:o,title:"",body:""}}}),r.clear(),a}function i(n){var t=[],o=[];Object.keys(y).forEach(function(e){o=o.concat(Object.keys(y[e]).map(function(n){return y[e][n]}))}),n=[].concat(n,n.trim().split(/[\s\-\\\\/]+/));for(var i=0;i<o.length;i++)!function(i){var r=o[i],a=!1,s="",c=r.title&&r.title.trim(),f=r.body&&r.body.trim(),l=r.slug||"";if(c&&f&&(n.forEach(function(n,t){var o=new RegExp(n,"gi"),i=-1,r=-1;if(i=c&&c.search(o),r=f&&f.search(o),i<0&&r<0)a=!1;else{a=!0,r<0&&(r=0);var l=0,d=0;l=r<11?0:r-10,d=0===l?70:r+n.length+60,d>f.length&&(d=f.length);var u="..."+e(f).substring(l,d).replace(o,'<em class="search-keyword">'+n+"</em>")+"...";s+=u}}),a)){var d={title:e(c),content:s,url:l};t.push(d)}}(i);return t}function r(e,i){h=Docsify;var r="auto"===e.paths,a=localStorage.getItem("docsify.search.expires")<Date.now();if(y=JSON.parse(localStorage.getItem("docsify.search.index")),a)y={};else if(!r)return;var s=r?n(i.router):e.paths,c=s.length,f=0;s.forEach(function(n){if(y[n])return f++;h.get(i.router.getFile(n)).then(function(r){y[n]=o(n,r,i.router),c===++f&&t(e.maxAge)})})}function a(){var e=Docsify.dom.create("style","\n.sidebar {\n padding-top: 0;\n}\n\n.search {\n margin-bottom: 20px;\n padding: 6px;\n border-bottom: 1px solid #eee;\n}\n\n.search .results-panel {\n display: none;\n}\n\n.search .results-panel.show {\n display: block;\n}\n\n.search input {\n outline: none;\n border: none;\n width: 100%;\n padding: 7px;\n line-height: 22px;\n font-size: 14px;\n -webkit-appearance: none;\n -moz-appearance: none;\n appearance: none;\n}\n\n.search h2 {\n font-size: 17px;\n margin: 10px 0;\n}\n\n.search a {\n text-decoration: none;\n color: inherit;\n}\n\n.search .matching-post {\n border-bottom: 1px solid #eee;\n}\n\n.search .matching-post:last-child {\n border-bottom: 0;\n}\n\n.search p {\n font-size: 14px;\n overflow: hidden;\n text-overflow: ellipsis;\n display: -webkit-box;\n -webkit-line-clamp: 2;\n -webkit-box-orient: vertical;\n}\n\n.search p.empty {\n text-align: center;\n}");Docsify.dom.appendTo(Docsify.dom.head,e)}function s(e,n){void 0===n&&(n="");var t='<input type="search" value="'+n+'" /><div class="results-panel"></div></div>',o=Docsify.dom.create("div",t),i=Docsify.dom.find("aside");Docsify.dom.toggleClass(o,"search"),Docsify.dom.before(i,o)}function c(e){var n=Docsify.dom.find("div.search"),t=Docsify.dom.find(n,".results-panel");if(!e)return t.classList.remove("show"),void(t.innerHTML="");var o=i(e),r="";o.forEach(function(e){r+='<div class="matching-post">\n<h2><a href="'+e.url+'">'+e.title+"</a></h2>\n<p>"+e.content+"</p>\n</div>"}),t.classList.add("show"),t.innerHTML=r||'<p class="empty">'+m+"</p>"}function f(){var e,n=Docsify.dom.find("div.search"),t=Docsify.dom.find(n,"input");Docsify.dom.on(n,"click",function(e){return"A"!==e.target.tagName&&e.stopPropagation()}),Docsify.dom.on(t,"input",function(n){clearTimeout(e),e=setTimeout(function(e){return c(n.target.value.trim())},100)})}function l(e,n){var t=Docsify.dom.getNode('.search input[type="search"]');if(t)if("string"==typeof e)t.placeholder=e;else{var o=Object.keys(e).filter(function(e){return n.indexOf(e)>-1})[0];t.placeholder=e[o]}}function d(e,n){if("string"==typeof e)m=e;else{var t=Object.keys(e).filter(function(e){return n.indexOf(e)>-1})[0];m=e[t]}}function u(e,n){var t=n.router.parse().query.s;a(),s(e,t),f(),t&&setTimeout(function(e){return c(t)},500)}function p(e,n){l(e.placeholder,n.route.path),d(e.noData,n.route.path)}var h,y={},m="",g={placeholder:"Type to search",noData:"No Results!",paths:"auto",maxAge:864e5},v=function(e,n){var t=Docsify.util,o=n.config.search||g;Array.isArray(o)?g.paths=o:"object"==typeof o&&(g.paths=Array.isArray(o.paths)?o.paths:"auto",g.maxAge=t.isPrimitive(o.maxAge)?o.maxAge:g.maxAge,g.placeholder=o.placeholder||g.placeholder,g.noData=o.noData||g.noData);var i="auto"===g.paths;e.mounted(function(e){u(g,n),!i&&r(g,n)}),e.doneEach(function(e){p(g,n),i&&r(g,n)})};$docsify.plugins=[].concat(v,$docsify.plugins)}(); !function(){"use strict";function e(e){var n={"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#39;","/":"&#x2F;"};return String(e).replace(/[&<>"'\/]/g,function(e){return n[e]})}function n(e){var n=[];return h.dom.findAll("a:not([data-nosearch])").map(function(t){var o=t.href,i=t.getAttribute("href"),r=e.parse(o).path;r&&-1===n.indexOf(r)&&!Docsify.util.isAbsolutePath(i)&&n.push(r)}),n}function t(e){localStorage.setItem("docsify.search.expires",Date.now()+e),localStorage.setItem("docsify.search.index",JSON.stringify(g))}function o(e,n,t,o){void 0===n&&(n="");var i,r=window.marked.lexer(n),a=window.Docsify.slugify,s={};return r.forEach(function(n){if("heading"===n.type&&n.depth<=o)i=t.toURL(e,{id:a(n.text)}),s[i]={slug:i,title:n.text,body:""};else{if(!i)return;s[i]?s[i].body?s[i].body+="\n"+(n.text||""):s[i].body=n.text:s[i]={slug:i,title:"",body:""}}}),a.clear(),s}function i(n){var t=[],o=[];Object.keys(g).forEach(function(e){o=o.concat(Object.keys(g[e]).map(function(n){return g[e][n]}))}),n=n.trim();var i=n.split(/[\s\-\\\\/]+/);1!==i.length&&(i=[].concat(n,i));for(var r=0;r<o.length;r++)!function(n){var r=o[n],a=!1,s="",c=r.title&&r.title.trim(),l=r.body&&r.body.trim(),f=r.slug||"";if(c&&l&&(i.forEach(function(n,t){var o=new RegExp(n,"gi"),i=-1,r=-1;if(i=c&&c.search(o),r=l&&l.search(o),i<0&&r<0)a=!1;else{a=!0,r<0&&(r=0);var f=0,d=0;f=r<11?0:r-10,d=0===f?70:r+n.length+60,d>l.length&&(d=l.length);var p="..."+e(l).substring(f,d).replace(o,'<em class="search-keyword">'+n+"</em>")+"...";s+=p}}),a)){var d={title:e(c),content:s,url:f};t.push(d)}}(r);return t}function r(e,i){h=Docsify;var r="auto"===e.paths,a=localStorage.getItem("docsify.search.expires")<Date.now();if(g=JSON.parse(localStorage.getItem("docsify.search.index")),a)g={};else if(!r)return;var s=r?n(i.router):e.paths,c=s.length,l=0;s.forEach(function(n){if(g[n])return l++;h.get(i.router.getFile(n)).then(function(r){g[n]=o(n,r,i.router,e.depth),c===++l&&t(e.maxAge)})})}function a(){Docsify.dom.style("\n.sidebar {\n padding-top: 0;\n}\n\n.search {\n margin-bottom: 20px;\n padding: 6px;\n border-bottom: 1px solid #eee;\n}\n\n.search .results-panel {\n display: none;\n}\n\n.search .results-panel.show {\n display: block;\n}\n\n.search input {\n outline: none;\n border: none;\n width: 100%;\n padding: 7px;\n line-height: 22px;\n font-size: 14px;\n -webkit-appearance: none;\n -moz-appearance: none;\n appearance: none;\n}\n\n.search h2 {\n font-size: 17px;\n margin: 10px 0;\n}\n\n.search a {\n text-decoration: none;\n color: inherit;\n}\n\n.search .matching-post {\n border-bottom: 1px solid #eee;\n}\n\n.search .matching-post:last-child {\n border-bottom: 0;\n}\n\n.search p {\n font-size: 14px;\n overflow: hidden;\n text-overflow: ellipsis;\n display: -webkit-box;\n -webkit-line-clamp: 2;\n -webkit-box-orient: vertical;\n}\n\n.search p.empty {\n text-align: center;\n}")}function s(e,n){void 0===n&&(n="");var t='<input type="search" value="'+n+'" /><div class="results-panel"></div></div>',o=Docsify.dom.create("div",t),i=Docsify.dom.find("aside");Docsify.dom.toggleClass(o,"search"),Docsify.dom.before(i,o)}function c(e){var n=Docsify.dom.find("div.search"),t=Docsify.dom.find(n,".results-panel");if(!e)return t.classList.remove("show"),void(t.innerHTML="");var o=i(e),r="";o.forEach(function(e){r+='<div class="matching-post">\n<a href="'+e.url+'"> \n<h2>'+e.title+"</h2>\n<p>"+e.content+"</p>\n</a>\n</div>"}),t.classList.add("show"),t.innerHTML=r||'<p class="empty">'+y+"</p>"}function l(){var e,n=Docsify.dom.find("div.search"),t=Docsify.dom.find(n,"input");Docsify.dom.on(n,"click",function(e){return"A"!==e.target.tagName&&e.stopPropagation()}),Docsify.dom.on(t,"input",function(n){clearTimeout(e),e=setTimeout(function(e){return c(n.target.value.trim())},100)})}function f(e,n){var t=Docsify.dom.getNode('.search input[type="search"]');if(t)if("string"==typeof e)t.placeholder=e;else{var o=Object.keys(e).filter(function(e){return n.indexOf(e)>-1})[0];t.placeholder=e[o]}}function d(e,n){if("string"==typeof e)y=e;else{var t=Object.keys(e).filter(function(e){return n.indexOf(e)>-1})[0];y=e[t]}}function p(e,n){var t=n.router.parse().query.s;a(),s(e,t),l(),t&&setTimeout(function(e){return c(t)},500)}function u(e,n){f(e.placeholder,n.route.path),d(e.noData,n.route.path)}var h,g={},y="",m={placeholder:"Type to search",noData:"No Results!",paths:"auto",depth:2,maxAge:864e5},v=function(e,n){var t=Docsify.util,o=n.config.search||m;Array.isArray(o)?m.paths=o:"object"==typeof o&&(m.paths=Array.isArray(o.paths)?o.paths:"auto",m.maxAge=t.isPrimitive(o.maxAge)?o.maxAge:m.maxAge,m.placeholder=o.placeholder||m.placeholder,m.noData=o.noData||m.noData,m.depth=o.depth||m.depth);var i="auto"===m.paths;e.mounted(function(e){p(m,n),!i&&r(m,n)}),e.doneEach(function(e){u(m,n),i&&r(m,n)})};$docsify.plugins=[].concat(v,$docsify.plugins)}();
+11 -288
View File
File diff suppressed because one or more lines are too long
+1 -1
View File
File diff suppressed because one or more lines are too long
+1 -1
View File
File diff suppressed because one or more lines are too long
+1 -1
View File
File diff suppressed because one or more lines are too long
+1 -1
View File
File diff suppressed because one or more lines are too long
+1 -1
View File
File diff suppressed because one or more lines are too long
+2668 -425
View File
File diff suppressed because it is too large Load Diff
+4 -3
View File
@@ -1,6 +1,6 @@
{ {
"name": "docsify", "name": "docsify",
"version": "4.2.2", "version": "4.5.2",
"description": "A magical documentation generator.", "description": "A magical documentation generator.",
"author": { "author": {
"name": "qingwei-li", "name": "qingwei-li",
@@ -20,7 +20,7 @@
"themes" "themes"
], ],
"scripts": { "scripts": {
"bootstrap": "npm i && lerna bootstrap", "bootstrap": "npm i && lerna bootstrap && npm run build:ssr",
"build": "rm -rf lib themes && node build/build && mkdir lib/themes && mkdir themes && node build/build-css && npm run build:ssr && node build/build-cover", "build": "rm -rf lib themes && node build/build && mkdir lib/themes && mkdir themes && node build/build-css && npm run build:ssr && node build/build-cover",
"dev:build": "rm -rf lib themes && mkdir themes && node build/build --dev && node build/build-css --dev", "dev:build": "rm -rf lib themes && mkdir themes && node build/build --dev && node build/build-css --dev",
"dev": "node app & nodemon -w src -e js,css --exec 'npm run dev:build'", "dev": "node app & nodemon -w src -e js,css --exec 'npm run dev:build'",
@@ -31,9 +31,10 @@
}, },
"dependencies": { "dependencies": {
"marked": "^0.3.6", "marked": "^0.3.6",
"medium-zoom": "^0.2.0",
"prismjs": "^1.6.0", "prismjs": "^1.6.0",
"tinydate": "^1.0.0", "tinydate": "^1.0.0",
"zoom-image": "^0.1.4" "tweezer.js": "^1.4.0"
}, },
"devDependencies": { "devDependencies": {
"conventional-changelog-cli": "^1.3.2", "conventional-changelog-cli": "^1.3.2",
+1 -1
View File
@@ -3,7 +3,7 @@
## Install ## Install
```bash ```bash
yarn add docsify-server-render yarn add docsify-server-renderer
``` ```
## Usage ## Usage
+11 -11
View File
@@ -13,7 +13,9 @@ function cwd (...args) {
} }
function mainTpl (config) { function mainTpl (config) {
let html = `<nav class="app-nav${config.repo ? '' : ' no-badge'}"><!--navbar--></nav>` let html = `<nav class="app-nav${config.repo
? ''
: ' no-badge'}"><!--navbar--></nav>`
if (config.repo) { if (config.repo) {
html += tpl.corner(config.repo) html += tpl.corner(config.repo)
@@ -28,11 +30,7 @@ function mainTpl (config) {
} }
export default class Renderer { export default class Renderer {
constructor ({ constructor ({ template, config, cache }) {
template,
config,
cache
}) {
this.html = template this.html = template
this.config = config = Object.assign({}, config, { this.config = config = Object.assign({}, config, {
routerMode: 'history' routerMode: 'history'
@@ -43,7 +41,10 @@ export default class Renderer {
this.compiler = new Compiler(config, this.router) this.compiler = new Compiler(config, this.router)
this.router.getCurrentPath = () => this.url this.router.getCurrentPath = () => this.url
this._renderHtml('inject-config', `<script>window.$docsify = ${JSON.stringify(config)}</script>`) this._renderHtml(
'inject-config',
`<script>window.$docsify = ${JSON.stringify(config)}</script>`
)
this._renderHtml('inject-app', mainTpl(config)) this._renderHtml('inject-app', mainTpl(config))
this.template = this.html this.template = this.html
@@ -52,9 +53,7 @@ export default class Renderer {
_getPath (url) { _getPath (url) {
const file = this.router.getFile(url) const file = this.router.getFile(url)
return isAbsolutePath(file) return isAbsolutePath(file) ? file : cwd(`./${file}`)
? file
: cwd(`./${file}`)
} }
async renderToString (url) { async renderToString (url) {
@@ -94,7 +93,8 @@ export default class Renderer {
switch (type) { switch (type) {
case 'sidebar': case 'sidebar':
html = this.compiler.sidebar(html, maxLevel) + html =
this.compiler.sidebar(html, maxLevel) +
`<script>window.__SUB_SIDEBAR__ = ${JSON.stringify( `<script>window.__SUB_SIDEBAR__ = ${JSON.stringify(
this.compiler.subSidebar(subMaxLevel) this.compiler.subSidebar(subMaxLevel)
)}</script>` )}</script>`
+1 -1
View File
@@ -37,5 +37,5 @@
"integrity": "sha1-6DWIAbhrg7F1YNTjw4LXrvIQCUQ=" "integrity": "sha1-6DWIAbhrg7F1YNTjw4LXrvIQCUQ="
} }
}, },
"version": "4.2.2" "version": "4.5.2"
} }
@@ -1,6 +1,6 @@
{ {
"name": "docsify-server-renderer", "name": "docsify-server-renderer",
"version": "4.2.2", "version": "4.5.2",
"description": "docsify server renderer", "description": "docsify server renderer",
"author": { "author": {
"name": "qingwei-li", "name": "qingwei-li",
+31 -26
View File
@@ -1,32 +1,37 @@
import { merge, hyphenate, isPrimitive } from './util/core' import { merge, hyphenate, isPrimitive } from './util/core'
const config = merge({ const config = merge(
el: '#app', {
repo: '', el: '#app',
maxLevel: 6, repo: '',
subMaxLevel: 0, maxLevel: 6,
loadSidebar: null, subMaxLevel: 0,
loadNavbar: null, loadSidebar: null,
homepage: 'README.md', loadNavbar: null,
coverpage: '', homepage: 'README.md',
basePath: '', coverpage: '',
auto2top: false, basePath: '',
name: '', auto2top: false,
themeColor: '', name: '',
nameLink: window.location.pathname, themeColor: '',
autoHeader: false, nameLink: window.location.pathname,
executeScript: null, autoHeader: false,
noEmoji: false, executeScript: null,
ga: '', noEmoji: false,
mergeNavbar: false, ga: '',
formatUpdated: '', mergeNavbar: false,
externalLinkTarget: '_blank', formatUpdated: '',
routerModel: 'hash', externalLinkTarget: '_blank',
noCompileLinks: [] routerMode: 'hash',
}, window.$docsify) noCompileLinks: []
},
window.$docsify
)
const script = document.currentScript || const script =
[].slice.call(document.getElementsByTagName('script')) document.currentScript ||
[].slice
.call(document.getElementsByTagName('script'))
.filter(n => /docsify\./.test(n.src))[0] .filter(n => /docsify\./.test(n.src))[0]
if (script) { if (script) {
+1 -1
View File
@@ -5,7 +5,7 @@ import { scrollIntoView } from './scroll'
export function eventMixin (proto) { export function eventMixin (proto) {
proto.$resetEvents = function () { proto.$resetEvents = function () {
scrollIntoView(this.route.query.id) scrollIntoView(this.route.path, this.route.query.id)
sidebar.getAndActive(this.router, 'nav') sidebar.getAndActive(this.router, 'nav')
} }
} }
+57 -21
View File
@@ -1,15 +1,37 @@
import { isMobile } from '../util/env' import { isMobile } from '../util/env'
import * as dom from '../util/dom' import * as dom from '../util/dom'
import Tweezer from 'tweezer.js'
const nav = {} const nav = {}
let hoverOver = false let hoverOver = false
let scroller = null
let enableScrollEvent = true
let coverHeight = 0
function highlight () { function scrollTo (el) {
if (scroller) scroller.stop()
enableScrollEvent = false
scroller = new Tweezer({
start: window.pageYOffset,
end: el.getBoundingClientRect().top + window.pageYOffset,
duration: 500
})
.on('tick', v => window.scrollTo(0, v))
.on('done', () => {
enableScrollEvent = true
scroller = null
})
.begin()
}
function highlight (path) {
if (!enableScrollEvent) return
const sidebar = dom.getNode('.sidebar') const sidebar = dom.getNode('.sidebar')
const anchors = dom.findAll('.anchor') const anchors = dom.findAll('.anchor')
const wrap = dom.find(sidebar, '.sidebar-nav') const wrap = dom.find(sidebar, '.sidebar-nav')
let active = dom.find(sidebar, 'li.active') let active = dom.find(sidebar, 'li.active')
const top = dom.body.scrollTop const doc = document.documentElement
const top = ((doc && doc.scrollTop) || document.body.scrollTop) - coverHeight
let last let last
for (let i = 0, len = anchors.length; i < len; i += 1) { for (let i = 0, len = anchors.length; i < len; i += 1) {
@@ -23,7 +45,7 @@ function highlight () {
} }
} }
if (!last) return if (!last) return
const li = nav[last.getAttribute('data-id')] const li = nav[getNavKey(path, last.getAttribute('data-id'))]
if (!li || li === active) return if (!li || li === active) return
@@ -37,23 +59,22 @@ function highlight () {
const height = sidebar.clientHeight const height = sidebar.clientHeight
const curOffset = 0 const curOffset = 0
const cur = active.offsetTop + active.clientHeight + 40 const cur = active.offsetTop + active.clientHeight + 40
const isInView = ( const isInView =
active.offsetTop >= wrap.scrollTop && active.offsetTop >= wrap.scrollTop && cur <= wrap.scrollTop + height
cur <= wrap.scrollTop + height
)
const notThan = cur - curOffset < height const notThan = cur - curOffset < height
const top = isInView const top = isInView ? wrap.scrollTop : notThan ? curOffset : cur - height
? wrap.scrollTop
: notThan
? curOffset
: cur - height
sidebar.scrollTop = top sidebar.scrollTop = top
} }
} }
function getNavKey (path, id) {
return `${path}?id=${id}`
}
export function scrollActiveSidebar (router) { export function scrollActiveSidebar (router) {
if (isMobile) return const cover = dom.find('.cover.show')
coverHeight = cover ? cover.offsetHeight : 0
const sidebar = dom.getNode('.sidebar') const sidebar = dom.getNode('.sidebar')
const lis = dom.findAll(sidebar, 'li') const lis = dom.findAll(sidebar, 'li')
@@ -65,21 +86,36 @@ export function scrollActiveSidebar (router) {
let href = a.getAttribute('href') let href = a.getAttribute('href')
if (href !== '/') { if (href !== '/') {
href = router.parse(href).query.id const { query: { id }, path } = router.parse(href)
if (id) href = getNavKey(path, id)
} }
nav[decodeURIComponent(href)] = li if (href) nav[decodeURIComponent(href)] = li
} }
dom.off('scroll', highlight) if (isMobile) return
dom.on('scroll', highlight) const path = router.getCurrentPath()
dom.on(sidebar, 'mouseover', () => { hoverOver = true }) dom.off('scroll', () => highlight(path))
dom.on(sidebar, 'mouseleave', () => { hoverOver = false }) dom.on('scroll', () => highlight(path))
dom.on(sidebar, 'mouseover', () => {
hoverOver = true
})
dom.on(sidebar, 'mouseleave', () => {
hoverOver = false
})
} }
export function scrollIntoView (id) { export function scrollIntoView (path, id) {
if (!id) return
const section = dom.find('#' + id) const section = dom.find('#' + id)
section && section.scrollIntoView() section && scrollTo(section)
const li = nav[getNavKey(path, id)]
const sidebar = dom.getNode('.sidebar')
const active = dom.find(sidebar, 'li.active')
active && active.classList.remove('active')
li && li.classList.add('active')
} }
const scrollEl = dom.$.scrollingElement || dom.$.documentElement const scrollEl = dom.$.scrollingElement || dom.$.documentElement
+16 -15
View File
@@ -16,9 +16,12 @@ export function btn (el, router) {
const sidebar = dom.getNode('.sidebar') const sidebar = dom.getNode('.sidebar')
isMobile && dom.on(dom.body, 'click', _ => isMobile &&
dom.body.classList.contains('close') && toggle() dom.on(
) dom.body,
'click',
_ => dom.body.classList.contains('close') && toggle()
)
dom.on(sidebar, 'click', _ => dom.on(sidebar, 'click', _ =>
setTimeout((_ => getAndActive(router, sidebar, true, true), 0)) setTimeout((_ => getAndActive(router, sidebar, true, true), 0))
) )
@@ -51,19 +54,17 @@ export function getAndActive (router, el, isParent, autoTitle) {
const hash = router.toURL(router.getCurrentPath()) const hash = router.toURL(router.getCurrentPath())
let target let target
links links.sort((a, b) => b.href.length - a.href.length).forEach(a => {
.sort((a, b) => b.href.length - a.href.length) const href = a.getAttribute('href')
.forEach(a => { const node = isParent ? a.parentNode : a
const href = a.getAttribute('href')
const node = isParent ? a.parentNode : a
if (hash.indexOf(href) === 0 && !target) { if (hash.indexOf(href) === 0 && !target) {
target = a target = a
dom.toggleClass(node, 'add', 'active') dom.toggleClass(node, 'add', 'active')
} else { } else {
dom.toggleClass(node, 'remove', 'active') dom.toggleClass(node, 'remove', 'active')
} }
}) })
if (autoTitle) { if (autoTitle) {
dom.$.title = target ? `${target.innerText} - ${title}` : title dom.$.title = target ? `${target.innerText} - ${title}` : title
+9 -5
View File
@@ -26,9 +26,13 @@ export function get (url, hasBar = false) {
return { return {
then: function (success, error = noop) { then: function (success, error = noop) {
if (hasBar) { if (hasBar) {
const id = setInterval(_ => progressbar({ const id = setInterval(
step: Math.floor(Math.random() * 5 + 1) _ =>
}), 500) progressbar({
step: Math.floor(Math.random() * 5 + 1)
}),
500
)
on('progress', progressbar) on('progress', progressbar)
on('loadend', evt => { on('loadend', evt => {
@@ -42,12 +46,12 @@ export function get (url, hasBar = false) {
if (target.status >= 400) { if (target.status >= 400) {
error(target) error(target)
} else { } else {
const result = cache[url] = { const result = (cache[url] = {
content: target.response, content: target.response,
opt: { opt: {
updatedAt: xhr.getResponseHeader('last-modified') updatedAt: xhr.getResponseHeader('last-modified')
} }
} })
success(result.content, result.opt) success(result.content, result.opt)
} }
+35 -19
View File
@@ -1,29 +1,31 @@
import { get } from './ajax' import { get } from './ajax'
import { callHook } from '../init/lifecycle' import { callHook } from '../init/lifecycle'
import { getParentPath } from '../router/util' import { getParentPath, stringifyQuery } from '../router/util'
import { noop } from '../util/core' import { noop } from '../util/core'
import { getAndActive } from '../event/sidebar' import { getAndActive } from '../event/sidebar'
function loadNested (path, file, next, vm, first) { function loadNested (path, qs, file, next, vm, first) {
path = first ? path : path.replace(/\/$/, '') path = first ? path : path.replace(/\/$/, '')
path = getParentPath(path) path = getParentPath(path)
if (!path) return if (!path) return
get(vm.router.getFile(path + file)) get(vm.router.getFile(path + file) + qs).then(next, _ =>
.then(next, _ => loadNested(path, file, next, vm)) loadNested(path, qs, file, next, vm)
)
} }
export function fetchMixin (proto) { export function fetchMixin (proto) {
let last let last
proto._fetch = function (cb = noop) { proto._fetch = function (cb = noop) {
const { path } = this.route const { path, query } = this.route
const qs = stringifyQuery(query, ['id'])
const { loadNavbar, loadSidebar } = this.config const { loadNavbar, loadSidebar } = this.config
// Abort last request // Abort last request
last && last.abort && last.abort() last && last.abort && last.abort()
last = get(this.router.getFile(path), true) last = get(this.router.getFile(path) + qs, true)
// Current page is html // Current page is html
this.isHTML = /\.html$/g.test(path) this.isHTML = /\.html$/g.test(path)
@@ -31,29 +33,42 @@ export function fetchMixin (proto) {
const loadSideAndNav = () => { const loadSideAndNav = () => {
if (!loadSidebar) return cb() if (!loadSidebar) return cb()
const fn = result => { this._renderSidebar(result); cb() } const fn = result => {
this._renderSidebar(result)
cb()
}
// Load sidebar // Load sidebar
loadNested(path, loadSidebar, fn, this, true) loadNested(path, qs, loadSidebar, fn, this, true)
} }
// Load main content // Load main content
last.then((text, opt) => { last.then(
this._renderMain(text, opt) (text, opt) => {
loadSideAndNav() this._renderMain(text, opt)
}, loadSideAndNav()
_ => { },
this._renderMain(null) _ => {
loadSideAndNav() this._renderMain(null)
}) loadSideAndNav()
}
)
// Load nav // Load nav
loadNavbar && loadNavbar &&
loadNested(path, loadNavbar, text => this._renderNav(text), this, true) loadNested(
path,
qs,
loadNavbar,
text => this._renderNav(text),
this,
true
)
} }
proto._fetchCover = function () { proto._fetchCover = function () {
const { coverpage } = this.config const { coverpage } = this.config
const query = this.route.query
const root = getParentPath(this.route.path) const root = getParentPath(this.route.path)
const path = this.router.getFile(root + coverpage) const path = this.router.getFile(root + coverpage)
@@ -63,8 +78,9 @@ export function fetchMixin (proto) {
} }
this.coverIsHTML = /\.html$/g.test(path) this.coverIsHTML = /\.html$/g.test(path)
get(path) get(path + stringifyQuery(query, ['id'])).then(text =>
.then(text => this._renderCover(text)) this._renderCover(text)
)
} }
proto.$fetch = function (cb = noop) { proto.$fetch = function (cb = noop) {
+14 -1
View File
@@ -5,6 +5,19 @@ import { fetchMixin } from './fetch'
import { eventMixin } from './event' import { eventMixin } from './event'
import initGlobalAPI from './global-api' import initGlobalAPI from './global-api'
/**
* Fork https://github.com/bendrucker/document-ready/blob/master/index.js
*/
function ready (callback) {
const state = document.readyState
if (state === 'complete' || state === 'interactive') {
return setTimeout(callback, 0)
}
document.addEventListener('DOMContentLoaded', callback)
}
function Docsify () { function Docsify () {
this._init() this._init()
} }
@@ -30,4 +43,4 @@ Docsify.version = '__VERSION__'
/** /**
* Run Docsify * Run Docsify
*/ */
setTimeout(_ => new Docsify(), 0) ready(_ => new Docsify())
+1 -1
View File
@@ -13,7 +13,7 @@ export function initLifecycle (vm) {
vm._hooks = {} vm._hooks = {}
vm._lifecycle = {} vm._lifecycle = {}
hooks.forEach(hook => { hooks.forEach(hook => {
const arr = vm._hooks[hook] = [] const arr = (vm._hooks[hook] = [])
vm._lifecycle[hook] = fn => arr.push(fn) vm._lifecycle[hook] = fn => arr.push(fn)
}) })
} }
+80 -22
View File
@@ -8,6 +8,20 @@ import { isAbsolutePath, getPath } from '../router/util'
import { isFn, merge, cached } from '../util/core' import { isFn, merge, cached } from '../util/core'
const cachedLinks = {} const cachedLinks = {}
function getAndRemoveConfig (str = '') {
const config = {}
if (str) {
str = str
.replace(/:([\w-]+)=?([\w-]+)?/g, (m, key, value) => {
config[key] = value || true
return ''
})
.trim()
}
return { str, config }
}
export class Compiler { export class Compiler {
constructor (config, router) { constructor (config, router) {
@@ -25,9 +39,11 @@ export class Compiler {
if (isFn(mdConf)) { if (isFn(mdConf)) {
compile = mdConf(marked, renderer) compile = mdConf(marked, renderer)
} else { } else {
marked.setOptions(merge(mdConf, { marked.setOptions(
renderer: merge(renderer, mdConf.renderer) merge(mdConf, {
})) renderer: merge(renderer, mdConf.renderer)
})
)
compile = marked compile = marked
} }
@@ -61,11 +77,13 @@ export class Compiler {
const renderer = new marked.Renderer() const renderer = new marked.Renderer()
const { linkTarget, router, contentBase } = this const { linkTarget, router, contentBase } = this
const _self = this const _self = this
const origin = {}
/** /**
* render anchor tag * render anchor tag
* @link https://github.com/chjj/marked#overriding-renderer-methods * @link https://github.com/chjj/marked#overriding-renderer-methods
*/ */
renderer.heading = function (text, level) { origin.heading = renderer.heading = function (text, level) {
const nextToc = { level, title: text } const nextToc = { level, title: text }
if (/{docsify-ignore}/g.test(text)) { if (/{docsify-ignore}/g.test(text)) {
@@ -88,29 +106,46 @@ export class Compiler {
return `<h${level} id="${slug}"><a href="${url}" data-id="${slug}" class="anchor"><span>${text}</span></a></h${level}>` return `<h${level} id="${slug}"><a href="${url}" data-id="${slug}" class="anchor"><span>${text}</span></a></h${level}>`
} }
// highlight code // highlight code
renderer.code = function (code, lang = '') { origin.code = renderer.code = function (code, lang = '') {
const hl = Prism.highlight(code, Prism.languages[lang] || Prism.languages.markup) const hl = Prism.highlight(
code,
Prism.languages[lang] || Prism.languages.markup
)
return `<pre v-pre data-lang="${lang}"><code class="lang-${lang}">${hl}</code></pre>` return `<pre v-pre data-lang="${lang}"><code class="lang-${lang}">${hl}</code></pre>`
} }
renderer.link = function (href, title, text) { origin.link = renderer.link = function (href, title = '', text) {
let blank = '' let attrs = ''
if (!/:|(\/{2})/.test(href) && const { str, config } = getAndRemoveConfig(title)
title = str
if (
!/:|(\/{2})/.test(href) &&
!_self.matchNotCompileLink(href) && !_self.matchNotCompileLink(href) &&
!/(\s?:ignore)(\s\S+)?$/.test(title)) { !config.ignore
) {
href = router.toURL(href, null, router.getCurrentPath()) href = router.toURL(href, null, router.getCurrentPath())
} else { } else {
blank = ` target="${linkTarget}"` attrs += ` target="${linkTarget}"`
title = title && title.replace(/:ignore/g, '').trim() }
if (config.target) {
attrs += ' target=' + config.target
}
if (config.disabled) {
attrs += ' disabled'
href = 'javascript:void(0)'
} }
if (title) { if (title) {
title = ` title="${title}"` attrs += ` title="${title}"`
} }
return `<a href="${href}"${title || ''}${blank}>${text}</a>`
return `<a href="${href}"${attrs}>${text}</a>`
} }
renderer.paragraph = function (text) { origin.paragraph = renderer.paragraph = function (text) {
if (/^!&gt;/.test(text)) { if (/^!&gt;/.test(text)) {
return helperTpl('tip', text) return helperTpl('tip', text)
} else if (/^\?&gt;/.test(text)) { } else if (/^\?&gt;/.test(text)) {
@@ -118,17 +153,39 @@ export class Compiler {
} }
return `<p>${text}</p>` return `<p>${text}</p>`
} }
renderer.image = function (href, title, text) { origin.image = renderer.image = function (href, title, text) {
let url = href let url = href
const titleHTML = title ? ` title="${title}"` : '' let attrs = ''
const { str, config } = getAndRemoveConfig(title)
title = str
if (config['no-zoom']) {
attrs += ' data-no-zoom'
}
if (title) {
attrs += ` title="${title}"`
}
if (!isAbsolutePath(href)) { if (!isAbsolutePath(href)) {
url = getPath(contentBase, href) url = getPath(contentBase, href)
} }
return `<img src="${url}" data-origin="${href}" alt="${text}"${titleHTML}>` return `<img src="${url}"data-origin="${href}" alt="${text}"${attrs}>`
} }
const CHECKED_RE = /^\[([ x])\] +/
origin.listitem = renderer.listitem = function (text) {
const checked = CHECKED_RE.exec(text)
if (checked) {
text = text.replace(CHECKED_RE, `<input type="checkbox" ${checked[1] === 'x' ? 'checked' : ''} />`)
}
return `<li>${text}</li>\n`
}
renderer.origin = origin
return renderer return renderer
} }
@@ -162,11 +219,12 @@ export class Compiler {
const currentPath = this.router.getCurrentPath() const currentPath = this.router.getCurrentPath()
const { cacheTree, toc } = this const { cacheTree, toc } = this
toc[0] && toc[0].ignoreAllSubs && (this.toc = []) toc[0] && toc[0].ignoreAllSubs && toc.splice(0)
toc[0] && toc[0].level === 1 && toc.shift() toc[0] && toc[0].level === 1 && toc.shift()
toc.forEach((node, i) => {
node.ignoreSubHeading && toc.splice(i, 1) for (let i = 0; i < toc.length; i++) {
}) toc[i].ignoreSubHeading && toc.splice(i, 1) && i--
}
const tree = cacheTree[currentPath] || genTree(toc, level) const tree = cacheTree[currentPath] || genTree(toc, level)
+1 -1
View File
@@ -212,7 +212,7 @@ export function initRender (vm) {
if (config.themeColor) { if (config.themeColor) {
dom.$.head.appendChild( dom.$.head.appendChild(
dom.create('div', tpl.theme(config.themeColor)).getRootNode() dom.create('div', tpl.theme(config.themeColor)).firstElementChild
) )
// Polyfll // Polyfll
cssVars(config.themeColor) cssVars(config.themeColor)
+8 -2
View File
@@ -1,10 +1,16 @@
let cache = {} let cache = {}
const re = /[\u2000-\u206F\u2E00-\u2E7F\\'!"#$%&()*+,.\/:;<=>?@\[\]^`{|}~]/g const re = /[\u2000-\u206F\u2E00-\u2E7F\\'!"#$%&()*+,.\/:;<=>?@\[\]^`{|}~]/g
function lower (string) {
return string.toLowerCase()
}
export function slugify (str) { export function slugify (str) {
if (typeof str !== 'string') return '' if (typeof str !== 'string') return ''
let slug = str.toLowerCase().trim() let slug = str
.trim()
.replace(/[A-Z]+/g, lower)
.replace(/<[^>\d]+>/g, '') .replace(/<[^>\d]+>/g, '')
.replace(re, '') .replace(re, '')
.replace(/\s/g, '-') .replace(/\s/g, '-')
@@ -12,7 +18,7 @@ export function slugify (str) {
.replace(/^(\d)/, '_$1') .replace(/^(\d)/, '_$1')
let count = cache[slug] let count = cache[slug]
count = cache.hasOwnProperty(slug) ? (count + 1) : 0 count = cache.hasOwnProperty(slug) ? count + 1 : 0
cache[slug] = count cache[slug] = count
if (count) { if (count) {
+29 -23
View File
@@ -10,37 +10,40 @@ export function corner (data) {
data = data.replace(/^git\+/, '') data = data.replace(/^git\+/, '')
return ( return (
`<a href="${data}" class="github-corner" aria-label="View source on Github">` + `<a href="${data}" class="github-corner" aria-label="View source on Github">` +
'<svg viewBox="0 0 250 250" aria-hidden="true">' + '<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="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>' + '<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>' +
'<path d="M115.0,115.0 C114.9,115.1 118.7,116.5 119.8,115.4 L133.7,101.6 C136.9,99.2 139.9,98.4 142.2,98.6 C133.8,88.0 127.5,74.4 143.8,58.0 C148.5,53.4 154.0,51.2 159.7,51.0 C160.3,49.4 163.2,43.6 171.4,40.1 C171.4,40.1 176.1,42.5 178.8,56.2 C183.1,58.6 187.2,61.8 190.9,65.4 C194.5,69.0 197.7,73.2 200.1,77.6 C213.8,80.2 216.3,84.9 216.3,84.9 C212.7,93.1 206.9,96.0 205.4,96.6 C205.1,102.4 203.0,107.8 198.3,112.5 C181.9,128.9 168.3,122.5 157.7,114.1 C157.9,116.9 156.7,120.9 152.7,124.9 L141.0,136.5 C139.8,137.7 141.6,141.9 141.8,141.8 Z" fill="currentColor" class="octo-body"></path>' + '<path d="M115.0,115.0 C114.9,115.1 118.7,116.5 119.8,115.4 L133.7,101.6 C136.9,99.2 139.9,98.4 142.2,98.6 C133.8,88.0 127.5,74.4 143.8,58.0 C148.5,53.4 154.0,51.2 159.7,51.0 C160.3,49.4 163.2,43.6 171.4,40.1 C171.4,40.1 176.1,42.5 178.8,56.2 C183.1,58.6 187.2,61.8 190.9,65.4 C194.5,69.0 197.7,73.2 200.1,77.6 C213.8,80.2 216.3,84.9 216.3,84.9 C212.7,93.1 206.9,96.0 205.4,96.6 C205.1,102.4 203.0,107.8 198.3,112.5 C181.9,128.9 168.3,122.5 157.7,114.1 C157.9,116.9 156.7,120.9 152.7,124.9 L141.0,136.5 C139.8,137.7 141.6,141.9 141.8,141.8 Z" fill="currentColor" class="octo-body"></path>' +
'</svg>' + '</svg>' +
'</a>') '</a>'
)
} }
/** /**
* Render main content * Render main content
*/ */
export function main (config) { export function main (config) {
const aside = ( const aside =
'<button class="sidebar-toggle">' + '<button class="sidebar-toggle">' +
'<div class="sidebar-toggle-button">' + '<div class="sidebar-toggle-button">' +
'<span></span><span></span><span></span>' + '<span></span><span></span><span></span>' +
'</div>' + '</div>' +
'</button>' + '</button>' +
'<aside class="sidebar">' + '<aside class="sidebar">' +
(config.name (config.name
? `<h1><a class="app-name-link" data-nosearch>${config.name}</a></h1>` ? `<h1><a class="app-name-link" data-nosearch>${config.name}</a></h1>`
: '') + : '') +
'<div class="sidebar-nav"><!--sidebar--></div>' + '<div class="sidebar-nav"><!--sidebar--></div>' +
'</aside>') '</aside>'
return (isMobile ? `${aside}<main>` : `<main>${aside}`) + return (
'<section class="content">' + (isMobile ? `${aside}<main>` : `<main>${aside}`) +
'<article class="markdown-section" id="main"><!--main--></article>' + '<section class="content">' +
'</section>' + '<article class="markdown-section" id="main"><!--main--></article>' +
'</section>' +
'</main>' '</main>'
)
} }
/** /**
@@ -48,14 +51,17 @@ export function main (config) {
*/ */
export function cover () { export function cover () {
const SL = ', 100%, 85%' const SL = ', 100%, 85%'
const bgc = 'linear-gradient(to left bottom, ' + const bgc =
`hsl(${Math.floor(Math.random() * 255) + SL}) 0%,` + 'linear-gradient(to left bottom, ' +
`hsl(${Math.floor(Math.random() * 255) + SL}) 100%)` `hsl(${Math.floor(Math.random() * 255) + SL}) 0%,` +
`hsl(${Math.floor(Math.random() * 255) + SL}) 100%)`
return `<section class="cover" style="background: ${bgc}">` + return (
`<section class="cover" style="background: ${bgc}">` +
'<div class="cover-main"></div>' + '<div class="cover-main"></div>' +
'<div class="mask"></div>' + '<div class="mask"></div>' +
'</section>' '</section>'
)
} }
/** /**
+6 -6
View File
@@ -4,20 +4,20 @@ import { noop } from '../../util/core'
const cached = {} const cached = {}
function getAlias (path, alias, last) { function getAlias (path, alias, last) {
const match = Object.keys(alias).filter((key) => { const match = Object.keys(alias).filter(key => {
const re = cached[key] || (cached[key] = new RegExp(`^${key}$`)) const re = cached[key] || (cached[key] = new RegExp(`^${key}$`))
return re.test(path) && path !== last return re.test(path) && path !== last
})[0] })[0]
return match ? getAlias(path.replace(cached[match], alias[match]), alias, path) : path return match
? getAlias(path.replace(cached[match], alias[match]), alias, path)
: path
} }
function getFileName (path) { function getFileName (path) {
return /\.(md|html)$/g.test(path) return /\.(md|html)$/g.test(path)
? path ? path
: /\/$/g.test(path) : /\/$/g.test(path) ? `${path}README.md` : `${path}.md`
? `${path}README.md`
: `${path}.md`
} }
export class History { export class History {
@@ -37,7 +37,7 @@ export class History {
path = config.alias ? getAlias(path, config.alias) : path path = config.alias ? getAlias(path, config.alias) : path
path = getFileName(path) path = getFileName(path)
path = path === '/README.md' ? (config.homepage || path) : path path = path === '/README.md' ? config.homepage || path : path
path = isAbsolutePath(path) ? path : getPath(base, path) path = isAbsolutePath(path) ? path : getPath(base, path)
if (isRelative) { if (isRelative) {
+8 -8
View File
@@ -5,9 +5,7 @@ import { parseQuery, stringifyQuery, cleanPath } from '../util'
function replaceHash (path) { function replaceHash (path) {
const i = location.href.indexOf('#') const i = location.href.indexOf('#')
location.replace( location.replace(location.href.slice(0, i >= 0 ? i : 0) + '#' + path)
location.href.slice(0, i >= 0 ? i : 0) + '#' + path
)
} }
const replaceSlug = cached(path => { const replaceSlug = cached(path => {
@@ -24,9 +22,7 @@ export class HashHistory extends History {
const path = window.location.pathname || '' const path = window.location.pathname || ''
const base = this.config.basePath const base = this.config.basePath
return /^(\/|https?:)/g.test(base) return /^(\/|https?:)/g.test(base) ? base : cleanPath(path + '/' + base)
? base
: cleanPath(path + '/' + base)
} }
getCurrentPath () { getCurrentPath () {
@@ -59,7 +55,7 @@ export class HashHistory extends History {
let query = '' let query = ''
const hashIndex = path.indexOf('#') const hashIndex = path.indexOf('#')
if (hashIndex) { if (hashIndex >= 0) {
path = path.slice(hashIndex + 1) path = path.slice(hashIndex + 1)
} }
@@ -84,7 +80,11 @@ export class HashHistory extends History {
path = route.path + stringifyQuery(route.query) path = route.path + stringifyQuery(route.query)
path = path.replace(/\.md(\?)|\.md$/, '$1') path = path.replace(/\.md(\?)|\.md$/, '$1')
if (local) path = currentRoute + path if (local) {
const idIndex = currentRoute.indexOf('?')
path =
(idIndex > 0 ? currentRoute.substr(0, idIndex) : currentRoute) + path
}
return cleanPath('#/' + path) return cleanPath('#/' + path)
} }
+1 -3
View File
@@ -22,9 +22,7 @@ export class HTML5History extends History {
onchange (cb = noop) { onchange (cb = noop) {
on('click', e => { on('click', e => {
const el = e.target.tagName === 'A' const el = e.target.tagName === 'A' ? e.target : e.target.parentNode
? e.target
: e.target.parentNode
if (el.tagName === 'A' && !/_blank/.test(el.target)) { if (el.tagName === 'A' && !/_blank/.test(el.target)) {
e.preventDefault() e.preventDefault()
+9 -10
View File
@@ -22,13 +22,16 @@ export function parseQuery (query) {
return res return res
} }
export function stringifyQuery (obj) { export function stringifyQuery (obj, ignores = []) {
const qs = [] const qs = []
for (const key in obj) { for (const key in obj) {
qs.push(obj[key] if (ignores.indexOf(key) > -1) continue
? `${encode(key)}=${encode(obj[key])}`.toLowerCase() qs.push(
: encode(key)) obj[key]
? `${encode(key)}=${encode(obj[key])}`.toLowerCase()
: encode(key)
)
} }
return qs.length ? `?${qs.join('&')}` : '' return qs.length ? `?${qs.join('&')}` : ''
@@ -45,13 +48,9 @@ export const isAbsolutePath = cached(path => {
export const getParentPath = cached(path => { export const getParentPath = cached(path => {
return /\/$/g.test(path) return /\/$/g.test(path)
? path ? path
: (path = path.match(/(\S*\/)[^\/]+$/)) : (path = path.match(/(\S*\/)[^\/]+$/)) ? path[1] : ''
? path[1]
: ''
}) })
export const cleanPath = cached(path => { export const cleanPath = cached(path => {
return path return path.replace(/^\/+/, '/').replace(/([^:])\/{2,}/g, '$1/')
.replace(/^\/+/, '/')
.replace(/([^:])\/{2,}/g, '$1/')
}) })
+12 -10
View File
@@ -19,21 +19,23 @@ export const hyphenate = cached(str => {
/** /**
* Simple Object.assign polyfill * Simple Object.assign polyfill
*/ */
export const merge = Object.assign || function (to) { export const merge =
const hasOwn = Object.prototype.hasOwnProperty Object.assign ||
function (to) {
const hasOwn = Object.prototype.hasOwnProperty
for (let i = 1; i < arguments.length; i++) { for (let i = 1; i < arguments.length; i++) {
const from = Object(arguments[i]) const from = Object(arguments[i])
for (const key in from) { for (const key in from) {
if (hasOwn.call(from, key)) { if (hasOwn.call(from, key)) {
to[key] = from[key] to[key] = from[key]
}
} }
} }
}
return to return to
} }
/** /**
* Check if value is primitive * Check if value is primitive
+5
View File
@@ -81,3 +81,8 @@ export function off (el, type, handler) {
export function toggleClass (el, type, val) { export function toggleClass (el, type, val) {
el && el.classList[val ? type : 'toggle'](val || type) el && el.classList[val ? type : 'toggle'](val || type)
} }
export function style (content) {
appendTo(head, create('style', content))
}
+14 -8
View File
@@ -5,11 +5,17 @@ export const isMobile = inBrowser && document.body.clientWidth <= 600
/** /**
* @see https://github.com/MoOx/pjax/blob/master/lib/is-supported.js * @see https://github.com/MoOx/pjax/blob/master/lib/is-supported.js
*/ */
export const supportsPushState = inBrowser && (function () { export const supportsPushState =
// Borrowed wholesale from https://github.com/defunkt/jquery-pjax inBrowser &&
return window.history && (function () {
window.history.pushState && // Borrowed wholesale from https://github.com/defunkt/jquery-pjax
window.history.replaceState && return (
// pushState isnt reliable on iOS until 5. window.history &&
!navigator.userAgent.match(/((iPod|iPhone|iPad).+\bOS\s+[1-4]\D|WebApps\/.+CFNetwork)/) window.history.pushState &&
})() window.history.replaceState &&
// pushState isnt reliable on iOS until 5.
!navigator.userAgent.match(
/((iPod|iPhone|iPad).+\bOS\s+[1-4]\D|WebApps\/.+CFNetwork)/
)
)
})()
+5 -6
View File
@@ -2,18 +2,17 @@ import * as dom from '../dom'
import { get } from '../../fetch/ajax' import { get } from '../../fetch/ajax'
function replaceVar (block, color) { function replaceVar (block, color) {
block.innerHTML = block.innerHTML block.innerHTML = block.innerHTML.replace(
.replace(/var\(\s*--theme-color.*?\)/g, color) /var\(\s*--theme-color.*?\)/g,
color
)
} }
export default function (color) { export default function (color) {
// Variable support // Variable support
if (window.CSS && if (window.CSS && window.CSS.supports && window.CSS.supports('(--v:red)')) { return }
window.CSS.supports &&
window.CSS.supports('(--v:red)')) return
const styleBlocks = dom.findAll('style:not(.inserted),link') const styleBlocks = dom.findAll('style:not(.inserted),link')
;[].forEach.call(styleBlocks, block => { ;[].forEach.call(styleBlocks, block => {
if (block.nodeName === 'STYLE') { if (block.nodeName === 'STYLE') {
replaceVar(block, color) replaceVar(block, color)
+87
View File
@@ -0,0 +1,87 @@
const DEFAULT_OPTIONS = {
theme: 'light',
image: 'show'
}
function tpl (id, options) {
const qs = []
for (const key in options) {
qs.push(`${key}=${options[key]}`)
}
const div = Docsify.dom.create('div')
Docsify.dom.toggleClass(div, 'codesponsor')
div.innerHTML = `<iframe
scrolling=0
frameborder=0
width=250
height=auto
style="max-height: 250px;"
id="code-sponsor-embed-iframe"
src="https://app.codesponsor.io/widgets/${id}?${qs.join('&')}">
</iframe>`
return div
}
function appIframe (id, opts) {
const html = tpl(id, opts)
Docsify.dom.before(Docsify.dom.find('section.content'), html)
}
function appendStyle () {
Docsify.dom.style(`
.codesponsor {
position: relative;
float: right;
right: 10px;
top: 10px;
}
@media screen and (min-width: 1600px) {
body.sticky .codesponsor {
position: fixed;
}
.codesponsor {
position: absolute;
bottom: 10px;
top: auto;
float: none;
}
}
`)
}
const install = function (hook, vm) {
let config = vm.config.codesponsor
let id
if (typeof config === 'string') {
id = config
config = {}
} else {
id = config.id
}
const opts = Docsify.util.merge(DEFAULT_OPTIONS, config)
if (!id) {
throw Error('codesponsor plugin need id')
}
if (Docsify.util.isMobile) {
return
}
// Append style
hook.ready(() => {
appendStyle()
appIframe(id, opts)
})
}
window.$docsify.plugins = [].concat(install, window.$docsify.plugins)
+48
View File
@@ -0,0 +1,48 @@
location.href = location.href.replace('/-/', '/#/')
function install (hook, vm) {
const dom = Docsify.dom
const disqus = vm.config.disqus
if (!disqus) {
throw Error('$docsify.disqus is required')
}
hook.init(_ => {
const script = dom.create('script')
script.async = true
script.src = `https://${disqus}.disqus.com/embed.js`
script.setAttribute('data-timestamp', +new Date())
dom.appendTo(dom.body, script)
})
hook.mounted(_ => {
const div = dom.create('div')
div.id = 'disqus_thread'
const main = dom.getNode('#main')
div.style = `width: ${main.clientWidth}px; margin: 0 auto 20px;`
dom.appendTo(dom.find('.content'), div)
// eslint-disable-next-line
window.disqus_config = function() {
this.page.url = location.origin + '/-' + vm.route.path
this.page.identifier = vm.route.path
this.page.title = document.title
}
})
hook.doneEach(_ => {
if (typeof window.DISQUS !== 'undefined') {
window.DISQUS.reset({
reload: true,
config: function () {
this.page.url = location.origin + '/-' + vm.route.path
this.page.identifier = vm.route.path
this.page.title = document.title
}
})
}
})
}
$docsify.plugins = [].concat(install, $docsify.plugins)
+893 -146
View File
File diff suppressed because it is too large Load Diff
+6 -5
View File
@@ -5,7 +5,8 @@
import parser from './yaml' import parser from './yaml'
var optionalByteOrderMark = '\\ufeff?' var optionalByteOrderMark = '\\ufeff?'
var pattern = '^(' + var pattern =
'^(' +
optionalByteOrderMark + optionalByteOrderMark +
'(= yaml =|---)' + '(= yaml =|---)' +
'$([\\s\\S]*?)' + '$([\\s\\S]*?)' +
@@ -17,7 +18,7 @@ var pattern = '^(' +
// need to be moved down into the functions that use it. // need to be moved down into the functions that use it.
var regex = new RegExp(pattern, 'm') var regex = new RegExp(pattern, 'm')
function extractor (string) { function extractor(string) {
string = string || '' string = string || ''
var lines = string.split(/(\r?\n)/) var lines = string.split(/(\r?\n)/)
@@ -28,7 +29,7 @@ function extractor (string) {
} }
} }
function parse (string) { function parse(string) {
var match = regex.exec(string) var match = regex.exec(string)
if (!match) { if (!match) {
@@ -45,10 +46,10 @@ function parse (string) {
return { attributes: attributes, body: body, frontmatter: yaml } return { attributes: attributes, body: body, frontmatter: yaml }
} }
function test (string) { function test(string) {
string = string || '' string = string || ''
return regex.test(string) return regex.test(string)
} }
export default extractor export default extractor
+350 -353
View File
@@ -29,415 +29,412 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* @namespace * @namespace
*/ */
var errors = [], var errors = [],
reference_blocks = [], reference_blocks = [],
processing_time = 0, processing_time = 0,
regex = regex = {
{ regLevel: new RegExp('^([\\s\\-]+)'),
"regLevel" : new RegExp("^([\\s\\-]+)"), invalidLine: new RegExp('^\\-\\-\\-|^\\.\\.\\.|^\\s*#.*|^\\s*$'),
"invalidLine" : new RegExp("^\\-\\-\\-|^\\.\\.\\.|^\\s*#.*|^\\s*$"), dashesString: new RegExp('^\\s*\\"([^\\"]*)\\"\\s*$'),
"dashesString" : new RegExp("^\\s*\\\"([^\\\"]*)\\\"\\s*$"), quotesString: new RegExp("^\\s*\\'([^\\']*)\\'\\s*$"),
"quotesString" : new RegExp("^\\s*\\\'([^\\\']*)\\\'\\s*$"), float: new RegExp('^[+-]?[0-9]+\\.[0-9]+(e[+-]?[0-9]+(\\.[0-9]+)?)?$'),
"float" : new RegExp("^[+-]?[0-9]+\\.[0-9]+(e[+-]?[0-9]+(\\.[0-9]+)?)?$"), integer: new RegExp('^[+-]?[0-9]+$'),
"integer" : new RegExp("^[+-]?[0-9]+$"), array: new RegExp('\\[\\s*(.*)\\s*\\]'),
"array" : new RegExp("\\[\\s*(.*)\\s*\\]"), map: new RegExp('\\{\\s*(.*)\\s*\\}'),
"map" : new RegExp("\\{\\s*(.*)\\s*\\}"), key_value: new RegExp('([a-z0-9_-][ a-z0-9_-]*):( .+)', 'i'),
"key_value" : new RegExp("([a-z0-9_-][ a-z0-9_-]*):( .+)", "i"), single_key_value: new RegExp('^([a-z0-9_-][ a-z0-9_-]*):( .+?)$', 'i'),
"single_key_value" : new RegExp("^([a-z0-9_-][ a-z0-9_-]*):( .+?)$", "i"), key: new RegExp('([a-z0-9_-][ a-z0-9_-]+):( .+)?', 'i'),
"key" : new RegExp("([a-z0-9_-][ a-z0-9_-]+):( .+)?", "i"), item: new RegExp('^-\\s+'),
"item" : new RegExp("^-\\s+"), trim: new RegExp('^\\s+|\\s+$'),
"trim" : new RegExp("^\\s+|\\s+$"), comment: new RegExp('([^\\\'\\"#]+([\\\'\\"][^\\\'\\"]*[\\\'\\"])*)*(#.*)?')
"comment" : new RegExp("([^\\\'\\\"#]+([\\\'\\\"][^\\\'\\\"]*[\\\'\\\"])*)*(#.*)?") }
};
/** /**
* @class A block of lines of a given level. * @class A block of lines of a given level.
* @param {int} lvl The block's level. * @param {int} lvl The block's level.
* @private * @private
*/ */
function Block(lvl) { function Block(lvl) {
return { return {
/* The block's parent */ /* The block's parent */
parent: null, parent: null,
/* Number of children */ /* Number of children */
length: 0, length: 0,
/* Block's level */ /* Block's level */
level: lvl, level: lvl,
/* Lines of code to process */ /* Lines of code to process */
lines: [], lines: [],
/* Blocks with greater level */ /* Blocks with greater level */
children : [], children: [],
/* Add a block to the children collection */ /* Add a block to the children collection */
addChild : function(obj) { addChild: function(obj) {
this.children.push(obj); this.children.push(obj)
obj.parent = this; obj.parent = this
++this.length; ++this.length
} }
}; }
} }
// function to create an XMLHttpClient in a cross-browser manner // function to create an XMLHttpClient in a cross-browser manner
function createXMLHTTPRequest() { function createXMLHTTPRequest() {
var xmlhttp; var xmlhttp
try { try {
// Mozilla / Safari / IE7 // Mozilla / Safari / IE7
xmlhttp = new XMLHttpRequest(); xmlhttp = new XMLHttpRequest()
} catch (e) { } catch (e) {
// IE // IE
var XMLHTTP_IDS = new Array('MSXML2.XMLHTTP.5.0', var XMLHTTP_IDS = new Array(
'MSXML2.XMLHTTP.4.0', 'MSXML2.XMLHTTP.5.0',
'MSXML2.XMLHTTP.3.0', 'MSXML2.XMLHTTP.4.0',
'MSXML2.XMLHTTP', 'MSXML2.XMLHTTP.3.0',
'Microsoft.XMLHTTP' ); 'MSXML2.XMLHTTP',
var success = false; 'Microsoft.XMLHTTP'
for (var i=0;i < XMLHTTP_IDS.length && !success; i++) { )
try { var success = false
xmlhttp = new ActiveXObject(XMLHTTP_IDS[i]); for (var i = 0; i < XMLHTTP_IDS.length && !success; i++) {
success = true; try {
} catch (e) {} xmlhttp = new ActiveXObject(XMLHTTP_IDS[i])
} success = true
if (!success) { } catch (e) {}
throw new Error('Unable to create XMLHttpRequest.');
}
} }
if (!success) {
throw new Error('Unable to create XMLHttpRequest.')
}
}
return xmlhttp; return xmlhttp
} }
function parser(str) { function parser(str) {
var regLevel = regex["regLevel"]; var regLevel = regex['regLevel']
var invalidLine = regex["invalidLine"]; var invalidLine = regex['invalidLine']
var lines = str.split("\n"); var lines = str.split('\n')
var m; var m
var level = 0, curLevel = 0; var level = 0,
curLevel = 0
var blocks = []; var blocks = []
var result = new Block(-1); var result = new Block(-1)
var currentBlock = new Block(0); var currentBlock = new Block(0)
result.addChild(currentBlock); result.addChild(currentBlock)
var levels = []; var levels = []
var line = ""; var line = ''
blocks.push(currentBlock); blocks.push(currentBlock)
levels.push(level); levels.push(level)
for(var i = 0, len = lines.length; i < len; ++i) { for (var i = 0, len = lines.length; i < len; ++i) {
line = lines[i]; line = lines[i]
if(line.match(invalidLine)) { if (line.match(invalidLine)) {
continue; continue
}
if(m = regLevel.exec(line)) {
level = m[1].length;
} else
level = 0;
if(level > curLevel) {
var oldBlock = currentBlock;
currentBlock = new Block(level);
oldBlock.addChild(currentBlock);
blocks.push(currentBlock);
levels.push(level);
} else if(level < curLevel) {
var added = false;
var k = levels.length - 1;
for(; k >= 0; --k) {
if(levels[k] == level) {
currentBlock = new Block(level);
blocks.push(currentBlock);
levels.push(level);
if(blocks[k].parent!= null)
blocks[k].parent.addChild(currentBlock);
added = true;
break;
}
}
if(!added) {
errors.push("Error: Invalid indentation at line " + i + ": " + line);
return;
}
}
currentBlock.lines.push(line.replace(regex["trim"], ""));
curLevel = level;
} }
return result; if ((m = regLevel.exec(line))) {
level = m[1].length
} else level = 0
if (level > curLevel) {
var oldBlock = currentBlock
currentBlock = new Block(level)
oldBlock.addChild(currentBlock)
blocks.push(currentBlock)
levels.push(level)
} else if (level < curLevel) {
var added = false
var k = levels.length - 1
for (; k >= 0; --k) {
if (levels[k] == level) {
currentBlock = new Block(level)
blocks.push(currentBlock)
levels.push(level)
if (blocks[k].parent != null) blocks[k].parent.addChild(currentBlock)
added = true
break
}
}
if (!added) {
errors.push('Error: Invalid indentation at line ' + i + ': ' + line)
return
}
}
currentBlock.lines.push(line.replace(regex['trim'], ''))
curLevel = level
}
return result
} }
function processValue(val) { function processValue(val) {
val = val.replace(regex["trim"], ""); val = val.replace(regex['trim'], '')
var m = null; var m = null
if(val == 'true') { if (val == 'true') {
return true; return true
} else if(val == 'false') { } else if (val == 'false') {
return false; return false
} else if(val == '.NaN') { } else if (val == '.NaN') {
return Number.NaN; return Number.NaN
} else if(val == 'null') { } else if (val == 'null') {
return null; return null
} else if(val == '.inf') { } else if (val == '.inf') {
return Number.POSITIVE_INFINITY; return Number.POSITIVE_INFINITY
} else if(val == '-.inf') { } else if (val == '-.inf') {
return Number.NEGATIVE_INFINITY; return Number.NEGATIVE_INFINITY
} else if(m = val.match(regex["dashesString"])) { } else if ((m = val.match(regex['dashesString']))) {
return m[1]; return m[1]
} else if(m = val.match(regex["quotesString"])) { } else if ((m = val.match(regex['quotesString']))) {
return m[1]; return m[1]
} else if(m = val.match(regex["float"])) { } else if ((m = val.match(regex['float']))) {
return parseFloat(m[0]); return parseFloat(m[0])
} else if(m = val.match(regex["integer"])) { } else if ((m = val.match(regex['integer']))) {
return parseInt(m[0]); return parseInt(m[0])
} else if( !isNaN(m = Date.parse(val))) { } else if (!isNaN((m = Date.parse(val)))) {
return new Date(m); return new Date(m)
} else if(m = val.match(regex["single_key_value"])) { } else if ((m = val.match(regex['single_key_value']))) {
var res = {}; var res = {}
res[m[1]] = processValue(m[2]); res[m[1]] = processValue(m[2])
return res; return res
} else if(m = val.match(regex["array"])){ } else if ((m = val.match(regex['array']))) {
var count = 0, c = ' '; var count = 0,
var res = []; c = ' '
var content = ""; var res = []
var str = false; var content = ''
for(var j = 0, lenJ = m[1].length; j < lenJ; ++j) { var str = false
c = m[1][j]; for (var j = 0, lenJ = m[1].length; j < lenJ; ++j) {
if(c == '\'' || c == '"') { c = m[1][j]
if(str === false) { if (c == "'" || c == '"') {
str = c; if (str === false) {
content += c; str = c
continue; content += c
} else if((c == '\'' && str == '\'') || (c == '"' && str == '"')) { continue
str = false; } else if ((c == "'" && str == "'") || (c == '"' && str == '"')) {
content += c; str = false
continue; content += c
} continue
} else if(str === false && (c == '[' || c == '{')) {
++count;
} else if(str === false && (c == ']' || c == '}')) {
--count;
} else if(str === false && count == 0 && c == ',') {
res.push(processValue(content));
content = "";
continue;
}
content += c;
} }
} else if (str === false && (c == '[' || c == '{')) {
++count
} else if (str === false && (c == ']' || c == '}')) {
--count
} else if (str === false && count == 0 && c == ',') {
res.push(processValue(content))
content = ''
continue
}
if(content.length > 0) content += c
res.push(processValue(content)); }
return res;
} else if(m = val.match(regex["map"])){
var count = 0, c = ' ';
var res = [];
var content = "";
var str = false;
for(var j = 0, lenJ = m[1].length; j < lenJ; ++j) {
c = m[1][j];
if(c == '\'' || c == '"') {
if(str === false) {
str = c;
content += c;
continue;
} else if((c == '\'' && str == '\'') || (c == '"' && str == '"')) {
str = false;
content += c;
continue;
}
} else if(str === false && (c == '[' || c == '{')) {
++count;
} else if(str === false && (c == ']' || c == '}')) {
--count;
} else if(str === false && count == 0 && c == ',') {
res.push(content);
content = "";
continue;
}
content += c; if (content.length > 0) res.push(processValue(content))
return res
} else if ((m = val.match(regex['map']))) {
var count = 0,
c = ' '
var res = []
var content = ''
var str = false
for (var j = 0, lenJ = m[1].length; j < lenJ; ++j) {
c = m[1][j]
if (c == "'" || c == '"') {
if (str === false) {
str = c
content += c
continue
} else if ((c == "'" && str == "'") || (c == '"' && str == '"')) {
str = false
content += c
continue
} }
} else if (str === false && (c == '[' || c == '{')) {
++count
} else if (str === false && (c == ']' || c == '}')) {
--count
} else if (str === false && count == 0 && c == ',') {
res.push(content)
content = ''
continue
}
if(content.length > 0) content += c
res.push(content); }
var newRes = {}; if (content.length > 0) res.push(content)
for(var j = 0, lenJ = res.length; j < lenJ; ++j) {
if(m = res[j].match(regex["key_value"])) {
newRes[m[1]] = processValue(m[2]);
}
}
return newRes; var newRes = {}
} else for (var j = 0, lenJ = res.length; j < lenJ; ++j) {
return val; if ((m = res[j].match(regex['key_value']))) {
newRes[m[1]] = processValue(m[2])
}
}
return newRes
} else return val
} }
function processFoldedBlock(block) { function processFoldedBlock(block) {
var lines = block.lines; var lines = block.lines
var children = block.children; var children = block.children
var str = lines.join(" "); var str = lines.join(' ')
var chunks = [str]; var chunks = [str]
for(var i = 0, len = children.length; i < len; ++i) { for (var i = 0, len = children.length; i < len; ++i) {
chunks.push(processFoldedBlock(children[i])); chunks.push(processFoldedBlock(children[i]))
} }
return chunks.join("\n"); return chunks.join('\n')
} }
function processLiteralBlock(block) { function processLiteralBlock(block) {
var lines = block.lines; var lines = block.lines
var children = block.children; var children = block.children
var str = lines.join("\n"); var str = lines.join('\n')
for(var i = 0, len = children.length; i < len; ++i) { for (var i = 0, len = children.length; i < len; ++i) {
str += processLiteralBlock(children[i]); str += processLiteralBlock(children[i])
} }
return str; return str
} }
function processBlock(blocks) { function processBlock(blocks) {
var m = null; var m = null
var res = {}; var res = {}
var lines = null; var lines = null
var children = null; var children = null
var currentObj = null; var currentObj = null
var level = -1; var level = -1
var processedBlocks = []; var processedBlocks = []
var isMap = true; var isMap = true
for(var j = 0, lenJ = blocks.length; j < lenJ; ++j) { for (var j = 0, lenJ = blocks.length; j < lenJ; ++j) {
if (level != -1 && level != blocks[j].level) continue
if(level != -1 && level != blocks[j].level) processedBlocks.push(j)
continue;
processedBlocks.push(j); level = blocks[j].level
lines = blocks[j].lines
children = blocks[j].children
currentObj = null
level = blocks[j].level; for (var i = 0, len = lines.length; i < len; ++i) {
lines = blocks[j].lines; var line = lines[i]
children = blocks[j].children;
currentObj = null;
for(var i = 0, len = lines.length; i < len; ++i) { if ((m = line.match(regex['key']))) {
var line = lines[i]; var key = m[1]
if(m = line.match(regex["key"])) { if (key[0] == '-') {
var key = m[1]; key = key.replace(regex['item'], '')
if (isMap) {
if(key[0] == '-') { isMap = false
key = key.replace(regex["item"], ""); if (typeof res.length === 'undefined') {
if (isMap) { res = []
isMap = false;
if (typeof(res.length) === "undefined") {
res = [];
}
}
if(currentObj != null) res.push(currentObj);
currentObj = {};
isMap = true;
}
if(typeof m[2] != "undefined") {
var value = m[2].replace(regex["trim"], "");
if(value[0] == '&') {
var nb = processBlock(children);
if(currentObj != null) currentObj[key] = nb;
else res[key] = nb;
reference_blocks[value.substr(1)] = nb;
} else if(value[0] == '|') {
if(currentObj != null) currentObj[key] = processLiteralBlock(children.shift());
else res[key] = processLiteralBlock(children.shift());
} else if(value[0] == '*') {
var v = value.substr(1);
var no = {};
if(typeof reference_blocks[v] == "undefined") {
errors.push("Reference '" + v + "' not found!");
} else {
for(var k in reference_blocks[v]) {
no[k] = reference_blocks[v][k];
}
if(currentObj != null) currentObj[key] = no;
else res[key] = no;
}
} else if(value[0] == '>') {
if(currentObj != null) currentObj[key] = processFoldedBlock(children.shift());
else res[key] = processFoldedBlock(children.shift());
} else {
if(currentObj != null) currentObj[key] = processValue(value);
else res[key] = processValue(value);
}
} else {
if(currentObj != null) currentObj[key] = processBlock(children);
else res[key] = processBlock(children);
}
} else if(line.match(/^-\s*$/)) {
if (isMap) {
isMap = false;
if (typeof(res.length) === "undefined") {
res = [];
}
}
if(currentObj != null) res.push(currentObj);
currentObj = {};
isMap = true;
continue;
} else if(m = line.match(/^-\s*(.*)/)) {
if(currentObj != null)
currentObj.push(processValue(m[1]));
else {
if (isMap) {
isMap = false;
if (typeof(res.length) === "undefined") {
res = [];
}
}
res.push(processValue(m[1]));
}
continue;
} }
}
if (currentObj != null) res.push(currentObj)
currentObj = {}
isMap = true
} }
if(currentObj != null) { if (typeof m[2] != 'undefined') {
if (isMap) { var value = m[2].replace(regex['trim'], '')
isMap = false; if (value[0] == '&') {
if (typeof(res.length) === "undefined") { var nb = processBlock(children)
res = []; if (currentObj != null) currentObj[key] = nb
} else res[key] = nb
reference_blocks[value.substr(1)] = nb
} else if (value[0] == '|') {
if (currentObj != null)
currentObj[key] = processLiteralBlock(children.shift())
else res[key] = processLiteralBlock(children.shift())
} else if (value[0] == '*') {
var v = value.substr(1)
var no = {}
if (typeof reference_blocks[v] == 'undefined') {
errors.push("Reference '" + v + "' not found!")
} else {
for (var k in reference_blocks[v]) {
no[k] = reference_blocks[v][k]
}
if (currentObj != null) currentObj[key] = no
else res[key] = no
} }
res.push(currentObj); } else if (value[0] == '>') {
if (currentObj != null)
currentObj[key] = processFoldedBlock(children.shift())
else res[key] = processFoldedBlock(children.shift())
} else {
if (currentObj != null) currentObj[key] = processValue(value)
else res[key] = processValue(value)
}
} else {
if (currentObj != null) currentObj[key] = processBlock(children)
else res[key] = processBlock(children)
} }
} else if (line.match(/^-\s*$/)) {
if (isMap) {
isMap = false
if (typeof res.length === 'undefined') {
res = []
}
}
if (currentObj != null) res.push(currentObj)
currentObj = {}
isMap = true
continue
} else if ((m = line.match(/^-\s*(.*)/))) {
if (currentObj != null) currentObj.push(processValue(m[1]))
else {
if (isMap) {
isMap = false
if (typeof res.length === 'undefined') {
res = []
}
}
res.push(processValue(m[1]))
}
continue
}
} }
for(var j = processedBlocks.length - 1; j >= 0; --j) { if (currentObj != null) {
blocks.splice.call(blocks, processedBlocks[j], 1); if (isMap) {
isMap = false
if (typeof res.length === 'undefined') {
res = []
}
}
res.push(currentObj)
} }
}
return res; for (var j = processedBlocks.length - 1; j >= 0; --j) {
blocks.splice.call(blocks, processedBlocks[j], 1)
}
return res
} }
function semanticAnalysis(blocks) { function semanticAnalysis(blocks) {
var res = processBlock(blocks.children); var res = processBlock(blocks.children)
return res; return res
} }
function preProcess(src) { function preProcess(src) {
var m; var m
var lines = src.split("\n"); var lines = src.split('\n')
var r = regex["comment"]; var r = regex['comment']
for(var i in lines) { for (var i in lines) {
if(m = lines[i].match(r)) { if ((m = lines[i].match(r))) {
/* var cmt = ""; /* var cmt = "";
if(typeof m[3] != "undefined") if(typeof m[3] != "undefined")
lines[i] = m[1]; lines[i] = m[1];
else if(typeof m[3] != "undefined") else if(typeof m[3] != "undefined")
@@ -445,25 +442,25 @@ function preProcess(src) {
else else
lines[i] = ""; lines[i] = "";
*/ */
if(typeof m[3] !== "undefined") { if (typeof m[3] !== 'undefined') {
lines[i] = m[0].substr(0, m[0].length - m[3].length); lines[i] = m[0].substr(0, m[0].length - m[3].length)
} }
}
} }
}
return lines.join("\n"); return lines.join('\n')
} }
function load(str) { function load(str) {
errors = []; errors = []
reference_blocks = []; reference_blocks = []
processing_time = (new Date()).getTime(); processing_time = new Date().getTime()
var pre = preProcess(str) var pre = preProcess(str)
var doc = parser(pre); var doc = parser(pre)
var res = semanticAnalysis(doc); var res = semanticAnalysis(doc)
processing_time = (new Date()).getTime() - processing_time; processing_time = new Date().getTime() - processing_time
return res; return res
} }
export default load export default load
+5 -3
View File
@@ -8,9 +8,11 @@ function appendScript () {
function init (id) { function init (id) {
appendScript() appendScript()
window.ga = window.ga || function () { window.ga =
(window.ga.q = window.ga.q || []).push(arguments) window.ga ||
} function () {
;(window.ga.q = window.ga.q || []).push(arguments)
}
window.ga.l = Number(new Date()) window.ga.l = Number(new Date())
window.ga('create', id, 'auto') window.ga('create', id, 'auto')
} }
+11 -7
View File
@@ -64,14 +64,14 @@ function style () {
.search p.empty { .search p.empty {
text-align: center; text-align: center;
}` }`
const style = Docsify.dom.create('style', code)
Docsify.dom.appendTo(Docsify.dom.head, style) Docsify.dom.style(code)
} }
function tpl (opts, defaultValue = '') { function tpl (opts, defaultValue = '') {
const html = const html =
`<input type="search" value="${defaultValue}" />` + `<input type="search" value="${defaultValue}" />` +
'<div class="results-panel"></div>' + '<div class="results-panel"></div>' +
'</div>' '</div>'
const el = Docsify.dom.create('div', html) const el = Docsify.dom.create('div', html)
const aside = Docsify.dom.find('aside') const aside = Docsify.dom.find('aside')
@@ -94,8 +94,10 @@ function doSearch (value) {
let html = '' let html = ''
matchs.forEach(post => { matchs.forEach(post => {
html += `<div class="matching-post"> html += `<div class="matching-post">
<h2><a href="${post.url}">${post.title}</a></h2> <a href="${post.url}">
<h2>${post.title}</h2>
<p>${post.content}</p> <p>${post.content}</p>
</a>
</div>` </div>`
}) })
@@ -109,8 +111,11 @@ function bindEvents () {
let timeId let timeId
// Prevent to Fold sidebar // Prevent to Fold sidebar
Docsify.dom.on($search, 'click', Docsify.dom.on(
e => e.target.tagName !== 'A' && e.stopPropagation()) $search,
'click',
e => e.target.tagName !== 'A' && e.stopPropagation()
)
Docsify.dom.on($input, 'input', e => { Docsify.dom.on($input, 'input', e => {
clearTimeout(timeId) clearTimeout(timeId)
timeId = setTimeout(_ => doSearch(e.target.value.trim()), 100) timeId = setTimeout(_ => doSearch(e.target.value.trim()), 100)
@@ -151,4 +156,3 @@ export function update (opts, vm) {
updatePlaceholder(opts.placeholder, vm.route.path) updatePlaceholder(opts.placeholder, vm.route.path)
updateNoData(opts.noData, vm.route.path) updateNoData(opts.noData, vm.route.path)
} }
+2
View File
@@ -5,6 +5,7 @@ const CONFIG = {
placeholder: 'Type to search', placeholder: 'Type to search',
noData: 'No Results!', noData: 'No Results!',
paths: 'auto', paths: 'auto',
depth: 2,
maxAge: 86400000 // 1 day maxAge: 86400000 // 1 day
} }
@@ -19,6 +20,7 @@ const install = function (hook, vm) {
CONFIG.maxAge = util.isPrimitive(opts.maxAge) ? opts.maxAge : CONFIG.maxAge CONFIG.maxAge = util.isPrimitive(opts.maxAge) ? opts.maxAge : CONFIG.maxAge
CONFIG.placeholder = opts.placeholder || CONFIG.placeholder CONFIG.placeholder = opts.placeholder || CONFIG.placeholder
CONFIG.noData = opts.noData || CONFIG.noData CONFIG.noData = opts.noData || CONFIG.noData
CONFIG.depth = opts.depth || CONFIG.depth
} }
const isAuto = CONFIG.paths === 'auto' const isAuto = CONFIG.paths === 'auto'
+13 -5
View File
@@ -38,14 +38,14 @@ function saveData (maxAge) {
localStorage.setItem('docsify.search.index', JSON.stringify(INDEXS)) localStorage.setItem('docsify.search.index', JSON.stringify(INDEXS))
} }
export function genIndex (path, content = '', router) { export function genIndex (path, content = '', router, depth) {
const tokens = window.marked.lexer(content) const tokens = window.marked.lexer(content)
const slugify = window.Docsify.slugify const slugify = window.Docsify.slugify
const index = {} const index = {}
let slug let slug
tokens.forEach(token => { tokens.forEach(token => {
if (token.type === 'heading' && token.depth <= 2) { if (token.type === 'heading' && token.depth <= depth) {
slug = router.toURL(path, { id: slugify(token.text) }) slug = router.toURL(path, { id: slugify(token.text) })
index[slug] = { slug, title: token.text, body: '' } index[slug] = { slug, title: token.text, body: '' }
} else { } else {
@@ -65,14 +65,22 @@ export function genIndex (path, content = '', router) {
return index return index
} }
export function search (keywords) { /**
* @param {String} query
* @returns {Array}
*/
export function search (query) {
const matchingResults = [] const matchingResults = []
let data = [] let data = []
Object.keys(INDEXS).forEach(key => { Object.keys(INDEXS).forEach(key => {
data = data.concat(Object.keys(INDEXS[key]).map(page => INDEXS[key][page])) data = data.concat(Object.keys(INDEXS[key]).map(page => INDEXS[key][page]))
}) })
keywords = [].concat(keywords, keywords.trim().split(/[\s\-\\\/]+/)) query = query.trim()
let keywords = query.split(/[\s\-\\\/]+/)
if (keywords.length !== 1) {
keywords = [].concat(query, keywords)
}
for (let i = 0; i < data.length; i++) { for (let i = 0; i < data.length; i++) {
const post = data[i] const post = data[i]
@@ -154,7 +162,7 @@ export function init (config, vm) {
helper helper
.get(vm.router.getFile(path)) .get(vm.router.getFile(path))
.then(result => { .then(result => {
INDEXS[path] = genIndex(path, result, vm.router) INDEXS[path] = genIndex(path, result, vm.router, config.depth)
len === ++count && saveData(config.maxAge) len === ++count && saveData(config.maxAge)
}) })
}) })
+5 -13
View File
@@ -1,22 +1,14 @@
import zoom from 'zoom-image' import mediumZoom from 'medium-zoom'
import style from 'zoom-image/css/zoom-image.css'
function install (hook) { function install (hook) {
const dom = Docsify.dom let zoom
let destroys
// add style
dom.appendTo(dom.head, dom.create('style', style))
hook.doneEach(_ => { hook.doneEach(_ => {
const images = dom.findAll('img:not(.emoji)') if (zoom) {
zoom.detach()
if (Array.isArray(destroys) && destroys.length) {
destroys.forEach(o => o())
destroys = []
} }
destroys = images.map(zoom) zoom = mediumZoom('img:not(.emoji):not([data-no-zoom])')
}) })
} }
+4 -4
View File
@@ -12,7 +12,7 @@ section.cover {
&.has-mask .mask { &.has-mask .mask {
background-color: $color-bg; background-color: $color-bg;
opacity: .8; opacity: 0.8;
position: absolute; position: absolute;
size: 100%; size: 100%;
} }
@@ -42,7 +42,7 @@ section.cover {
color: inherit; color: inherit;
font-size: 2.5rem; font-size: 2.5rem;
font-weight: 300; font-weight: 300;
margin: .625rem 0 2.5rem; margin: 0.625rem 0 2.5rem;
position: relative; position: relative;
text-align: center; text-align: center;
@@ -92,7 +92,7 @@ section.cover {
&:hover { &:hover {
color: inherit; color: inherit;
opacity: .8; opacity: 0.8;
} }
} }
@@ -103,7 +103,7 @@ section.cover {
blockquote > p > a { blockquote > p > a {
border-bottom: 2px solid var(--theme-color, $color-primary); border-bottom: 2px solid var(--theme-color, $color-primary);
transition: color .3s; transition: color 0.3s;
&:hover { &:hover {
color: var(--theme-color, $color-primary); color: var(--theme-color, $color-primary);
+65 -33
View File
@@ -10,7 +10,9 @@
body:not(.ready) { body:not(.ready) {
overflow: hidden; overflow: hidden;
[data-cloak], .app-nav { [data-cloak],
.app-nav,
> nav {
display: none; display: none;
} }
} }
@@ -22,7 +24,7 @@ div#app {
text-align: center; text-align: center;
&:empty::before { &:empty::before {
content: "Loading..."; content: 'Loading...';
} }
} }
@@ -50,9 +52,11 @@ div#app {
.search .search-keyword { .search .search-keyword {
color: var(--theme-color, $color-primary); color: var(--theme-color, $color-primary);
font-style: normal; font-style: normal;
font-weight: bold;
} }
html, body { html,
body {
height: 100%; height: 100%;
} }
@@ -71,17 +75,27 @@ img {
max-width: 100%; max-width: 100%;
} }
a[disabled] {
cursor: not-allowed;
opacity: 0.6;
}
kbd { kbd {
border: solid 1px #ccc; border: solid 1px #ccc;
border-radius: 3px; border-radius: 3px;
display: inline-block; display: inline-block;
font-size: 12px !important; font-size: 12px !important;
line-height: 12px; line-height: 12px;
margin-bottom : 3px; margin-bottom: 3px;
padding: 3px 5px; padding: 3px 5px;
vertical-align: middle; vertical-align: middle;
} }
li input[type=checkbox] {
margin: 0 0.2em 0.25em -1.6em;
vertical-align: middle;
}
/* navbar */ /* navbar */
.app-nav { .app-nav {
left: 0; left: 0;
@@ -99,12 +113,13 @@ kbd {
margin: 0; margin: 0;
} }
>a { > a {
margin: 0 1rem; margin: 0 1rem;
padding: 5px 0; padding: 5px 0;
} }
ul, li { ul,
li {
display: inline-block; display: inline-block;
list-style: none; list-style: none;
margin: 0; margin: 0;
@@ -114,7 +129,7 @@ kbd {
color: inherit; color: inherit;
font-size: 16px; font-size: 16px;
text-decoration: none; text-decoration: none;
transition: color .3s; transition: color 0.3s;
&:hover { &:hover {
color: var(--theme-color, $color-primary); color: var(--theme-color, $color-primary);
@@ -186,7 +201,7 @@ kbd {
z-index: 1; z-index: 1;
&:hover .octo-arm { &:hover .octo-arm {
animation:octocat-wave 560ms ease-in-out; animation: octocat-wave 560ms ease-in-out;
} }
svg { svg {
@@ -202,12 +217,13 @@ main {
display: block; display: block;
position: relative; position: relative;
size: 100vw 100%; size: 100vw 100%;
z-index: 0;
} }
.anchor { .anchor {
display: inline-block; display: inline-block;
text-decoration: none; text-decoration: none;
transition: all .3s; transition: all 0.3s;
span { span {
color: $color-text; color: $color-text;
@@ -220,9 +236,9 @@ main {
/* sidebar */ /* sidebar */
.sidebar { .sidebar {
border-right: 1px solid rgba(0, 0, 0, .07); border-right: 1px solid rgba(0, 0, 0, 0.07);
overflow-y: auto; overflow-y: auto;
padding: 40px 0; padding: 40px 0 0;
position: absolute 0 * 0 0; position: absolute 0 * 0 0;
transition: transform 250ms ease-out; transition: transform 250ms ease-out;
width: $sidebar-width; width: $sidebar-width;
@@ -244,9 +260,10 @@ main {
position: static; position: static;
} }
} }
.sidebar-nav { .sidebar-nav {
line-height: 2em; line-height: 2em;
padding-bottom: 40px;
} }
ul { ul {
@@ -254,12 +271,13 @@ main {
padding: 0; padding: 0;
} }
li>p { li > p {
font-weight: 700; font-weight: 700;
margin: 0; margin: 0;
} }
ul, ul li { ul,
ul li {
list-style: none; list-style: none;
} }
@@ -293,20 +311,20 @@ main {
/* sidebar toggle */ /* sidebar toggle */
.sidebar-toggle { .sidebar-toggle {
background-color: transparent; background-color: transparent;
background-color: rgba($color-bg, .8); background-color: rgba($color-bg, 0.8);
border: 0; border: 0;
outline: none; outline: none;
outline: none; outline: none;
padding: 10px; padding: 10px;
position: absolute * * 0 0; position: absolute * * 0 0;
text-align: center; text-align: center;
transition: opacity .3s; transition: opacity 0.3s;
width: 30px; width: 30px;
width: calc($sidebar-width - 16px); width: calc($sidebar-width - 16px);
z-index: 30; z-index: 30;
.sidebar-toggle-button:hover { .sidebar-toggle-button:hover {
opacity: .4; opacity: 0.4;
} }
span { span {
@@ -318,14 +336,15 @@ main {
} }
body.sticky { body.sticky {
.sidebar, .sidebar-toggle { .sidebar,
.sidebar-toggle {
position: fixed; position: fixed;
} }
} }
/* main content */ /* main content */
.content { .content {
padding-top: 20px; padding-top: 60px;
position: absolute 0 0 0 $sidebar-width; position: absolute 0 0 0 $sidebar-width;
transition: left 250ms ease; transition: left 250ms ease;
} }
@@ -342,8 +361,8 @@ body.sticky {
font-size: inherit; font-size: inherit;
} }
>:first-child { > :first-child {
margin-top: 0!important; margin-top: 0 !important;
} }
} }
@@ -393,7 +412,7 @@ body.sticky {
background-color: #f66; background-color: #f66;
border-radius: 100%; border-radius: 100%;
color: $color-bg; color: $color-bg;
content: "!"; content: '!';
font-family: 'Dosis', 'Source Sans Pro', 'Helvetica Neue', Arial, sans-serif; font-family: 'Dosis', 'Source Sans Pro', 'Helvetica Neue', Arial, sans-serif;
font-size: 14px; font-size: 14px;
font-weight: bold; font-weight: bold;
@@ -435,17 +454,18 @@ body.close {
} }
@media print { @media print {
.github-corner, .sidebar-toggle, .sidebar { .github-corner,
display: none; .sidebar-toggle,
} .sidebar,
.app-nav { .app-nav {
display: none; display: none;
} }
} }
@media screen and (max-width: 768px) { @media screen and (max-width: 768px) {
.github-corner, .sidebar-toggle, .sidebar { .github-corner,
.sidebar-toggle,
.sidebar {
position: fixed; position: fixed;
} }
@@ -471,10 +491,12 @@ body.close {
left: 0; left: 0;
max-width: 100vw; max-width: 100vw;
position: static; position: static;
padding-top: 20px;
transition: transform 250ms ease; transition: transform 250ms ease;
} }
.app-nav, .github-corner { .app-nav,
.github-corner {
transition: transform 250ms ease-out; transition: transform 250ms ease-out;
} }
@@ -489,7 +511,7 @@ body.close {
} }
.sidebar-toggle { .sidebar-toggle {
background-color: rgba($color-bg, .8); background-color: rgba($color-bg, 0.8);
transition: 1s background-color; transition: 1s background-color;
width: calc($sidebar-width - 16px); width: calc($sidebar-width - 16px);
} }
@@ -498,7 +520,8 @@ body.close {
transform: translateX($sidebar-width); transform: translateX($sidebar-width);
} }
.app-nav, .github-corner { .app-nav,
.github-corner {
display: none; display: none;
} }
} }
@@ -514,7 +537,16 @@ body.close {
} }
@keyframes octocat-wave { @keyframes octocat-wave {
0%,100% { transform: rotate(0); } 0%,
20%,60% { transform: rotate(-25deg); } 100% {
40%,80% { transform: rotate(10deg); } transform: rotate(0);
}
20%,
60% {
transform: rotate(-25deg);
}
40%,
80% {
transform: rotate(10deg);
}
} }
+9 -7
View File
@@ -1,12 +1,12 @@
@import url('https://fonts.googleapis.com/css?family=Inconsolata|Inconsolata-Bold'); @import url('https://fonts.googleapis.com/css?family=Inconsolata|Inconsolata-Bold');
$color-primary: #0074D9; $color-primary: #0074d9;
$color-bg: #fff; $color-bg: #fff;
$color-text: #34495e; $color-text: #34495e;
$sidebar-width: 16rem; $sidebar-width: 16rem;
@import "basic/layout"; @import 'basic/layout';
@import "basic/coverpage"; @import 'basic/coverpage';
/* sidebar */ /* sidebar */
.sidebar { .sidebar {
@@ -132,7 +132,7 @@ $sidebar-width: 16rem;
border-radius: 3px; border-radius: 3px;
font-family: Inconsolata; font-family: Inconsolata;
padding: 0.2em 0.4rem; padding: 0.2em 0.4rem;
white-space: pre; white-space: nowrap;
} }
.markdown-section pre { .markdown-section pre {
@@ -160,7 +160,7 @@ $sidebar-width: 16rem;
} }
.namespace { .namespace {
opacity: .7; opacity: 0.7;
} }
.token.property, .token.property,
@@ -216,7 +216,7 @@ $sidebar-width: 16rem;
cursor: help; cursor: help;
} }
.markdown-section pre>code { .markdown-section pre > code {
background-color: #f8f8f8; background-color: #f8f8f8;
border-radius: 2px; border-radius: 2px;
display: block; display: block;
@@ -226,9 +226,11 @@ $sidebar-width: 16rem;
overflow: inherit; overflow: inherit;
padding: 20px 0.8em 20px; padding: 20px 0.8em 20px;
position: relative; position: relative;
white-space: inherit;
} }
.markdown-section code::after, .markdown-section code::before { .markdown-section code::after,
.markdown-section code::before {
letter-spacing: 0.05rem; letter-spacing: 0.05rem;
} }
+10 -9
View File
@@ -5,8 +5,8 @@ $color-bg: #3f3f3f;
$color-text: #c8c8c8; $color-text: #c8c8c8;
$sidebar-width: 300px; $sidebar-width: 300px;
@import "basic/layout"; @import 'basic/layout';
@import "basic/coverpage"; @import 'basic/coverpage';
body { body {
background-color: $color-bg; background-color: $color-bg;
@@ -38,7 +38,7 @@ body {
padding: 0; padding: 0;
} }
ul li.active>a { ul li.active > a {
color: var(--theme-color, $color-primary); color: var(--theme-color, $color-primary);
font-weight: 600; font-weight: 600;
} }
@@ -71,7 +71,7 @@ body {
.markdown-section h3 { .markdown-section h3 {
font-size: 1.5rem; font-size: 1.5rem;
margin: 40px 0 .6rem; margin: 40px 0 0.6rem;
} }
.markdown-section h4 { .markdown-section h4 {
@@ -134,7 +134,7 @@ body {
font-size: 0.8rem; font-size: 0.8rem;
margin: 0 2px; margin: 0 2px;
padding: 3px 5px; padding: 3px 5px;
white-space: nowrap; white-space: pre-wrap;
} }
.markdown-section pre { .markdown-section pre {
@@ -159,7 +159,7 @@ body {
} }
.token.namespace { .token.namespace {
opacity: .7; opacity: 0.7;
} }
.token.boolean, .token.boolean,
@@ -246,7 +246,7 @@ body {
cursor: help; cursor: help;
} }
.markdown-section pre>code { .markdown-section pre > code {
-moz-osx-font-smoothing: initial; -moz-osx-font-smoothing: initial;
-webkit-font-smoothing: initial; -webkit-font-smoothing: initial;
background-color: #282828; background-color: #282828;
@@ -263,7 +263,8 @@ body {
white-space: inherit; white-space: inherit;
} }
.markdown-section code::after, .markdown-section code::before { .markdown-section code::after,
.markdown-section code::before {
letter-spacing: 0.05rem; letter-spacing: 0.05rem;
} }
@@ -292,7 +293,7 @@ pre::after {
color: #657b83; color: #657b83;
} }
input[type="search"] { input[type='search'] {
background: #4f4f4f; background: #4f4f4f;
border-color: #4f4f4f; border-color: #4f4f4f;
color: #c8c8c8; color: #c8c8c8;
+2 -2
View File
@@ -2,5 +2,5 @@ $color-primary: #000;
$color-bg: #fff; $color-bg: #fff;
$color-text: #000; $color-text: #000;
$sidebar-width: 300px; $sidebar-width: 300px;
@import "basic/layout"; @import 'basic/layout';
@import "basic/coverpage"; @import 'basic/coverpage';
+12 -12
View File
@@ -5,8 +5,8 @@ $color-bg: #fff;
$color-text: #34495e; $color-text: #34495e;
$sidebar-width: 300px; $sidebar-width: 300px;
@import "basic/layout"; @import 'basic/layout';
@import "basic/coverpage"; @import 'basic/coverpage';
body { body {
background-color: $color-bg; background-color: $color-bg;
@@ -39,7 +39,7 @@ body {
padding: 0; padding: 0;
} }
ul li.active>a { ul li.active > a {
border-right: 2px solid; border-right: 2px solid;
color: var(--theme-color, $color-primary); color: var(--theme-color, $color-primary);
font-weight: 600; font-weight: 600;
@@ -47,10 +47,11 @@ body {
} }
.app-sub-sidebar { .app-sub-sidebar {
.section-link { li {
&::before { &::before {
content: '-'; content: '-';
padding-right: 4px; padding-right: 4px;
float: left;
} }
} }
} }
@@ -82,7 +83,7 @@ body {
.markdown-section h3 { .markdown-section h3 {
font-size: 1.5rem; font-size: 1.5rem;
margin: 40px 0 .6rem; margin: 40px 0 0.6rem;
} }
.markdown-section h4 { .markdown-section h4 {
@@ -99,9 +100,7 @@ body {
} }
.markdown-section figure, .markdown-section figure,
.markdown-section p, .markdown-section p {
.markdown-section ul,
.markdown-section ol {
margin: 1.2em 0; margin: 1.2em 0;
} }
@@ -145,7 +144,7 @@ body {
font-size: 0.8rem; font-size: 0.8rem;
margin: 0 2px; margin: 0 2px;
padding: 3px 5px; padding: 3px 5px;
white-space: nowrap; white-space: pre-wrap;
} }
.markdown-section pre { .markdown-section pre {
@@ -170,7 +169,7 @@ body {
} }
.token.namespace { .token.namespace {
opacity: .7; opacity: 0.7;
} }
.token.boolean, .token.boolean,
@@ -257,7 +256,7 @@ body {
cursor: help; cursor: help;
} }
.markdown-section pre>code { .markdown-section pre > code {
-moz-osx-font-smoothing: initial; -moz-osx-font-smoothing: initial;
-webkit-font-smoothing: initial; -webkit-font-smoothing: initial;
background-color: #f8f8f8; background-color: #f8f8f8;
@@ -274,7 +273,8 @@ body {
white-space: inherit; white-space: inherit;
} }
.markdown-section code::after, .markdown-section code::before { .markdown-section code::after,
.markdown-section code::before {
letter-spacing: 0.05rem; letter-spacing: 0.05rem;
} }