diff options
author | Samy Pessé <samypesse@gmail.com> | 2014-08-18 19:14:14 -0700 |
---|---|---|
committer | Samy Pessé <samypesse@gmail.com> | 2014-08-18 19:14:14 -0700 |
commit | f77404afe180e97692897237dca7598eae33a761 (patch) | |
tree | acc8edad99500f7aac919ab2f7d6d19274c3bd81 /lib | |
parent | 00496dbd09440d246ca903623ab093274d834e21 (diff) | |
parent | fbd7522748882b9b223e536ac1e935dc1c8bcb80 (diff) | |
download | gitbook-f77404afe180e97692897237dca7598eae33a761.zip gitbook-f77404afe180e97692897237dca7598eae33a761.tar.gz gitbook-f77404afe180e97692897237dca7598eae33a761.tar.bz2 |
Merge pull request #411 from GitbookIO/glossary-search
Glossary search
Diffstat (limited to 'lib')
-rw-r--r-- | lib/generate/site/glossary_indexer.js | 103 | ||||
-rw-r--r-- | lib/generate/site/index.js | 8 | ||||
-rw-r--r-- | lib/generate/site/search_indexer.js | 2 | ||||
-rw-r--r-- | lib/parse/glossary.js | 7 | ||||
-rw-r--r-- | lib/parse/readme.js | 2 |
5 files changed, 119 insertions, 3 deletions
diff --git a/lib/generate/site/glossary_indexer.js b/lib/generate/site/glossary_indexer.js new file mode 100644 index 0000000..d46e393 --- /dev/null +++ b/lib/generate/site/glossary_indexer.js @@ -0,0 +1,103 @@ +var _ = require("lodash"); + +var kramed = require('kramed'); +var textRenderer = require('kramed-text-renderer'); + +var entryId = require('../../parse/glossary').entryId; + + +function Indexer(glossary) { + if(!(this instanceof Indexer)) { + return new Indexer(glossary); + } + + _.bindAll(this); + + this.glossary = glossary || []; + + this.glossaryTerms = _.pluck(this.glossary, "id"); + + // Regex for searching for terms through body + this.termsRegex = new RegExp( + // Match any of the terms + "("+ + this.glossaryTerms.map(regexEscape).join('|') + + ")", + + // Flags + "gi" + ); + + // debug + console.log('term regex =', this.termsRegex); + + // page url => terms + this.idx = { + /* + "a/b.html": ["one word", "second word"] + */ + }; + + // term => page urls + this.invertedIdx = { + /* + "word1": ["page1.html", "page2.html"] + */ + }; + + // Use text renderer + this.renderer = textRenderer(); +} + +Indexer.prototype.text = function(nodes) { + // Copy section + var section = _.toArray(nodes); + + // kramed's Render expects this, we don't use it yet + section.links = {}; + + var options = _.extend({}, kramed.defaults, { + renderer: this.renderer + }); + + return kramed.parser(section, options); +}; + +// Add page to glossary index +Indexer.prototype.add = function(sections, url) { + if(!(this.glossary && this.glossary.length > 0)) { + console.log('Glossary =', this.glossary); + console.log('No glossary to match'); + return; + } + + var textblob = + _.where(sections, { type: 'normal' }) + .map(this.text) + .join('\n'); + + var matches = _(textblob.match(this.termsRegex) || []) + .map(entryId) + .uniq() + .value(); + + // Add idx for book + this.idx[url] = matches; + + // Add to inverted idx + matches.forEach(function(match) { + if(!this.invertedIdx[match]) { + this.invertedIdx[match] = []; + } + this.invertedIdx[match].push(url); + }.bind(this)); +}; + + + +function regexEscape(s) { + return s.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&'); +} + +// Exports +module.exports = Indexer; diff --git a/lib/generate/site/index.js b/lib/generate/site/index.js index 1846da1..588ffdb 100644 --- a/lib/generate/site/index.js +++ b/lib/generate/site/index.js @@ -9,7 +9,7 @@ var parse = require("../../parse"); var BaseGenerator = require("../generator"); var links = require("../../utils/links"); var indexer = require('./search_indexer'); - +var glossaryIndexer = require('./glossary_indexer'); var Generator = function() { @@ -85,7 +85,13 @@ Generator.prototype._writeTemplate = function(tpl, options, output, interpolate) }; Generator.prototype.indexPage = function(lexed, pagePath) { + // Setup glossary indexer if not yet setup + if(!this.glossaryIndexer) { + this.glossaryIndexer = glossaryIndexer(this.options.glossary); + } + this.indexer.add(lexed, pagePath); + this.glossaryIndexer.add(lexed, pagePath); return Q(); }; diff --git a/lib/generate/site/search_indexer.js b/lib/generate/site/search_indexer.js index 54a04de..7cfe29a 100644 --- a/lib/generate/site/search_indexer.js +++ b/lib/generate/site/search_indexer.js @@ -3,7 +3,7 @@ var _ = require("lodash"); var lunr = require('lunr'); var kramed = require('kramed'); -var textRenderer = require('marked-text-renderer'); +var textRenderer = require('kramed-text-renderer'); function Indexer() { diff --git a/lib/parse/glossary.js b/lib/parse/glossary.js index 6286783..549e9fd 100644 --- a/lib/parse/glossary.js +++ b/lib/parse/glossary.js @@ -33,9 +33,16 @@ function parseGlossary(src) { // Simplify each group to a simple object with name/description return { name: pair[0].text, + id: entryId(pair[0].text), description: pair[1].text, }; }); } +// Normalizes a glossary entry's name to create an ID +function entryId(name) { + return name.toLowerCase(); +} + module.exports = parseGlossary; +module.exports.entryId = entryId; diff --git a/lib/parse/readme.js b/lib/parse/readme.js index 7044ce8..9d8f552 100644 --- a/lib/parse/readme.js +++ b/lib/parse/readme.js @@ -1,6 +1,6 @@ var _ = require('lodash'); var kramed = require('kramed'); -var textRenderer = require('marked-text-renderer'); +var textRenderer = require('kramed-text-renderer'); function extractFirstNode(nodes, nType) { return _.chain(nodes) |