diff options
author | Aaron O'Mullan <aaron.omullan@gmail.com> | 2015-03-12 19:30:07 +0100 |
---|---|---|
committer | Samy Pessé <samypesse@gmail.com> | 2016-12-22 15:00:39 +0100 |
commit | 46fd9f8a53a680a3d1ce156c71d061d057ea4e67 (patch) | |
tree | d1d014fbfe8798c0d79d34b4e656240a58e26b26 | |
parent | 3d6414d2d1c41907c5a1ccd47b2d6229c1b393dc (diff) | |
download | gitbook-46fd9f8a53a680a3d1ce156c71d061d057ea4e67.zip gitbook-46fd9f8a53a680a3d1ce156c71d061d057ea4e67.tar.gz gitbook-46fd9f8a53a680a3d1ce156c71d061d057ea4e67.tar.bz2 |
Replace markdown-renderer with annotater
Handle blocks for now
-rw-r--r-- | packages/gitbook-markdown/lib/annotate.js | 80 | ||||
-rw-r--r-- | packages/gitbook-markdown/lib/page.js | 31 | ||||
-rw-r--r-- | packages/gitbook-markdown/package.json | 1 |
3 files changed, 98 insertions, 14 deletions
diff --git a/packages/gitbook-markdown/lib/annotate.js b/packages/gitbook-markdown/lib/annotate.js new file mode 100644 index 0000000..dab3d0e --- /dev/null +++ b/packages/gitbook-markdown/lib/annotate.js @@ -0,0 +1,80 @@ +// Pulled from "kramed.Lexer.rules.tables" +var rules = { newline: /^\n+/, + code: /^( {4}[^\n]+\n*)+/, + fences: /^ *(`{3,}|~{3,}) *(\S+)? *\n([\s\S]+?)\s*\1 *(?:\n+|$)/, + hr: /^( *[-*_]){3,} *(?:\n+|$)/, + heading: /^ *(#{1,6}) *([^\n]+?) *#* *(?:\n+|$)/, + nptable: /^ *(\S.*\|.*)\n *([-:]+ *\|[-| :]*)\n((?:.*\|.*(?:\n|$))*)\n*/, + lheading: /^([^\n]+)\n *(=|-){2,} *(?:\n+|$)/, + blockquote: /^( *>[^\n]+(\n(?! *\[([^\]]+)\]: *<?([^\s>]+)>?(?: +["(]([^\n]+)[")])? *(?:\n+|$))[^\n]+)*\n*)+/, + list: /^( *)((?:[*+-]|\d+\.)) [\s\S]+?(?:\n+(?=\1?(?:[-*_] *){3,}(?:\n+|$))|\n+(?= *\[([^\]]+)\]: *<?([^\s>]+)>?(?: +["(]([^\n]+)[")])? *(?:\n+|$))|\n{2,}(?! )(?!\1(?:[*+-]|\d+\.) )\n*|\s*$)/, + html: /^ *(?:<!--[\s\S]*?--> *(?:\n|\s*$)|<((?!(?:a|em|strong|small|s|cite|q|dfn|abbr|data|time|code|var|samp|kbd|sub|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo|span|br|wbr|ins|del|img)\b)\w+(?!:\/|[^\w\s@]*@)\b)[\s\S]+?<\/\1> *(?:\n{2,}|\s*$)|<(?!(?:a|em|strong|small|s|cite|q|dfn|abbr|data|time|code|var|samp|kbd|sub|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo|span|br|wbr|ins|del|img)\b)\w+(?!:\/|[^\w\s@]*@)\b(?:"[^"]*"|'[^']*'|[^'">])*?> *(?:\n{2,}|\s*$))/, + def: /^ *\[([^\]]+)\]: *<?([^\s>]+)>?(?: +["(]([^\n]+)[")])? *(?:\n+|$)/, + footnote: /^\[\^([^\]]+)\]: ([^\n]+)/, + table: /^ *\|(.+)\n *\|( *[-:]+[-| :]*)\n((?: *\|.*(?:\n|$))*)\n*/, + paragraph: /^((?:[^\n]+\n?(?! *(`{3,}|~{3,}) *(\S+)? *\n([\s\S]+?)\s*\2 *(?:\n+|$)|( *)((?:[*+-]|\d+\.)) [\s\S]+?(?:\n+(?=\3?(?:[-*_] *){3,}(?:\n+|$))|\n+(?= *\[([^\]]+)\]: *<?([^\s>]+)>?(?: +["(]([^\n]+)[")])? *(?:\n+|$))|\n{2,}(?! )(?!\1(?:[*+-]|\d+\.) )\n*|\s*$)|( *[-*_]){3,} *(?:\n+|$)| *(#{1,6}) *([^\n]+?) *#* *(?:\n+|$)|([^\n]+)\n *(=|-){2,} *(?:\n+|$)|( *>[^\n]+(\n(?! *\[([^\]]+)\]: *<?([^\s>]+)>?(?: +["(]([^\n]+)[")])? *(?:\n+|$))[^\n]+)*\n*)+|<(?!(?:a|em|strong|small|s|cite|q|dfn|abbr|data|time|code|var|samp|kbd|sub|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo|span|br|wbr|ins|del|img)\b)\w+(?!:\/|[^\w\s@]*@)\b| *\[([^\]]+)\]: *<?([^\s>]+)>?(?: +["(]([^\n]+)[")])? *(?:\n+|$)| *(\${2,}) *([\s\S]+?)\s*\1 *(?:\n+|$)))+)\n*/, + text: /^[^\n]+/, + math: /^ *(\${2,}) *([\s\S]+?)\s*\1 *(?:\n+|$)/, + // These are lower level, ignore them + //bullet: /(?:[*+-]|\d+\.)/, + //item: /^( *)((?:[*+-]|\d+\.)) [^\n]*(?:\n(?!\1(?:[*+-]|\d+\.) )[^\n]*)*/gm, + //_tag: '(?!(?:a|em|strong|small|s|cite|q|dfn|abbr|data|time|code|var|samp|kbd|sub|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo|span|br|wbr|ins|del|img)\\b)\\w+(?!:/|[^\\w\\s@]*@)\\b' +}; + +// List of all the regexes we want to run +var ruleTypes = [ +'newline', 'code', 'fences', 'footnote', 'math', 'heading', +'nptable', 'lheading', 'hr', 'blockquote', 'list', +'html', 'def', 'table', 'paragraph', 'text', +]; + +// Mapping if rule type is different from token type +var ruleMap = { + 'nptable': 'table', + 'lheading': 'heading', + 'newline': 'space', +} + +function annotate(src) { + 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 = annotate; diff --git a/packages/gitbook-markdown/lib/page.js b/packages/gitbook-markdown/lib/page.js index 5876beb..d98bb72 100644 --- a/packages/gitbook-markdown/lib/page.js +++ b/packages/gitbook-markdown/lib/page.js @@ -3,27 +3,32 @@ var kramed = require('kramed'); var hljs = require('highlight.js'); var lnormalize = require('./utils/lang').normalize; -var mdRenderer = require('kramed-markdown-renderer'); +var annotate = require('./annotate'); var RAW_START = "{% raw %}"; var RAW_END = "{% endraw %}"; -function preparePage(src) { - var renderer = mdRenderer(); +function escape(str) { + return RAW_START + str + RAW_END; +} - var escape = function(func, code, lang, escaped) { - return RAW_START+func(code, lang, escaped)+RAW_END; - }; +// Combines annotated nodes +function combine(nodes) { + return _.pluck(nodes, 'raw').join(''); +} - renderer.code = _.wrap(renderer.code, escape); - renderer.codespan = _.wrap(renderer.codespan, escape); +function preparePage(src) { + var lexed = annotate(src); - var options = _.extend({}, kramed.defaults, { - renderer: renderer, - escape: false - }); + // Escape code blocks + var escaped = lexed.map(function(el) { + if(el.type == 'code') { + el.raw = escape(el.raw); + } + return el; + }) - return kramed(src, options); + return combine(escaped); } function parsePage(src) { diff --git a/packages/gitbook-markdown/package.json b/packages/gitbook-markdown/package.json index 4e8b919..7ae1989 100644 --- a/packages/gitbook-markdown/package.json +++ b/packages/gitbook-markdown/package.json @@ -8,7 +8,6 @@ "lodash": "^3.2.0", "kramed": "0.4.6", "kramed-text-renderer": "0.2.1", - "kramed-markdown-renderer": "0.1.2", "highlight.js": "8.4.0" }, "devDependencies": { |