From 80e2f23714489b7e2cc15e4372aa2dc1d681be9e Mon Sep 17 00:00:00 2001 From: Aaron O'Mullan Date: Sun, 17 Aug 2014 21:13:39 -0700 Subject: [PATCH 1/6] Add "id" attribute to parsed glossary entries --- lib/parse/glossary.js | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/lib/parse/glossary.js b/lib/parse/glossary.js index 6286783bd..1b6279b36 100644 --- a/lib/parse/glossary.js +++ b/lib/parse/glossary.js @@ -33,9 +33,15 @@ 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; From 93e0864063e8b0a451b4ed946a6d909299907a10 Mon Sep 17 00:00:00 2001 From: Aaron O'Mullan Date: Sun, 17 Aug 2014 21:18:42 -0700 Subject: [PATCH 2/6] Fix dump typo in glossary's entryId func --- lib/parse/glossary.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/parse/glossary.js b/lib/parse/glossary.js index 1b6279b36..f5d4dae8c 100644 --- a/lib/parse/glossary.js +++ b/lib/parse/glossary.js @@ -41,7 +41,7 @@ function parseGlossary(src) { // Normalizes a glossary entry's name to create an ID function entryId(name) { - return name.toLowercase(); + return name.toLowerCase(); } module.exports = parseGlossary; From 4c921bdc091592f7e66aaabedd1477cc6bffe387 Mon Sep 17 00:00:00 2001 From: Aaron O'Mullan Date: Mon, 18 Aug 2014 12:01:12 -0700 Subject: [PATCH 3/6] Use kramed-text-renderer (0.2.1) --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 2cae79ef4..048f2a58f 100644 --- a/package.json +++ b/package.json @@ -8,7 +8,7 @@ "q": "1.0.1", "lodash": "2.4.1", "kramed": "0.4.0", - "marked-text-renderer": "0.1.0", + "kramed-text-renderer": "0.2.1", "lunr": "0.5.2", "swig": "1.3.2", "send": "0.2.0", From 4f9b474fdd87dada179efe86300c96278e263be5 Mon Sep 17 00:00:00 2001 From: Aaron O'Mullan Date: Mon, 18 Aug 2014 12:01:26 -0700 Subject: [PATCH 4/6] Use kramed 0.4.1 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 048f2a58f..af0c2bd67 100644 --- a/package.json +++ b/package.json @@ -7,7 +7,7 @@ "dependencies": { "q": "1.0.1", "lodash": "2.4.1", - "kramed": "0.4.0", + "kramed": "0.4.1", "kramed-text-renderer": "0.2.1", "lunr": "0.5.2", "swig": "1.3.2", From 90320fd26c60fce5615be09e0c03c486b567e8bd Mon Sep 17 00:00:00 2001 From: Aaron O'Mullan Date: Mon, 18 Aug 2014 17:25:26 -0700 Subject: [PATCH 5/6] Add glossary indexing --- lib/generate/site/glossary_indexer.js | 103 ++++++++++++++++++++++++++ lib/generate/site/index.js | 8 +- lib/parse/glossary.js | 1 + 3 files changed, 111 insertions(+), 1 deletion(-) create mode 100644 lib/generate/site/glossary_indexer.js diff --git a/lib/generate/site/glossary_indexer.js b/lib/generate/site/glossary_indexer.js new file mode 100644 index 000000000..8f8434d38 --- /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 1846da10e..588ffdb88 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 f5d4dae8c..549e9fda5 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; From fbd7522748882b9b223e536ac1e935dc1c8bcb80 Mon Sep 17 00:00:00 2001 From: Aaron O'Mullan Date: Mon, 18 Aug 2014 18:36:38 -0700 Subject: [PATCH 6/6] Replace kramed-text-renderer references MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit with “kramed-text-renderer” --- lib/generate/site/glossary_indexer.js | 2 +- lib/generate/site/search_indexer.js | 2 +- lib/parse/readme.js | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/generate/site/glossary_indexer.js b/lib/generate/site/glossary_indexer.js index 8f8434d38..d46e3930b 100644 --- a/lib/generate/site/glossary_indexer.js +++ b/lib/generate/site/glossary_indexer.js @@ -1,7 +1,7 @@ var _ = require("lodash"); var kramed = require('kramed'); -var textRenderer = require('marked-text-renderer'); +var textRenderer = require('kramed-text-renderer'); var entryId = require('../../parse/glossary').entryId; diff --git a/lib/generate/site/search_indexer.js b/lib/generate/site/search_indexer.js index 54a04de08..7cfe29a06 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/readme.js b/lib/parse/readme.js index 7044ce8ad..9d8f5527c 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)