summaryrefslogtreecommitdiffstats
path: root/lib/parse/summary.js
diff options
context:
space:
mode:
Diffstat (limited to 'lib/parse/summary.js')
-rw-r--r--lib/parse/summary.js167
1 files changed, 0 insertions, 167 deletions
diff --git a/lib/parse/summary.js b/lib/parse/summary.js
deleted file mode 100644
index 2fdec8a..0000000
--- a/lib/parse/summary.js
+++ /dev/null
@@ -1,167 +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 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()
- .rest(function(el) {
- // Get everything after list_start
- return el.type !== 'list_start';
- })
- .reverse()
- .rest(function(el) {
- // Get everything after list_end (remember we're reversed)
- return el.type !== 'list_end';
- })
- .reverse()
- .value().slice(1, -1);
-}
-
-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;
- })
-}
-
-// Parses an Article or Chapter title
-// supports extracting links
-function parseTitle(src, nums) {
- // Check if it's a link
- var matches = kramed.InlineLexer.rules.link.exec(src);
-
- var level = nums.join('.');
-
- // Not a link, return plain text
- if(!matches) {
- return {
- title: src,
- level: level,
- path: null,
- };
- }
-
- return {
- title: matches[1],
- level: level,
-
- // Normalize path
- // 1. Convert Window's "\" to "/"
- // 2. Remove leading "/" if exists
- path: matches[2].replace(/\\/g, '/').replace(/^\/+/, ''),
- };
-}
-
-function parseChapter(nodes, nums) {
- // Convert single number to an array
- nums = _.isArray(nums) ? nums : [nums];
-
- return _.extend(parseTitle(_.first(nodes).text, nums), {
- articles: _.map(listSplit(filterList(nodes), 'list_item_start', 'list_item_end'), function(nodes, i) {
- return parseChapter(nodes, nums.concat(i + 1));
- })
- });
-}
-
-function defaultChapterList(chapterList) {
- var first = _.first(chapterList);
-
- // Check if introduction node was specified in SUMMARY.md
- if (first) {
- var chapter = parseChapter(first, [0]);
-
- // Already have README node, we're good to go
- if(chapter.path === 'README.md') {
- return chapterList;
- }
- }
-
- // It wasn't specified, so add in default
- return [
- [ { type: 'text', text: '[Introduction](README.md)' } ]
- ].concat(chapterList);
-}
-
-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 = defaultChapterList(listGroups(src));
-
- return {
- chapters: chapters.map(parseChapter)
- };
-}
-
-function parseEntries (src) {
- return listGroups(src).map(parseChapter);
-}
-
-
-// Exports
-module.exports = parseSummary;
-module.exports.entries = parseEntries;