diff options
author | Soreine <nicolas@gitbook.com> | 2016-05-03 12:37:26 +0200 |
---|---|---|
committer | Soreine <nicolas@gitbook.com> | 2016-05-03 12:37:26 +0200 |
commit | 693171cb0544c900cb964b0b6015ca528aa776f2 (patch) | |
tree | 408f2dafa58b8c76e8e0f3dce9c762cbf9a283cc /lib/modifiers | |
parent | 6b17d08892828818216a260576c83b7203c2098f (diff) | |
download | gitbook-693171cb0544c900cb964b0b6015ca528aa776f2.zip gitbook-693171cb0544c900cb964b0b6015ca528aa776f2.tar.gz gitbook-693171cb0544c900cb964b0b6015ca528aa776f2.tar.bz2 |
Adds move and remove article modifier.
Diffstat (limited to 'lib/modifiers')
-rw-r--r-- | lib/modifiers/summary/index.js | 3 | ||||
-rw-r--r-- | lib/modifiers/summary/insertArticle.js | 33 | ||||
-rw-r--r-- | lib/modifiers/summary/moveArticle.js | 81 | ||||
-rw-r--r-- | lib/modifiers/summary/removeArticle.js | 36 | ||||
-rw-r--r-- | lib/modifiers/summary/unshiftArticle.js | 2 |
5 files changed, 126 insertions, 29 deletions
diff --git a/lib/modifiers/summary/index.js b/lib/modifiers/summary/index.js index 855d7cc..4498287 100644 --- a/lib/modifiers/summary/index.js +++ b/lib/modifiers/summary/index.js @@ -1,6 +1,7 @@ - module.exports = { insertArticle: require('./insertArticle'), + moveArticle: require('./moveArticle'), + removeArticle: require('./removeArticle'), unshiftArticle: require('./unshiftArticle'), editPartTitle: require('./editPartTitle'), diff --git a/lib/modifiers/summary/insertArticle.js b/lib/modifiers/summary/insertArticle.js index ae920c2..d97943e 100644 --- a/lib/modifiers/summary/insertArticle.js +++ b/lib/modifiers/summary/insertArticle.js @@ -3,18 +3,6 @@ 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 @@ -27,21 +15,13 @@ 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) { + var parent = summary.getParent(level); + if (!parent) { return summary; } // Find the index to insert at - var articles = parentArticle.getArticles(); + var articles = parent.getArticles(); var index = articles.findIndex(function(art) { return art.getLevel() === level; }); @@ -53,11 +33,10 @@ function insertArticle(summary, level, article) { articles = articles.insert(index, article); // Reindex the level from here - parentArticle = parentArticle.set('articles', articles); - parentArticle = indexArticleLevels(parentArticle); - - return editArticle(summary, parentLevel, parentArticle); + parent = parent.set('articles', articles); + parent = indexArticleLevels(parent); + return editArticle(summary, parent.getLevel(), parent); } module.exports = insertArticle; diff --git a/lib/modifiers/summary/moveArticle.js b/lib/modifiers/summary/moveArticle.js new file mode 100644 index 0000000..83904ec --- /dev/null +++ b/lib/modifiers/summary/moveArticle.js @@ -0,0 +1,81 @@ +var is = require('is'); +var removeArticle = require('./removeArticle'); +var insertArticle = require('./insertArticle'); + +/** + Remove an article from a level, and insert it after another. + + @param {Summary} summary + @param {String|SummaryArticle} from: level to remove + @param {String|SummaryArticle} to: level to insert after + @return {Summary} +*/ +function moveArticle(summary, from, to) { + // Coerce to level + var fromLevel = is.string(from)? from : from.getLevel(); + var toLevel = is.string(to)? to : to.getLevel(); + + var article = summary.getByLevel(fromLevel); + + // Remove + var removed = removeArticle(summary, from); + + // Adjust toLevel if removing impacted it + toLevel = arrayToLevel( + shiftLevel(levelToArray(fromLevel), + levelToArray(toLevel))); + // Re-insert + return insertArticle(removed, to, article); +} + +/** + @param {Array<Number>} removedLevel + @param {Array<Number>} level The level to udpate + @return {Array<Number>} + */ +function shiftLevel(removedLevel, level) { + if (level.length === 0) { + // `removedLevel` is under level, so no effect + return level; + } else if (removedLevel.length === 0) { + // Either `level` is a child of `removedLevel`... or they are equal + // This is undefined behavior. + return level; + } + + var removedRoot = removedLevel[0]; + var root = level[0]; + var removedRest = removedLevel.unshift(); + var rest = level.unshift(); + + if (removedRoot < root) { + // It will shift levels at this point. The rest is unchanged. + return Array.prototype.concat(root - 1, rest); + } else if (removedRoot === root) { + // Look deeper + return Array.prototype.concat(root, shiftLevel(removedRest, rest)); + } else { + // No impact + return level; + } +} + +/** + @param {String} + @return {Array<Number>} + */ +function levelToArray(l) { + return l.split('.').map(function (char) { + return parseInt(char, 10); + }); +} + +/** + @param {Array<Number>} + @return {String} + */ +function arrayToLevel(a) { + return a.join('.'); +} + +module.exports = moveArticle; diff --git a/lib/modifiers/summary/removeArticle.js b/lib/modifiers/summary/removeArticle.js new file mode 100644 index 0000000..4cb848a --- /dev/null +++ b/lib/modifiers/summary/removeArticle.js @@ -0,0 +1,36 @@ +var is = require('is'); +var editArticle = require('./editArticle'); +var indexArticleLevels = require('./indexArticleLevels'); + +/** + Remove an article from a level. + + @param {Summary} summary + @param {String|SummaryArticle} level: level to remove + @return {Summary} +*/ +function removeArticle(summary, level) { + // Coerce to level + level = is.string(level)? level : level.getLevel(); + + var parent = summary.getParent(summary, level); + + // Find the index to remove + var index = articles.findIndex(function(art) { + return art.getLevel() === level; + }); + if (!index) { + return summary; + } + + // Remove from children + var articles = parent.getArticles().remove(index); + parent = parent.set('articles', articles); + + // Reindex the level from here + parent = indexArticleLevels(parent); + + return editArticle(summary, parent.getLevel(), parent); +} + +module.exports = removeArticle; diff --git a/lib/modifiers/summary/unshiftArticle.js b/lib/modifiers/summary/unshiftArticle.js index 3f2ae4d..d1ebc05 100644 --- a/lib/modifiers/summary/unshiftArticle.js +++ b/lib/modifiers/summary/unshiftArticle.js @@ -4,7 +4,7 @@ var SummaryPart = require('../../models/summaryPart'); var indexLevels = require('./indexLevels'); /** - Insert an article at the + Insert an article at the beginning of summary @param {Summary} summary @param {Article} article |