mirror of
https://github.com/GitbookIO/gitbook.git
synced 2026-09-23 19:06:31 +00:00
Adds move and remove article modifier.
This commit is contained in:
@@ -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;
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
|
||||
module.exports = {
|
||||
insertArticle: require('./insertArticle'),
|
||||
moveArticle: require('./moveArticle'),
|
||||
removeArticle: require('./removeArticle'),
|
||||
unshiftArticle: require('./unshiftArticle'),
|
||||
|
||||
editPartTitle: require('./editPartTitle'),
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
@@ -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;
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user