summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSamy Pessé <samypesse@gmail.com>2016-04-28 14:12:21 +0200
committerSamy Pessé <samypesse@gmail.com>2016-04-28 14:12:21 +0200
commit5059e8df3466bf33c379f3ed0626f48904e9cbcc (patch)
treef39b0e7254ab66e942af27cda3fc5e6f9fd631ab
parent3d405a1ac56e6c0e63276e0918ab8bd8fae82142 (diff)
downloadgitbook-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.js0
-rw-r--r--lib/modifiers/summary/editArticle.js70
-rw-r--r--lib/modifiers/summary/editArticleTitle.js17
-rw-r--r--lib/modifiers/summary/index.js3
-rw-r--r--lib/modifiers/summary/indexArticleLevels.js23
-rw-r--r--lib/modifiers/summary/indexLevels.js4
-rw-r--r--lib/modifiers/summary/indexPartLevels.js24
-rw-r--r--lib/modifiers/summary/insertArticle.js50
-rw-r--r--lib/parse/parseSummary.js2
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;