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 | |
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
-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 | ||||
-rw-r--r-- | package.json | 4 |
6 files changed, 121 insertions, 5 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) diff --git a/package.json b/package.json index 2cae79e..af0c2bd 100644 --- a/package.json +++ b/package.json @@ -7,8 +7,8 @@ "dependencies": { "q": "1.0.1", "lodash": "2.4.1", - "kramed": "0.4.0", - "marked-text-renderer": "0.1.0", + "kramed": "0.4.1", + "kramed-text-renderer": "0.2.1", "lunr": "0.5.2", "swig": "1.3.2", "send": "0.2.0", |