summaryrefslogtreecommitdiffstats
path: root/lib/modifiers/summary/moveArticleAfter.js
diff options
context:
space:
mode:
authorSamy Pessé <samypesse@gmail.com>2016-05-11 13:57:21 +0200
committerSamy Pessé <samypesse@gmail.com>2016-05-11 13:57:21 +0200
commit7bd49606e3aceb4078258c6693f53bc129eb5b93 (patch)
treeb61d65f716c402c847973186c6f1dd7b78311827 /lib/modifiers/summary/moveArticleAfter.js
parentd7c86353503106b2672b7948661c1c0aa9e727bb (diff)
parent19e9ff81d2d118bb45d8245da3f1ba4cad95416b (diff)
downloadgitbook-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.js60
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;