summaryrefslogtreecommitdiffstats
path: root/packages/gitbook-markdown/lib
diff options
context:
space:
mode:
authorSamy Pessé <samypesse@gmail.com>2016-02-20 15:31:59 +0100
committerSamy Pessé <samypesse@gmail.com>2016-12-22 15:00:51 +0100
commitdbee17ddec2e786fbf02572e7bf6050c207b492f (patch)
tree8d93bd8eb985e3bd8132612935bc5a1583fe15e3 /packages/gitbook-markdown/lib
parent9b3888005d5098079056fa889a84e75cf3c57670 (diff)
downloadgitbook-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.js52
-rw-r--r--packages/gitbook-markdown/lib/index.js16
-rw-r--r--packages/gitbook-markdown/lib/langs.js21
-rw-r--r--packages/gitbook-markdown/lib/page.js34
-rw-r--r--packages/gitbook-markdown/lib/readme.js45
-rw-r--r--packages/gitbook-markdown/lib/summary.js179
-rw-r--r--packages/gitbook-markdown/lib/tohtml.js20
-rw-r--r--packages/gitbook-markdown/lib/tomarkdown.js43
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 '';
+ },
+};
+