summaryrefslogtreecommitdiffstats
path: root/packages/gitbook-markdown/lib/annotate_engine.js
diff options
context:
space:
mode:
authorAaron O'Mullan <aaron.omullan@gmail.com>2015-03-12 19:33:49 +0100
committerSamy Pessé <samypesse@gmail.com>2016-12-22 15:00:39 +0100
commit2196afddd60f6a9e050cad7baf4bf6d6935f6769 (patch)
treec434bf9bb0b5d0e2e80f490e13743ba03bc8af17 /packages/gitbook-markdown/lib/annotate_engine.js
parent46fd9f8a53a680a3d1ce156c71d061d057ea4e67 (diff)
downloadgitbook-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.js43
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;