diff options
author | Samy Pessé <samypesse@gmail.com> | 2016-02-20 15:31:59 +0100 |
---|---|---|
committer | Samy Pessé <samypesse@gmail.com> | 2016-12-22 15:00:51 +0100 |
commit | dbee17ddec2e786fbf02572e7bf6050c207b492f (patch) | |
tree | 8d93bd8eb985e3bd8132612935bc5a1583fe15e3 /packages/gitbook-markdown/lib | |
parent | 9b3888005d5098079056fa889a84e75cf3c57670 (diff) | |
download | gitbook-dbee17ddec2e786fbf02572e7bf6050c207b492f.zip gitbook-dbee17ddec2e786fbf02572e7bf6050c207b492f.tar.gz gitbook-dbee17ddec2e786fbf02572e7bf6050c207b492f.tar.bz2 |
Use gitbook-html as base parser
Diffstat (limited to 'packages/gitbook-markdown/lib')
-rw-r--r-- | packages/gitbook-markdown/lib/glossary.js | 52 | ||||
-rw-r--r-- | packages/gitbook-markdown/lib/index.js | 16 | ||||
-rw-r--r-- | packages/gitbook-markdown/lib/langs.js | 21 | ||||
-rw-r--r-- | packages/gitbook-markdown/lib/page.js | 34 | ||||
-rw-r--r-- | packages/gitbook-markdown/lib/readme.js | 45 | ||||
-rw-r--r-- | packages/gitbook-markdown/lib/summary.js | 179 | ||||
-rw-r--r-- | packages/gitbook-markdown/lib/tohtml.js | 20 | ||||
-rw-r--r-- | packages/gitbook-markdown/lib/tomarkdown.js | 43 |
8 files changed, 76 insertions, 334 deletions
diff --git a/packages/gitbook-markdown/lib/glossary.js b/packages/gitbook-markdown/lib/glossary.js deleted file mode 100644 index 256b52c..0000000 --- a/packages/gitbook-markdown/lib/glossary.js +++ /dev/null @@ -1,52 +0,0 @@ -var _ = require('lodash'); -var kramed = require('kramed'); - -// Get all the pairs of header + paragraph in a list of nodes -function groups(nodes) { - // A list of next nodes - var next = nodes.slice(1).concat(null); - - return _.reduce(nodes, function(accu, node, idx) { - // Skip - if(!( - node.type === 'heading' && - (next[idx] && next[idx].type === 'paragraph') - )) { - return accu; - } - - // Add group - accu.push([ - node, - next[idx] - ]); - - return accu; - }, []); -} - -function parseGlossary(src) { - var nodes = kramed.lexer(src); - - return groups(nodes) - .map(function(pair) { - // Simplify each group to a simple object with name/description - return { - name: pair[0].text, - description: pair[1].text, - }; - }); -} - -function glossaryToMarkdown(glossary) { - var bl = "\n"; - - var body = _.map(glossary, function(entry) { - return "## "+entry.name+bl+bl+entry.description; - }).join(bl+bl); - - return "# Glossary"+bl+bl+body; -} - -module.exports = parseGlossary; -module.exports.toText = glossaryToMarkdown; diff --git a/packages/gitbook-markdown/lib/index.js b/packages/gitbook-markdown/lib/index.js index 55ba205..1f575a5 100644 --- a/packages/gitbook-markdown/lib/index.js +++ b/packages/gitbook-markdown/lib/index.js @@ -1,10 +1,8 @@ -var kramed = require("kramed"); -var _ = require("lodash"); +var htmlParser = require('gitbook-html'); -module.exports = { - summary: require("./summary"), - glossary: require("./glossary"), - langs: require("./langs"), - readme: require("./readme"), - page: require("./page") -}; +var toHTML = require('./tohtml'); +var toMarkdown = require('./tomarkdown'); +var page = require('./page'); + +module.exports = htmlParser.createParser(toHTML, toMarkdown); +module.exports.page.prepare = page.prepare; diff --git a/packages/gitbook-markdown/lib/langs.js b/packages/gitbook-markdown/lib/langs.js deleted file mode 100644 index 3da906d..0000000 --- a/packages/gitbook-markdown/lib/langs.js +++ /dev/null @@ -1,21 +0,0 @@ -var _ = require("lodash"); -var parseEntries = require("./summary").entries; - - -function parseLangs(content) { - return parseEntries(content); -} - -function langsToMarkdown(langs) { - var bl = "\n"; - var content = "# Languages"+bl+bl; - - _.each(langs, function(lang) { - content = content + "* ["+lang.title+"]("+lang.path+")"+bl; - }); - - return content; -} - -module.exports = parseLangs; -module.exports.toText = langsToMarkdown; diff --git a/packages/gitbook-markdown/lib/page.js b/packages/gitbook-markdown/lib/page.js index 3a92086..d8a5119 100644 --- a/packages/gitbook-markdown/lib/page.js +++ b/packages/gitbook-markdown/lib/page.js @@ -1,10 +1,9 @@ var _ = require('lodash'); var kramed = require('kramed'); - var annotate = require('kramed/lib/annotate/'); -var RAW_START = "{% raw %}"; -var RAW_END = "{% endraw %}"; +var RAW_START = '{% raw %}'; +var RAW_END = '{% endraw %}'; function escape(str) { return RAW_START + str + RAW_END; @@ -15,6 +14,7 @@ function combine(nodes) { return _.pluck(nodes, 'raw').join(''); } +// Add templating "raw" to code blocks function preparePage(src) { var lexed = annotate.blocks(src); var levelRaw = 0; @@ -54,28 +54,6 @@ function preparePage(src) { return combine(escaped); } -function parsePage(src) { - var options = _.extend({}, kramed.defaults, { - mathjax: false, - renderer: new kramed.Renderer({ - langPrefix: 'lang-', - smartypants: false, - headerPrefix: '', - headerAutoId: false, - xhtml: false - }) - }); - - return { - sections: [ - { - type: "normal", - content: kramed(src, options) - } - ] - }; -} - -// Exports -module.exports = parsePage; -module.exports.prepare = preparePage; +module.exports = { + prepare: preparePage +}; diff --git a/packages/gitbook-markdown/lib/readme.js b/packages/gitbook-markdown/lib/readme.js deleted file mode 100644 index 9d8f552..0000000 --- a/packages/gitbook-markdown/lib/readme.js +++ /dev/null @@ -1,45 +0,0 @@ -var _ = require('lodash'); -var kramed = require('kramed'); -var textRenderer = require('kramed-text-renderer'); - -function extractFirstNode(nodes, nType) { - return _.chain(nodes) - .filter(function(node) { - return node.type == nType; - }) - .pluck("text") - .first() - .value(); -} - - -function parseReadme(src) { - var nodes, title, description; - var renderer = textRenderer(); - - // Parse content - nodes = kramed.lexer(src); - - title = extractFirstNode(nodes, "heading") || ''; - description = extractFirstNode(nodes, "paragraph") || ''; - - var convert = _.compose( - function(text) { - return _.unescape(text.replace(/(\r\n|\n|\r)/gm, "")); - }, - function(text) { - return kramed.parse(text, _.extend({}, kramed.defaults, { - renderer: renderer - })); - } - ); - - return { - title: convert(title), - description: convert(description) - }; -} - - -// Exports -module.exports = parseReadme; diff --git a/packages/gitbook-markdown/lib/summary.js b/packages/gitbook-markdown/lib/summary.js deleted file mode 100644 index 77284cf..0000000 --- a/packages/gitbook-markdown/lib/summary.js +++ /dev/null @@ -1,179 +0,0 @@ -var _ = require('lodash'); -var kramed = require('kramed'); - - -// Utility function for splitting a list into groups -function splitBy(list, starter, ender) { - var starts = 0; - var ends = 0; - var group = []; - - // Groups - return _.reduce(list, function(groups, value) { - // Ignore start and end delimiters in resulted groups - if(starter(value)) { - starts++; - } else if(ender(value)) { - ends++; - } - - // Add current value to group - group.push(value); - - // We've got a matching - if(starts === ends && starts !== 0) { - // Add group to end groups - // (remove starter and ender token) - groups.push(group.slice(1, -1)); - - // Reset group - group = []; - } - - return groups; - }, []); -} - -function skipSpace(nodes) { - return _.filter(nodes, function(node) { - return node && node.type != 'space'; - }); -} - -function correctLoose(nodes) { - return _.map(nodes, function(node) { - // Return normal nodes - if(!node || node.type != 'loose_item_start') { - return node - } - - // Correct loose items - node.type = 'list_item_start'; - - return node; - }) -} - -function listSplit(nodes, start_type, end_type) { - return splitBy(nodes, function(el) { - return el.type === start_type; - }, function(el) { - return el.type === end_type; - }); -} - -// Get the biggest list -// out of a list of kramed nodes -function filterList(nodes) { - return _.chain(nodes) - .toArray() - .dropWhile(function(el) { - // Get everything after list_start - return el.type !== 'list_start'; - }) - .reverse() - .dropWhile(function(el) { - // Get everything after list_end (remember we're reversed) - return el.type !== 'list_end'; - }) - .reverse() - .value().slice(1, -1); -} - -// Parses an Article or Chapter title -// supports extracting links -function parseTitle(src) { - // Check if it's a link - var matches = kramed.InlineLexer.rules.link.exec(src); - - // Not a link, return plain text - if(!matches) { - return { - title: src, - path: null, - }; - } - - return { - title: matches[1], - path: matches[2], - }; -} - -function parseChapter(nodes) { - var node = _.first(nodes); - if (!node) return null; - if (!node.text) throw new Error("Invalid entry in the SUMMARY"); - - return _.extend(parseTitle(node.text), { - articles: _.chain(listSplit(filterList(nodes), 'list_item_start', 'list_item_end')) - .map(function(nodes, i) { - return parseChapter(nodes); - }) - .compact() - .value() - }); -} - -function listGroups(src) { - var nodes = kramed.lexer(src); - - // Get out groups of lists - return listSplit( - filterList(correctLoose(skipSpace(nodes))), - 'list_item_start', 'list_item_end' - ); -} - -function parseSummary(src) { - // Split out chapter sections - var chapters = _.chain(listGroups(src)) - .map(parseChapter) - .compact() - .value(); - - return { - chapters: chapters - }; -} - -function parseEntries(src) { - return _.chain(listGroups(src)) - .map(parseChapter) - .compact() - .value(); -} - - -function summaryToMarkdown(summary) { - var bl = "\n"; - var content = "# Summary"+bl+bl; - - var _base = function(article) { - if (article.path) { - return "* ["+article.title+"]("+article.path+")"; - } else { - return "* "+article.title; - } - }; - - var convertArticle = function(article, d) { - content = content + Array(4*d).join(" ") + _base(article)+bl; - _.each(article.articles, function(_article) { - convertArticle(_article, d + 1); - }); - }; - - _.each(summary.chapters, function(chapter) { - convertArticle(chapter, 0); - }); - - content = content+bl; - - return content; -}; - - -module.exports = parseSummary; -module.exports.entries = parseEntries; -module.exports.toText = summaryToMarkdown; diff --git a/packages/gitbook-markdown/lib/tohtml.js b/packages/gitbook-markdown/lib/tohtml.js new file mode 100644 index 0000000..9647363 --- /dev/null +++ b/packages/gitbook-markdown/lib/tohtml.js @@ -0,0 +1,20 @@ +var _ = require('lodash'); +var kramed = require('kramed'); + +// Convert markdown to HTML +function convertMdToHTML(src) { + var options = _.extend({}, kramed.defaults, { + mathjax: false, + renderer: new kramed.Renderer({ + langPrefix: 'lang-', + smartypants: false, + headerPrefix: '', + headerAutoId: false, + xhtml: false + }) + }); + + return kramed(src, options); +} + +module.exports = convertMdToHTML; diff --git a/packages/gitbook-markdown/lib/tomarkdown.js b/packages/gitbook-markdown/lib/tomarkdown.js new file mode 100644 index 0000000..5bee4e0 --- /dev/null +++ b/packages/gitbook-markdown/lib/tomarkdown.js @@ -0,0 +1,43 @@ + +// Return N time a string +function ns(s, n) { + return Array(n + 1).join(s); +} + +module.exports = { + onTitleStart: function(level) { + return ns('#', level) + ' '; + }, + onTitleEnd: function(level) { + return this.onBL(); + }, + + onParagraphStart: function() { + return this.onSection(); + }, + onParagraphEnd: function() { + return this.onSection(); + }, + + onLinkStart: function() { + return '['; + }, + onLinkEnd: function(href) { + return '](' + href +')'; + }, + + onListStart: function(level) { + return ''; + }, + onListEnd: function() { + return ''; + }, + + onListItemStart: function(level) { + return ns(' ', level * 4) + '* '; + }, + onListItemEnd: function() { + return ''; + }, +}; + |