Compare commits

...
15 Commits
Author SHA1 Message Date
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
18 changed files with 2959 additions and 432 deletions
+38
View File
@@ -1,7 +1,45 @@
<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> <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) ## [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> <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) ## [4.2.8](https://github.com/QingWei-Li/docsify/compare/v4.2.7...v4.2.8) (2017-08-10)
+1 -1
View File
@@ -29,7 +29,7 @@
loadSidebar: true, loadSidebar: true,
coverpage: true, coverpage: true,
name: 'docsify', name: 'docsify',
subMaxLevel: 0, subMaxLevel: 2,
mergeNavbar: true, mergeNavbar: true,
formatUpdated: '{MM}/{DD} {HH}:{mm}', formatUpdated: '{MM}/{DD} {HH}:{mm}',
plugins: [ plugins: [
+1 -1
View File
@@ -1,6 +1,6 @@
![logo](_media/icon.svg) ![logo](_media/icon.svg)
# docsify <small>4.2.9</small> # docsify <small>4.3.2</small>
> A magical documentation site generator. > A magical documentation site generator.
+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);
}
}
}
}
```
+4
View File
@@ -96,3 +96,7 @@ Medium's Bilderzoom. Basierend auf [zoom-image](https://github.com/egoist/zoom-i
```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>
``` ```
## 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)
+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);
}
}
}
}
```
+4
View File
@@ -96,3 +96,7 @@ Medium's Image Zoom. Based on [zoom-image](https://github.com/egoist/zoom-image)
```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>
``` ```
## 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)
+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);
}
}
}
}
```
+5
View File
@@ -90,3 +90,8 @@ Medium's 风格的图片缩放插件. 基于 [zoom-image](https://github.com/ego
```html ```html
<script src="//unpkg.com/docsify/lib/plugins/zoom-image.js"></script> <script src="//unpkg.com/docsify/lib/plugins/zoom-image.js"></script>
``` ```
## 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)
+133 -9
View File
@@ -2817,11 +2817,13 @@ Compiler.prototype._initRenderer = function _initRenderer () {
var router = ref.router; var router = ref.router;
var contentBase = ref.contentBase; var contentBase = ref.contentBase;
var _self = this; var _self = this;
var 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) {
var nextToc = { level: level, title: text }; var nextToc = { level: level, title: text };
if (/{docsify-ignore}/g.test(text)) { if (/{docsify-ignore}/g.test(text)) {
@@ -2844,14 +2846,14 @@ Compiler.prototype._initRenderer = function _initRenderer () {
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) {
if ( lang === void 0 ) lang = ''; if ( lang === void 0 ) lang = '';
var hl = prism.highlight(code, prism.languages[lang] || prism.languages.markup); var 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) {
var blank = ''; var blank = '';
if (!/:|(\/{2})/.test(href) && if (!/:|(\/{2})/.test(href) &&
@@ -2875,7 +2877,7 @@ Compiler.prototype._initRenderer = function _initRenderer () {
} }
return ("<a href=\"" + href + "\"" + (title || '') + blank + ">" + text + "</a>") return ("<a href=\"" + href + "\"" + (title || '') + blank + ">" + text + "</a>")
}; };
renderer.paragraph = function (text) { origin.paragraph = renderer.paragraph = function (text) {
if (/^!&gt;/.test(text)) { if (/^!&gt;/.test(text)) {
return helper('tip', text) return helper('tip', text)
} else if (/^\?&gt;/.test(text)) { } else if (/^\?&gt;/.test(text)) {
@@ -2883,7 +2885,7 @@ Compiler.prototype._initRenderer = function _initRenderer () {
} }
return ("<p>" + text + "</p>") return ("<p>" + text + "</p>")
}; };
renderer.image = function (href, title, text) { origin.image = renderer.image = function (href, title, text) {
var url = href; var url = href;
var titleHTML = title ? (" title=\"" + title + "\"") : ''; var titleHTML = title ? (" title=\"" + title + "\"") : '';
@@ -2894,6 +2896,8 @@ Compiler.prototype._initRenderer = function _initRenderer () {
return ("<img src=\"" + url + "\" data-origin=\"" + href + "\" alt=\"" + text + "\"" + titleHTML + ">") return ("<img src=\"" + url + "\" data-origin=\"" + href + "\" alt=\"" + text + "\"" + titleHTML + ">")
}; };
renderer.origin = origin;
return renderer return renderer
}; };
@@ -3027,15 +3031,127 @@ function getAndActive (router, el, isParent, autoTitle) {
return target return target
} }
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) { descriptor.writable = true; } Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) { defineProperties(Constructor.prototype, protoProps); } if (staticProps) { defineProperties(Constructor, staticProps); } return Constructor; }; }();
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
var Tweezer = function () {
function Tweezer() {
var opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
_classCallCheck(this, Tweezer);
this.duration = opts.duration || 1000;
this.ease = opts.easing || this._defaultEase;
this.start = opts.start;
this.end = opts.end;
this.frame = null;
this.next = null;
this.isRunning = false;
this.events = {};
this.direction = this.start < this.end ? 'up' : 'down';
}
_createClass(Tweezer, [{
key: 'begin',
value: function begin() {
if (!this.isRunning && this.next !== this.end) {
this.frame = window.requestAnimationFrame(this._tick.bind(this));
}
return this;
}
}, {
key: 'stop',
value: function stop() {
window.cancelAnimationFrame(this.frame);
this.isRunning = false;
this.frame = null;
this.timeStart = null;
this.next = null;
return this;
}
}, {
key: 'on',
value: function on(name, handler) {
this.events[name] = this.events[name] || [];
this.events[name].push(handler);
return this;
}
}, {
key: 'emit',
value: function emit(name, val) {
var _this = this;
var e = this.events[name];
e && e.forEach(function (handler) {
return handler.call(_this, val);
});
}
}, {
key: '_tick',
value: function _tick(currentTime) {
this.isRunning = true;
var lastTick = this.next || this.start;
if (!this.timeStart) { this.timeStart = currentTime; }
this.timeElapsed = currentTime - this.timeStart;
this.next = Math.round(this.ease(this.timeElapsed, this.start, this.end - this.start, this.duration));
if (this._shouldTick(lastTick)) {
this.emit('tick', this.next);
this.frame = window.requestAnimationFrame(this._tick.bind(this));
} else {
this.emit('tick', this.end);
this.emit('done', null);
}
}
}, {
key: '_shouldTick',
value: function _shouldTick(lastTick) {
return {
up: this.next < this.end && lastTick <= this.next,
down: this.next > this.end && lastTick >= this.next
}[this.direction];
}
}, {
key: '_defaultEase',
value: function _defaultEase(t, b, c, d) {
if ((t /= d / 2) < 1) { return c / 2 * t * t + b; }
return -c / 2 * (--t * (t - 2) - 1) + b;
}
}]);
return Tweezer;
}();
var nav = {}; var nav = {};
var hoverOver = false; var hoverOver = false;
var scroller = null;
var enableScrollEvent = true;
function scrollTo (el) {
if (scroller) { scroller.stop(); }
enableScrollEvent = false;
scroller = new Tweezer({
start: window.scrollY,
end: el.getBoundingClientRect().top + window.scrollY,
duration: 500
})
.on('tick', function (v) { return window.scrollTo(0, v); })
.on('done', function () { enableScrollEvent = true; scroller = null; })
.begin();
}
function highlight () { function highlight () {
if (!enableScrollEvent) { return }
var sidebar = getNode('.sidebar'); var sidebar = getNode('.sidebar');
var anchors = findAll('.anchor'); var anchors = findAll('.anchor');
var wrap = find(sidebar, '.sidebar-nav'); var wrap = find(sidebar, '.sidebar-nav');
var active = find(sidebar, 'li.active'); var active = find(sidebar, 'li.active');
var top = body.scrollTop; var doc = document.documentElement;
var top = doc && doc.scrollTop || document.body.scrollTop;
var last; var last;
for (var i = 0, len = anchors.length; i < len; i += 1) { for (var i = 0, len = anchors.length; i < len; i += 1) {
@@ -3094,7 +3210,7 @@ function scrollActiveSidebar (router) {
href = router.parse(href).query.id; href = router.parse(href).query.id;
} }
nav[decodeURIComponent(href)] = li; if (href) { nav[decodeURIComponent(href)] = li; }
} }
off('scroll', highlight); off('scroll', highlight);
@@ -3104,8 +3220,16 @@ function scrollActiveSidebar (router) {
} }
function scrollIntoView (id) { function scrollIntoView (id) {
if (!id) { return }
var section = find('#' + id); var section = find('#' + id);
section && section.scrollIntoView(); section && scrollTo(section);
var li = nav[id];
var sidebar = getNode('.sidebar');
var active = find(sidebar, 'li.active');
active && active.classList.remove('active');
li && li.classList.add('active');
} }
var scrollEl = $.scrollingElement || $.documentElement; var scrollEl = $.scrollingElement || $.documentElement;
@@ -3822,7 +3946,7 @@ initGlobalAPI();
/** /**
* Version * Version
*/ */
Docsify.version = '4.2.9'; Docsify.version = '4.3.2';
/** /**
* Run Docsify * Run Docsify
+2 -2
View File
File diff suppressed because one or more lines are too long
+2649 -406
View File
File diff suppressed because it is too large Load Diff
+2 -1
View File
@@ -1,6 +1,6 @@
{ {
"name": "docsify", "name": "docsify",
"version": "4.2.9", "version": "4.3.2",
"description": "A magical documentation generator.", "description": "A magical documentation generator.",
"author": { "author": {
"name": "qingwei-li", "name": "qingwei-li",
@@ -33,6 +33,7 @@
"marked": "^0.3.6", "marked": "^0.3.6",
"prismjs": "^1.6.0", "prismjs": "^1.6.0",
"tinydate": "^1.0.0", "tinydate": "^1.0.0",
"tweezer.js": "^1.4.0",
"zoom-image": "^0.1.4" "zoom-image": "^0.1.4"
}, },
"devDependencies": { "devDependencies": {
+1 -1
View File
@@ -3,7 +3,7 @@
## Install ## Install
```bash ```bash
yarn add docsify-server-render yarn add docsify-server-renderer
``` ```
## Usage ## Usage
+1 -1
View File
@@ -37,5 +37,5 @@
"integrity": "sha1-6DWIAbhrg7F1YNTjw4LXrvIQCUQ=" "integrity": "sha1-6DWIAbhrg7F1YNTjw4LXrvIQCUQ="
} }
}, },
"version": "4.2.9" "version": "4.3.2"
} }
@@ -1,6 +1,6 @@
{ {
"name": "docsify-server-renderer", "name": "docsify-server-renderer",
"version": "4.2.9", "version": "4.3.2",
"description": "docsify server renderer", "description": "docsify server renderer",
"author": { "author": {
"name": "qingwei-li", "name": "qingwei-li",
+29 -3
View File
@@ -1,15 +1,33 @@
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
function scrollTo (el) {
if (scroller) scroller.stop()
enableScrollEvent = false
scroller = new Tweezer({
start: window.scrollY,
end: el.getBoundingClientRect().top + window.scrollY,
duration: 500
})
.on('tick', v => window.scrollTo(0, v))
.on('done', () => { enableScrollEvent = true; scroller = null })
.begin()
}
function highlight () { function highlight () {
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
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) {
@@ -68,7 +86,7 @@ export function scrollActiveSidebar (router) {
href = router.parse(href).query.id href = router.parse(href).query.id
} }
nav[decodeURIComponent(href)] = li if (href) nav[decodeURIComponent(href)] = li
} }
dom.off('scroll', highlight) dom.off('scroll', highlight)
@@ -78,8 +96,16 @@ export function scrollActiveSidebar (router) {
} }
export function scrollIntoView (id) { export function scrollIntoView (id) {
if (!id) return
const section = dom.find('#' + id) const section = dom.find('#' + id)
section && section.scrollIntoView() section && scrollTo(section)
const li = nav[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
+9 -5
View File
@@ -61,11 +61,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,12 +90,12 @@ 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 blank = ''
if (!/:|(\/{2})/.test(href) && if (!/:|(\/{2})/.test(href) &&
@@ -117,7 +119,7 @@ export class Compiler {
} }
return `<a href="${href}"${title || ''}${blank}>${text}</a>` return `<a href="${href}"${title || ''}${blank}>${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)) {
@@ -125,7 +127,7 @@ 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}"` : '' const titleHTML = title ? ` title="${title}"` : ''
@@ -136,6 +138,8 @@ export class Compiler {
return `<img src="${url}" data-origin="${href}" alt="${text}"${titleHTML}>` return `<img src="${url}" data-origin="${href}" alt="${text}"${titleHTML}>`
} }
renderer.origin = origin
return renderer return renderer
} }