mirror of
https://github.com/GitbookIO/gitbook.git
synced 2026-09-16 07:35:16 +00:00
Compare commits
46 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| ac756ddf7e | |||
| 36e2236e6b | |||
| 72df665520 | |||
| 07785528a5 | |||
| bb579dd581 | |||
| a7d3064340 | |||
| 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 | |||
| 0e8f7b870b | |||
| 1eebc9a46e | |||
| 0a94c80c44 | |||
| c70bb2fbd8 | |||
| 12c06b384f | |||
| 82a58e7ac3 | |||
| dcb56ef433 | |||
| 8da91de514 | |||
| 4b20685562 | |||
| fff7c5cc3a | |||
| 3065742b73 | |||
| ffd69ad1f2 | |||
| 9004011479 | |||
| 1046bb4133 | |||
| 5578505213 |
+10
@@ -30,6 +30,8 @@ Translators
|
||||
- Knut Melvær (@kmelve)
|
||||
- Persian (Farsi)
|
||||
- Mohammad Hossein Mojtahedi (@mhm5000)
|
||||
- Polish
|
||||
- Łukasz Szeremeta (@lszeremeta)
|
||||
- Portuguese
|
||||
- Ryan O'Mullan (@RyanOM)
|
||||
- Spanish
|
||||
@@ -40,3 +42,11 @@ Translators
|
||||
- Hu Hao (@howiehu)
|
||||
- French
|
||||
- Samy Pessé (@SamyPesse)
|
||||
- Romanian
|
||||
- Iancu Aurel (@awrelll)
|
||||
- Finnish
|
||||
- Tommi Savikko (@savikko)
|
||||
- Japanese
|
||||
- Iancu Aurel (@awrelll)
|
||||
- Korean
|
||||
- Iancu Aurel (@awrelll)
|
||||
|
||||
+21
@@ -2,6 +2,27 @@
|
||||
All notable changes to this project will be documented in this file.
|
||||
This project adheres to [Semantic Versioning](http://semver.org/).
|
||||
|
||||
## 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
|
||||
- Improve error logging (display file, line and column)
|
||||
- Add back support for `options.originalInput`
|
||||
- Don't process math in markdown parser (delegated to `mathjax` plugin)
|
||||
- Fix some cases of code blocks escaping
|
||||
- Fix i18n for introduction title in json format
|
||||
- Fix reload when book configuration is updated
|
||||
- Fix backslashes in url when building on windows
|
||||
|
||||
## 2.0.0
|
||||
- Fix page title of introduction
|
||||
- Ignore codeblocks when replacing glossary terms
|
||||
|
||||
+91
-22
@@ -2,9 +2,9 @@ var Q = require("q");
|
||||
var _ = require("lodash");
|
||||
var path = require("path");
|
||||
var util = require("util");
|
||||
var lunr = require('lunr');
|
||||
var lunr = require("lunr");
|
||||
var parsers = require("gitbook-parsers");
|
||||
var color = require('bash-color');
|
||||
var color = require("bash-color");
|
||||
|
||||
var fs = require("./utils/fs");
|
||||
var parseNavigation = require("./utils/navigation");
|
||||
@@ -12,6 +12,7 @@ var parseProgress = require("./utils/progress");
|
||||
var pageUtil = require("./utils/page");
|
||||
var batch = require("./utils/batch");
|
||||
var links = require("./utils/links");
|
||||
var i18n = require("./utils/i18n");
|
||||
var logger = require("./utils/logger");
|
||||
|
||||
var Configuration = require("./configuration");
|
||||
@@ -114,7 +115,7 @@ Book.prototype.parse = function() {
|
||||
return that.parseLangs()
|
||||
.then(function() {
|
||||
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
|
||||
that.books = _.map(that.langs, function(lang) {
|
||||
@@ -234,8 +235,15 @@ Book.prototype.generate = function(generator) {
|
||||
return _.reduce(ops["content"] || [], function(prev, file, i) {
|
||||
return prev.then(function() {
|
||||
var p = ((i*100)/nFiles).toFixed(0)+"%";
|
||||
that.log.info.ln("processing", file, p);
|
||||
return Q(generator.convertFile(file));
|
||||
that.log.debug.ln("processing", file, p);
|
||||
|
||||
return Q(generator.convertFile(file))
|
||||
.fail(function(err) {
|
||||
// Transform error message to signal file
|
||||
throw that.normError(err, {
|
||||
fileName: file
|
||||
});
|
||||
});
|
||||
});
|
||||
}, Q());
|
||||
});
|
||||
@@ -369,7 +377,13 @@ Book.prototype.parseReadme = function() {
|
||||
that.log.debug.ln("readme located at", that.readmeFile);
|
||||
return that.template.renderFile(that.readmeFile)
|
||||
.then(function(content) {
|
||||
return readme.parser.readme(content);
|
||||
return readme.parser.readme(content)
|
||||
.fail(function(err) {
|
||||
throw that.normError(err, {
|
||||
name: err.name || "Readme Parse Error",
|
||||
fileName: that.readmeFile
|
||||
});
|
||||
});
|
||||
});
|
||||
})
|
||||
.then(function(readme) {
|
||||
@@ -396,7 +410,13 @@ Book.prototype.parseLangs = function() {
|
||||
that.log.debug.ln("languages index located at", that.langsFile);
|
||||
return that.template.renderFile(that.langsFile)
|
||||
.then(function(content) {
|
||||
return langs.parser.langs(content);
|
||||
return langs.parser.langs(content)
|
||||
.fail(function(err) {
|
||||
throw that.normError(err, {
|
||||
name: err.name || "Langs Parse Error",
|
||||
fileName: that.langsFile
|
||||
});
|
||||
});
|
||||
});
|
||||
})
|
||||
.then(function(langs) {
|
||||
@@ -425,8 +445,14 @@ Book.prototype.parseSummary = function() {
|
||||
.then(function(content) {
|
||||
return summary.parser.summary(content, {
|
||||
entryPoint: that.readmeFile,
|
||||
entryPointTitle: "",
|
||||
entryPointTitle: that.i18n('SUMMARY_INTRODUCTION'),
|
||||
files: that.files
|
||||
})
|
||||
.fail(function(err) {
|
||||
throw that.normError(err, {
|
||||
name: err.name || "Summary Parse Error",
|
||||
fileName: that.summaryFile
|
||||
});
|
||||
});
|
||||
});
|
||||
})
|
||||
@@ -455,7 +481,13 @@ Book.prototype.parseGlossary = function() {
|
||||
that.log.debug.ln("glossary located at", that.glossaryFile);
|
||||
return that.template.renderFile(that.glossaryFile)
|
||||
.then(function(content) {
|
||||
return glossary.parser.glossary(content);
|
||||
return glossary.parser.glossary(content)
|
||||
.fail(function(err) {
|
||||
throw that.normError(err, {
|
||||
name: err.name || "Glossary Parse Error",
|
||||
fileName: that.glossaryFile
|
||||
});
|
||||
});
|
||||
});
|
||||
})
|
||||
.then(function(glossary) {
|
||||
@@ -675,8 +707,8 @@ Book.prototype.resolve = function(p) {
|
||||
return path.resolve(this.root, p);
|
||||
};
|
||||
|
||||
// Normalize a link to .html and convert README -> index
|
||||
Book.prototype.contentLink = function(link) {
|
||||
// Normalize a path to .html and convert README -> index
|
||||
Book.prototype.contentPath = function(link) {
|
||||
if (
|
||||
path.basename(link, path.extname(link)) == "README"
|
||||
|| link == this.readmeFile
|
||||
@@ -688,6 +720,11 @@ Book.prototype.contentLink = function(link) {
|
||||
return link;
|
||||
}
|
||||
|
||||
// Normalize a link to .html and convert README -> index
|
||||
Book.prototype.contentLink = function(link) {
|
||||
return links.normalize(this.contentPath(link));
|
||||
}
|
||||
|
||||
// Index a page into the search index
|
||||
Book.prototype.indexPage = function(page) {
|
||||
var nav = this.navigation[page.path];
|
||||
@@ -722,22 +759,49 @@ Book.prototype.setOutput = function(p) {
|
||||
});
|
||||
};
|
||||
|
||||
// Translate a strign according to the book language
|
||||
Book.prototype.i18n = function(phrase) {
|
||||
var args = Array.prototype.slice.call(arguments);
|
||||
return i18n.__.apply({}, [this.config.normalizeLanguage()].concat(args));
|
||||
};
|
||||
|
||||
// Normalize error
|
||||
Book.prototype.normError = function(err, opts, defs) {
|
||||
if (_.isString(err)) err = new Error(err);
|
||||
|
||||
// Extend err
|
||||
_.extend(err, opts || {});
|
||||
_.defaults(err, defs || {});
|
||||
|
||||
err.lineNumber = err.lineNumber || err.lineno;
|
||||
err.columnNumber = err.columnNumber || err.colno;
|
||||
|
||||
err.toString = function() {
|
||||
var attributes = [];
|
||||
|
||||
if (this.fileName) attributes.push("In file '"+this.fileName+"'");
|
||||
if (this.lineNumber) attributes.push("Line "+this.lineNumber);
|
||||
if (this.columnNumber) attributes.push("Column "+this.columnNumber);
|
||||
return (this.name || "Error")+": "+this.message+((attributes.length > 0)? " ("+attributes.join(", ")+")" : "")
|
||||
};
|
||||
|
||||
return err;
|
||||
};
|
||||
|
||||
// Init and return a book
|
||||
Book.init = function(root) {
|
||||
var book = new Book(root);
|
||||
Book.init = function(root, opts) {
|
||||
var book = new Book(root, opts);
|
||||
var extensionToUse = ".md";
|
||||
|
||||
var chaptersPaths = function(chapters) {
|
||||
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(
|
||||
_.filter([
|
||||
{
|
||||
title: chapter.title,
|
||||
path: chapter.path
|
||||
}
|
||||
].concat(chaptersPaths(chapter.articles)))
|
||||
[o].concat(chaptersPaths(chapter.articles))
|
||||
);
|
||||
}, []);
|
||||
};
|
||||
@@ -774,12 +838,17 @@ Book.init = function(root) {
|
||||
.then(function(chapters) {
|
||||
// Create files that don't exist
|
||||
return Q.all(_.map(chapters, function(chapter) {
|
||||
if (!chapter.path) return Q();
|
||||
var absolutePath = path.resolve(book.root, chapter.path);
|
||||
|
||||
return fs.exists(absolutePath)
|
||||
.then(function(exists) {
|
||||
book.log.info.ln("create", chapter.path);
|
||||
if(exists) return;
|
||||
if(exists) {
|
||||
book.log.info.ln("found", chapter.path);
|
||||
return;
|
||||
} else {
|
||||
book.log.info.ln("create", chapter.path);
|
||||
}
|
||||
|
||||
return fs.mkdirp(path.dirname(absolutePath))
|
||||
.then(function() {
|
||||
|
||||
+25
-3
@@ -60,7 +60,6 @@ function normalizePluginsNames(plugins) {
|
||||
return _.pluck(normalizePluginsList(plugins), "name");
|
||||
};
|
||||
|
||||
|
||||
var Configuration = function(book, options) {
|
||||
var that = this;
|
||||
|
||||
@@ -75,6 +74,20 @@ var Configuration = function(book, options) {
|
||||
return that.book.root;
|
||||
}
|
||||
});
|
||||
|
||||
// options.originalInput == book.parent.root
|
||||
Object.defineProperty(this.options, "originalInput", {
|
||||
get: function () {
|
||||
return that.book.parent? that.book.parent.root : undefined;
|
||||
}
|
||||
});
|
||||
|
||||
// options.originalOutput == book.parent.options.output
|
||||
Object.defineProperty(this.options, "originalOutput", {
|
||||
get: function () {
|
||||
return that.book.parent? that.book.parent.options.output : undefined;
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
// Read and parse the configuration
|
||||
@@ -83,8 +96,17 @@ Configuration.prototype.load = function() {
|
||||
|
||||
return Q()
|
||||
.then(function() {
|
||||
var configPath, config;
|
||||
|
||||
try {
|
||||
var _config = require(path.resolve(that.book.root, that.options.configFile));
|
||||
configPath = require.resolve(
|
||||
path.resolve(that.book.root, that.options.configFile)
|
||||
);
|
||||
|
||||
// Invalidate node.js cache for livreloading
|
||||
delete require.cache[configPath];
|
||||
|
||||
_config = require(configPath);
|
||||
that.options = _.merge(
|
||||
that.options,
|
||||
_.omit(_config, 'configFile', 'defaultsPlugins', 'generator', 'extension')
|
||||
@@ -111,7 +133,7 @@ Configuration.prototype.load = function() {
|
||||
|
||||
// Default value for text direction (from language)
|
||||
if (!that.options.direction) {
|
||||
var lang = i18n.getByLanguage(that.options.language);
|
||||
var lang = i18n.getCatalog(that.options.language);
|
||||
if (lang) that.options.direction = lang.direction;
|
||||
}
|
||||
|
||||
|
||||
@@ -6,7 +6,6 @@ var _ = require("lodash");
|
||||
var nunjucks = require("nunjucks");
|
||||
var AutoEscapeExtension = require("nunjucks-autoescape");
|
||||
var FilterExtension = require("nunjucks-filter");
|
||||
var I18nExtension = require("nunjucks-i18n");
|
||||
|
||||
var fs = require("../utils/fs");
|
||||
var BaseGenerator = require("../generator");
|
||||
@@ -79,8 +78,8 @@ Generator.prototype.prepareTemplateEngine = function() {
|
||||
.then(function() {
|
||||
var language = that.book.config.normalizeLanguage();
|
||||
|
||||
if (!i18n.getByLanguage(language) && language != "en") {
|
||||
that.book.log.warn.ln("Language '"+language+"' is not available as a layout locales (en, "+i18n.getLanguages().join(", ")+")");
|
||||
if (!i18n.hasLocale(language)) {
|
||||
that.book.log.warn.ln("Language '"+language+"' is not available as a layout locales (en, "+i18n.getLocales().join(", ")+")");
|
||||
}
|
||||
|
||||
var folders = _.chain(that.templates)
|
||||
@@ -101,15 +100,11 @@ Generator.prototype.prepareTemplateEngine = function() {
|
||||
that.env.addFilter('lvl', function(lvl) {
|
||||
return lvl.split(".").length;
|
||||
});
|
||||
that.env.addGlobal('__', that.book.i18n.bind(that.book));
|
||||
|
||||
// Add extension
|
||||
that.env.addExtension('AutoEscapeExtension', new AutoEscapeExtension(that.env));
|
||||
that.env.addExtension('FilterExtension', new FilterExtension(that.env));
|
||||
that.env.addExtension('I18nExtension', new I18nExtension({
|
||||
env: that.env,
|
||||
translations: i18n.getLocales(),
|
||||
locale: "language"
|
||||
}));
|
||||
});
|
||||
};
|
||||
|
||||
@@ -136,7 +131,7 @@ Generator.prototype.convertFile = function(input) {
|
||||
}
|
||||
})
|
||||
.then(function(page) {
|
||||
var relativeOutput = that.book.contentLink(page.path);
|
||||
var relativeOutput = that.book.contentPath(page.path);
|
||||
var output = path.join(that.options.output, relativeOutput);
|
||||
|
||||
var basePath = path.relative(path.dirname(output), that.options.output) || ".";
|
||||
|
||||
+1
-1
@@ -155,7 +155,7 @@ Plugin.prototype.callHook = function(name, data) {
|
||||
if (!hookFunc) return Q(data);
|
||||
|
||||
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()
|
||||
.then(function() {
|
||||
|
||||
+9
-3
@@ -2,9 +2,9 @@ var _ = require("lodash");
|
||||
var Q = require("q");
|
||||
var path = require("path");
|
||||
var nunjucks = require("nunjucks");
|
||||
var escapeStringRegexp = require("escape-string-regexp");
|
||||
|
||||
var git = require("./utils/git");
|
||||
var stringUtils = require("./utils/string");
|
||||
var fs = require("./utils/fs");
|
||||
var batch = require("./utils/batch");
|
||||
var pkg = require("../package.json");
|
||||
@@ -302,7 +302,7 @@ TemplateEngine.prototype.addBlock = function(name, block) {
|
||||
TemplateEngine.prototype._applyShortcut = function(parser, content, shortcut) {
|
||||
if (!_.contains(shortcut.parsers, parser)) return content;
|
||||
var regex = new RegExp(
|
||||
stringUtils.escapeRegex(shortcut.start) + "([\\s\\S]*?[^\\$])" + stringUtils.escapeRegex(shortcut.end),
|
||||
escapeStringRegexp(shortcut.start) + "([\\s\\S]*?[^\\$])" + escapeStringRegexp(shortcut.end),
|
||||
'g'
|
||||
);
|
||||
return content.replace(regex, function(all, match) {
|
||||
@@ -331,7 +331,13 @@ TemplateEngine.prototype.renderString = function(content, context, options) {
|
||||
// Replace shortcuts
|
||||
content = _.reduce(this.shortcuts, _.partial(this._applyShortcut.bind(this), options.type), content);
|
||||
|
||||
return Q.nfcall(this.env.renderString.bind(this.env), content, context, options);
|
||||
return Q.nfcall(this.env.renderString.bind(this.env), content, context, options)
|
||||
.fail(function(err) {
|
||||
if (_.isString(err)) err = new Error(err);
|
||||
err.message = err.message.replace(/^Error: /, "");
|
||||
|
||||
throw err;
|
||||
});
|
||||
};
|
||||
|
||||
// Render a file from the book
|
||||
|
||||
+40
-32
@@ -2,32 +2,20 @@ var _ = require("lodash");
|
||||
var path = require("path");
|
||||
var fs = require("fs");
|
||||
|
||||
var I18N_PATH = path.resolve(__dirname, "../../theme/i18n/")
|
||||
var i18n = require("i18n");
|
||||
|
||||
var getLocales = _.memoize(function() {
|
||||
var locales = fs.readdirSync(I18N_PATH);
|
||||
return _.chain(locales)
|
||||
.map(function(local) {
|
||||
local = path.basename(local, ".json");
|
||||
return [local, _.extend({
|
||||
direction: "ltr"
|
||||
}, require(path.join(I18N_PATH, local)), {
|
||||
id: local
|
||||
})];
|
||||
})
|
||||
.object()
|
||||
.value();
|
||||
var I18N_PATH = path.resolve(__dirname, "../../theme/i18n/")
|
||||
var DEFAULT_LANGUAGE = "en";
|
||||
var LOCALES = _.map(fs.readdirSync(I18N_PATH), function(lang) {
|
||||
return path.basename(lang, ".json");
|
||||
});
|
||||
|
||||
var getLanguages = function() {
|
||||
return _.keys(getLocales());
|
||||
};
|
||||
|
||||
var getByLanguage = function(lang) {
|
||||
lang = normalizeLanguage(lang);
|
||||
var locales = getLocales();
|
||||
return locales[lang];
|
||||
};
|
||||
i18n.configure({
|
||||
locales: LOCALES,
|
||||
directory: I18N_PATH,
|
||||
defaultLocale: DEFAULT_LANGUAGE,
|
||||
updateFiles: false
|
||||
});
|
||||
|
||||
var compareLocales = function(lang, locale) {
|
||||
var langMain = _.first(lang.split("-"));
|
||||
@@ -43,12 +31,9 @@ var compareLocales = function(lang, locale) {
|
||||
};
|
||||
|
||||
var normalizeLanguage = _.memoize(function(lang) {
|
||||
var locales = getLocales();
|
||||
var language = _.chain(locales)
|
||||
var language = _.chain(LOCALES)
|
||||
.values()
|
||||
.map(function(locale) {
|
||||
locale = locale.id;
|
||||
|
||||
return {
|
||||
locale: locale,
|
||||
score: compareLocales(lang, locale)
|
||||
@@ -64,9 +49,32 @@ var normalizeLanguage = _.memoize(function(lang) {
|
||||
return language || lang;
|
||||
});
|
||||
|
||||
module.exports = {
|
||||
getLocales: getLocales,
|
||||
getLanguages: getLanguages,
|
||||
getByLanguage: getByLanguage,
|
||||
normalizeLanguage: normalizeLanguage
|
||||
var translate = function(locale, phrase) {
|
||||
var args = Array.prototype.slice.call(arguments, 2);
|
||||
|
||||
return i18n.__.apply({}, [{
|
||||
locale: locale,
|
||||
phrase: phrase
|
||||
}].concat(args));
|
||||
};
|
||||
|
||||
var getCatalog = function(locale) {
|
||||
locale = normalizeLanguage(locale);
|
||||
return i18n.getCatalog(locale);
|
||||
};
|
||||
|
||||
var getLocales = function() {
|
||||
return LOCALES;
|
||||
};
|
||||
|
||||
var hasLocale = function(locale) {
|
||||
return _.contains(LOCALES, locale);
|
||||
}
|
||||
|
||||
module.exports = {
|
||||
__: translate,
|
||||
normalizeLanguage: normalizeLanguage,
|
||||
getCatalog: getCatalog,
|
||||
getLocales: getLocales,
|
||||
hasLocale: hasLocale
|
||||
};
|
||||
|
||||
+1
-1
@@ -193,7 +193,7 @@ function normalizeHtml(src, options) {
|
||||
// Keep it as it is
|
||||
} else if (links.isRelative(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 || "";
|
||||
|
||||
// If is in navigation relative: transform as content
|
||||
|
||||
@@ -20,12 +20,7 @@ function optionsToShellArgs(options) {
|
||||
.join(" ");
|
||||
}
|
||||
|
||||
function escapeRegex(str) {
|
||||
return str.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, "\\$&");
|
||||
}
|
||||
|
||||
module.exports = {
|
||||
escapeRegex: escapeRegex,
|
||||
escapeShellArg: escapeShellArg,
|
||||
optionsToShellArgs: optionsToShellArgs,
|
||||
toLowerCase: String.prototype.toLowerCase.call.bind(String.prototype.toLowerCase)
|
||||
|
||||
+8
-7
@@ -1,7 +1,7 @@
|
||||
var Q = require('q');
|
||||
var _ = require('lodash');
|
||||
var path = require('path');
|
||||
var Gaze = require('gaze').Gaze;
|
||||
var chokidar = require('chokidar');
|
||||
|
||||
var parsers = require('gitbook-parsers')
|
||||
|
||||
@@ -17,17 +17,18 @@ function watch(dir) {
|
||||
toWatch.push("**/*"+ext);
|
||||
});
|
||||
|
||||
var gaze = new Gaze(toWatch, {
|
||||
cwd: dir
|
||||
var watcher = chokidar.watch(toWatch, {
|
||||
cwd: dir,
|
||||
ignoreInitial: true
|
||||
});
|
||||
|
||||
gaze.once("all", function(e, filepath) {
|
||||
gaze.close();
|
||||
watcher.once("all", function(e, filepath) {
|
||||
watcher.close();
|
||||
|
||||
d.resolve(filepath);
|
||||
});
|
||||
gaze.once("error", function(err) {
|
||||
gaze.close();
|
||||
watcher.once("error", function(err) {
|
||||
watcher.close();
|
||||
|
||||
d.reject(err);
|
||||
});
|
||||
|
||||
+8
-7
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "gitbook",
|
||||
"version": "2.0.0",
|
||||
"version": "2.0.3",
|
||||
"homepage": "https://www.gitbook.com",
|
||||
"description": "Library and cmd utility to generate GitBooks",
|
||||
"main": "lib/index.js",
|
||||
@@ -12,16 +12,16 @@
|
||||
"resolve": "0.6.3",
|
||||
"fs-extra": "0.16.5",
|
||||
"fstream-ignore": "1.0.2",
|
||||
"gitbook-parsers": "0.7.2",
|
||||
"nunjucks": "git+https://github.com/mozilla/nunjucks.git#0f8b21b8df7e8e852b2e1889388653b7075f0d09",
|
||||
"gitbook-parsers": "0.7.5",
|
||||
"nunjucks": "1.3.0",
|
||||
"nunjucks-autoescape": "0.1.1",
|
||||
"nunjucks-filter": "0.1.0",
|
||||
"nunjucks-i18n": "1.0.0",
|
||||
"i18n": "0.5.0",
|
||||
"semver": "2.2.1",
|
||||
"npmi": "0.1.1",
|
||||
"cheerio": "0.19.0",
|
||||
"gitbook-plugin-livereload": "0.0.1",
|
||||
"gaze": "~0.5.1",
|
||||
"chokidar": "~1.0.1",
|
||||
"send": "0.2.0",
|
||||
"tiny-lr": "0.1.5",
|
||||
"tmp": "0.0.24",
|
||||
@@ -32,7 +32,8 @@
|
||||
"npm": "2.4.1",
|
||||
"dom-serializer": "0.1.0",
|
||||
"spawn-cmd": "0.0.2",
|
||||
"highlight.js": "8.4.0"
|
||||
"highlight.js": "8.4.0",
|
||||
"escape-string-regexp": "1.0.3"
|
||||
},
|
||||
"devDependencies": {
|
||||
"mocha": "2.2.1",
|
||||
@@ -60,7 +61,7 @@
|
||||
"gitbook"
|
||||
],
|
||||
"author": "FriendCode Inc. <contact@gitbook.com>",
|
||||
"license": "Apache 2",
|
||||
"license": "Apache-2.0",
|
||||
"bugs": {
|
||||
"url": "https://github.com/GitbookIO/gitbook/issues"
|
||||
},
|
||||
|
||||
+3
-1
@@ -46,7 +46,9 @@ should.Assertion.add('html', function(rules, description) {
|
||||
|
||||
// Test attributes
|
||||
_.each(validations.attributes, function(value, name) {
|
||||
$el.attr(name).should.be.equal(value);
|
||||
var attr = $el.attr(name);
|
||||
should(attr).be.ok;
|
||||
attr.should.be.equal(value);
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
@@ -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,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 fs = require('fs');
|
||||
var _ = require('lodash');
|
||||
var path = require('path');
|
||||
var cheerio = require('cheerio');
|
||||
|
||||
var links = require("../lib/utils/links");
|
||||
|
||||
describe('Links', function () {
|
||||
@@ -34,4 +39,27 @@ describe('Links', function () {
|
||||
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");
|
||||
})
|
||||
});
|
||||
|
||||
});
|
||||
|
||||
@@ -41,5 +41,30 @@ describe('Summary', function () {
|
||||
book.should.have.file("PAGE1.html");
|
||||
book.should.have.file("folder/PAGE2.html");
|
||||
});
|
||||
|
||||
it('should correctly output summary', function() {
|
||||
var PAGE = fs.readFileSync(
|
||||
path.join(book.options.output, "index.html"),
|
||||
{ encoding: "utf-8" }
|
||||
);
|
||||
|
||||
PAGE.should.be.html({
|
||||
".book-summary .chapter[data-level='0'] a": {
|
||||
attributes: {
|
||||
href: "./index.html"
|
||||
}
|
||||
},
|
||||
".book-summary .chapter[data-level='1'] a": {
|
||||
attributes: {
|
||||
href: "./PAGE1.html"
|
||||
}
|
||||
},
|
||||
".book-summary .chapter[data-level='2'] a": {
|
||||
attributes: {
|
||||
href: "./folder/PAGE2.html"
|
||||
}
|
||||
}
|
||||
});
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
+1
-1
@@ -12,7 +12,7 @@
|
||||
"SEARCH_PLACEHOLDER": "اكتب للبحث",
|
||||
"FONTSETTINGS_TOGGLE": "إعدادات الخط",
|
||||
"SHARE_TOGGLE": "حصة",
|
||||
"SHARE_ON": "على __platform__ حصة",
|
||||
"SHARE_ON": "على {{platform}} حصة",
|
||||
"FONTSETTINGS_WHITE": "أبيض",
|
||||
"FONTSETTINGS_SEPIA": "بني داكن",
|
||||
"FONTSETTINGS_NIGHT": "ليل",
|
||||
|
||||
+1
-1
@@ -11,7 +11,7 @@
|
||||
"SEARCH_PLACEHOLDER": "অনুসন্ধান",
|
||||
"FONTSETTINGS_TOGGLE": "ফন্ট সেটিংস",
|
||||
"SHARE_TOGGLE": "শেয়ার",
|
||||
"SHARE_ON": "__platform__-এ শেয়ার",
|
||||
"SHARE_ON": "{{platform}}-এ শেয়ার",
|
||||
"FONTSETTINGS_WHITE": "সাদা",
|
||||
"FONTSETTINGS_SEPIA": "সেপিয়া",
|
||||
"FONTSETTINGS_NIGHT": "রাত",
|
||||
|
||||
+1
-1
@@ -11,7 +11,7 @@
|
||||
"SEARCH_PLACEHOLDER": "Suchbegriff eingeben",
|
||||
"FONTSETTINGS_TOGGLE": "Schrifteinstellungen",
|
||||
"SHARE_TOGGLE": "Teilen",
|
||||
"SHARE_ON": "Auf __platform__ teilen",
|
||||
"SHARE_ON": "Auf {{platform}} teilen",
|
||||
"FONTSETTINGS_WHITE": "Hell",
|
||||
"FONTSETTINGS_SEPIA": "Sepia",
|
||||
"FONTSETTINGS_NIGHT": "Nacht",
|
||||
|
||||
+1
-1
@@ -11,7 +11,7 @@
|
||||
"SEARCH_PLACEHOLDER": "Type to search",
|
||||
"FONTSETTINGS_TOGGLE": "Font Settings",
|
||||
"SHARE_TOGGLE": "Share",
|
||||
"SHARE_ON": "Share on __platform__",
|
||||
"SHARE_ON": "Share on {{platform}}",
|
||||
"FONTSETTINGS_WHITE": "White",
|
||||
"FONTSETTINGS_SEPIA": "Sepia",
|
||||
"FONTSETTINGS_NIGHT": "Night",
|
||||
|
||||
+1
-1
@@ -11,7 +11,7 @@
|
||||
"SEARCH_PLACEHOLDER": "Escribe para buscar",
|
||||
"FONTSETTINGS_TOGGLE": "Configuración de fuente",
|
||||
"SHARE_TOGGLE": "Comparte",
|
||||
"SHARE_ON": "Comparte en __platform__",
|
||||
"SHARE_ON": "Comparte en {{platform}}",
|
||||
"FONTSETTINGS_WHITE": "Claro",
|
||||
"FONTSETTINGS_SEPIA": "Sépia",
|
||||
"FONTSETTINGS_NIGHT": "Noche",
|
||||
|
||||
+1
-1
@@ -12,7 +12,7 @@
|
||||
"SEARCH_PLACEHOLDER": "چیزی برای جستجو بنویسید",
|
||||
"FONTSETTINGS_TOGGLE": "تنظیمات فونت",
|
||||
"SHARE_TOGGLE": "اشتراک",
|
||||
"SHARE_ON": "در __platform__ به اشتراک بگذارید",
|
||||
"SHARE_ON": "در {{platform}} به اشتراک بگذارید",
|
||||
"FONTSETTINGS_WHITE": "سفید",
|
||||
"FONTSETTINGS_SEPIA": "سپیا",
|
||||
"FONTSETTINGS_NIGHT": "شب",
|
||||
|
||||
@@ -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"
|
||||
}
|
||||
+1
-1
@@ -11,7 +11,7 @@
|
||||
"SEARCH_PLACEHOLDER": "Tapez pour rechercher",
|
||||
"FONTSETTINGS_TOGGLE": "Paramètres de Police",
|
||||
"SHARE_TOGGLE": "Partage",
|
||||
"SHARE_ON": "Partager sur __platform__",
|
||||
"SHARE_ON": "Partager sur {{platform}}",
|
||||
"FONTSETTINGS_WHITE": "Clair",
|
||||
"FONTSETTINGS_SEPIA": "Sépia",
|
||||
"FONTSETTINGS_NIGHT": "Nuit",
|
||||
|
||||
+1
-1
@@ -11,7 +11,7 @@
|
||||
"SEARCH_PLACEHOLDER": "Scrivi per cercare",
|
||||
"FONTSETTINGS_TOGGLE": "Impostazioni dei caratteri",
|
||||
"SHARE_TOGGLE": "Condividi",
|
||||
"SHARE_ON": "Condividi su __platform__",
|
||||
"SHARE_ON": "Condividi su {{platform}}",
|
||||
"FONTSETTINGS_WHITE": "Bianco",
|
||||
"FONTSETTINGS_SEPIA": "Seppia",
|
||||
"FONTSETTINGS_NIGHT": "Notte",
|
||||
|
||||
@@ -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"
|
||||
}
|
||||
+1
-1
@@ -11,7 +11,7 @@
|
||||
"SEARCH_PLACEHOLDER": "Skriv inn søkeord",
|
||||
"FONTSETTINGS_TOGGLE": "Tekstinnstillinger",
|
||||
"SHARE_TOGGLE": "Del",
|
||||
"SHARE_ON": "Del på __platform__",
|
||||
"SHARE_ON": "Del på {{platform}}",
|
||||
"FONTSETTINGS_WHITE": "Lys",
|
||||
"FONTSETTINGS_SEPIA": "Sepia",
|
||||
"FONTSETTINGS_NIGHT": "Mørk",
|
||||
|
||||
@@ -0,0 +1,20 @@
|
||||
{
|
||||
"LANGS_CHOOSE": "Wybierz język",
|
||||
"GLOSSARY": "Glosariusz",
|
||||
"GLOSSARY_INDEX": "Indeks",
|
||||
"GLOSSARY_OPEN": "Glosariusz",
|
||||
"GITBOOK_LINK": "Opublikowano dzięki GitBook",
|
||||
"SUMMARY": "Spis treści",
|
||||
"SUMMARY_INTRODUCTION": "Wstęp",
|
||||
"SUMMARY_TOGGLE": "Spis treści",
|
||||
"SEARCH_TOGGLE": "Szukaj",
|
||||
"SEARCH_PLACEHOLDER": "Wpisz szukaną frazę",
|
||||
"FONTSETTINGS_TOGGLE": "Ustawienia czcionki",
|
||||
"SHARE_TOGGLE": "Udostępnij",
|
||||
"SHARE_ON": "Udostępnij na {{platform}}",
|
||||
"FONTSETTINGS_WHITE": "Jasny",
|
||||
"FONTSETTINGS_SEPIA": "Sepia",
|
||||
"FONTSETTINGS_NIGHT": "Noc",
|
||||
"FONTSETTINGS_SANS": "Bezszeryfowa",
|
||||
"FONTSETTINGS_SERIF": "Szeryfowa"
|
||||
}
|
||||
+1
-1
@@ -11,7 +11,7 @@
|
||||
"SEARCH_PLACEHOLDER": "Escreva para pesquisar",
|
||||
"FONTSETTINGS_TOGGLE": "Configurações de fonte",
|
||||
"SHARE_TOGGLE": "Compartilhar",
|
||||
"SHARE_ON": "Compartilhar no __platform__",
|
||||
"SHARE_ON": "Compartilhar no {{platform}}",
|
||||
"FONTSETTINGS_WHITE": "Claro",
|
||||
"FONTSETTINGS_SEPIA": "Sépia",
|
||||
"FONTSETTINGS_NIGHT": "Noite",
|
||||
|
||||
@@ -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"
|
||||
}
|
||||
+1
-1
@@ -11,7 +11,7 @@
|
||||
"SEARCH_PLACEHOLDER": "Введите условия поиска",
|
||||
"FONTSETTINGS_TOGGLE": "Шрифт",
|
||||
"SHARE_TOGGLE": "Поделиться",
|
||||
"SHARE_ON": "Поделиться в __platform__",
|
||||
"SHARE_ON": "Поделиться в {{platform}}",
|
||||
"FONTSETTINGS_WHITE": "Светлый",
|
||||
"FONTSETTINGS_SEPIA": "Сепия",
|
||||
"FONTSETTINGS_NIGHT": "Тёмный",
|
||||
|
||||
@@ -11,7 +11,7 @@
|
||||
"SEARCH_PLACEHOLDER": "输入并搜索",
|
||||
"FONTSETTINGS_TOGGLE": "字体设置",
|
||||
"SHARE_TOGGLE": "分享",
|
||||
"SHARE_ON": "分享到 __platform__",
|
||||
"SHARE_ON": "分享到 {{platform}}",
|
||||
"FONTSETTINGS_WHITE": "白色",
|
||||
"FONTSETTINGS_SEPIA": "棕褐色",
|
||||
"FONTSETTINGS_NIGHT": "夜间",
|
||||
|
||||
@@ -11,7 +11,7 @@
|
||||
"SEARCH_PLACEHOLDER": "輸入並搜尋",
|
||||
"FONTSETTINGS_TOGGLE": "字型設定",
|
||||
"SHARE_TOGGLE": "分享",
|
||||
"SHARE_ON": "分享到 __platform__",
|
||||
"SHARE_ON": "分享到 {{platform}}",
|
||||
"FONTSETTINGS_WHITE": "白色",
|
||||
"FONTSETTINGS_SEPIA": "棕褐色",
|
||||
"FONTSETTINGS_NIGHT": "夜間",
|
||||
|
||||
@@ -1,11 +1,11 @@
|
||||
{% extends "./page.html" %}
|
||||
|
||||
{% block title %}{% i18n "GLOSSARY" %}Glossary{% endi18n %} | {{ title }}{% endblock %}
|
||||
{% block title %}{{ __("GLOSSARY") }} | {{ title }}{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
<div class="page page-toc">
|
||||
<h1 class="book-chapter book-chapter-1">{% i18n "GLOSSARY" %}Glossary{% endi18n %}</h1>
|
||||
<h1>{% i18n "GLOSSARY" %}Glossary{% endi18n %}</h1>
|
||||
<h1 class="book-chapter book-chapter-1">{{ __("GLOSSARY") }}</h1>
|
||||
<h1>{{ __("GLOSSARY") }}</h1>
|
||||
{% for item in glossary %}
|
||||
<section class="normal glossary" id="{{ item.id }}">
|
||||
<h2><a href="#{{ item.id }}">{{ item.name }}</a></h2>
|
||||
|
||||
@@ -1,13 +1,13 @@
|
||||
{% extends "./page.html" %}
|
||||
|
||||
{% block title %}{% i18n "SUMMARY" %}Table of Contents{% endi18n %} | {{ title }}{% endblock %}
|
||||
{% block title %}{{ __("SUMMARY") }} | {{ title }}{% endblock %}
|
||||
|
||||
{% macro articles(_articles) %}
|
||||
{% for item in _articles %}
|
||||
<li>
|
||||
{% if item.path and item.exists %}
|
||||
{% if not item.external %}
|
||||
<a href="{{ basePath }}/{{ item.path|contentLink }}">{% if item.introduction %}{% i18n "SUMMARY_INTRODUCTION" %}Introduction{% endi18n %}{% else %}{{ item.title }}{% endif %}</a>
|
||||
<a href="{{ basePath }}/{{ item.path|contentLink }}">{{ item.title }}</a>
|
||||
{% else %}
|
||||
<a target="_blank" href="{{ item.path }}">{{ item.title }}</a>
|
||||
{% endif %}
|
||||
@@ -25,12 +25,12 @@
|
||||
|
||||
{% block content %}
|
||||
<div class="page page-toc">
|
||||
<h1>{% i18n "SUMMARY" %}Table of Contents{% endi18n %}</h1>
|
||||
<h1>{{ __("SUMMARY") }}</h1>
|
||||
<ol>
|
||||
{{ articles(summary.chapters) }}
|
||||
|
||||
{% if glossary.length > 0 %}
|
||||
<li><a href="{{ basePath }}/GLOSSARY.html">{% i18n "GLOSSARY" %}Glossary{% endi18n %}</a></li>
|
||||
<li><a href="{{ basePath }}/GLOSSARY.html">{{ __("GLOSSARY") }}</a></li>
|
||||
{% endif %}
|
||||
</ol>
|
||||
</div>
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{% extends "page.html" %}
|
||||
|
||||
{% block title %}{% i18n "GLOSSARY" %}Glossary{% endi18n %} | {{ title }}{% endblock %}
|
||||
{% block title %}{{ __("GLOSSARY") }} | {{ title }}{% endblock %}
|
||||
|
||||
{% block page_inner %}
|
||||
{% for item in glossary %}
|
||||
|
||||
@@ -10,13 +10,13 @@
|
||||
</div>
|
||||
|
||||
<div class="buttons font-family-list">
|
||||
<button type="button" data-font="0" class="button">{% i18n "FONTSETTINGS_SERIF" %}Serif{% endi18n %}</button>
|
||||
<button type="button" data-font="1" class="button">{% i18n "FONTSETTINGS_SANS" %}Sans{% endi18n %}</button>
|
||||
<button type="button" data-font="0" class="button">{{ __("FONTSETTINGS_SERIF") }}</button>
|
||||
<button type="button" data-font="1" class="button">{{ __("FONTSETTINGS_SANS") }}</button>
|
||||
</div>
|
||||
|
||||
<div class="buttons color-theme-list">
|
||||
<button type="button" id="color-theme-preview-0" class="button size-3" data-theme="0">{% i18n "FONTSETTINGS_WHITE" %}White{% endi18n %}</button>
|
||||
<button type="button" id="color-theme-preview-1" class="button size-3" data-theme="1">{% i18n "FONTSETTINGS_SEPIA" %}Sepia{% endi18n %}</button>
|
||||
<button type="button" id="color-theme-preview-2" class="button size-3" data-theme="2">{% i18n "FONTSETTINGS_NIGHT" %}Night{% endi18n %}</button>
|
||||
<button type="button" id="color-theme-preview-0" class="button size-3" data-theme="0">{{ __("FONTSETTINGS_WHITE") }}</button>
|
||||
<button type="button" id="color-theme-preview-1" class="button size-3" data-theme="1">{{ __("FONTSETTINGS_SEPIA") }}</button>
|
||||
<button type="button" id="color-theme-preview-2" class="button size-3" data-theme="2">{{ __("FONTSETTINGS_NIGHT") }}</button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -1,12 +1,12 @@
|
||||
<div class="book-header">
|
||||
<!-- Actions Left -->
|
||||
<a href="#" class="btn pull-left toggle-summary" aria-label="{% i18n "SUMMARY_TOGGLE" %}Table of Contents{% endi18n %}"><i class="fa fa-align-justify"></i></a>
|
||||
<a href="#" class="btn pull-left toggle-search" aria-label="{% i18n "SEARCH_TOGGLE" %}Search{% endi18n %}"><i class="fa fa-search"></i></a>
|
||||
<a href="#" class="btn pull-left toggle-summary" aria-label="{{ __("SUMMARY_TOGGLE") }}"><i class="fa fa-align-justify"></i></a>
|
||||
<a href="#" class="btn pull-left toggle-search" aria-label="{{ __("SEARCH_TOGGLE") }}"><i class="fa fa-search"></i></a>
|
||||
{% if glossary.length > 0 %}
|
||||
<a href="{{ basePath }}/GLOSSARY.html" class="btn pull-left" aria-label="{% i18n "GLOSSARY_OPEN" %}Glossary{% endi18n %}"><i class="fa fa-sort-alpha-asc"></i></a>
|
||||
<a href="{{ basePath }}/GLOSSARY.html" class="btn pull-left" aria-label="{{ __("GLOSSARY_OPEN") }}"><i class="fa fa-sort-alpha-asc"></i></a>
|
||||
{% endif %}
|
||||
<div id="font-settings-wrapper" class="dropdown pull-left">
|
||||
<a href="#" class="btn toggle-dropdown" aria-label="{% i18n "FONTSETTINGS_TOGGLE" %}Font Settings{% endi18n %}"><i class="fa fa-font"></i>
|
||||
<a href="#" class="btn toggle-dropdown" aria-label="{{ __("FONTSETTINGS_TOGGLE") }}"><i class="fa fa-font"></i>
|
||||
</a>
|
||||
{% include "./font-settings.html" %}
|
||||
</div>
|
||||
@@ -14,7 +14,7 @@
|
||||
<!-- Actions Right -->
|
||||
{% if options.links.sharing.all != false %}
|
||||
<div class="dropdown pull-right">
|
||||
<a href="#" class="btn toggle-dropdown" aria-label="{% i18n "SHARE_TOGGLE" %}Share{% endi18n %}"><i class="fa fa-share-alt"></i>
|
||||
<a href="#" class="btn toggle-dropdown" aria-label="{{ __("SHARE_TOGGLE") }}"><i class="fa fa-share-alt"></i>
|
||||
</a>
|
||||
<div class="dropdown-menu font-settings dropdown-left">
|
||||
<div class="dropdown-caret">
|
||||
@@ -22,11 +22,21 @@
|
||||
<span class="caret-inner"></span>
|
||||
</div>
|
||||
<div class="buttons">
|
||||
<button type="button" data-sharing="twitter" class="button">{% i18n "SHARE_ON", __platform__="Twitter" %}Share on __platform__{% endi18n %}</button>
|
||||
<button type="button" data-sharing="google-plus" class="button">{% i18n "SHARE_ON", __platform__="Google" %}Share on __platform__{% endi18n %}</button>
|
||||
<button type="button" data-sharing="facebook" class="button">{% i18n "SHARE_ON", __platform__="Facebook" %}Share on __platform__{% endi18n %}</button>
|
||||
<button type="button" data-sharing="weibo" class="button">{% i18n "SHARE_ON", __platform__="Weibo" %}Share on __platform__{% endi18n %}</button>
|
||||
<button type="button" data-sharing="instapaper" class="button">{% i18n "SHARE_ON", __platform__="Instapaper" %}Share on __platform__{% endi18n %}</button>
|
||||
<button type="button" data-sharing="twitter" class="button">
|
||||
{{ __("SHARE_ON", platform="Twitter") }}
|
||||
</button>
|
||||
<button type="button" data-sharing="google-plus" class="button">
|
||||
{{ __("SHARE_ON", platform="Google") }}
|
||||
</button>
|
||||
<button type="button" data-sharing="facebook" class="button">
|
||||
{{ __("SHARE_ON", platform="Facebook") }}
|
||||
</button>
|
||||
<button type="button" data-sharing="weibo" class="button">
|
||||
{{ __("SHARE_ON", platform="Weibo") }}
|
||||
</button>
|
||||
<button type="button" data-sharing="instapaper" class="button">
|
||||
{{ __("SHARE_ON", platform="Instapaper") }}
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
{% if item.level != "0" %}
|
||||
<b>{{ item.level }}.</b>
|
||||
{% endif %}
|
||||
{% if item.introduction and not item.title %}{% i18n "SUMMARY_INTRODUCTION" %}Introduction{% endi18n %}{% else %}{{ item.title }}{% endif %}
|
||||
{{ item.title }}
|
||||
</a>
|
||||
{% else %}
|
||||
<a target="_blank" href="{{ item.path }}">
|
||||
@@ -33,7 +33,7 @@
|
||||
|
||||
<div class="book-summary">
|
||||
<div class="book-search">
|
||||
<input type="text" placeholder="{% i18n "SEARCH_PLACEHOLDER" %}Type to search{% endi18n %}" class="form-control" />
|
||||
<input type="text" placeholder="{{ __("SEARCH_PLACEHOLDER") }}" class="form-control" />
|
||||
</div>
|
||||
<ul class="summary">
|
||||
{% set _divider = false %}
|
||||
@@ -55,7 +55,9 @@
|
||||
{% if options.links.gitbook != false %}
|
||||
<li class="divider"></li>
|
||||
<li>
|
||||
<a href="https://www.gitbook.com" target="blank" class="gitbook-link">{% i18n "GITBOOK_LINK" %}Published using GitBook{% endi18n %}</a>
|
||||
<a href="https://www.gitbook.com" target="blank" class="gitbook-link">
|
||||
{{ __("GITBOOK_LINK") }}
|
||||
</a>
|
||||
</li>
|
||||
{% endif %}
|
||||
</ul>
|
||||
|
||||
@@ -9,7 +9,7 @@
|
||||
{% block content %}
|
||||
<div class="book-langs-index">
|
||||
<div class="inner">
|
||||
<h3>{% i18n "LANGS_CHOOSE" %}Choose a language{% endi18n %}</h3>
|
||||
<h3>{{ __("LANGS_CHOOSE") }}</h3>
|
||||
|
||||
<ul class="languages">
|
||||
{% for lang in langs %}
|
||||
@@ -22,4 +22,4 @@
|
||||
</div>
|
||||
{% endblock %}
|
||||
|
||||
{% block javascript %}{% endblock %}
|
||||
{% block javascript %}{% endblock %}
|
||||
|
||||
@@ -10,7 +10,7 @@
|
||||
{% endif %}
|
||||
{% endblock %}
|
||||
|
||||
{% block title %}{% if progress.current.introduction and not progress.current.title %}{% i18n "SUMMARY_INTRODUCTION" %}Introduction{% endi18n %}{% else %}{{ progress.current.title }}{% endif %} | {{ title }}{% endblock %}
|
||||
{% block title %}{{ progress.current.title }} | {{ title }}{% endblock %}
|
||||
{% block description %}{% if progress.current.level == "0" %}{{ description }}{% endif %}{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
|
||||
Reference in New Issue
Block a user