From 0c8513801c131ec6e2c7b348403a4c66a9bf2a11 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Samy=20Pess=C3=A9?= Date: Thu, 22 Jan 2015 21:52:13 +0100 Subject: [PATCH] Write glossary for website --- lib/book.js | 3 ++- lib/generators/site.js | 22 +++++++++++++++------- lib/utils/page.js | 9 +++++++++ test/website.js | 6 ++++++ theme/templates/website/glossary.html | 24 ++++++++++++------------ 5 files changed, 44 insertions(+), 20 deletions(-) diff --git a/lib/book.js b/lib/book.js index 036844f17..90322f28f 100644 --- a/lib/book.js +++ b/lib/book.js @@ -282,7 +282,7 @@ Book.prototype.parseGlossary = function() { return that.findFile(that.config.getStructure("glossary")) .then(function(glossary) { - if (!glossary) return {}; + if (!glossary) return []; // Remove the glossary from the list of files to parse that.files = _.without(that.files, glossary.path); @@ -325,6 +325,7 @@ Book.prototype.parsePage = function(filename) { // Content sections page.sections = pageUtil.normalize(page.sections, { + input: filename, navigation: that.navigation, base: path.dirname(filename) || './', output: path.dirname(filename) || './', diff --git a/lib/generators/site.js b/lib/generators/site.js index d5a0c0847..51a6cb309 100644 --- a/lib/generators/site.js +++ b/lib/generators/site.js @@ -89,6 +89,7 @@ Generator.prototype.prepareTemplates = function() { Generator.prototype.finish = function() { return this.copyAssets() .then(this.copyCover) + .then(this.writeGlossary) }; // Normalize a link to .html and convert README -> index @@ -131,16 +132,21 @@ Generator.prototype.writeParsedFile = function(page) { // Write the index for langs Generator.prototype.langsIndex = function(langs) { var that = this; - var basePath = "."; return this._writeTemplate(this.langsTemplate, { - langs: langs, - - basePath: basePath, - staticBase: path.join(basePath, "gitbook"), + langs: langs }, path.join(this.options.output, "index.html")); }; +// Write glossary +Generator.prototype.writeGlossary = function() { + var that = this; + + // No glossary + if (this.book.glossary.length == 0) return Q(); + + return this._writeTemplate(this.glossaryTemplate, {}, path.join(this.options.output, "GLOSSARY.html")); +}; // Convert a page into a normalized data set Generator.prototype.normalizePage = function(page) { @@ -189,7 +195,10 @@ Generator.prototype._writeTemplate = function(tpl, options, output, interpolate) pluginsConfig: JSON.stringify(that.options.pluginsConfig), htmlSnippet: _.partialRight(that.plugins.html, that, options), - options: that.options + options: that.options, + + basePath: ".", + staticBase: path.join(".", "gitbook"), }, options) ); }) @@ -202,7 +211,6 @@ Generator.prototype._writeTemplate = function(tpl, options, output, interpolate) }); }; - // Copy assets Generator.prototype.copyAssets = function() { var that = this; diff --git a/lib/utils/page.js b/lib/utils/page.js index 9a468d675..0168831de 100644 --- a/lib/utils/page.js +++ b/lib/utils/page.js @@ -95,9 +95,15 @@ function normalizeHtml(src, options) { // Replace glossayr terms _.each(options.glossary, function(term) { var r = new RegExp( "\\b(" + pregQuote(term.name.toLowerCase()) + ")\\b" , 'gi' ); + var includedInFiles = false; $("*").each(function() { replaceText($, this, r, function(match) { + if (!includedInFiles) { + includedInFiles = true; + term.files = term.files || []; + term.files.push(options.navigation[options.input]); + } return ""+match+""; }); }); @@ -110,6 +116,9 @@ function normalizeHtml(src, options) { // Adapt page content to be relative to a base folder function normalizePage(sections, options) { options = _.defaults(options || {}, { + // Current file path + input: ".", + // Navigation to use to transform path navigation: {}, diff --git a/test/website.js b/test/website.js index 54dfc8ab8..064d2268a 100644 --- a/test/website.js +++ b/test/website.js @@ -22,6 +22,12 @@ describe('Website Generator', function () { }, done); }); + it('should correctly include glossary in website', function(done) { + testGeneration(books[0], "site", function(output) { + assert(fs.existsSync(path.join(output, "GLOSSARY.html"))); + }, done); + }); + it('should correctly generate a multilingual book to website', function(done) { testGeneration(books[2], "site", function(output) { assert(fs.existsSync(path.join(output, "index.html"))); diff --git a/theme/templates/website/glossary.html b/theme/templates/website/glossary.html index 5841f5e97..e19d1b94c 100644 --- a/theme/templates/website/glossary.html +++ b/theme/templates/website/glossary.html @@ -3,16 +3,16 @@ {% block title %}Glossary | {{ title }}{% endblock %} {% block page_inner %} -{% for item in glossaryIndex %} -
-

{{ item.name }}

-

{{ item.description }}

-

Index

- -
-{% endfor %} + {% for item in glossary %} +
+

{{ item.name }}

+

{{ item.description }}

+

Index

+ +
+ {% endfor %} {% endblock %}