mirror of
https://github.com/GitbookIO/gitbook.git
synced 2026-10-02 06:58:06 +00:00
Compare commits
68 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 501843d624 | |||
| 508ce4283e | |||
| 4aa8e66549 | |||
| 917a6f70d8 | |||
| 2f5e53da55 | |||
| c3cdefc90a | |||
| 9c580e4989 | |||
| 50c902c4e4 | |||
| 84b6e0bde6 | |||
| abc29c3fba | |||
| 8356c534f5 | |||
| 78ff2687b4 | |||
| 9b6586fb36 | |||
| ea133219d0 | |||
| c9b5d81a3c | |||
| d895c63211 | |||
| 8c86da67ca | |||
| a9a230dfc3 | |||
| 6d53e52771 | |||
| 52e10b7cfe | |||
| addac85696 | |||
| 13fb949d68 | |||
| f1b593cfbd | |||
| f998e2dec9 | |||
| 2c0bd53a91 | |||
| 6dd7f6162f | |||
| 475b0bb2b3 | |||
| e6343935e3 | |||
| 946883fd4c | |||
| b1b7e3148b | |||
| 32203f6438 | |||
| f2d3c5d2ed | |||
| 7e2f0ed4bc | |||
| a877acf905 | |||
| ac756ddf7e | |||
| 36e2236e6b | |||
| 72df665520 | |||
| 07785528a5 | |||
| bb579dd581 | |||
| a7d3064340 | |||
| 1a60778248 | |||
| cda4bb5bda | |||
| 7543781046 | |||
| 82f3ffad06 | |||
| dc4d2a1731 | |||
| 2523925915 | |||
| d5bbd8475c | |||
| 54d195268a | |||
| a0deb9509f | |||
| b0b1433594 | |||
| 17a2c0a37c | |||
| fd68ea1cc2 | |||
| 784874c776 | |||
| f45c6d3466 | |||
| 98af70902f | |||
| 41a67b5c4c | |||
| 83ee903af4 | |||
| e591b0e485 | |||
| bcc9a34742 | |||
| 6b56c7de7f | |||
| 7b42719699 | |||
| 64b8343f67 | |||
| fcc5089fa6 | |||
| 334f782aa8 | |||
| 1776f2bf77 | |||
| e259412f79 | |||
| 999a02f110 | |||
| 604d0fba65 |
+10
@@ -42,3 +42,13 @@ Translators
|
|||||||
- Hu Hao (@howiehu)
|
- Hu Hao (@howiehu)
|
||||||
- French
|
- French
|
||||||
- Samy Pessé (@SamyPesse)
|
- Samy Pessé (@SamyPesse)
|
||||||
|
- Romanian
|
||||||
|
- Iancu Aurel (@awrelll)
|
||||||
|
- Finnish
|
||||||
|
- Tommi Savikko (@savikko)
|
||||||
|
- Japanese
|
||||||
|
- Iancu Aurel (@awrelll)
|
||||||
|
- Korean
|
||||||
|
- Iancu Aurel (@awrelll)
|
||||||
|
- Vietnamese
|
||||||
|
- Hong Nguyen (@nghong)
|
||||||
+29
@@ -2,6 +2,35 @@
|
|||||||
All notable changes to this project will be documented in this file.
|
All notable changes to this project will be documented in this file.
|
||||||
This project adheres to [Semantic Versioning](http://semver.org/).
|
This project adheres to [Semantic Versioning](http://semver.org/).
|
||||||
|
|
||||||
|
## 2.2.0
|
||||||
|
- Fix direction in code blocks (always LTR)
|
||||||
|
- Add options `chapterMark` and `pageBreaksBefore` for PDF
|
||||||
|
- Update code highlighting library
|
||||||
|
- `book.json` accessible as `config` in templating syntax
|
||||||
|
- Add Vietnamese translation (`vi`)
|
||||||
|
|
||||||
|
## 2.1.0
|
||||||
|
- Fix error in calcul of `levels` in table of contents, error introduced a few versions ago
|
||||||
|
- Add optional `styles/print.css` to replace `print.css` used in ebook
|
||||||
|
|
||||||
|
## 2.0.4
|
||||||
|
- Fix `{% raw %}`, got confused with "fake" variable declarations
|
||||||
|
- Fix title of language chooser
|
||||||
|
- Fix the X-UA-Compatible meta tag
|
||||||
|
- Move style sheets to the <head> section
|
||||||
|
|
||||||
|
## 2.0.3
|
||||||
|
- Fix `gitbook init` for SUMMARY with empty entries
|
||||||
|
- Fix escaping of code blocks in markdown
|
||||||
|
|
||||||
|
## 2.0.2
|
||||||
|
- Fix relative links in windows
|
||||||
|
- Improve watcher in serve command (switch to chokidar)
|
||||||
|
- Add Romanian translation (`ro`)
|
||||||
|
- Add Finish translation (`fi`)
|
||||||
|
- Add Japanese translation (`jp`)
|
||||||
|
- Add Korean translation (`kr`)
|
||||||
|
|
||||||
## 2.0.1
|
## 2.0.1
|
||||||
- Improve error logging (display file, line and column)
|
- Improve error logging (display file, line and column)
|
||||||
- Add back support for `options.originalInput`
|
- Add back support for `options.originalInput`
|
||||||
|
|||||||
+16
-12
@@ -115,7 +115,7 @@ Book.prototype.parse = function() {
|
|||||||
return that.parseLangs()
|
return that.parseLangs()
|
||||||
.then(function() {
|
.then(function() {
|
||||||
multilingual = that.langs.length > 0;
|
multilingual = that.langs.length > 0;
|
||||||
if (multilingual) that.log.info.ln("Parsing multilingual book, with", that.langs.length, "lanuages");
|
if (multilingual) that.log.info.ln("Parsing multilingual book, with", that.langs.length, "languages");
|
||||||
|
|
||||||
// Sub-books that inherit from the current book configuration
|
// Sub-books that inherit from the current book configuration
|
||||||
that.books = _.map(that.langs, function(lang) {
|
that.books = _.map(that.langs, function(lang) {
|
||||||
@@ -789,20 +789,19 @@ Book.prototype.normError = function(err, opts, defs) {
|
|||||||
};
|
};
|
||||||
|
|
||||||
// Init and return a book
|
// Init and return a book
|
||||||
Book.init = function(root) {
|
Book.init = function(root, opts) {
|
||||||
var book = new Book(root);
|
var book = new Book(root, opts);
|
||||||
var extensionToUse = ".md";
|
var extensionToUse = ".md";
|
||||||
|
|
||||||
var chaptersPaths = function(chapters) {
|
var chaptersPaths = function(chapters) {
|
||||||
return _.reduce(chapters || [], function(accu, chapter) {
|
return _.reduce(chapters || [], function(accu, chapter) {
|
||||||
if (!chapter.path) return accu;
|
var o = {
|
||||||
|
title: chapter.title
|
||||||
|
};
|
||||||
|
if (chapter.path) o.path = chapter.path;
|
||||||
|
|
||||||
return accu.concat(
|
return accu.concat(
|
||||||
_.filter([
|
[o].concat(chaptersPaths(chapter.articles))
|
||||||
{
|
|
||||||
title: chapter.title,
|
|
||||||
path: chapter.path
|
|
||||||
}
|
|
||||||
].concat(chaptersPaths(chapter.articles)))
|
|
||||||
);
|
);
|
||||||
}, []);
|
}, []);
|
||||||
};
|
};
|
||||||
@@ -839,12 +838,17 @@ Book.init = function(root) {
|
|||||||
.then(function(chapters) {
|
.then(function(chapters) {
|
||||||
// Create files that don't exist
|
// Create files that don't exist
|
||||||
return Q.all(_.map(chapters, function(chapter) {
|
return Q.all(_.map(chapters, function(chapter) {
|
||||||
|
if (!chapter.path) return Q();
|
||||||
var absolutePath = path.resolve(book.root, chapter.path);
|
var absolutePath = path.resolve(book.root, chapter.path);
|
||||||
|
|
||||||
return fs.exists(absolutePath)
|
return fs.exists(absolutePath)
|
||||||
.then(function(exists) {
|
.then(function(exists) {
|
||||||
book.log.info.ln("create", chapter.path);
|
if(exists) {
|
||||||
if(exists) return;
|
book.log.info.ln("found", chapter.path);
|
||||||
|
return;
|
||||||
|
} else {
|
||||||
|
book.log.info.ln("create", chapter.path);
|
||||||
|
}
|
||||||
|
|
||||||
return fs.mkdirp(path.dirname(absolutePath))
|
return fs.mkdirp(path.dirname(absolutePath))
|
||||||
.then(function() {
|
.then(function() {
|
||||||
|
|||||||
@@ -186,6 +186,7 @@ Configuration.DEFAULT = {
|
|||||||
// CSS Styles
|
// CSS Styles
|
||||||
"styles": {
|
"styles": {
|
||||||
"website": "styles/website.css",
|
"website": "styles/website.css",
|
||||||
|
"print": "styles/print.css",
|
||||||
"ebook": "styles/ebook.css",
|
"ebook": "styles/ebook.css",
|
||||||
"pdf": "styles/pdf.css",
|
"pdf": "styles/pdf.css",
|
||||||
"mobi": "styles/mobi.css",
|
"mobi": "styles/mobi.css",
|
||||||
@@ -245,6 +246,14 @@ Configuration.DEFAULT = {
|
|||||||
// Choices are [u’a0’, u’a1’, u’a2’, u’a3’, u’a4’, u’a5’, u’a6’, u’b0’, u’b1’, u’b2’, u’b3’, u’b4’, u’b5’, u’b6’, u’legal’, u’letter’]
|
// Choices are [u’a0’, u’a1’, u’a2’, u’a3’, u’a4’, u’a5’, u’a6’, u’b0’, u’b1’, u’b2’, u’b3’, u’b4’, u’b5’, u’b6’, u’legal’, u’letter’]
|
||||||
"paperSize": "a4",
|
"paperSize": "a4",
|
||||||
|
|
||||||
|
// How to mark detected chapters.
|
||||||
|
// Choices are “pagebreak”, “rule”, "both" or “none”.
|
||||||
|
"chapterMark" : "pagebreak",
|
||||||
|
|
||||||
|
// An XPath expression. Page breaks are inserted before the specified elements.
|
||||||
|
// To disable use the expression: "/"
|
||||||
|
"pageBreaksBefore": "/",
|
||||||
|
|
||||||
// Margin (in pts)
|
// Margin (in pts)
|
||||||
// Note: 72 pts equals 1 inch
|
// Note: 72 pts equals 1 inch
|
||||||
"margin": {
|
"margin": {
|
||||||
|
|||||||
@@ -18,7 +18,7 @@ var Generator = function(book, format) {
|
|||||||
this.namespace = "ebook";
|
this.namespace = "ebook";
|
||||||
|
|
||||||
// Styles to use
|
// Styles to use
|
||||||
this.styles = _.compact(["ebook", this.ebookFormat]);
|
this.styles = _.compact(["print", "ebook", this.ebookFormat]);
|
||||||
|
|
||||||
// Convert images (svg -> png)
|
// Convert images (svg -> png)
|
||||||
this.convertImages = true;
|
this.convertImages = true;
|
||||||
@@ -68,8 +68,6 @@ Generator.prototype.finish = function() {
|
|||||||
"--book-producer": "GitBook",
|
"--book-producer": "GitBook",
|
||||||
"--publisher": "GitBook",
|
"--publisher": "GitBook",
|
||||||
"--chapter": "descendant-or-self::*[contains(concat(' ', normalize-space(@class), ' '), ' book-chapter ')]",
|
"--chapter": "descendant-or-self::*[contains(concat(' ', normalize-space(@class), ' '), ' book-chapter ')]",
|
||||||
"--chapter-mark": "pagebreak",
|
|
||||||
"--page-breaks-before": "/",
|
|
||||||
"--level1-toc": "descendant-or-self::*[contains(concat(' ', normalize-space(@class), ' '), ' book-chapter-1 ')]",
|
"--level1-toc": "descendant-or-self::*[contains(concat(' ', normalize-space(@class), ' '), ' book-chapter-1 ')]",
|
||||||
"--level2-toc": "descendant-or-self::*[contains(concat(' ', normalize-space(@class), ' '), ' book-chapter-2 ')]",
|
"--level2-toc": "descendant-or-self::*[contains(concat(' ', normalize-space(@class), ' '), ' book-chapter-2 ')]",
|
||||||
"--level3-toc": "descendant-or-self::*[contains(concat(' ', normalize-space(@class), ' '), ' book-chapter-3 ')]",
|
"--level3-toc": "descendant-or-self::*[contains(concat(' ', normalize-space(@class), ' '), ' book-chapter-3 ')]",
|
||||||
@@ -82,6 +80,8 @@ Generator.prototype.finish = function() {
|
|||||||
var pdfOptions = that.options.pdf;
|
var pdfOptions = that.options.pdf;
|
||||||
|
|
||||||
_.extend(_options, {
|
_.extend(_options, {
|
||||||
|
"--chapter-mark": String(pdfOptions.chapterMark),
|
||||||
|
"--page-breaks-before": String(pdfOptions.pageBreaksBefore),
|
||||||
"--margin-left": String(pdfOptions.margin.left),
|
"--margin-left": String(pdfOptions.margin.left),
|
||||||
"--margin-right": String(pdfOptions.margin.right),
|
"--margin-right": String(pdfOptions.margin.right),
|
||||||
"--margin-top": String(pdfOptions.margin.top),
|
"--margin-top": String(pdfOptions.margin.top),
|
||||||
|
|||||||
@@ -4,8 +4,8 @@ var Q = require("q");
|
|||||||
var _ = require("lodash");
|
var _ = require("lodash");
|
||||||
|
|
||||||
var nunjucks = require("nunjucks");
|
var nunjucks = require("nunjucks");
|
||||||
var AutoEscapeExtension = require("nunjucks-autoescape");
|
var AutoEscapeExtension = require("nunjucks-autoescape")(nunjucks);
|
||||||
var FilterExtension = require("nunjucks-filter");
|
var FilterExtension = require("nunjucks-filter")(nunjucks);
|
||||||
|
|
||||||
var fs = require("../utils/fs");
|
var fs = require("../utils/fs");
|
||||||
var BaseGenerator = require("../generator");
|
var BaseGenerator = require("../generator");
|
||||||
@@ -50,12 +50,13 @@ Generator.prototype.prepareStyles = function() {
|
|||||||
this.styles = _.chain(this.styles)
|
this.styles = _.chain(this.styles)
|
||||||
.map(function(style) {
|
.map(function(style) {
|
||||||
var stylePath = that.options.styles[style];
|
var stylePath = that.options.styles[style];
|
||||||
if (fs.existsSync(path.resolve(that.book.root, stylePath))) {
|
if (stylePath && fs.existsSync(path.resolve(that.book.root, stylePath))) {
|
||||||
return stylePath;
|
return [style, stylePath];
|
||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
})
|
})
|
||||||
.compact()
|
.compact()
|
||||||
|
.object()
|
||||||
.value();
|
.value();
|
||||||
|
|
||||||
return Q();
|
return Q();
|
||||||
@@ -100,7 +101,6 @@ Generator.prototype.prepareTemplateEngine = function() {
|
|||||||
that.env.addFilter('lvl', function(lvl) {
|
that.env.addFilter('lvl', function(lvl) {
|
||||||
return lvl.split(".").length;
|
return lvl.split(".").length;
|
||||||
});
|
});
|
||||||
that.env.addGlobal('__', that.book.i18n.bind(that.book));
|
|
||||||
|
|
||||||
// Add extension
|
// Add extension
|
||||||
that.env.addExtension('AutoEscapeExtension', new AutoEscapeExtension(that.env));
|
that.env.addExtension('AutoEscapeExtension', new AutoEscapeExtension(that.env));
|
||||||
@@ -238,6 +238,8 @@ Generator.prototype._writeTemplate = function(tpl, options, output, interpolate)
|
|||||||
|
|
||||||
basePath: ".",
|
basePath: ".",
|
||||||
staticBase: path.join(".", "gitbook"),
|
staticBase: path.join(".", "gitbook"),
|
||||||
|
|
||||||
|
'__': that.book.i18n.bind(that.book)
|
||||||
}, options)
|
}, options)
|
||||||
);
|
);
|
||||||
})
|
})
|
||||||
|
|||||||
+1
-1
@@ -155,7 +155,7 @@ Plugin.prototype.callHook = function(name, data) {
|
|||||||
if (!hookFunc) return Q(data);
|
if (!hookFunc) return Q(data);
|
||||||
|
|
||||||
this.book.log.debug.ln("call hook", name);
|
this.book.log.debug.ln("call hook", name);
|
||||||
if (!_.contains(Plugin.HOOKS, name)) this.book.log.warn.ln("hook '"+name+"' used by plugin '"+this.name+"' is deprecated, and will be remove in the coming versions");
|
if (!_.contains(Plugin.HOOKS, name)) this.book.log.warn.ln("hook '"+name+"' used by plugin '"+this.name+"' is deprecated, and will be removed in the coming versions");
|
||||||
|
|
||||||
return Q()
|
return Q()
|
||||||
.then(function() {
|
.then(function() {
|
||||||
|
|||||||
+6
-3
@@ -2,9 +2,9 @@ var _ = require("lodash");
|
|||||||
var Q = require("q");
|
var Q = require("q");
|
||||||
var path = require("path");
|
var path = require("path");
|
||||||
var nunjucks = require("nunjucks");
|
var nunjucks = require("nunjucks");
|
||||||
|
var escapeStringRegexp = require("escape-string-regexp");
|
||||||
|
|
||||||
var git = require("./utils/git");
|
var git = require("./utils/git");
|
||||||
var stringUtils = require("./utils/string");
|
|
||||||
var fs = require("./utils/fs");
|
var fs = require("./utils/fs");
|
||||||
var batch = require("./utils/batch");
|
var batch = require("./utils/batch");
|
||||||
var pkg = require("../package.json");
|
var pkg = require("../package.json");
|
||||||
@@ -250,7 +250,7 @@ TemplateEngine.prototype.addBlock = function(name, block) {
|
|||||||
|
|
||||||
// Extract main body and kwargs
|
// Extract main body and kwargs
|
||||||
var body = args.pop();
|
var body = args.pop();
|
||||||
var kwargs = args.pop() || {};
|
var kwargs = _.isObject(_.last(args))? args.pop() : {};
|
||||||
|
|
||||||
// Extract blocks body
|
// Extract blocks body
|
||||||
var _blocks = _.map(block.blocks, function(blockName, i){
|
var _blocks = _.map(block.blocks, function(blockName, i){
|
||||||
@@ -302,7 +302,7 @@ TemplateEngine.prototype.addBlock = function(name, block) {
|
|||||||
TemplateEngine.prototype._applyShortcut = function(parser, content, shortcut) {
|
TemplateEngine.prototype._applyShortcut = function(parser, content, shortcut) {
|
||||||
if (!_.contains(shortcut.parsers, parser)) return content;
|
if (!_.contains(shortcut.parsers, parser)) return content;
|
||||||
var regex = new RegExp(
|
var regex = new RegExp(
|
||||||
stringUtils.escapeRegex(shortcut.start) + "([\\s\\S]*?[^\\$])" + stringUtils.escapeRegex(shortcut.end),
|
escapeStringRegexp(shortcut.start) + "([\\s\\S]*?[^\\$])" + escapeStringRegexp(shortcut.end),
|
||||||
'g'
|
'g'
|
||||||
);
|
);
|
||||||
return content.replace(regex, function(all, match) {
|
return content.replace(regex, function(all, match) {
|
||||||
@@ -316,6 +316,9 @@ TemplateEngine.prototype.renderString = function(content, context, options) {
|
|||||||
// Variables from book.json
|
// Variables from book.json
|
||||||
book: this.book.options.variables,
|
book: this.book.options.variables,
|
||||||
|
|
||||||
|
// Complete book.json
|
||||||
|
config: this.book.options,
|
||||||
|
|
||||||
// infos about gitbook
|
// infos about gitbook
|
||||||
gitbook: {
|
gitbook: {
|
||||||
version: pkg.version,
|
version: pkg.version,
|
||||||
|
|||||||
+6
-3
@@ -193,7 +193,7 @@ function normalizeHtml(src, options) {
|
|||||||
// Keep it as it is
|
// Keep it as it is
|
||||||
} else if (links.isRelative(href)) {
|
} else if (links.isRelative(href)) {
|
||||||
var parts = url.parse(href);
|
var parts = url.parse(href);
|
||||||
var absolutePath = path.join(options.base, parts.pathname);
|
var absolutePath = links.join(options.base, parts.pathname);
|
||||||
var anchor = parts.hash || "";
|
var anchor = parts.hash || "";
|
||||||
|
|
||||||
// If is in navigation relative: transform as content
|
// If is in navigation relative: transform as content
|
||||||
@@ -237,13 +237,16 @@ function normalizeHtml(src, options) {
|
|||||||
});
|
});
|
||||||
|
|
||||||
// Replace glossary terms
|
// Replace glossary terms
|
||||||
_.each(options.glossary, function(term) {
|
var glossary = _.sortBy(options.glossary, function(term) {
|
||||||
|
return -term.name.length;
|
||||||
|
});
|
||||||
|
_.each(glossary, function(term) {
|
||||||
var r = new RegExp( "\\b(" + pregQuote(term.name.toLowerCase()) + ")\\b" , 'gi' );
|
var r = new RegExp( "\\b(" + pregQuote(term.name.toLowerCase()) + ")\\b" , 'gi' );
|
||||||
var includedInFiles = false;
|
var includedInFiles = false;
|
||||||
|
|
||||||
$("*").each(function() {
|
$("*").each(function() {
|
||||||
// Ignore codeblocks
|
// Ignore codeblocks
|
||||||
if (_.contains(["code", "pre"], this.name.toLowerCase())) return;
|
if (_.contains(["code", "pre", "a"], this.name.toLowerCase())) return;
|
||||||
|
|
||||||
replaceText($, this, r, function(match) {
|
replaceText($, this, r, function(match) {
|
||||||
// Add to files index in glossary
|
// Add to files index in glossary
|
||||||
|
|||||||
@@ -20,12 +20,7 @@ function optionsToShellArgs(options) {
|
|||||||
.join(" ");
|
.join(" ");
|
||||||
}
|
}
|
||||||
|
|
||||||
function escapeRegex(str) {
|
|
||||||
return str.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, "\\$&");
|
|
||||||
}
|
|
||||||
|
|
||||||
module.exports = {
|
module.exports = {
|
||||||
escapeRegex: escapeRegex,
|
|
||||||
escapeShellArg: escapeShellArg,
|
escapeShellArg: escapeShellArg,
|
||||||
optionsToShellArgs: optionsToShellArgs,
|
optionsToShellArgs: optionsToShellArgs,
|
||||||
toLowerCase: String.prototype.toLowerCase.call.bind(String.prototype.toLowerCase)
|
toLowerCase: String.prototype.toLowerCase.call.bind(String.prototype.toLowerCase)
|
||||||
|
|||||||
+8
-7
@@ -1,7 +1,7 @@
|
|||||||
var Q = require('q');
|
var Q = require('q');
|
||||||
var _ = require('lodash');
|
var _ = require('lodash');
|
||||||
var path = require('path');
|
var path = require('path');
|
||||||
var Gaze = require('gaze').Gaze;
|
var chokidar = require('chokidar');
|
||||||
|
|
||||||
var parsers = require('gitbook-parsers')
|
var parsers = require('gitbook-parsers')
|
||||||
|
|
||||||
@@ -17,17 +17,18 @@ function watch(dir) {
|
|||||||
toWatch.push("**/*"+ext);
|
toWatch.push("**/*"+ext);
|
||||||
});
|
});
|
||||||
|
|
||||||
var gaze = new Gaze(toWatch, {
|
var watcher = chokidar.watch(toWatch, {
|
||||||
cwd: dir
|
cwd: dir,
|
||||||
|
ignoreInitial: true
|
||||||
});
|
});
|
||||||
|
|
||||||
gaze.once("all", function(e, filepath) {
|
watcher.once("all", function(e, filepath) {
|
||||||
gaze.close();
|
watcher.close();
|
||||||
|
|
||||||
d.resolve(filepath);
|
d.resolve(filepath);
|
||||||
});
|
});
|
||||||
gaze.once("error", function(err) {
|
watcher.once("error", function(err) {
|
||||||
gaze.close();
|
watcher.close();
|
||||||
|
|
||||||
d.reject(err);
|
d.reject(err);
|
||||||
});
|
});
|
||||||
|
|||||||
+9
-8
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "gitbook",
|
"name": "gitbook",
|
||||||
"version": "2.0.1",
|
"version": "2.2.0",
|
||||||
"homepage": "https://www.gitbook.com",
|
"homepage": "https://www.gitbook.com",
|
||||||
"description": "Library and cmd utility to generate GitBooks",
|
"description": "Library and cmd utility to generate GitBooks",
|
||||||
"main": "lib/index.js",
|
"main": "lib/index.js",
|
||||||
@@ -12,16 +12,16 @@
|
|||||||
"resolve": "0.6.3",
|
"resolve": "0.6.3",
|
||||||
"fs-extra": "0.16.5",
|
"fs-extra": "0.16.5",
|
||||||
"fstream-ignore": "1.0.2",
|
"fstream-ignore": "1.0.2",
|
||||||
"gitbook-parsers": "0.7.4",
|
"gitbook-parsers": "0.7.6",
|
||||||
"nunjucks": "git+https://github.com/mozilla/nunjucks.git#0f8b21b8df7e8e852b2e1889388653b7075f0d09",
|
"nunjucks": "mozilla/nunjucks#103513c294835bcbe64222de6db494e2555e294e",
|
||||||
"nunjucks-autoescape": "0.1.1",
|
"nunjucks-autoescape": "1.0.0",
|
||||||
"nunjucks-filter": "0.1.0",
|
"nunjucks-filter": "1.0.0",
|
||||||
"i18n": "0.5.0",
|
"i18n": "0.5.0",
|
||||||
"semver": "2.2.1",
|
"semver": "2.2.1",
|
||||||
"npmi": "0.1.1",
|
"npmi": "0.1.1",
|
||||||
"cheerio": "0.19.0",
|
"cheerio": "0.19.0",
|
||||||
"gitbook-plugin-livereload": "0.0.1",
|
"gitbook-plugin-livereload": "0.0.1",
|
||||||
"gaze": "~0.5.1",
|
"chokidar": "~1.0.1",
|
||||||
"send": "0.2.0",
|
"send": "0.2.0",
|
||||||
"tiny-lr": "0.1.5",
|
"tiny-lr": "0.1.5",
|
||||||
"tmp": "0.0.24",
|
"tmp": "0.0.24",
|
||||||
@@ -32,7 +32,8 @@
|
|||||||
"npm": "2.4.1",
|
"npm": "2.4.1",
|
||||||
"dom-serializer": "0.1.0",
|
"dom-serializer": "0.1.0",
|
||||||
"spawn-cmd": "0.0.2",
|
"spawn-cmd": "0.0.2",
|
||||||
"highlight.js": "8.4.0"
|
"highlight.js": "8.6.0",
|
||||||
|
"escape-string-regexp": "1.0.3"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"mocha": "2.2.1",
|
"mocha": "2.2.1",
|
||||||
@@ -60,7 +61,7 @@
|
|||||||
"gitbook"
|
"gitbook"
|
||||||
],
|
],
|
||||||
"author": "FriendCode Inc. <contact@gitbook.com>",
|
"author": "FriendCode Inc. <contact@gitbook.com>",
|
||||||
"license": "Apache 2",
|
"license": "Apache-2.0",
|
||||||
"bugs": {
|
"bugs": {
|
||||||
"url": "https://github.com/GitbookIO/gitbook/issues"
|
"url": "https://github.com/GitbookIO/gitbook/issues"
|
||||||
},
|
},
|
||||||
|
|||||||
+1
-1
@@ -35,7 +35,7 @@ should.Assertion.add('html', function(rules, description) {
|
|||||||
var $el = $(query);
|
var $el = $(query);
|
||||||
|
|
||||||
// Test number of elements
|
// Test number of elements
|
||||||
$el.should.have.lengthOf(validations.count);
|
$el.length.should.be.equal(validations.count);
|
||||||
|
|
||||||
// Test text
|
// Test text
|
||||||
if (validations.text !== undefined) {
|
if (validations.text !== undefined) {
|
||||||
|
|||||||
@@ -7,3 +7,7 @@ Just a simple and easy to understand test.
|
|||||||
## hakunamatata
|
## hakunamatata
|
||||||
|
|
||||||
This word is not present in the content.
|
This word is not present in the content.
|
||||||
|
|
||||||
|
## test long
|
||||||
|
|
||||||
|
This is a test with a longer text that the first entry to test order.
|
||||||
|
|||||||
@@ -6,3 +6,5 @@ The word test should be replaced by a glossary link.
|
|||||||
But the word test should not be replaced in code blocks
|
But the word test should not be replaced in code blocks
|
||||||
```
|
```
|
||||||
|
|
||||||
|
The two words test long should be replaced by the correct glossary links.
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,3 @@
|
|||||||
|
*
|
||||||
|
!SUMMARY.md
|
||||||
|
!.gitignore
|
||||||
@@ -0,0 +1,6 @@
|
|||||||
|
# Summary
|
||||||
|
|
||||||
|
* [Hello](hello.md)
|
||||||
|
* [Hello 2](hello2.md)
|
||||||
|
* Hello 3
|
||||||
|
* [Hello 4](hello3/hello4.md)
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
# Readme
|
||||||
@@ -0,0 +1,4 @@
|
|||||||
|
# Summary
|
||||||
|
|
||||||
|
* [Folder1](folder1/README.md)
|
||||||
|
* [Folder2](folder2/README.md)
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
# Folder 1
|
||||||
|
|
||||||
|
[Link to folder2](../folder2/README.md)
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
# Folder 2
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
# Readme
|
||||||
|
|
||||||
|
Default description for the book.
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
# Summary
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
body {
|
||||||
|
color: red;
|
||||||
|
}
|
||||||
@@ -21,4 +21,35 @@ describe('eBook generator', function () {
|
|||||||
book.should.have.file("gitbook/style.css");
|
book.should.have.file("gitbook/style.css");
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
describe('Custom styles', function() {
|
||||||
|
var book;
|
||||||
|
|
||||||
|
before(function() {
|
||||||
|
return books.generate("style-print", "ebook")
|
||||||
|
.then(function(_book) {
|
||||||
|
book = _book;
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should remove default print.css', function() {
|
||||||
|
var PAGE = fs.readFileSync(
|
||||||
|
path.join(book.options.output, "index.html"),
|
||||||
|
{ encoding: "utf-8" }
|
||||||
|
);
|
||||||
|
PAGE.should.be.html({
|
||||||
|
"link": {
|
||||||
|
count: 1,
|
||||||
|
attributes: {
|
||||||
|
href: "./styles/print.css"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should correctly print.css', function() {
|
||||||
|
book.should.have.file("styles");
|
||||||
|
book.should.have.file("styles/print.css");
|
||||||
|
});
|
||||||
|
})
|
||||||
});
|
});
|
||||||
|
|||||||
+10
-1
@@ -14,7 +14,7 @@ describe('Glossary', function () {
|
|||||||
|
|
||||||
it('should correctly list items', function() {
|
it('should correctly list items', function() {
|
||||||
book.should.have.property("glossary");
|
book.should.have.property("glossary");
|
||||||
book.glossary.should.have.lengthOf(2);
|
book.glossary.should.have.lengthOf(3);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -73,6 +73,15 @@ describe('Glossary', function () {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it('should correctly select the longest term', function() {
|
||||||
|
readme.should.be.html({
|
||||||
|
".page-inner a[href='GLOSSARY.html#test_long']": {
|
||||||
|
count: 1,
|
||||||
|
text: "test long"
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -0,0 +1,23 @@
|
|||||||
|
var fs = require('fs');
|
||||||
|
var path = require('path');
|
||||||
|
var should = require('should');
|
||||||
|
|
||||||
|
var Book = require('../').Book;
|
||||||
|
var LOG_LEVELS = require('../').LOG_LEVELS;
|
||||||
|
|
||||||
|
describe('Init Books', function () {
|
||||||
|
var initRoot;
|
||||||
|
|
||||||
|
before(function() {
|
||||||
|
initRoot = path.resolve(__dirname, "books/init");
|
||||||
|
return Book.init(initRoot, {
|
||||||
|
logLevel: LOG_LEVELS.DISABLED,
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should create all chapters', function() {
|
||||||
|
should(fs.existsSync(path.resolve(initRoot, "hello.md"))).be.ok;
|
||||||
|
should(fs.existsSync(path.resolve(initRoot, "hello2.md"))).be.ok;
|
||||||
|
should(fs.existsSync(path.resolve(initRoot, "hello3/hello4.md"))).be.ok;
|
||||||
|
});
|
||||||
|
});
|
||||||
@@ -1,4 +1,9 @@
|
|||||||
var should = require('should');
|
var should = require('should');
|
||||||
|
var fs = require('fs');
|
||||||
|
var _ = require('lodash');
|
||||||
|
var path = require('path');
|
||||||
|
var cheerio = require('cheerio');
|
||||||
|
|
||||||
var links = require("../lib/utils/links");
|
var links = require("../lib/utils/links");
|
||||||
|
|
||||||
describe('Links', function () {
|
describe('Links', function () {
|
||||||
@@ -34,4 +39,27 @@ describe('Links', function () {
|
|||||||
links.toAbsolute("/sub/test.md", "test", "test").should.be.equal("../sub/test.md");
|
links.toAbsolute("/sub/test.md", "test", "test").should.be.equal("../sub/test.md");
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
describe('page', function() {
|
||||||
|
var book;
|
||||||
|
|
||||||
|
before(function() {
|
||||||
|
return books.generate("links", "website")
|
||||||
|
.then(function(_book) {
|
||||||
|
book = _book;
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should correctly replace relative links', function() {
|
||||||
|
var readme = fs.readFileSync(
|
||||||
|
path.join(book.options.output, "folder1/index.html"),
|
||||||
|
{ encoding: "utf-8" }
|
||||||
|
);
|
||||||
|
var $ = cheerio.load(readme);
|
||||||
|
var $a = $(".page-inner a");
|
||||||
|
|
||||||
|
$a.attr('href').should.be.exactly("../folder2/index.html");
|
||||||
|
})
|
||||||
|
});
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -185,6 +185,20 @@ describe('Plugins', function () {
|
|||||||
content.should.equal("hello;the;world");
|
content.should.equal("hello;the;world");
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it('should correctly extend template blocks with arguments', function() {
|
||||||
|
return testTpl('{% test5args "a", "b", "c" %}{% endtest5args %}')
|
||||||
|
.then(function(content) {
|
||||||
|
content.should.equal("test5a,b,ctest5");
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should correctly extend template blocks with args and kwargs', function() {
|
||||||
|
return testTpl('{% test5kwargs "a", "b", "c", d="test", e="test2" %}{% endtest5kwargs %}')
|
||||||
|
.then(function(content) {
|
||||||
|
content.should.equal("test5a,b,c,d:test,e:test2,__keywords:truetest5");
|
||||||
|
});
|
||||||
|
});
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
@@ -36,6 +36,21 @@ module.exports = {
|
|||||||
assert(blk.blocks[1].name, "finally");
|
assert(blk.blocks[1].name, "finally");
|
||||||
return [blk.body, blk.blocks[0].body, blk.blocks[1].body].join(blk.kwargs.separator);
|
return [blk.body, blk.blocks[0].body, blk.blocks[1].body].join(blk.kwargs.separator);
|
||||||
}
|
}
|
||||||
}
|
},
|
||||||
|
"test5args": {
|
||||||
|
process: function(blk) {
|
||||||
|
return "test5"+blk.args.join(',')+"test5";
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"test5kwargs": {
|
||||||
|
process: function(blk) {
|
||||||
|
var s = blk.args.join(',');
|
||||||
|
for (var key in blk.kwargs) {
|
||||||
|
s = s + ','+key+':'+blk.kwargs[key];
|
||||||
|
}
|
||||||
|
|
||||||
|
return "test5"+s+"test5";
|
||||||
|
}
|
||||||
|
},
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
+1
-1
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -0,0 +1,20 @@
|
|||||||
|
{
|
||||||
|
"LANGS_CHOOSE": "Valitse kieli",
|
||||||
|
"GLOSSARY": "Sanasto",
|
||||||
|
"GLOSSARY_INDEX": "Hakemisto",
|
||||||
|
"GLOSSARY_OPEN": "Sanasto",
|
||||||
|
"GITBOOK_LINK": "Julkaistu GitBookilla",
|
||||||
|
"SUMMARY": "Sisällysluettelo",
|
||||||
|
"SUMMARY_INTRODUCTION": "Johdanto",
|
||||||
|
"SUMMARY_TOGGLE": "Sisällysluettelu",
|
||||||
|
"SEARCH_TOGGLE": "Etsi",
|
||||||
|
"SEARCH_PLACEHOLDER": "Kirjoita hakusana",
|
||||||
|
"FONTSETTINGS_TOGGLE": "Fonttivalinnat",
|
||||||
|
"SHARE_TOGGLE": "Jaa",
|
||||||
|
"SHARE_ON": "Jaa {{platform}}ssa",
|
||||||
|
"FONTSETTINGS_WHITE": "Valkoinen",
|
||||||
|
"FONTSETTINGS_SEPIA": "Seepia",
|
||||||
|
"FONTSETTINGS_NIGHT": "Yö",
|
||||||
|
"FONTSETTINGS_SANS": "Sans",
|
||||||
|
"FONTSETTINGS_SERIF": "Serif"
|
||||||
|
}
|
||||||
@@ -0,0 +1,20 @@
|
|||||||
|
{
|
||||||
|
"LANGS_CHOOSE": "言語を選択",
|
||||||
|
"GLOSSARY": "用語集",
|
||||||
|
"GLOSSARY_INDEX": "インデックス",
|
||||||
|
"GLOSSARY_OPEN": "用語集",
|
||||||
|
"GITBOOK_LINK": "で公開 GitBook",
|
||||||
|
"SUMMARY": "目次",
|
||||||
|
"SUMMARY_INTRODUCTION": "はじめに",
|
||||||
|
"SUMMARY_TOGGLE": "目次",
|
||||||
|
"SEARCH_TOGGLE": "検索",
|
||||||
|
"SEARCH_PLACEHOLDER": "検索すると入力",
|
||||||
|
"FONTSETTINGS_TOGGLE": "フォント設定",
|
||||||
|
"SHARE_TOGGLE": "シェア",
|
||||||
|
"SHARE_ON": "でシェア {{platform}}",
|
||||||
|
"FONTSETTINGS_WHITE": "白",
|
||||||
|
"FONTSETTINGS_SEPIA": "Sepia",
|
||||||
|
"FONTSETTINGS_NIGHT": "夜",
|
||||||
|
"FONTSETTINGS_SANS": "Sans",
|
||||||
|
"FONTSETTINGS_SERIF": "Serif"
|
||||||
|
}
|
||||||
@@ -0,0 +1,20 @@
|
|||||||
|
{
|
||||||
|
"LANGS_CHOOSE": "언어를 선택하세요",
|
||||||
|
"GLOSSARY": "어휘",
|
||||||
|
"GLOSSARY_INDEX": "색인",
|
||||||
|
"GLOSSARY_OPEN": "어휘",
|
||||||
|
"GITBOOK_LINK": "에 게시 GitBook",
|
||||||
|
"SUMMARY": "차례",
|
||||||
|
"SUMMARY_INTRODUCTION": "소개",
|
||||||
|
"SUMMARY_TOGGLE": "차례",
|
||||||
|
"SEARCH_TOGGLE": "수색",
|
||||||
|
"SEARCH_PLACEHOLDER": "검색어 입력",
|
||||||
|
"FONTSETTINGS_TOGGLE": "글꼴 설정",
|
||||||
|
"SHARE_TOGGLE": "몫",
|
||||||
|
"SHARE_ON": "공유 {{platform}}",
|
||||||
|
"FONTSETTINGS_WHITE": "화이트",
|
||||||
|
"FONTSETTINGS_SEPIA": "Sepia",
|
||||||
|
"FONTSETTINGS_NIGHT": "밤",
|
||||||
|
"FONTSETTINGS_SANS": "Sans",
|
||||||
|
"FONTSETTINGS_SERIF": "Serif"
|
||||||
|
}
|
||||||
@@ -0,0 +1,20 @@
|
|||||||
|
{
|
||||||
|
"LANGS_CHOOSE": "Alege o limba",
|
||||||
|
"GLOSSARY": "Glosar",
|
||||||
|
"GLOSSARY_INDEX": "Index",
|
||||||
|
"GLOSSARY_OPEN": "Glosar",
|
||||||
|
"GITBOOK_LINK": "Publicata cu GitBook",
|
||||||
|
"SUMMARY": "Cuprins",
|
||||||
|
"SUMMARY_INTRODUCTION": "Introducere",
|
||||||
|
"SUMMARY_TOGGLE": "Cuprins",
|
||||||
|
"SEARCH_TOGGLE": "Cauta",
|
||||||
|
"SEARCH_PLACEHOLDER": "Ce cauti",
|
||||||
|
"FONTSETTINGS_TOGGLE": "Setari de font",
|
||||||
|
"SHARE_TOGGLE": "Distribuie",
|
||||||
|
"SHARE_ON": "Distribuie pe {{platform}}",
|
||||||
|
"FONTSETTINGS_WHITE": "Alb",
|
||||||
|
"FONTSETTINGS_SEPIA": "Sepia",
|
||||||
|
"FONTSETTINGS_NIGHT": "Noapte",
|
||||||
|
"FONTSETTINGS_SANS": "Sans",
|
||||||
|
"FONTSETTINGS_SERIF": "Serif"
|
||||||
|
}
|
||||||
@@ -0,0 +1,20 @@
|
|||||||
|
{
|
||||||
|
"LANGS_CHOOSE": "Lựa chọn ngôn ngữ",
|
||||||
|
"GLOSSARY": "Chú giải",
|
||||||
|
"GLOSSARY_INDEX": "Chỉ mục",
|
||||||
|
"GLOSSARY_OPEN": "Chú giải",
|
||||||
|
"GITBOOK_LINK": "Xuất bản với GitBook",
|
||||||
|
"SUMMARY": "Mục Lục",
|
||||||
|
"SUMMARY_INTRODUCTION": "Giới thiệu",
|
||||||
|
"SUMMARY_TOGGLE": "Mục Lục",
|
||||||
|
"SEARCH_TOGGLE": "Tìm kiếm",
|
||||||
|
"SEARCH_PLACEHOLDER": "Nhập thông tin cần tìm",
|
||||||
|
"FONTSETTINGS_TOGGLE": "Tùy chỉnh phông chữ",
|
||||||
|
"SHARE_TOGGLE": "Chia sẻ",
|
||||||
|
"SHARE_ON": "Chia sẻ trên {{platform}}",
|
||||||
|
"FONTSETTINGS_WHITE": "Sáng",
|
||||||
|
"FONTSETTINGS_SEPIA": "Vàng nâu",
|
||||||
|
"FONTSETTINGS_NIGHT": "Tối",
|
||||||
|
"FONTSETTINGS_SANS": "Sans",
|
||||||
|
"FONTSETTINGS_SERIF": "Serif"
|
||||||
|
}
|
||||||
@@ -16,6 +16,9 @@ define([
|
|||||||
},
|
},
|
||||||
"instapaper": function($el) {
|
"instapaper": function($el) {
|
||||||
window.open("http://www.instapaper.com/text?u="+encodeURIComponent(location.href));
|
window.open("http://www.instapaper.com/text?u="+encodeURIComponent(location.href));
|
||||||
|
},
|
||||||
|
"vk": function($el) {
|
||||||
|
window.open("http://vkontakte.ru/share.php?url="+encodeURIComponent(location.href));
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -51,6 +51,7 @@
|
|||||||
pre {
|
pre {
|
||||||
font-family: monospace, monospace;
|
font-family: monospace, monospace;
|
||||||
font-size: 1em;
|
font-size: 1em;
|
||||||
|
direction: ltr;
|
||||||
}
|
}
|
||||||
|
|
||||||
table {
|
table {
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
<!DOCTYPE HTML>
|
<!DOCTYPE HTML>
|
||||||
<html lang="{{ language }}" {% block htmlTag %}{% endblock %} {% if options.direction == "rtl" %}dir="rtl"{% endif %}>
|
<html lang="{{ language }}" {% block htmlTag %}{% endblock %} {% if options.direction == "rtl" %}dir="rtl"{% endif %}>
|
||||||
{{ htmlSnippet("html:start")|default("")|safe }}
|
{{ htmlSnippet("html:start")|default("", true)|safe }}
|
||||||
<head>
|
<head>
|
||||||
{{ htmlSnippet("head:start")|default("")|safe }}
|
{{ htmlSnippet("head:start")|default("", true)|safe }}
|
||||||
<meta charset="UTF-8">
|
<meta charset="UTF-8">
|
||||||
<title>{% block title %}{% endblock %}</title>
|
<title>{% block title %}{% endblock %}</title>
|
||||||
<meta content="text/html; charset=utf-8" http-equiv="Content-Type">
|
<meta content="text/html; charset=utf-8" http-equiv="Content-Type">
|
||||||
@@ -11,14 +11,14 @@
|
|||||||
{% if options.author %}<meta name="author" content="{{ options.author }}">{% endif %}
|
{% if options.author %}<meta name="author" content="{{ options.author }}">{% endif %}
|
||||||
{% if options.isbn %}<meta name="identifier" content="{{ options.isbn }}" scheme="ISBN">{% endif %}
|
{% if options.isbn %}<meta name="identifier" content="{{ options.isbn }}" scheme="ISBN">{% endif %}
|
||||||
{% block head %}{% endblock %}
|
{% block head %}{% endblock %}
|
||||||
{{ htmlSnippet("head:end")|default("")|safe }}
|
{% block style %}{% endblock %}
|
||||||
|
{{ htmlSnippet("head:end")|default("", true)|safe }}
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
{{ htmlSnippet("body:start")|default("")|safe }}
|
{{ htmlSnippet("body:start")|default("", true)|safe }}
|
||||||
{% block style %}{% endblock %}
|
|
||||||
{% block content %}{% endblock %}
|
{% block content %}{% endblock %}
|
||||||
{% block javascript %}{% endblock %}
|
{% block javascript %}{% endblock %}
|
||||||
{{ htmlSnippet("body:end")|default("")|safe }}
|
{{ htmlSnippet("body:end")|default("", true)|safe }}
|
||||||
</body>
|
</body>
|
||||||
{{ htmlSnippet("html:end")|default("")|safe }}
|
{{ htmlSnippet("html:end")|default("", true)|safe }}
|
||||||
</html>
|
</html>
|
||||||
|
|||||||
@@ -3,7 +3,9 @@
|
|||||||
{% block title %}{{ progress.current.title }} | {{ title }}{% endblock %}
|
{% block title %}{{ progress.current.title }} | {{ title }}{% endblock %}
|
||||||
|
|
||||||
{% block style %}
|
{% block style %}
|
||||||
|
{% if not styles.print %}
|
||||||
<link rel="stylesheet" href="{{ staticBase }}/print.css">
|
<link rel="stylesheet" href="{{ staticBase }}/print.css">
|
||||||
|
{% endif %}
|
||||||
{% for resource in plugins.resources.css %}
|
{% for resource in plugins.resources.css %}
|
||||||
{% if resource.url %}
|
{% if resource.url %}
|
||||||
<link rel="stylesheet" href="{{ resource.url }}">
|
<link rel="stylesheet" href="{{ resource.url }}">
|
||||||
@@ -11,7 +13,7 @@
|
|||||||
<link rel="stylesheet" href="{{ staticBase }}/plugins/{{ resource.path }}">
|
<link rel="stylesheet" href="{{ staticBase }}/plugins/{{ resource.path }}">
|
||||||
{% endif %}
|
{% endif %}
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
{% for style in styles %}
|
{% for type, style in styles %}
|
||||||
<link rel="stylesheet" href="{{ basePath }}/{{ style }}">
|
<link rel="stylesheet" href="{{ basePath }}/{{ style }}">
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
|||||||
@@ -54,6 +54,10 @@
|
|||||||
{% if options.links.sharing.weibo == true %}
|
{% if options.links.sharing.weibo == true %}
|
||||||
<a href="#" target="_blank" class="btn pull-right weibo-sharing-link sharing-link" data-sharing="weibo" aria-label="Weibo"><i class="fa fa-weibo"></i></a>
|
<a href="#" target="_blank" class="btn pull-right weibo-sharing-link sharing-link" data-sharing="weibo" aria-label="Weibo"><i class="fa fa-weibo"></i></a>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
{% if options.links.sharing.vk == true %}
|
||||||
|
<a href="#" target="_blank" class="btn pull-right vk-sharing-link sharing-link" data-sharing="vk" aria-label="VK"><i class="fa fa-vk"></i></a>
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
|
||||||
<!-- Title -->
|
<!-- Title -->
|
||||||
<h1>
|
<h1>
|
||||||
|
|||||||
@@ -4,21 +4,15 @@
|
|||||||
{% if item.path and item.exists %}
|
{% if item.path and item.exists %}
|
||||||
{% if not item.external %}
|
{% if not item.external %}
|
||||||
<a href="{{ basePath }}/{{ item.path|contentLink }}">
|
<a href="{{ basePath }}/{{ item.path|contentLink }}">
|
||||||
<i class="fa fa-check"></i>
|
|
||||||
{% if item.level != "0" %}
|
|
||||||
<b>{{ item.level }}.</b>
|
|
||||||
{% endif %}
|
|
||||||
{{ item.title }}
|
|
||||||
</a>
|
|
||||||
{% else %}
|
{% else %}
|
||||||
<a target="_blank" href="{{ item.path }}">
|
<a target="_blank" href="{{ item.path }}">
|
||||||
|
{% endif %}
|
||||||
<i class="fa fa-check"></i>
|
<i class="fa fa-check"></i>
|
||||||
{% if item.level != "0" %}
|
{% if item.level != "0" %}
|
||||||
<b>{{ item.level }}.</b>
|
<b>{{ item.level }}.</b>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
{{ item.title }}
|
{{ item.title }}
|
||||||
</a>
|
</a>
|
||||||
{% endif %}
|
|
||||||
{% else %}
|
{% else %}
|
||||||
<span><b>{{ item.level }}.</b> {{ item.title }}</span>
|
<span><b>{{ item.level }}.</b> {{ item.title }}</span>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{% extends "./layout.html" %}
|
{% extends "./layout.html" %}
|
||||||
|
|
||||||
{% block title %}{{ title }}{% endblock %}
|
{% block title %}{{ __("LANGS_CHOOSE") }} | {{ title }}{% endblock %}
|
||||||
|
|
||||||
{% block style %}
|
{% block style %}
|
||||||
<link rel="stylesheet" href="{{ staticBase }}/style.css">
|
<link rel="stylesheet" href="{{ staticBase }}/style.css">
|
||||||
|
|||||||
@@ -1,10 +1,10 @@
|
|||||||
<!DOCTYPE HTML>
|
<!DOCTYPE HTML>
|
||||||
<html lang="{{ language }}" {% if options.direction == "rtl" %}dir="rtl"{% endif %}>
|
<html lang="{{ language }}" {% if options.direction == "rtl" %}dir="rtl"{% endif %}>
|
||||||
{{ htmlSnippet("html:start")|default("")|safe }}
|
{{ htmlSnippet("html:start")|default("", true)|safe }}
|
||||||
<head>
|
<head>
|
||||||
{{ htmlSnippet("head:start")|default("")|safe }}
|
{{ htmlSnippet("head:start")|default("", true)|safe }}
|
||||||
<meta charset="UTF-8">
|
<meta charset="UTF-8">
|
||||||
<meta http-equiv="X-UA-Compatible" content="IE=11; IE=10; IE=9; IE=8; IE=7; IE=EDGE" />
|
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
|
||||||
<title>{% block title %}{% endblock %}</title>
|
<title>{% block title %}{% endblock %}</title>
|
||||||
<meta content="text/html; charset=utf-8" http-equiv="Content-Type">
|
<meta content="text/html; charset=utf-8" http-equiv="Content-Type">
|
||||||
<meta name="description" content="{% block description %}{% endblock %}">
|
<meta name="description" content="{% block description %}{% endblock %}">
|
||||||
@@ -17,15 +17,15 @@
|
|||||||
<meta name="apple-mobile-web-app-status-bar-style" content="black">
|
<meta name="apple-mobile-web-app-status-bar-style" content="black">
|
||||||
<link rel="apple-touch-icon-precomposed" sizes="152x152" href="{{ staticBase }}/images/apple-touch-icon-precomposed-152.png">
|
<link rel="apple-touch-icon-precomposed" sizes="152x152" href="{{ staticBase }}/images/apple-touch-icon-precomposed-152.png">
|
||||||
<link rel="shortcut icon" href="{{ staticBase }}/images/favicon.ico" type="image/x-icon">
|
<link rel="shortcut icon" href="{{ staticBase }}/images/favicon.ico" type="image/x-icon">
|
||||||
|
{% block style %}{% endblock %}
|
||||||
{% block head %}{% endblock %}
|
{% block head %}{% endblock %}
|
||||||
{{ htmlSnippet("head:end")|default("")|safe }}
|
{{ htmlSnippet("head:end")|default("", true)|safe }}
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
{{ htmlSnippet("body:start")|default("")|safe }}
|
{{ htmlSnippet("body:start")|default("", true)|safe }}
|
||||||
{% block style %}{% endblock %}
|
|
||||||
{% block content %}{% endblock %}
|
{% block content %}{% endblock %}
|
||||||
{% block javascript %}{% endblock %}
|
{% block javascript %}{% endblock %}
|
||||||
{{ htmlSnippet("body:end")|default("")|safe }}
|
{{ htmlSnippet("body:end")|default("", true)|safe }}
|
||||||
</body>
|
</body>
|
||||||
{{ htmlSnippet("html:end")|default("")|safe }}
|
{{ htmlSnippet("html:end")|default("", true)|safe }}
|
||||||
</html>
|
</html>
|
||||||
|
|||||||
@@ -70,7 +70,7 @@ require(["gitbook"], function(gitbook) {
|
|||||||
<link rel="stylesheet" href="{{ staticBase }}/plugins/{{ resource.path }}">
|
<link rel="stylesheet" href="{{ staticBase }}/plugins/{{ resource.path }}">
|
||||||
{% endif %}
|
{% endif %}
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
{% for style in styles %}
|
{% for type, style in styles %}
|
||||||
<link rel="stylesheet" href="{{ basePath }}/{{ style }}">
|
<link rel="stylesheet" href="{{ basePath }}/{{ style }}">
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
|||||||
Reference in New Issue
Block a user