Compare commits

...

15 Commits

Author SHA1 Message Date
Samy Pessé 0e8f7b870b Bump version to 2.0.1 2015-04-02 19:41:14 +02:00
Samy Pessé 1eebc9a46e Normalize structure parsing error 2015-04-02 19:21:39 +02:00
Samy Pessé 0a94c80c44 Normalize template errors 2015-04-02 18:59:56 +02:00
Samy Pessé c70bb2fbd8 Update gitbook-parsers@0.7.4 2015-04-02 18:31:49 +02:00
Samy Pessé 12c06b384f Don't fail if config doesn't exists 2015-04-02 09:43:48 +02:00
Samy Pessé 82a58e7ac3 Invalidate configuration cache when reloading 2015-04-02 09:38:57 +02:00
Samy Pessé dcb56ef433 Merge pull request #683 from GitbookIO/fix/i18n
Fix i18n in json format
2015-04-01 22:23:23 +02:00
Samy Pessé 8da91de514 Don't update translations 2015-04-01 22:21:13 +02:00
Samy Pessé 4b20685562 Use i18n node module for template translation 2015-04-01 22:17:12 +02:00
Samy Pessé fff7c5cc3a Add back support for options.originalInput
Related to rtCamp/gitbook-plugin-edit-link#2
2015-03-30 16:50:26 +02:00
Samy Pessé 3065742b73 Separate book.contentLink and book.contentPath 2015-03-28 15:54:34 +01:00
Samy Pessé ffd69ad1f2 Add test for summary paths
Related to #674
2015-03-28 15:28:28 +01:00
Samy Pessé 9004011479 Merge pull request #673 from lszeremeta/master
Polish (pl) added in theme/i18n
2015-03-28 14:54:50 +01:00
Łukasz Szeremeta 1046bb4133 Add @lszeremeta to translators 2015-03-28 14:48:16 +01:00
Łukasz Szeremeta 5578505213 Polish (pl) added in theme/i18n 2015-03-27 22:03:28 +01:00
32 changed files with 267 additions and 101 deletions
+2
View File
@@ -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
+9
View File
@@ -2,6 +2,15 @@
All notable changes to this project will be documented in this file.
This project adheres to [Semantic Versioning](http://semver.org/).
## 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
+75 -10
View File
@@ -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");
@@ -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,6 +759,34 @@ 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) {
+25 -3
View File
@@ -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;
}
+4 -9
View File
@@ -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) || ".";
+7 -1
View File
@@ -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
View File
@@ -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
};
+3 -3
View File
@@ -1,6 +1,6 @@
{
"name": "gitbook",
"version": "2.0.0",
"version": "2.0.1",
"homepage": "https://www.gitbook.com",
"description": "Library and cmd utility to generate GitBooks",
"main": "lib/index.js",
@@ -12,11 +12,11 @@
"resolve": "0.6.3",
"fs-extra": "0.16.5",
"fstream-ignore": "1.0.2",
"gitbook-parsers": "0.7.2",
"gitbook-parsers": "0.7.4",
"nunjucks": "git+https://github.com/mozilla/nunjucks.git#0f8b21b8df7e8e852b2e1889388653b7075f0d09",
"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",
+3 -1
View File
@@ -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);
});
});
});
+25
View File
@@ -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
View File
@@ -12,7 +12,7 @@
"SEARCH_PLACEHOLDER": "اكتب للبحث",
"FONTSETTINGS_TOGGLE": "إعدادات الخط",
"SHARE_TOGGLE": "حصة",
"SHARE_ON": "على __platform__ حصة",
"SHARE_ON": "على {{platform}} حصة",
"FONTSETTINGS_WHITE": "أبيض",
"FONTSETTINGS_SEPIA": "بني داكن",
"FONTSETTINGS_NIGHT": "ليل",
+1 -1
View File
@@ -11,7 +11,7 @@
"SEARCH_PLACEHOLDER": "অনুসন্ধান",
"FONTSETTINGS_TOGGLE": "ফন্ট সেটিংস",
"SHARE_TOGGLE": "শেয়ার",
"SHARE_ON": "__platform__-এ শেয়ার",
"SHARE_ON": "{{platform}}-এ শেয়ার",
"FONTSETTINGS_WHITE": "সাদা",
"FONTSETTINGS_SEPIA": "সেপিয়া",
"FONTSETTINGS_NIGHT": "রাত",
+1 -1
View File
@@ -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
View File
@@ -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
View File
@@ -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
View File
@@ -12,7 +12,7 @@
"SEARCH_PLACEHOLDER": "چیزی برای جستجو بنویسید",
"FONTSETTINGS_TOGGLE": "تنظیمات فونت",
"SHARE_TOGGLE": "اشتراک",
"SHARE_ON": "در __platform__ به اشتراک بگذارید",
"SHARE_ON": "در {{platform}} به اشتراک بگذارید",
"FONTSETTINGS_WHITE": "سفید",
"FONTSETTINGS_SEPIA": "سپیا",
"FONTSETTINGS_NIGHT": "شب",
+1 -1
View File
@@ -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
View File
@@ -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",
+1 -1
View File
@@ -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",
+20
View File
@@ -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
View File
@@ -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",
+1 -1
View File
@@ -11,7 +11,7 @@
"SEARCH_PLACEHOLDER": "Введите условия поиска",
"FONTSETTINGS_TOGGLE": "Шрифт",
"SHARE_TOGGLE": "Поделиться",
"SHARE_ON": "Поделиться в __platform__",
"SHARE_ON": "Поделиться в {{platform}}",
"FONTSETTINGS_WHITE": "Светлый",
"FONTSETTINGS_SEPIA": "Сепия",
"FONTSETTINGS_NIGHT": "Тёмный",
+1 -1
View File
@@ -11,7 +11,7 @@
"SEARCH_PLACEHOLDER": "输入并搜索",
"FONTSETTINGS_TOGGLE": "字体设置",
"SHARE_TOGGLE": "分享",
"SHARE_ON": "分享到 __platform__",
"SHARE_ON": "分享到 {{platform}}",
"FONTSETTINGS_WHITE": "白色",
"FONTSETTINGS_SEPIA": "棕褐色",
"FONTSETTINGS_NIGHT": "夜间",
+1 -1
View File
@@ -11,7 +11,7 @@
"SEARCH_PLACEHOLDER": "輸入並搜尋",
"FONTSETTINGS_TOGGLE": "字型設定",
"SHARE_TOGGLE": "分享",
"SHARE_ON": "分享到 __platform__",
"SHARE_ON": "分享到 {{platform}}",
"FONTSETTINGS_WHITE": "白色",
"FONTSETTINGS_SEPIA": "棕褐色",
"FONTSETTINGS_NIGHT": "夜間",
+3 -3
View File
@@ -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>
+4 -4
View File
@@ -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 -1
View File
@@ -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>
+20 -10
View File
@@ -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>
+2 -2
View File
@@ -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 %}
+1 -1
View File
@@ -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 %}