diff options
author | Aaron O'Mullan <aaron.omullan@friendco.de> | 2014-04-06 14:50:11 -0700 |
---|---|---|
committer | Aaron O'Mullan <aaron.omullan@friendco.de> | 2014-04-06 14:50:11 -0700 |
commit | 2f8543d7102d0b55b043563ee03e72d38d40cab5 (patch) | |
tree | 44444a9fb06048549d43b5a102d8ca37d64aa363 /lib/generate/site/search_indexer.js | |
parent | aee33d67b63fa5392ee7cec48af441f8068be1e8 (diff) | |
download | gitbook-2f8543d7102d0b55b043563ee03e72d38d40cab5.zip gitbook-2f8543d7102d0b55b043563ee03e72d38d40cab5.tar.gz gitbook-2f8543d7102d0b55b043563ee03e72d38d40cab5.tar.bz2 |
Generate search_index.json when generating site
Fixes #24
Diffstat (limited to 'lib/generate/site/search_indexer.js')
-rw-r--r-- | lib/generate/site/search_indexer.js | 71 |
1 files changed, 71 insertions, 0 deletions
diff --git a/lib/generate/site/search_indexer.js b/lib/generate/site/search_indexer.js new file mode 100644 index 0000000..b239b8b --- /dev/null +++ b/lib/generate/site/search_indexer.js @@ -0,0 +1,71 @@ +var Q = require("q"); +var _ = require("lodash"); + +var lunr = require('lunr'); +var marked = require('marked'); +var textRenderer = require('marked-text-renderer'); + + +function Indexer() { + if(!(this instanceof Indexer)) { + return new Indexer(); + } + + _.bindAll(this); + + // Setup lunr index + this.idx = lunr(function () { + this.ref('url'); + + this.field('title', { boost: 10 }); + this.field('body'); + }); + + this.renderer = textRenderer(); +} + +Indexer.prototype.text = function(nodes) { + // Copy section + var section = _.toArray(nodes); + + // marked's Render expects this, we don't use it yet + section.links = {}; + + var options = _.extend({}, marked.defaults, { + renderer: this.renderer + }); + + return marked.parser(section, options); +}; + +Indexer.prototype.addSection = function(path, section) { + var url = [path, section.id].join('#'); + + var title = this.text( + _.filter(section, {'type': 'heading'}) + ); + + var body = this.text( + _.omit(section, {'type': 'heading'}) + ); + + // Add to lunr index + this.idx.add({ + url: url, + title: title, + body: body, + }); +}; + +Indexer.prototype.add = function(lexedPage, url) { + var sections = lexedPage; + + _.map(sections, _.partial(this.addSection, url)); +}; + +Indexer.prototype.dump = function() { + return JSON.stringify(this.idx); +}; + +// Exports +module.exports = Indexer; |