diff options
author | Samy Pessé <samypesse@gmail.com> | 2016-04-28 14:12:21 +0200 |
---|---|---|
committer | Samy Pessé <samypesse@gmail.com> | 2016-04-28 14:12:21 +0200 |
commit | 5059e8df3466bf33c379f3ed0626f48904e9cbcc (patch) | |
tree | f39b0e7254ab66e942af27cda3fc5e6f9fd631ab | |
parent | 3d405a1ac56e6c0e63276e0918ab8bd8fae82142 (diff) | |
download | gitbook-5059e8df3466bf33c379f3ed0626f48904e9cbcc.zip gitbook-5059e8df3466bf33c379f3ed0626f48904e9cbcc.tar.gz gitbook-5059e8df3466bf33c379f3ed0626f48904e9cbcc.tar.bz2 |
Add modifiers to edit article and insert in summary
-rw-r--r-- | lib/modifiers/summary/__tests__/editArticle.js | 0 | ||||
-rw-r--r-- | lib/modifiers/summary/editArticle.js | 70 | ||||
-rw-r--r-- | lib/modifiers/summary/editArticleTitle.js | 17 | ||||
-rw-r--r-- | lib/modifiers/summary/index.js | 3 | ||||
-rw-r--r-- | lib/modifiers/summary/indexArticleLevels.js | 23 | ||||
-rw-r--r-- | lib/modifiers/summary/indexLevels.js | 4 | ||||
-rw-r--r-- | lib/modifiers/summary/indexPartLevels.js | 24 | ||||
-rw-r--r-- | lib/modifiers/summary/insertArticle.js | 50 | ||||
-rw-r--r-- | lib/parse/parseSummary.js | 2 |
9 files changed, 188 insertions, 5 deletions
diff --git a/lib/modifiers/summary/__tests__/editArticle.js b/lib/modifiers/summary/__tests__/editArticle.js new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/lib/modifiers/summary/__tests__/editArticle.js diff --git a/lib/modifiers/summary/editArticle.js b/lib/modifiers/summary/editArticle.js new file mode 100644 index 0000000..1625398 --- /dev/null +++ b/lib/modifiers/summary/editArticle.js @@ -0,0 +1,70 @@ + +/** + Edit a list of articles + + @param {List<Article>} articles + @param {String} level + @param {Article} newArticle + @return {List<Article>} +*/ +function editArticleInList(articles, level, newArticle) { + return articles.map(function(article) { + var articleLevel = article.getLevel(); + + if (articleLevel == level) { + return article.merge(newArticle); + } + + if (level.indexOf(articleLevel) === 0) { + var articles = editArticleInList(article.getArticles(), level, newArticle); + return article.set('articles', articles); + } + + return article; + }); +} + + +/** + Edit an article in a part + + @param {Part} part + @param {String} level + @param {Article} newArticle + @return {Part} +*/ +function editArticleInPart(part, level, newArticle) { + var articles = part.getArticles(); + articles = editArticleInList(articles); + + return part.set('articles', articles); +} + + +/** + Edit an article in a summary + + @param {Summary} summary + @param {String} level + @param {Article} newArticle + @return {Summary} +*/ +function editArticle(summary, level, newArticle) { + var parts = summary.getParts(); + + var levelParts = level.split('.'); + var partIndex = Number(levelParts[0]); + + var part = parts.get(partIndex); + if (!part) { + return summary; + } + + part = editArticleInPart(part, level, newArticle); + parts = parts.set(partIndex, part); + + return summary.set('parts', parts); +} + + +module.exports = editArticle; diff --git a/lib/modifiers/summary/editArticleTitle.js b/lib/modifiers/summary/editArticleTitle.js new file mode 100644 index 0000000..bd9b6f2 --- /dev/null +++ b/lib/modifiers/summary/editArticleTitle.js @@ -0,0 +1,17 @@ +var editArticle = require('./editArticle'); + +/** + Edit title of an article + + @param {Summary} summary + @param {String} level + @param {String} newTitle + @return {Summary} +*/ +function editArticleTitle(summary, level, newTitle) { + return editArticle(summary, level, { + title: newTitle + }); +} + +module.exports = editArticleTitle; diff --git a/lib/modifiers/summary/index.js b/lib/modifiers/summary/index.js index 03f1098..855d7cc 100644 --- a/lib/modifiers/summary/index.js +++ b/lib/modifiers/summary/index.js @@ -3,5 +3,6 @@ module.exports = { insertArticle: require('./insertArticle'), unshiftArticle: require('./unshiftArticle'), - editPartTitle: require('./editPartTitle') + editPartTitle: require('./editPartTitle'), + editArticleTitle: require('./editArticleTitle') }; diff --git a/lib/modifiers/summary/indexArticleLevels.js b/lib/modifiers/summary/indexArticleLevels.js new file mode 100644 index 0000000..02ca594 --- /dev/null +++ b/lib/modifiers/summary/indexArticleLevels.js @@ -0,0 +1,23 @@ + +/** + Index levels in an article tree + + @param {Article} + @param {String} baseLevel + @return {Article} +*/ +function indexArticleLevels(article, baseLevel) { + baseLevel = baseLevel || article.getLevel(); + var articles = article.getArticle(); + + articles = articles.map(function(inner, i) { + return indexArticleLevels(inner, baseLevel + '.' + (i + 1)); + }); + + return article.merge({ + level: baseLevel, + articles: articles + }); +} + +module.exports = indexArticleLevels; diff --git a/lib/modifiers/summary/indexLevels.js b/lib/modifiers/summary/indexLevels.js index d29b043..604e9ff 100644 --- a/lib/modifiers/summary/indexLevels.js +++ b/lib/modifiers/summary/indexLevels.js @@ -1,3 +1,4 @@ +var indexPartLevels = require('./indexPartLevels'); /** Index all levels in the summary @@ -6,7 +7,10 @@ @return {Summary} */ function indexLevels(summary) { + var parts = summary.getParts(); + parts = parts.map(indexPartLevels); + return summary.set('parts', parts); } diff --git a/lib/modifiers/summary/indexPartLevels.js b/lib/modifiers/summary/indexPartLevels.js new file mode 100644 index 0000000..19ba089 --- /dev/null +++ b/lib/modifiers/summary/indexPartLevels.js @@ -0,0 +1,24 @@ +var indexArticleLevels = require('./indexArticleLevels'); + +/** + Index levels in a part + + @param {Part} + @param {Number} index + @return {Part} +*/ +function indexPartLevels(part, index) { + var baseLevel = String(index + 1); + var articles = part.getArticle(); + + articles = articles.map(function(inner, i) { + return indexArticleLevels(inner, baseLevel + '.' + (i + 1)); + }); + + return part.merge({ + level: baseLevel, + articles: articles + }); +} + +module.exports = indexPartLevels; diff --git a/lib/modifiers/summary/insertArticle.js b/lib/modifiers/summary/insertArticle.js index ec29978..ae920c2 100644 --- a/lib/modifiers/summary/insertArticle.js +++ b/lib/modifiers/summary/insertArticle.js @@ -1,16 +1,62 @@ +var is = require('is'); var SummaryArticle = require('../../models/summaryArticle'); +var editArticle = require('./editArticle'); +var indexArticleLevels = require('./indexArticleLevels'); + + +/** + Get level of parent of an article + + @param {String} level + @return {String} +*/ +function getParentLevel(level) { + var parts = level.split('.'); + return parts.slice(0, -1).join('.'); +} /** - Insert an article in a summary, and reindex levels correctly + Insert an article in a summary at a specific position @param {Summary} summary - @param {String} level: level to insert after + @param {String|Article} level: level to insert after @param {Article} article @return {Summary} */ function insertArticle(summary, level, article) { article = SummaryArticle(article); + level = is.string(level)? level : level.getLevel(); + + var parentLevel = getParentLevel(level); + + if (!parentLevel) { + // todo: insert new part + return summary; + } + + // Get parent of the position + var parentArticle = summary.getByLevel(parentLevel); + if (!parentLevel) { + return summary; + } + + // Find the index to insert at + var articles = parentArticle.getArticles(); + var index = articles.findIndex(function(art) { + return art.getLevel() === level; + }); + if (!index) { + return summary; + } + + // Insert the article at the right index + articles = articles.insert(index, article); + + // Reindex the level from here + parentArticle = parentArticle.set('articles', articles); + parentArticle = indexArticleLevels(parentArticle); + return editArticle(summary, parentLevel, parentArticle); } diff --git a/lib/parse/parseSummary.js b/lib/parse/parseSummary.js index ebe47d2..0c07ac7 100644 --- a/lib/parse/parseSummary.js +++ b/lib/parse/parseSummary.js @@ -1,5 +1,3 @@ -var Promise = require('../utils/promise'); - var parseStructureFile = require('./parseStructureFile'); var Summary = require('../models/summary'); var SummaryModifier = require('../modifiers').Summary; |