summaryrefslogtreecommitdiffstats
path: root/lib/generate/site/search_indexer.js
diff options
context:
space:
mode:
authorAaron O'Mullan <aaron.omullan@friendco.de>2014-04-06 14:50:11 -0700
committerAaron O'Mullan <aaron.omullan@friendco.de>2014-04-06 14:50:11 -0700
commit2f8543d7102d0b55b043563ee03e72d38d40cab5 (patch)
tree44444a9fb06048549d43b5a102d8ca37d64aa363 /lib/generate/site/search_indexer.js
parentaee33d67b63fa5392ee7cec48af441f8068be1e8 (diff)
downloadgitbook-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.js71
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;