diff options
author | Samy Pessé <samypesse@gmail.com> | 2016-02-19 16:12:43 +0100 |
---|---|---|
committer | Samy Pessé <samypesse@gmail.com> | 2016-12-22 12:32:14 +0100 |
commit | 4c44d677117d926b6dcc164f55fe34079c2ca3c7 (patch) | |
tree | 71d0fca56421f3a7b68d60a446f89d3735828f03 /packages/gitbook-html/lib/summary.js | |
parent | 9e99b5850fd866fc2f9196993a0ae7e342311558 (diff) | |
download | gitbook-4c44d677117d926b6dcc164f55fe34079c2ca3c7.zip gitbook-4c44d677117d926b6dcc164f55fe34079c2ca3c7.tar.gz gitbook-4c44d677117d926b6dcc164f55fe34079c2ca3c7.tar.bz2 |
Improve summary parser
Diffstat (limited to 'packages/gitbook-html/lib/summary.js')
-rwxr-xr-x | packages/gitbook-html/lib/summary.js | 97 |
1 files changed, 59 insertions, 38 deletions
diff --git a/packages/gitbook-html/lib/summary.js b/packages/gitbook-html/lib/summary.js index 1e2d63d..e71d6b5 100755 --- a/packages/gitbook-html/lib/summary.js +++ b/packages/gitbook-html/lib/summary.js @@ -1,14 +1,17 @@ var _ = require('lodash'); var dom = require('./dom'); +var SELECTOR_LIST = '.olist > ol, ol, ul'; +var SELECTOR_LINK = 'a, p > a'; + +var BL = '\n'; // parse a ul list and return list of chapters recursvely function parseList($ul, $) { var articles = []; - $ul.children('>li').each(function() { + $ul.children('li').each(function() { var article = {}; - var $li = $(this); // Get text for the entry @@ -16,14 +19,14 @@ function parseList($ul, $) { article.title = $p.text() || dom.textNode($li.get(0)); // Parse link - var $a = $li.find('> a, > p > a'); + var $a = $li.children(SELECTOR_LINK); if ($a.length > 0) { article.title = $a.first().text(); article.path = $a.attr('href').replace(/\\/g, '/').replace(/^\/+/, '') } // Sub articles - var $sub = $li.children('> .olist > ol, > ol, > ul'); + var $sub = $li.children(SELECTOR_LIST).first(); article.articles = parseList($sub, $); articles.push(article); @@ -32,55 +35,73 @@ function parseList($ul, $) { return articles; } -// Return a list of entries in a div -function parseEntries (html) { +// HTML -> Summary +function parseSummary(html) { var $ = dom.parse(html); - var chapters = parseList($("> ol, > ul").first(), $); - return chapters; -} + var $root = dom.root($); -// HTML -> Summary -function parseSummary(src) { - var chapters = parseEntries(src); + var $lists = $root.children(SELECTOR_LIST); + var parts = []; + + $lists.each(function() { + var $list = $(this); + + parts.push({ + articles: parseList($(SELECTOR_LIST).first(), $) + }); + }); return { - chapters: chapters + parts: parts }; } // Summary -> HTML -function summaryToText(summary) { - var bl = '\n'; - - var _base = function(article) { - if (article.path) { - return '<a href="'+article.path+'">'+article.title+'</a>'; - } else { - return article.title; - } - }; +function textPrefix(d) { + return Array(d*4).join(' '); +} - var convertArticle = function(article, d) { - var content = Array(d+2).join(' ') + '<li>' + _base(article); +function articleToText(article, d) { + var prefix = textPrefix(d); + var content = prefix + '<li>'; - if (article.articles.length > 0) { - content += convertArticles(article.articles, d); - } - return content + '</li>' + bl; - }; + if (article.path) { + content += '<a href="'+article.path+'">'+article.title+'</a>'; + } else { + content += article.title; + } - var convertArticles = function(articles, d) { - var content = '<ul>' + bl; - _.each(articles, function(_article) { - content += convertArticle(_article, d + 1); - }); - return content + '<ul>' + bl; + if (article.articles.length > 0) { + content += BL + articlesToText(article.articles, d) + prefix; } + content += '</li>' + BL; + + return content; +} + +function articlesToText(articles, d) { + var prefix = textPrefix(d); + var content = prefix + '<ul>' + BL; + _.each(articles, function(_article) { + content += articleToText(_article, d + 1); + }); + return content + '</ul>' + BL; +} + +function partsToText(part) { + return articlesToText(part.articles, 0) + BL + BL; +} + +function summaryToText(summary) { + var content = '<h1>Summary</h1>' + BL; + + _.each(summary.parts, function(part) { + content += partsToText(part); + }); - return '<h1>Summary</h1>'+ bl+bl + convertArticles(summary.chapters, 0) + bl; + return content + BL; }; module.exports = parseSummary; -module.exports.entries = parseEntries; module.exports.toText = summaryToText; |