diff options
author | Soreine <nicolas@gitbook.com> | 2016-05-09 19:07:51 +0200 |
---|---|---|
committer | Soreine <nicolas@gitbook.com> | 2016-05-11 13:11:32 +0200 |
commit | 0945807184907d4aac47d370d05b39d4029d07fa (patch) | |
tree | 486df7d82ac8f928f43c4df6150f6cb05baeb0d4 | |
parent | d85663b153adba5f237055444d18aae05eb4c03b (diff) | |
download | gitbook-0945807184907d4aac47d370d05b39d4029d07fa.zip gitbook-0945807184907d4aac47d370d05b39d4029d07fa.tar.gz gitbook-0945807184907d4aac47d370d05b39d4029d07fa.tar.bz2 |
Greatly simplify moveArticle's implementation
-rw-r--r-- | lib/modifiers/summary/__tests__/moveArticle.js | 2 | ||||
-rw-r--r-- | lib/modifiers/summary/moveArticle.js | 63 |
2 files changed, 4 insertions, 61 deletions
diff --git a/lib/modifiers/summary/__tests__/moveArticle.js b/lib/modifiers/summary/__tests__/moveArticle.js index 9a101f6..aed0b94 100644 --- a/lib/modifiers/summary/__tests__/moveArticle.js +++ b/lib/modifiers/summary/__tests__/moveArticle.js @@ -42,7 +42,7 @@ describe('moveArticle', function() { } ]); - it('should move an article at in place', function() { + it('should move an article to the same place', function() { var newSummary = moveArticle(summary, '2.1', '2.1'); expect(Immutable.is(summary, newSummary)).toBe(true); diff --git a/lib/modifiers/summary/moveArticle.js b/lib/modifiers/summary/moveArticle.js index 06d82ca..5cb1868 100644 --- a/lib/modifiers/summary/moveArticle.js +++ b/lib/modifiers/summary/moveArticle.js @@ -15,68 +15,11 @@ function moveArticle(summary, origin, target) { // Coerce to level var originLevel = is.string(origin)? origin : origin.getLevel(); var targetLevel = is.string(target)? target : target.getLevel(); - var article = summary.getByLevel(originLevel); - // Remove - var removed = removeArticle(summary, origin); - - // Adjust targetLevel if removing impacted it - targetLevel = arrayToLevel( - shiftLevel(levelToArray(originLevel), - levelToArray(targetLevel))); - // Re-insert - return insertArticle(removed, target, 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.slice(1); - var rest = level.slice(1); - - 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('.'); + // Remove first + var removed = removeArticle(summary, originLevel); + return insertArticle(removed, article, targetLevel); } module.exports = moveArticle; |