Write glossary for website

This commit is contained in:
Samy Pessé
2015-01-22 21:52:13 +01:00
parent 90789aa5b9
commit 0c8513801c
5 changed files with 44 additions and 20 deletions
+2 -1
View File
@@ -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) || './',
+15 -7
View File
@@ -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;
+9
View File
@@ -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 "<a href='"+links.toAbsolute("GLOSSARY.html", options.base, options.output)+"#"+term.id+"' class='glossary-term' title='"+term.description+"'>"+match+"</span>";
});
});
@@ -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: {},
+6
View File
@@ -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")));
+12 -12
View File
@@ -3,16 +3,16 @@
{% block title %}Glossary | {{ title }}{% endblock %}
{% block page_inner %}
{% for item in glossaryIndex %}
<section class="normal glossary" id="{{ item.id }}">
<h2><a href="#{{ item.id }}">{{ item.name }}</a></h2>
<p>{{ item.description }}</p>
<h4>Index</h4>
<ul class="glossary-index">
{% for file in item.files %}
<li><a href="{{ basePath }}/{{ file.path|contentLink }}"><span class="level">{{ file.level }}.</span> {{ file.title }}</a></li>
{% endfor %}
</ul>
</section>
{% endfor %}
{% for item in glossary %}
<section class="normal glossary" id="{{ item.id }}">
<h2><a href="#{{ item.id }}">{{ item.name }}</a></h2>
<p>{{ item.description }}</p>
<h4>Index</h4>
<ul class="glossary-index">
{% for file in item.files %}
<li><a href="{{ basePath }}/{{ file.path|contentLink }}"><span class="level">{{ file.level }}.</span> {{ file.title }}</a></li>
{% endfor %}
</ul>
</section>
{% endfor %}
{% endblock %}