Adds move and remove article modifier.

This commit is contained in:
Soreine
2016-05-03 12:37:26 +02:00
parent 6b17d08892
commit 693171cb05
6 changed files with 158 additions and 29 deletions
+32
View File
@@ -129,6 +129,27 @@ Summary.prototype.getPrevArticle = function(current) {
return prev;
};
/**
Return the parent article, or parent part of an article
@param {String|Article} current
@return {Article|Part|Null}
*/
Summary.prototype.getParent = function (level) {
// Coerce to level
level = is.string(level)? level : level.getLevel();
// Get parent level
var parentLevel = getParentLevel(level);
if (!parentLevel) {
return null;
}
// Get parent of the position
var parentArticle = this.getByLevel(parentLevel);
return parentArticle || null;
};
/**
Render summary as text
@@ -188,4 +209,15 @@ Summary.createFromParts = function createFromParts(file, parts) {
});
};
/**
Returns parent level of a level
@param {String} level
@return {String}
*/
function getParentLevel(level) {
var parts = level.split('.');
return parts.slice(0, -1).join('.');
}
module.exports = Summary;
+2 -1
View File
@@ -1,6 +1,7 @@
module.exports = {
insertArticle: require('./insertArticle'),
moveArticle: require('./moveArticle'),
removeArticle: require('./removeArticle'),
unshiftArticle: require('./unshiftArticle'),
editPartTitle: require('./editPartTitle'),
+6 -27
View File
@@ -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;
+81
View File
@@ -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;
+36
View File
@@ -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;
+1 -1
View File
@@ -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