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 | |
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')
-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 | ||||
-rw-r--r-- | packages/gitbook-markdown/package.json | 7 | ||||
-rw-r--r-- | packages/gitbook-markdown/test/fixtures/GLOSSARY.md | 10 | ||||
-rw-r--r-- | packages/gitbook-markdown/test/fixtures/SUMMARY_PARTS.md | 11 | ||||
-rw-r--r-- | packages/gitbook-markdown/test/glossary.js | 14 | ||||
-rw-r--r-- | packages/gitbook-markdown/test/langs.js | 10 | ||||
-rw-r--r-- | packages/gitbook-markdown/test/page.js | 21 | ||||
-rw-r--r-- | packages/gitbook-markdown/test/readme.js | 10 | ||||
-rw-r--r-- | packages/gitbook-markdown/test/summary.js | 61 |
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() { |