summaryrefslogtreecommitdiffstats
path: root/lib/modifiers
diff options
context:
space:
mode:
authorSoreine <nicolas@gitbook.com>2016-05-03 12:37:26 +0200
committerSoreine <nicolas@gitbook.com>2016-05-03 12:37:26 +0200
commit693171cb0544c900cb964b0b6015ca528aa776f2 (patch)
tree408f2dafa58b8c76e8e0f3dce9c762cbf9a283cc /lib/modifiers
parent6b17d08892828818216a260576c83b7203c2098f (diff)
downloadgitbook-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.js3
-rw-r--r--lib/modifiers/summary/insertArticle.js33
-rw-r--r--lib/modifiers/summary/moveArticle.js81
-rw-r--r--lib/modifiers/summary/removeArticle.js36
-rw-r--r--lib/modifiers/summary/unshiftArticle.js2
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