diff options
author | Aaron O'Mullan <aaron.omullan@gmail.com> | 2015-03-12 19:33:49 +0100 |
---|---|---|
committer | Samy Pessé <samypesse@gmail.com> | 2016-12-22 15:00:39 +0100 |
commit | 2196afddd60f6a9e050cad7baf4bf6d6935f6769 (patch) | |
tree | c434bf9bb0b5d0e2e80f490e13743ba03bc8af17 /packages/gitbook-markdown/lib/annotate_engine.js | |
parent | 46fd9f8a53a680a3d1ce156c71d061d057ea4e67 (diff) | |
download | gitbook-2196afddd60f6a9e050cad7baf4bf6d6935f6769.zip gitbook-2196afddd60f6a9e050cad7baf4bf6d6935f6769.tar.gz gitbook-2196afddd60f6a9e050cad7baf4bf6d6935f6769.tar.bz2 |
Add lib/annotate_engine.js
Decouple rules and annotation execution
Diffstat (limited to 'packages/gitbook-markdown/lib/annotate_engine.js')
-rw-r--r-- | packages/gitbook-markdown/lib/annotate_engine.js | 43 |
1 files changed, 43 insertions, 0 deletions
diff --git a/packages/gitbook-markdown/lib/annotate_engine.js b/packages/gitbook-markdown/lib/annotate_engine.js new file mode 100644 index 0000000..1feea47 --- /dev/null +++ b/packages/gitbook-markdown/lib/annotate_engine.js @@ -0,0 +1,43 @@ +function annotateEngine(src, rules, ruleTypes, ruleMap) { + var tokens = []; + + while(src) { + // Pick rule + var rule = ruleTypes.filter(function(ruleName, idx) { + var regex = rules[ruleName]; + return regex.exec(src); + })[0]; + + // No matching rules + if(!rule) { + throw new Error('No rule found for: ' + src); + } + + // Use rule to extract block + var ruleRegex = rules[rule]; + var block = ruleRegex.exec(src); + + // Get rule type + var type = ruleMap[rule] || rule; + + // Get raw text + var raw = block[0]; + + // Break out here to avoid infinite loops + if(raw.length === 0) { + break; + } + + tokens.push({ + type: ruleMap[rule] || rule, + raw: raw, + }); + + // Update source + src = src.substring(raw.length); + } + + return tokens +} + +module.exports = annotateEngine; |