summaryrefslogtreecommitdiffstats
path: root/packages/gitbook-markdown
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
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')
-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
-rw-r--r--packages/gitbook-markdown/package.json7
-rw-r--r--packages/gitbook-markdown/test/fixtures/GLOSSARY.md10
-rw-r--r--packages/gitbook-markdown/test/fixtures/SUMMARY_PARTS.md11
-rw-r--r--packages/gitbook-markdown/test/glossary.js14
-rw-r--r--packages/gitbook-markdown/test/langs.js10
-rw-r--r--packages/gitbook-markdown/test/page.js21
-rw-r--r--packages/gitbook-markdown/test/readme.js10
-rw-r--r--packages/gitbook-markdown/test/summary.js61
16 files changed, 158 insertions, 396 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 '';
+ },
+};
+
diff --git a/packages/gitbook-markdown/package.json b/packages/gitbook-markdown/package.json
index 97c1df1..d967f26 100644
--- a/packages/gitbook-markdown/package.json
+++ b/packages/gitbook-markdown/package.json
@@ -7,13 +7,14 @@
"dependencies": {
"lodash": "^3.2.0",
"kramed": "0.5.5",
- "kramed-text-renderer": "0.2.1"
+ "kramed-text-renderer": "0.2.1",
+ "gitbook-html": "1.0.0"
},
"devDependencies": {
- "mocha": "2.3.3"
+ "mocha": "^2.3.3"
},
"scripts": {
- "test": "export TESTING=true; mocha --reporter list"
+ "test": "export TESTING=true; mocha --reporter list --bail"
},
"repository": {
"type": "git",
diff --git a/packages/gitbook-markdown/test/fixtures/GLOSSARY.md b/packages/gitbook-markdown/test/fixtures/GLOSSARY.md
index 5969902..19142d8 100644
--- a/packages/gitbook-markdown/test/fixtures/GLOSSARY.md
+++ b/packages/gitbook-markdown/test/fixtures/GLOSSARY.md
@@ -1,15 +1,15 @@
-# Magic
+## Magic
Sufficiently advanced technology, beyond the understanding of the observer producing a sense of wonder.
Hello, I am random noise in the middle of this beautiful Glossary. (Really astonishing !)
-# PHP
+## PHP
An atrocious language, invented for the sole purpose of inflicting pain and suffering amongst the proframming wizards of this world.
-# Clojure
+## Clojure
Lisp re-invented for hipsters.
-# Go
+## Go
Go Go Google [Wow](https://www.google.com)
Fantastic, I love code too ! :
@@ -25,6 +25,6 @@ def f(x):
print(f(9))
```
-# Gitbook
+## Gitbook
Awesome project. Really amazing, I'm really at a loss for words ...
diff --git a/packages/gitbook-markdown/test/fixtures/SUMMARY_PARTS.md b/packages/gitbook-markdown/test/fixtures/SUMMARY_PARTS.md
new file mode 100644
index 0000000..eaba1a7
--- /dev/null
+++ b/packages/gitbook-markdown/test/fixtures/SUMMARY_PARTS.md
@@ -0,0 +1,11 @@
+# Summary
+
+* [Chapter 1](chapter-1/README.md)
+
+## Part 2
+
+* [Chapter 2](chapter-2/README.md)
+
+## Part 3
+
+* [Chapter 3](chapter-3/README.md)
diff --git a/packages/gitbook-markdown/test/glossary.js b/packages/gitbook-markdown/test/glossary.js
index efa77db..3231020 100644
--- a/packages/gitbook-markdown/test/glossary.js
+++ b/packages/gitbook-markdown/test/glossary.js
@@ -4,10 +4,14 @@ var assert = require('assert');
var glossary = require('../').glossary;
-var CONTENT = fs.readFileSync(path.join(__dirname, './fixtures/GLOSSARY.md'), 'utf8');
-var LEXED = glossary(CONTENT);
-
describe('Glossary parsing', function () {
+ var LEXED;
+
+ before(function() {
+ var CONTENT = fs.readFileSync(path.join(__dirname, './fixtures/GLOSSARY.md'), 'utf8');
+ LEXED = glossary(CONTENT);
+ });
+
it('should only get heading + paragraph pairs', function() {
assert.equal(LEXED.length, 5);
});
@@ -19,7 +23,7 @@ describe('Glossary parsing', function () {
});
it('should correctly convert it to text', function() {
- var text = glossary.toText(LEXED);
- assertObjectsEqual(glossary(text), LEXED);
+ var text = glossary.toText(LEXED);
+ assertObjectsEqual(glossary(text), LEXED);
});
});
diff --git a/packages/gitbook-markdown/test/langs.js b/packages/gitbook-markdown/test/langs.js
index e6c3dbd..bb75d11 100644
--- a/packages/gitbook-markdown/test/langs.js
+++ b/packages/gitbook-markdown/test/langs.js
@@ -4,10 +4,14 @@ var assert = require('assert');
var langs = require('../').langs;
-var CONTENT = fs.readFileSync(path.join(__dirname, './fixtures/LANGS.md'), 'utf8');
-var LEXED = langs(CONTENT);
-
describe('Languages parsing', function () {
+ var LEXED;
+
+ before(function() {
+ var CONTENT = fs.readFileSync(path.join(__dirname, './fixtures/LANGS.md'), 'utf8');
+ LEXED = langs(CONTENT);
+ });
+
it('should detect paths and titles', function() {
assert.equal(LEXED.length, 2);
assert.equal(LEXED[0].path,'en/');
diff --git a/packages/gitbook-markdown/test/page.js b/packages/gitbook-markdown/test/page.js
index 8f4b5c5..8b882d8 100644
--- a/packages/gitbook-markdown/test/page.js
+++ b/packages/gitbook-markdown/test/page.js
@@ -4,25 +4,22 @@ var assert = require('assert');
var page = require('../').page;
-function loadPage (name, options) {
- var CONTENT = fs.readFileSync(path.join(__dirname, './fixtures/' + name + '.md'), 'utf8');
- return page(CONTENT, options).sections;
-}
-
-var LEXED = loadPage('PAGE');
describe('Page parsing', function() {
- it('should detect sections', function() {
- assert.equal(LEXED.length, 1);
+ var LEXED;
+
+ before(function() {
+ var CONTENT = fs.readFileSync(path.join(__dirname, './fixtures/PAGE.md'), 'utf8');
+ LEXED = page(CONTENT);
});
- it('should gen content for normal sections', function() {
- assert(LEXED[0].content);
+ it('should gen content', function() {
+ assert(LEXED.content);
});
it('should not add id to headings', function() {
- assert.equal(page('# Hello').sections[0].content, '<h1>Hello</h1>\n');
- assert.equal(page('# Hello {#test}').sections[0].content, '<h1 id="test">Hello </h1>\n');
+ assert.equal(page('# Hello').content, '<h1>Hello</h1>\n');
+ assert.equal(page('# Hello {#test}').content, '<h1 id="test">Hello </h1>\n');
});
it('should escape codeblocks in preparation (1)', function() {
diff --git a/packages/gitbook-markdown/test/readme.js b/packages/gitbook-markdown/test/readme.js
index b3a5952..dd059fb 100644
--- a/packages/gitbook-markdown/test/readme.js
+++ b/packages/gitbook-markdown/test/readme.js
@@ -4,11 +4,13 @@ var assert = require('assert');
var readme = require('../').readme;
-
-var CONTENT = fs.readFileSync(path.join(__dirname, './fixtures/README.md'), 'utf8');
-var LEXED = readme(CONTENT);
-
describe('Readme parsing', function () {
+ var LEXED;
+
+ before(function() {
+ var CONTENT = fs.readFileSync(path.join(__dirname, './fixtures/README.md'), 'utf8');
+ LEXED = readme(CONTENT);
+ });
it('should contain a title', function() {
assert(LEXED.title);
diff --git a/packages/gitbook-markdown/test/summary.js b/packages/gitbook-markdown/test/summary.js
index a1bb49a..22800d4 100644
--- a/packages/gitbook-markdown/test/summary.js
+++ b/packages/gitbook-markdown/test/summary.js
@@ -13,56 +13,57 @@ function lex(fixtureFile) {
);
}
-var LEXED = lex('SUMMARY.md');
-
describe('Summary parsing', function () {
+ var LEXED;
+
+ before(function() {
+ LEXED = lex('SUMMARY.md');
+ PART = LEXED.parts[0];
+ });
+
it('should detect chapters', function() {
- assert.equal(LEXED.chapters.length, 5);
+ assert.equal(PART.articles.length, 5);
});
it('should support articles', function() {
- assert.equal(LEXED.chapters[0].articles.length, 2);
- assert.equal(LEXED.chapters[1].articles.length, 0);
- assert.equal(LEXED.chapters[2].articles.length, 0);
+ assert.equal(PART.articles[0].articles.length, 2);
+ assert.equal(PART.articles[1].articles.length, 0);
+ assert.equal(PART.articles[2].articles.length, 0);
});
it('should detect paths and titles', function() {
- assert(LEXED.chapters[0].path);
- assert(LEXED.chapters[1].path);
- assert(LEXED.chapters[2].path);
- assert(LEXED.chapters[3].path);
- assert.equal(LEXED.chapters[4].path, null);
+ assert(PART.articles[0].path);
+ assert(PART.articles[1].path);
+ assert(PART.articles[2].path);
+ assert(PART.articles[3].path);
+ assert.equal(PART.articles[4].path, null);
- assert(LEXED.chapters[0].title);
- assert(LEXED.chapters[1].title);
- assert(LEXED.chapters[2].title);
- assert(LEXED.chapters[3].title);
- assert(LEXED.chapters[4].title);
+ assert(PART.articles[0].title);
+ assert(PART.articles[1].title);
+ assert(PART.articles[2].title);
+ assert(PART.articles[3].title);
+ assert(PART.articles[4].title);
});
it('should normalize paths from .md', function() {
- assert.equal(LEXED.chapters[0].path,'chapter-1/README.md');
- assert.equal(LEXED.chapters[1].path,'chapter-2/README.md');
- assert.equal(LEXED.chapters[2].path,'chapter-3/README.md');
+ assert.equal(PART.articles[0].path,'chapter-1/README.md');
+ assert.equal(PART.articles[1].path,'chapter-2/README.md');
+ assert.equal(PART.articles[2].path,'chapter-3/README.md');
+ });
+
+ it('should part parts', function() {
+ var l = lex('SUMMARY_PARTS.md');
+ assert.equal(l.parts.length, 3);
});
it('should allow lists separated by whitespace', function() {
var l = lex('SUMMARY_WHITESPACE.md');
- assert.equal(l.chapters.length, 5);
+ assert.equal(l.parts[0].articles.length, 5);
});
it('should allow ignore empty entries', function() {
var l = lex('SUMMARY_EMPTY.md');
- assert.equal(l.chapters.length, 1);
- });
-
- it('should throw error for sublist entries', function() {
- assert.throws(
- function() {
- var l = lex('SUMMARY_SUBLIST.md');
- },
- "Invalid entry in the SUMMARY"
- );
+ assert.equal(l.parts[0].articles.length, 1);
});
it('should correctly convert it to text', function() {