summaryrefslogtreecommitdiffstats
path: root/lib/modifiers/summary/insertArticle.js
diff options
context:
space:
mode:
Diffstat (limited to 'lib/modifiers/summary/insertArticle.js')
-rw-r--r--lib/modifiers/summary/insertArticle.js63
1 files changed, 63 insertions, 0 deletions
diff --git a/lib/modifiers/summary/insertArticle.js b/lib/modifiers/summary/insertArticle.js
new file mode 100644
index 0000000..ae920c2
--- /dev/null
+++ b/lib/modifiers/summary/insertArticle.js
@@ -0,0 +1,63 @@
+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 at a specific position
+
+ @param {Summary} summary
+ @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);
+
+}
+
+module.exports = insertArticle;