Compare commits

..
27 Commits
Author SHA1 Message Date
qingwei.li 7c05d729b4 -> v0.4.1 2016-11-28 12:24:14 +08:00
qingwei.li 5953ef7739 bump 0.4.1 2016-11-28 12:23:43 +08:00
qingwei.li d556282471 add docsify.js.org
fix cdn
2016-11-28 12:22:47 +08:00
qingwei.li ec58149aad add catch ajax error 2016-11-28 12:17:57 +08:00
qingwei.li e15c53a6b8 fix site
remove cname

remove cdn

remove cdn
2016-11-28 12:14:24 +08:00
qingwei.li f450b118ee use docsify.js.org 2016-11-28 11:27:28 +08:00
qingwei.li 6ac7d4f66f Add changelog 2016-11-27 19:06:14 +08:00
qingwei.li 17806def5a -> v0.4.0 2016-11-27 18:57:06 +08:00
qingwei.li ea03583d3d bump 0.4.0 2016-11-27 18:56:25 +08:00
cinwell.liandGitHub 37e7984e7e feat: custom sidebar, #4 (#5)
* feat: custom sidebar, #4

* fix dev html

* fix doc

* fix doc
2016-11-27 18:53:31 +08:00
qingwei.li fc2e5b6fb9 fix undefined language 2016-11-27 15:24:07 +08:00
qingwei.li 94f00053d7 -> v0.3.1 2016-11-27 14:02:07 +08:00
qingwei.li 029f92e341 bump 0.3.1 2016-11-27 14:01:47 +08:00
qingwei.li 8041c82e6d Strip HTML tag when rendering the headling 2016-11-27 14:01:05 +08:00
qingwei.li 5e38b702cd -> v0.3.0 2016-11-27 13:36:18 +08:00
qingwei.li 136ef2881e bump 0.3.0 2016-11-27 13:35:31 +08:00
qingwei.li 50006d2ceb fix cdn path 2016-11-27 13:35:10 +08:00
qingwei.li 657ad7d59c Add minified css files 2016-11-27 13:30:40 +08:00
qingwei.li eba21726d7 Add max level option 2016-11-27 13:09:18 +08:00
qingwei.li e789fb2b18 -> v0.2.1 2016-11-26 21:08:34 +08:00
qingwei.li 6e4b9d4cad bump 0.2.1 2016-11-26 21:08:21 +08:00
qingwei.li 824e64ae48 Fix style 2016-11-26 21:07:47 +08:00
qingwei.li 4b961a9b69 -> v0.2.0 2016-11-26 18:52:48 +08:00
qingwei.li 2cf91da2f0 bump 2016-11-26 18:52:35 +08:00
qingwei.li 4f27fff283 Remove dynamic title 2016-11-26 18:51:44 +08:00
qingwei.li ff9e31f0c4 Add dev script 2016-11-26 18:37:17 +08:00
qingwei.li e8617a8af2 fix route 2016-11-26 18:13:39 +08:00
24 changed files with 441 additions and 80 deletions
+16
View File
@@ -0,0 +1,16 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<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="/themes/vue.css">
</head>
<body>
<nav>
<a href="/">En</a>
<a href="/zh-cn">中文</a>
</nav>
<div id="app"></div>
</body>
<script src="/lib/docsify.js" data-repo="qingwei-li/docsify"></script>
</html>
+33
View File
@@ -0,0 +1,33 @@
## 0.4.1
## Bug fixes
- catch ajax error
## 0.4.0
### Features
- Custom sidebar
### Bug fixes
- Fix undefined language
## 0.3.1
### Bug fixes
- Strip HTML tag when rendering the headings
## 0.3.0
### Features
- Add minified css files
- Add max level option
- Add pure.css
## 0.2.1
### Bug fixes
- Fix vue.css
## 0.2.0
### Bug fixes
- Fix route
- Remove dynamic title
## 0.1.0
### Features
- Add buble.css
+5
View File
@@ -30,5 +30,10 @@ Create `404.html` and `README.md` into `/docs`.
</html>
```
## How to contribute
- Fork it and clone!
- Run `npm i && npm run dev`
## License
MIT
+12
View File
@@ -0,0 +1,12 @@
var serveStatic = require('serve-static')
var http = require('http')
var fs = require('fs')
http.createServer(function (req, res) {
serveStatic('.')(req, res, function () {
res.writeHead(404, { 'Content-Type': 'text/html' })
res.end(fs.readFileSync('404.dev.html'))
})
}).listen(3000)
console.log(`\nListening at http://localhost:3000\n`)
+20
View File
@@ -0,0 +1,20 @@
var fs = require('fs')
var cssnano = require('cssnano').process
var resolve = require('path').resolve
var save = function (file, content) {
fs.writeFileSync(resolve(__dirname, '../lib/themes/', file), content)
}
var load = function (file) {
return fs.readFileSync(resolve(__dirname, '../themes/', file)).toString()
}
var list = fs.readdirSync(resolve(__dirname, '../themes'))
list.forEach(function (file) {
cssnano(load(file))
.then(function (result) {
save(file, result.css)
console.log('cssnao - ' + file)
})
})
+2 -2
View File
@@ -23,12 +23,12 @@ var build = function (opts) {
}
build({
entry: 'docsify.js',
entry: 'index.js',
output: 'docsify.js',
plugins: [commonjs(), nodeResolve()]
})
build({
entry: 'docsify.js',
entry: 'index.js',
output: 'docsify.min.js',
plugins: [commonjs(), nodeResolve(), uglify()]
})
+4 -4
View File
@@ -5,14 +5,14 @@
<title>Docsify</title>
<meta name="description" content="A magical documentation generator.">
<meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
<link rel="stylesheet" href="//unpkg.com/docsify/themes/vue.css">
<link rel="stylesheet" href="//unpkg.com/docsify/lib/themes/vue.css">
</head>
<body>
<nav>
<a href="/">En</a>
<a href="/zh-cn">中文</a>
<a href="/docsify/">En</a>
<a href="/docsify/zh-cn">中文</a>
</nav>
<div id="app"></div>
</body>
<script src="//unpkg.com/docsify" data-repo="qingwei-li/docsify"></script>
<script src="//unpkg.com/docsify/lib/docsify.min.js" data-repo="qingwei-li/docsify" data-max-level="3"></script>
</html>
+1
View File
@@ -0,0 +1 @@
docsify.js.org
+52 -4
View File
@@ -76,6 +76,13 @@ Currently available `vue.css` and `buble.css`
<link rel="stylesheet" href="//unpkg.com/docsify/themes/buble.css">
```
Minified files
```html
<link rel="stylesheet" href="//unpkg.com/docsify/lib/themes/vue.css">
<link rel="stylesheet" href="//unpkg.com/docsify/lib/themes/buble.css">
```
## More
### Multiple pages
@@ -86,13 +93,54 @@ Code in `404.html`
```html
<nav>
<a href="/">En</a>
<a href="/zh-cn">中文</a>
<a href="/docsify/">En</a>
<a href="/docsify/zh-cn">中文</a>
</nav>
```
### GitHub Corner
Modify your `404.html`
### Options
#### repo
Display the [GitHub Corner](http://tholman.com/github-corners/) widget.
```html
<script src="//unpkg.com/docsify" data-repo="your/repo"></script>
```
#### max-level
Toc level.
```html
<script src="//unpkg.com/docsify" data-max-level="6"></script>
```
#### el
Root element.
```html
<script src="//unpkg.com/docsify" data-el="#app"></script>
```
#### sidebar
Custom sidebar. if it'set, the TOC will be disabeld. Bind global variables on the `data-sidebar`.
![image](https://cloud.githubusercontent.com/assets/7565692/20647425/de5ab1c2-b4ce-11e6-863a-135868f2f9b4.png)
```html
<script>
window.sidebar = [
{ slug: '/', title: 'Home' },
{
slug: '/pageA',
title: 'page A',
children: [
{ slug: '/pageA/childrenB', title: 'children B' }
]
},
{ slug: '/PageC', title: 'Page C' }
]
</script>
<script src="/lib/docsify.js" data-sidebar="sidebar"></script>
```
+47 -3
View File
@@ -75,6 +75,13 @@ docsify serve docs
<link rel="stylesheet" href="//unpkg.com/docsify/themes/buble.css">
```
压缩版
```html
<link rel="stylesheet" href="//unpkg.com/docsify/lib/themes/vue.css">
<link rel="stylesheet" href="//unpkg.com/docsify/lib/themes/buble.css">
```
## 更多功能
### 多页面
@@ -85,16 +92,53 @@ docsify serve docs
```html
<nav>
<a href="/">En</a>
<a href="/zh-cn">中文</a>
<a href="/docsify/">En</a>
<a href="/docsify/zh-cn">中文</a>
</nav>
```
### GitHub Corner
### 配置参数
#### repo
参考本文档的右上角的 GitHub 图标,如果要开启的话,将 `404.html` 里的 script 改成
```html
<script src="//unpkg.com/docsify" data-repo="your/repo"></script>
```
#### max-level
目录最大展开层级,默认值为 6
```html
<script src="//unpkg.com/docsify" data-max-level="6"></script>
```
#### el
替换节点元素,默认为 `#app`
```html
<script src="//unpkg.com/docsify" data-el="#app"></script>
```
#### sidebar
设置后 TOC 功能将不可用,适合导航较多的文档,`data-sidebar` 传入全局变量名。
![image](https://cloud.githubusercontent.com/assets/7565692/20647425/de5ab1c2-b4ce-11e6-863a-135868f2f9b4.png)
```html
<script>
window.sidebar = [
{ slug: '/', title: 'Home' },
{
slug: '/pageA',
title: 'page A',
children: [
{ slug: '/pageA/childrenB', title: 'children B' }
]
},
{ slug: '/PageC', title: 'Page C' }
]
</script>
<script src="/lib/docsify.js" data-sidebar="sidebar"></script>
```
+41 -28
View File
@@ -13,7 +13,8 @@ var ajax = function (url, options) {
xhr.send();
return {
then: function (cb) { return xhr.addEventListener('load', cb); }
then: function (cb) { return xhr.addEventListener('load', cb); },
catch: function (cb) { return xhr.addEventListener('error', cb); }
}
};
@@ -2114,7 +2115,7 @@ Prism.languages.js = Prism.languages.javascript;
/**
* @link from https://github.com/killercup/grock/blob/5280ae63e16c5739e9233d9009bc235ed7d79a50/styles/solarized/assets/js/behavior.coffee#L54-L81
*/
var tocToTree = function (toc) {
var tocToTree = function (toc, maxLevel) {
var headlines = [];
var last = {};
@@ -2122,6 +2123,7 @@ var tocToTree = function (toc) {
var level = headline.level || 1;
var len = level - 1;
if (level > maxLevel) { return }
if (last[len]) {
last[len].children = last[len].children || [];
last[len].children.push(headline);
@@ -2140,7 +2142,7 @@ var buildHeadlinesTree = function (tree, tpl) {
if (!tree || !tree.length) { return '' }
tree.forEach(function (node) {
tpl += "<li><a class=\"section-link\" href=\"#" + (node.slug) + "\">" + (node.title) + "</a></li>";
tpl += "<li><a class=\"section-link\" href=\"" + (node.slug) + "\">" + (node.title) + "</a></li>";
if (node.children) {
tpl += "<li><ul class=\"children\">" + (buildHeadlinesTree(node.children)) + "</li></ul>";
}
@@ -2149,10 +2151,12 @@ var buildHeadlinesTree = function (tree, tpl) {
return tpl
};
var genToc = function (toc) {
var tree = tocToTree(toc);
var result = buildHeadlinesTree(tree, '<ul>');
return result
var genToc = function (toc, opts) {
var tree = Array.isArray(opts.sidebar)
? opts.sidebar
: tocToTree(toc, opts['max-level']);
return buildHeadlinesTree(tree, '<ul>')
};
var cornerTpl = "\n <a href=\"{{repo}}\" class=\"github-corner\" aria-label=\"View source on Github\">\n <svg viewBox=\"0 0 250 250\" aria-hidden=\"true\">\n <path d=\"M0,0 L115,115 L130,115 L142,142 L250,250 L250,0 Z\"></path>\n <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>\n <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>\n </svg>\n </a>\n";
@@ -2164,18 +2168,20 @@ var renderer = new marked.Renderer();
* @link https://github.com/chjj/marked#overriding-renderer-methods
*/
renderer.heading = function (text, level) {
var slug = text.toLowerCase().replace(/[\s\n\t]+/g, '-');
var slug = text.replace(/<(?:.|\n)*?>/gm, '').toLowerCase().replace(/[\s\n\t]+/g, '-');
toc.push({ level: level, slug: slug, title: text });
toc.push({ level: level, slug: '#' + slug, title: text });
return ("<h" + level + " id=\"" + slug + "\"><a href=\"#" + slug + "\" class=\"anchor\"></a>" + text + "</h" + level + ">")
};
// highlight code
renderer.code = function (code, lang) {
if ( lang === void 0 ) lang = '';
var hl = prism.highlight(code, prism.languages[lang] || prism.languages.markup);
return ("<pre><code class=\"lang-" + lang + "\" data-lang=\"" + lang + "\">" + hl + "</code></pre>")
return ("<pre data-lang=\"" + lang + "\"><code class=\"lang-" + lang + "\">" + hl + "</code></pre>")
};
marked.setOptions({ renderer: renderer });
@@ -2190,13 +2196,13 @@ var render = function (content, opts) {
}
var section = "<section class=\"content\">\n <article class=\"markdown-section\">" + (marked(content)) + "</article>\n </section>";
var sidebar = "<aside class=\"sidebar\">" + (genToc(toc)) + "</aside>";
var sidebar = "<aside class=\"sidebar\">" + (genToc(toc, opts)) + "</aside>";
return (corner + "<main>" + sidebar + section + "</main>")
};
function scrollActiveSidebar () {
if (/mobile/i.test(navigator.userAgent)) { return }
function scrollActiveSidebar (isCustom) {
if (/mobile/i.test(navigator.userAgent) || isCustom) { return }
var anchors = document.querySelectorAll('.anchor');
var nav = {};
@@ -2217,6 +2223,8 @@ function scrollActiveSidebar () {
if (bcr.top < 10 && bcr.bottom > 10) {
var li = nav[node.id];
if (!li) { return }
if (li === active) { return }
if (active) { active.setAttribute('class', ''); }
@@ -2243,15 +2251,15 @@ function scrollActiveSidebar () {
scrollIntoView();
}
var bindEvent = function () {
scrollActiveSidebar();
var bindEvent = function (isCustom) {
scrollActiveSidebar(isCustom);
};
var DEFAULT_OPTS = {
el: '#app',
title: document.title,
sep: ' - ',
repo: ''
repo: '',
'max-level': 6,
sidebar: ''
};
var script = document.currentScript || [].slice.call(document.getElementsByTagName('script')).pop();
@@ -2266,16 +2274,17 @@ var Docsify = function Docsify (opts) {
Docsify.installed = true;
this.opts = Object.assign({}, opts, DEFAULT_OPTS);
this.opts.title = (this.opts.title ? this.opts.sep : '') + this.opts.title;
this.replace = true;
this.dom = document.querySelector(this.opts.el);
if (!this.dom) {
this.dom = document.body;
this.replace = false;
}
if (this.opts.sidebar) { this.opts.sidebar = window[this.opts.sidebar]; }
this.loc = document.location.pathname;
if (/\/$/.test(this.loc)) { this.loc += 'README'; }
this.load();
var nav = document.querySelector('nav');
@@ -2285,28 +2294,32 @@ var Docsify = function Docsify (opts) {
Docsify.prototype.load = function load () {
var this$1 = this;
ajax(((this.loc) + ".md")).then(function (res) {
ajax(((this.loc) + ".md"))
.then(function (res) {
var target = res.target;
if (target.status >= 400) {
this$1.render('not found');
} else {
this$1.render(res.target.response);
bindEvent();
bindEvent(!!this$1.opts.sidebar);
if (this$1.opts.sidebar) {
this$1.activeNav(document.querySelector('aside.sidebar'), true);
}
}
});
})
.catch(function (_) { return this$1.render('not found'); });
};
Docsify.prototype.render = function render$1 (content) {
if (this.loc.slice(1) !== 'README') {
document.title = this.loc.slice(1) + this.opts.title;
}
this.dom[this.replace ? 'outerHTML' : 'innerHTML'] = render(content, this.opts);
};
Docsify.prototype.activeNav = function activeNav (elm) {
Docsify.prototype.activeNav = function activeNav (elm, activeParentNode) {
var host = document.location.origin + document.location.pathname;[].slice.call(elm.querySelectorAll('a')).forEach(function (node) {
if (node.href === host) {
node.setAttribute('class', 'active');
activeParentNode
? node.parentNode.setAttribute('class', 'active')
: node.setAttribute('class', 'active');
}
});
};
+1 -1
View File
File diff suppressed because one or more lines are too long
+1
View File
@@ -0,0 +1 @@
@import url('https://fonts.googleapis.com/css?family=Inconsolata|Inconsolata-Bold');*{box-sizing:border-box;-webkit-overflow-scrolling:touch;-webkit-tap-highlight-color:rgba(0,0,0,0);-webkit-text-size-adjust:none;-webkit-touch-callout:none;-webkit-font-smoothing:antialiased}nav{position:absolute;right:0;left:0;z-index:2;margin:25px 60px 0 0;text-align:right}nav a{margin:0 1em;padding:5px 0;font-size:16px;text-decoration:none;color:inherit;transition:color .3s}nav a.active,nav a:hover{color:#0074d9}nav a.active{border-bottom:2px solid #0074d9}.github-corner{position:absolute;top:0;right:0;z-index:2}.github-corner svg{color:#fff;fill:#0074d9;height:80px;width:80px}.github-corner:hover .octo-arm{animation:a .56s ease-in-out}@keyframes a{0%,to{transform:rotate(0)}20%,60%{transform:rotate(-25deg)}40%,80%{transform:rotate(10deg)}}@media (max-width:500px){.github-corner:hover .octo-arm{animation:none}.github-corner .octo-arm{animation:a .56s ease-in-out}}body,html{height:100%}body{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;background-color:#fff;color:#34495e;font-family:Source Sans Pro,arial,sans-serif;font-weight:400px;font-size:15px;letter-spacing:0;margin:0}main{height:100%;position:relative;width:100%}.sidebar{background-color:#fff;border-right:1px solid rgba(0,0,0,.07);bottom:0;color:#364149;overflow-y:auto;position:absolute;top:0;width:14em;z-index:1;padding-top:40px}.sidebar ul{margin:0;padding:0}.sidebar ul,.sidebar ul li{list-style:none}.sidebar a{color:#666;text-decoration:none}.sidebar li{list-style:none;padding:.2em .2em .2em 1em;margin:0}.sidebar .active{background-color:#eee}.sidebar .active a{color:#333}.content{bottom:0;left:14em;overflow-y:auto;position:absolute;right:0;top:0;overflow-x:hidden;padding-top:20px}@media screen and (max-width:600px){.sidebar{left:-14em}.content{left:0}}.markdown-section{position:relative;margin:0 auto;max-width:64em;padding:20px 15px 40px}.markdown-section *{box-sizing:border-box;-webkit-box-sizing:border-box;font-size:inherit}.markdown-section>:first-child{margin-top:0!important}.markdown-section h1,.markdown-section h2,.markdown-section h3,.markdown-section h4,.markdown-section strong{font-weight:400;color:#333}.markdown-section a{color:#0074d9;font-weight:400}.markdown-section ol,.markdown-section p,.markdown-section ul{word-spacing:.05em}.markdown-section h1{margin:0 0 1em;font-size:2em;font-weight:500}.markdown-section h2{padding:1rem 0 0;margin:0 0 1rem;font-size:1.8em;font-weight:400}.markdown-section h3{margin:52px 0 1.2em;font-size:1.5em}.markdown-section h4{font-size:1.25em}.markdown-section h5{font-size:1em}.markdown-section h6{font-size:1em;color:#777}.markdown-section figure,.markdown-section ol,.markdown-section p,.markdown-section ul{margin:1.2em 0}.markdown-section ol,.markdown-section p,.markdown-section ul{margin:0 0 1em;line-height:1.5}.markdown-section ol,.markdown-section ul{padding-left:1.5em}.markdown-section li{margin:0;line-height:1.5}.markdown-section blockquote{color:#858585;border-left:4px solid #0074d9;margin:2em 0;padding-left:20px}.markdown-section blockquote p{font-weight:600;margin-left:0}.markdown-section iframe{margin:1em 0}.markdown-section em{color:#7f8c8d}.markdown-section code{padding:.2em .4em;border-radius:3px;white-space:pre}.markdown-section code,.markdown-section pre{background-color:#f9f9f9;font-family:Inconsolata}.markdown-section pre{border-left:2px solid #eee;padding:8px;margin:0 0 1em;padding:12px 10px 12px 12px;font-size:16px}.token.cdata,.token.comment,.token.doctype,.token.prolog{color:#93a1a1}.token.punctuation{color:#586e75}.namespace{opacity:.7}.token.boolean,.token.constant,.token.deleted,.token.number,.token.property,.token.symbol,.token.tag{color:#268bd2}.token.attr-name,.token.builtin,.token.char,.token.inserted,.token.selector,.token.string,.token.url{color:#2aa198}.token.entity{color:#657b83;background:#eee8d5}.token.atrule,.token.attr-value,.token.keyword{color:#a11}.token.function{color:#b58900}.token.important,.token.regex,.token.variable{color:#cb4b16}.token.bold,.token.important{font-weight:700}.token.italic{font-style:italic}.token.entity{cursor:help}.markdown-section pre>code{display:block;font-family:Inconsolata;line-height:1.2em;padding:0}.markdown-section code:after,.markdown-section code:before{letter-spacing:.05em}code .token{min-height:1.5em;-webkit-font-smoothing:initial;-moz-osx-font-smoothing:initial}pre code{overflow-x:auto;position:relative;padding:0;background-color:#f8f8f8;padding:.8em .8em .4em;line-height:1.1em;border-radius:2px}.content img{max-width:100%}.content span.light{color:#7f8c8d}.content span.info{display:inline-block;font-size:.85em;margin-left:20px;vertical-align:middle;width:280px}
+1
View File
@@ -0,0 +1 @@
*{box-sizing:border-box;-webkit-overflow-scrolling:touch;-webkit-tap-highlight-color:rgba(0,0,0,0);-webkit-text-size-adjust:none;-webkit-touch-callout:none;-webkit-font-smoothing:antialiased}nav{position:absolute;right:0;left:0;z-index:2;margin:25px 60px 0 0;text-align:right}nav a{margin:0 1em;padding:5px 0;font-size:16px;text-decoration:none;color:inherit;transition:color .3s}.github-corner{position:absolute;top:0;right:0;z-index:2}.github-corner svg{color:#fff;height:80px;width:80px}.github-corner:hover .octo-arm{animation:a .56s ease-in-out}@keyframes a{0%,to{transform:rotate(0)}20%,60%{transform:rotate(-25deg)}40%,80%{transform:rotate(10deg)}}@media (max-width:500px){.github-corner:hover .octo-arm{animation:none}.github-corner .octo-arm{animation:a .56s ease-in-out}}body,html{height:100%}body{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;font-family:Source Sans Pro,Helvetica Neue,Arial,sans-serif;font-size:15px;letter-spacing:0;margin:0}main{height:100%;position:relative;width:100%}.sidebar{border-right:1px solid rgba(0,0,0,.07);bottom:0;overflow-y:auto;position:absolute;top:0;width:300px;z-index:1;padding-top:40px}.sidebar ul{margin:0;padding:0}.sidebar ul,.sidebar ul li{list-style:none}.sidebar ul li a{display:block;border-bottom:none}.sidebar ul li ul{padding-left:20px}.content{bottom:0;left:300px;overflow-y:auto;position:absolute;right:0;top:0;overflow-x:hidden;padding-top:20px}@media screen and (max-width:600px){.sidebar{left:-300px}.content{left:0}}.markdown-section{position:relative;margin:0 auto;max-width:800px;padding:20px 15px 40px}.markdown-section *{box-sizing:border-box;-webkit-box-sizing:border-box;font-size:inherit}.markdown-section>:first-child{margin-top:0!important}
File diff suppressed because one or more lines are too long
+7 -3
View File
@@ -1,6 +1,6 @@
{
"name": "docsify",
"version": "0.1.0",
"version": "0.4.1",
"description": "A magical documentation generator.",
"main": "lib/docsify.js",
"files": [
@@ -9,7 +9,8 @@
"themes"
],
"scripts": {
"build": "node build/build.js",
"build": "rm -rf lib && node build/build.js && mkdir lib/themes && node build/build-css.js",
"dev": "node app.js & nodemon --watch src themes --exec 'npm run build'",
"test": "eslint src test"
},
"repository": {
@@ -27,14 +28,17 @@
"homepage": "https://QingWei-Li.github.io/docsify",
"license": "MIT",
"devDependencies": {
"cssnano": "^3.8.1",
"eslint": "^3.10.2",
"eslint-config-vue": "^2.0.1",
"eslint-plugin-vue": "^1.0.0",
"nodemon": "^1.11.0",
"rollup": "^0.36.3",
"rollup-plugin-buble": "^0.14.0",
"rollup-plugin-commonjs": "^5.0.5",
"rollup-plugin-node-resolve": "^2.0.0",
"rollup-plugin-uglify": "^1.0.1"
"rollup-plugin-uglify": "^1.0.1",
"serve-static": "^1.11.1"
},
"dependencies": {
"marked": "^0.3.6",
+2 -1
View File
@@ -5,6 +5,7 @@ export default function (url, options = {}) {
xhr.send()
return {
then: cb => xhr.addEventListener('load', cb)
then: cb => xhr.addEventListener('load', cb),
catch: cb => xhr.addEventListener('error', cb)
}
}
+6 -4
View File
@@ -1,5 +1,5 @@
function scrollActiveSidebar () {
if (/mobile/i.test(navigator.userAgent)) return
function scrollActiveSidebar (isCustom) {
if (/mobile/i.test(navigator.userAgent) || isCustom) return
const anchors = document.querySelectorAll('.anchor')
const nav = {}
@@ -20,6 +20,8 @@ function scrollActiveSidebar () {
if (bcr.top < 10 && bcr.bottom > 10) {
const li = nav[node.id]
if (!li) return
if (li === active) return
if (active) active.setAttribute('class', '')
@@ -46,6 +48,6 @@ function scrollActiveSidebar () {
scrollIntoView()
}
export default function () {
scrollActiveSidebar()
export default function (isCustom) {
scrollActiveSidebar(isCustom)
}
+10 -7
View File
@@ -1,7 +1,7 @@
/**
* @link from https://github.com/killercup/grock/blob/5280ae63e16c5739e9233d9009bc235ed7d79a50/styles/solarized/assets/js/behavior.coffee#L54-L81
*/
const tocToTree = function (toc) {
const tocToTree = function (toc, maxLevel) {
const headlines = []
const last = {}
@@ -9,6 +9,7 @@ const tocToTree = function (toc) {
const level = headline.level || 1
const len = level - 1
if (level > maxLevel) return
if (last[len]) {
last[len].children = last[len].children || []
last[len].children.push(headline)
@@ -24,8 +25,8 @@ const tocToTree = function (toc) {
const buildHeadlinesTree = function (tree, tpl = '') {
if (!tree || !tree.length) return ''
tree.forEach((node) => {
tpl += `<li><a class="section-link" href="#${node.slug}">${node.title}</a></li>`
tree.forEach(node => {
tpl += `<li><a class="section-link" href="${node.slug}">${node.title}</a></li>`
if (node.children) {
tpl += `<li><ul class="children">${buildHeadlinesTree(node.children)}</li></ul>`
}
@@ -34,8 +35,10 @@ const buildHeadlinesTree = function (tree, tpl = '') {
return tpl
}
export default function (toc) {
var tree = tocToTree(toc)
var result = buildHeadlinesTree(tree, '<ul>')
return result
export default function (toc, opts) {
var tree = Array.isArray(opts.sidebar)
? opts.sidebar
: tocToTree(toc, opts['max-level'])
return buildHeadlinesTree(tree, '<ul>')
}
+17 -12
View File
@@ -4,9 +4,9 @@ import bindEvent from './bind-event'
const DEFAULT_OPTS = {
el: '#app',
title: document.title,
sep: ' - ',
repo: ''
repo: '',
'max-level': 6,
sidebar: ''
}
const script = document.currentScript || [].slice.call(document.getElementsByTagName('script')).pop()
@@ -22,16 +22,17 @@ class Docsify {
Docsify.installed = true
this.opts = Object.assign({}, opts, DEFAULT_OPTS)
this.opts.title = (this.opts.title ? this.opts.sep : '') + this.opts.title
this.replace = true
this.dom = document.querySelector(this.opts.el)
if (!this.dom) {
this.dom = document.body
this.replace = false
}
if (this.opts.sidebar) this.opts.sidebar = window[this.opts.sidebar]
this.loc = document.location.pathname
if (/\/$/.test(this.loc)) this.loc += 'README'
this.load()
const nav = document.querySelector('nav')
@@ -39,30 +40,34 @@ class Docsify {
}
load () {
ajax(`${this.loc}.md`).then(res => {
ajax(`${this.loc}.md`)
.then(res => {
const target = res.target
if (target.status >= 400) {
this.render('not found')
} else {
this.render(res.target.response)
bindEvent()
bindEvent(!!this.opts.sidebar)
if (this.opts.sidebar) {
this.activeNav(document.querySelector('aside.sidebar'), true)
}
}
})
.catch(_ => this.render('not found'))
}
render (content) {
if (this.loc.slice(1) !== 'README') {
document.title = this.loc.slice(1) + this.opts.title
}
this.dom[this.replace ? 'outerHTML' : 'innerHTML'] = render(content, this.opts)
}
activeNav (elm) {
activeNav (elm, activeParentNode) {
const host = document.location.origin + document.location.pathname
;[].slice.call(elm.querySelectorAll('a')).forEach(node => {
if (node.href === host) {
node.setAttribute('class', 'active')
activeParentNode
? node.parentNode.setAttribute('class', 'active')
: node.setAttribute('class', 'active')
}
})
}
+5 -5
View File
@@ -19,18 +19,18 @@ const renderer = new marked.Renderer()
* @link https://github.com/chjj/marked#overriding-renderer-methods
*/
renderer.heading = function (text, level) {
const slug = text.toLowerCase().replace(/[\s\n\t]+/g, '-')
const slug = text.replace(/<(?:.|\n)*?>/gm, '').toLowerCase().replace(/[\s\n\t]+/g, '-')
toc.push({ level, slug, title: text })
toc.push({ level, slug: '#' + slug, title: text })
return `<h${level} id="${slug}"><a href="#${slug}" class="anchor"></a>${text}</h${level}>`
}
// highlight code
renderer.code = function (code, lang) {
renderer.code = function (code, lang = '') {
const hl = Prism.highlight(code, Prism.languages[lang] || Prism.languages.markup)
return `<pre><code class="lang-${lang}" data-lang="${lang}">${hl}</code></pre>`
return `<pre data-lang="${lang}"><code class="lang-${lang}">${hl}</code></pre>`
}
marked.setOptions({ renderer })
@@ -45,7 +45,7 @@ export default function (content, opts = {}) {
const section = `<section class="content">
<article class="markdown-section">${marked(content)}</article>
</section>`
const sidebar = `<aside class="sidebar">${genToc(toc)}</aside>`
const sidebar = `<aside class="sidebar">${genToc(toc, opts)}</aside>`
return `${corner}<main>${sidebar}${section}</main>`
}
+2 -1
View File
@@ -362,9 +362,10 @@ main {
}
.markdown-section pre>code {
padding: 0;
display: block;
font-family: Inconsolata;
line-height: 1.2em;
padding: 0;
}
.markdown-section code::after, .markdown-section code::before {
+152
View File
@@ -0,0 +1,152 @@
* {
-webkit-box-sizing: border-box;
-moz-box-sizing: border-box;
box-sizing: border-box;
-webkit-overflow-scrolling: touch;
-webkit-tap-highlight-color: rgba(0, 0, 0, 0);
-webkit-text-size-adjust: none;
-webkit-touch-callout: none;
-webkit-font-smoothing: antialiased;
}
/* navbar */
nav {
position: absolute;
right: 0;
left: 0;
z-index: 10;
margin: 25px 60px 0 0;
text-align: right;
}
nav a {
margin: 0 1em;
padding: 5px 0;
font-size: 16px;
text-decoration: none;
color: inherit;
transition: color .3s;
}
/* github corner */
.github-corner {
position: absolute;
top: 0;
right: 0;
z-index: 10;
}
.github-corner svg {
color: #fff;
height: 80px;
width: 80px;
}
.github-corner:hover .octo-arm {
animation:octocat-wave 560ms ease-in-out;
}
@keyframes octocat-wave {
0%,100%{ transform: rotate(0); }
20%,60%{ transform: rotate(-25deg); }
40%,80%{ transform: rotate(10deg); }
}
@media (max-width: 500px) {
.github-corner:hover .octo-arm {
animation: none;
}
.github-corner .octo-arm {
animation: octocat-wave 560ms ease-in-out;
}
}
html, body {
height: 100%;
}
body {
-moz-osx-font-smoothing: grayscale;
-webkit-font-smoothing: antialiased;
font-family: 'Source Sans Pro', 'Helvetica Neue', Arial, sans-serif;
font-size: 15px;
letter-spacing: 0;
margin: 0;
}
/* main */
main {
height: 100%;
position: relative;
width: 100%;
}
/* sidebar */
.sidebar {
border-right: 1px solid rgba(0,0,0,.07);
bottom: 0;
overflow-y: auto;
position: absolute;
top: 0;
width: 300px;
z-index: 1;
padding-top: 40px;
}
.sidebar ul {
margin: 0;
padding: 0;
}
.sidebar ul, .sidebar ul li {
list-style: none;
}
.sidebar ul li a {
display: block;
border-bottom: none;
}
.sidebar ul li ul {
padding-left: 20px;
}
/* main content */
.content {
bottom: 0;
left: 300px;
overflow-y: auto;
position: absolute;
right: 0;
top: 0;
overflow-x: hidden;
padding-top: 20px;
}
@media screen and (max-width: 600px) {
.sidebar {
left: -300px;
}
.content {
left: 0;
}
}
/* markdown content found on pages */
.markdown-section {
position: relative;
margin: 0 auto;
max-width: 800px;
padding: 20px 15px 40px 15px;
}
.markdown-section * {
box-sizing: border-box;
-webkit-box-sizing: border-box;
font-size: inherit;
}
.markdown-section>:first-child {
margin-top: 0!important;
}
+3 -5
View File
@@ -208,10 +208,8 @@ main {
}
.markdown-section h2 {
border-bottom: 1px solid #ddd;
font-size: 1.75em;
margin: 45px 0 0.8em;
padding-bottom: 0.7em;
}
.markdown-section h3 {
@@ -283,13 +281,14 @@ main {
}
.markdown-section pre {
font-family: 'Roboto Mono', Monaco, courier, monospace;
-moz-osx-font-smoothing: initial;
-webkit-font-smoothing: initial;
background-color: #f8f8f8;
font-family: 'Roboto Mono', Monaco, courier, monospace;
line-height: 1.5em;
margin: 1.2em 0;
padding: 1.2em 1.4em;
position: relative;
}
/* code highlight */
@@ -415,7 +414,6 @@ code .token {
pre code {
overflow-x: auto;
position: relative;
padding: 0;
background-color: #f8f8f8;
padding: 0.8em 0.8em 0.4em;
@@ -423,7 +421,7 @@ pre code {
border-radius: 2px;
}
pre code::after {
pre::after {
color: #ccc;
content: attr(data-lang);
font-size: 0.75em;