summaryrefslogtreecommitdiffstats
path: root/lib/modifiers/summary
diff options
context:
space:
mode:
Diffstat (limited to 'lib/modifiers/summary')
-rw-r--r--lib/modifiers/summary/__tests__/editArticle.js0
-rw-r--r--lib/modifiers/summary/__tests__/editPartTitle.js44
-rw-r--r--lib/modifiers/summary/editArticle.js70
-rw-r--r--lib/modifiers/summary/editArticleTitle.js17
-rw-r--r--lib/modifiers/summary/editPartTitle.js24
-rw-r--r--lib/modifiers/summary/index.js8
-rw-r--r--lib/modifiers/summary/indexArticleLevels.js23
-rw-r--r--lib/modifiers/summary/indexLevels.js17
-rw-r--r--lib/modifiers/summary/indexPartLevels.js24
-rw-r--r--lib/modifiers/summary/insertArticle.js63
-rw-r--r--lib/modifiers/summary/unshiftArticle.js29
11 files changed, 319 insertions, 0 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/__tests__/editPartTitle.js b/lib/modifiers/summary/__tests__/editPartTitle.js
new file mode 100644
index 0000000..d1b916b
--- /dev/null
+++ b/lib/modifiers/summary/__tests__/editPartTitle.js
@@ -0,0 +1,44 @@
+var Summary = require('../../../models/summary');
+var File = require('../../../models/file');
+
+describe('editPartTitle', function() {
+ var editPartTitle = require('../editPartTitle');
+ var summary = Summary.createFromParts(File(), [
+ {
+ articles: [
+ {
+ title: 'My First Article',
+ path: 'README.md'
+ },
+ {
+ title: 'My Second Article',
+ path: 'article.md'
+ }
+ ]
+ },
+ {
+ title: 'Test'
+ }
+ ]);
+
+ it('should correctly set title of first part', function() {
+ var newSummary = editPartTitle(summary, 0, 'Hello World');
+ var part = newSummary.getPart(0);
+
+ expect(part.getTitle()).toBe('Hello World');
+ });
+
+ it('should correctly set title of second part', function() {
+ var newSummary = editPartTitle(summary, 1, 'Hello');
+ var part = newSummary.getPart(1);
+
+ expect(part.getTitle()).toBe('Hello');
+ });
+
+ it('should not fail if part doesn\'t exist', function() {
+ var newSummary = editPartTitle(summary, 3, 'Hello');
+ expect(newSummary.getParts().size).toBe(2);
+ });
+});
+
+
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/editPartTitle.js b/lib/modifiers/summary/editPartTitle.js
new file mode 100644
index 0000000..472399b
--- /dev/null
+++ b/lib/modifiers/summary/editPartTitle.js
@@ -0,0 +1,24 @@
+
+/**
+ Edit title of a part in the summary
+
+ @param {Summary} summary
+ @param {Number} index
+ @param {String} newTitle
+ @return {Summary}
+*/
+function editPartTitle(summary, index, newTitle) {
+ var parts = summary.getParts();
+
+ var part = parts.get(index);
+ if (!part) {
+ return summary;
+ }
+
+ part = part.set('title', newTitle);
+ parts = parts.set(index, part);
+
+ return summary.set('parts', parts);
+}
+
+module.exports = editPartTitle;
diff --git a/lib/modifiers/summary/index.js b/lib/modifiers/summary/index.js
new file mode 100644
index 0000000..855d7cc
--- /dev/null
+++ b/lib/modifiers/summary/index.js
@@ -0,0 +1,8 @@
+
+module.exports = {
+ insertArticle: require('./insertArticle'),
+ unshiftArticle: require('./unshiftArticle'),
+
+ 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..f311f74
--- /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.getArticles();
+
+ 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
new file mode 100644
index 0000000..604e9ff
--- /dev/null
+++ b/lib/modifiers/summary/indexLevels.js
@@ -0,0 +1,17 @@
+var indexPartLevels = require('./indexPartLevels');
+
+/**
+ Index all levels in the summary
+
+ @param {Summary}
+ @return {Summary}
+*/
+function indexLevels(summary) {
+ var parts = summary.getParts();
+ parts = parts.map(indexPartLevels);
+
+ return summary.set('parts', parts);
+}
+
+
+module.exports = indexLevels;
diff --git a/lib/modifiers/summary/indexPartLevels.js b/lib/modifiers/summary/indexPartLevels.js
new file mode 100644
index 0000000..d19c70a
--- /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.getArticles();
+
+ 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
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;
diff --git a/lib/modifiers/summary/unshiftArticle.js b/lib/modifiers/summary/unshiftArticle.js
new file mode 100644
index 0000000..3f2ae4d
--- /dev/null
+++ b/lib/modifiers/summary/unshiftArticle.js
@@ -0,0 +1,29 @@
+var SummaryArticle = require('../../models/summaryArticle');
+var SummaryPart = require('../../models/summaryPart');
+
+var indexLevels = require('./indexLevels');
+
+/**
+ Insert an article at the
+
+ @param {Summary} summary
+ @param {Article} article
+ @return {Summary}
+*/
+function unshiftArticle(summary, article) {
+ article = SummaryArticle(article);
+
+ var parts = summary.getParts();
+ var part = parts.get(0) || SummaryPart();
+
+ var articles = part.getArticles();
+ articles = articles.unshift(article);
+ part = part.set('articles', articles);
+
+ parts = parts.set(0, part);
+ summary = summary.set('parts', parts);
+
+ return indexLevels(summary);
+}
+
+module.exports = unshiftArticle;