diff options
Diffstat (limited to 'lib/modifiers')
-rw-r--r-- | lib/modifiers/index.js | 4 | ||||
-rw-r--r-- | lib/modifiers/summary/__tests__/editArticle.js | 0 | ||||
-rw-r--r-- | lib/modifiers/summary/__tests__/editPartTitle.js | 44 | ||||
-rw-r--r-- | lib/modifiers/summary/editArticle.js | 70 | ||||
-rw-r--r-- | lib/modifiers/summary/editArticleTitle.js | 17 | ||||
-rw-r--r-- | lib/modifiers/summary/editPartTitle.js | 24 | ||||
-rw-r--r-- | lib/modifiers/summary/index.js | 8 | ||||
-rw-r--r-- | lib/modifiers/summary/indexArticleLevels.js | 23 | ||||
-rw-r--r-- | lib/modifiers/summary/indexLevels.js | 17 | ||||
-rw-r--r-- | lib/modifiers/summary/indexPartLevels.js | 24 | ||||
-rw-r--r-- | lib/modifiers/summary/insertArticle.js | 63 | ||||
-rw-r--r-- | lib/modifiers/summary/unshiftArticle.js | 29 |
12 files changed, 323 insertions, 0 deletions
diff --git a/lib/modifiers/index.js b/lib/modifiers/index.js new file mode 100644 index 0000000..ed09e31 --- /dev/null +++ b/lib/modifiers/index.js @@ -0,0 +1,4 @@ + +module.exports = { + Summary: require('./summary') +}; 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; |