diff options
author | Samy Pessé <samypesse@gmail.com> | 2016-05-11 13:57:21 +0200 |
---|---|---|
committer | Samy Pessé <samypesse@gmail.com> | 2016-05-11 13:57:21 +0200 |
commit | 7bd49606e3aceb4078258c6693f53bc129eb5b93 (patch) | |
tree | b61d65f716c402c847973186c6f1dd7b78311827 /lib/modifiers/summary/moveArticleAfter.js | |
parent | d7c86353503106b2672b7948661c1c0aa9e727bb (diff) | |
parent | 19e9ff81d2d118bb45d8245da3f1ba4cad95416b (diff) | |
download | gitbook-7bd49606e3aceb4078258c6693f53bc129eb5b93.zip gitbook-7bd49606e3aceb4078258c6693f53bc129eb5b93.tar.gz gitbook-7bd49606e3aceb4078258c6693f53bc129eb5b93.tar.bz2 |
Merge pull request #1291 from GitbookIO/summary-modifiers
Summary modifiers
Diffstat (limited to 'lib/modifiers/summary/moveArticleAfter.js')
-rw-r--r-- | lib/modifiers/summary/moveArticleAfter.js | 60 |
1 files changed, 60 insertions, 0 deletions
diff --git a/lib/modifiers/summary/moveArticleAfter.js b/lib/modifiers/summary/moveArticleAfter.js new file mode 100644 index 0000000..e268f73 --- /dev/null +++ b/lib/modifiers/summary/moveArticleAfter.js @@ -0,0 +1,60 @@ +var is = require('is'); +var removeArticle = require('./removeArticle'); +var insertArticle = require('./insertArticle'); + +/** + Returns a new summary, with the an article moved after another + article. Unlike `moveArticle`, does not ensure that the article + will be found at the target's level plus one. + + @param {Summary} summary + @param {String|SummaryArticle} origin + @param {String|SummaryArticle} afterTarget + @return {Summary} +*/ +function moveArticleAfter(summary, origin, afterTarget) { + // Coerce to level + var originLevel = is.string(origin)? origin : origin.getLevel(); + var afterTargetLevel = is.string(afterTarget)? afterTarget : afterTarget.getLevel(); + var article = summary.getByLevel(originLevel); + + var targetLevel = increment(afterTargetLevel); + + if (targetLevel < origin) { + // Remove first + var removed = removeArticle(summary, originLevel); + // Insert then + return insertArticle(removed, article, targetLevel); + } else { + // Insert right after first + var inserted = insertArticle(summary, article, targetLevel); + // Remove old one + return removeArticle(inserted, originLevel); + } +} + +/** + @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('.'); +} + +function increment(level) { + level = levelToArray(level); + level[level.length - 1]++; + return arrayToLevel(level); +} + +module.exports = moveArticleAfter; |