diff options
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/parse/glossary.js | 1 |
3 files changed, 111 insertions, 1 deletions
diff --git a/lib/generate/site/glossary_indexer.js b/lib/generate/site/glossary_indexer.js new file mode 100644 index 0000000..8f8434d --- /dev/null +++ b/lib/generate/site/glossary_indexer.js @@ -0,0 +1,103 @@ +var _ = require("lodash"); + +var kramed = require('kramed'); +var textRenderer = require('marked-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/parse/glossary.js b/lib/parse/glossary.js index f5d4dae..549e9fd 100644 --- a/lib/parse/glossary.js +++ b/lib/parse/glossary.js @@ -45,3 +45,4 @@ function entryId(name) { } module.exports = parseGlossary; +module.exports.entryId = entryId; |