mirror of
https://github.com/GitbookIO/gitbook.git
synced 2026-09-29 05:29:02 +00:00
Modifier moveArticleAfter
This commit is contained in:
@@ -0,0 +1,82 @@
|
||||
var Immutable = require('immutable');
|
||||
var Summary = require('../../../models/summary');
|
||||
var File = require('../../../models/file');
|
||||
|
||||
describe('moveArticleAfter', function() {
|
||||
var moveArticleAfter = require('../moveArticleAfter');
|
||||
var summary = Summary.createFromParts(File(), [
|
||||
{
|
||||
articles: [
|
||||
{
|
||||
title: '1.1',
|
||||
path: '1.1'
|
||||
},
|
||||
{
|
||||
title: '1.2',
|
||||
path: '1.2'
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
title: 'Part I',
|
||||
articles: [
|
||||
{
|
||||
title: '2.1',
|
||||
path: '2.1',
|
||||
articles: [
|
||||
{
|
||||
title: '2.1.1',
|
||||
path: '2.1.1'
|
||||
},
|
||||
{
|
||||
title: '2.1.2',
|
||||
path: '2.1.2'
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
title: '2.2',
|
||||
path: '2.2'
|
||||
}
|
||||
]
|
||||
}
|
||||
]);
|
||||
|
||||
it('moving right after itself should be invariant', function() {
|
||||
var newSummary = moveArticleAfter(summary, '2.1', '2.1');
|
||||
|
||||
expect(Immutable.is(summary, newSummary)).toBe(true);
|
||||
});
|
||||
|
||||
it('moving after previous one should be invariant too', function() {
|
||||
var newSummary = moveArticleAfter(summary, '2.1', '2.0');
|
||||
|
||||
expect(Immutable.is(summary, newSummary)).toBe(true);
|
||||
});
|
||||
|
||||
it('should move an article after a previous level', function() {
|
||||
var newSummary = moveArticleAfter(summary, '2.2', '2.0');
|
||||
var moved = newSummary.getByLevel('2.1');
|
||||
|
||||
expect(moved.getTitle()).toBe('2.2');
|
||||
expect(newSummary.getByLevel('2.2').getTitle()).toBe('2.1');
|
||||
});
|
||||
|
||||
it('should move an article after a previous and less deep level', function() {
|
||||
var newSummary = moveArticleAfter(summary, '2.1.1', '2.0');
|
||||
var moved = newSummary.getByLevel('2.1');
|
||||
|
||||
expect(moved.getTitle()).toBe('2.1.1');
|
||||
expect(newSummary.getByLevel('2.2.1').getTitle()).toBe('2.1.2');
|
||||
expect(newSummary.getByLevel('2.2').getTitle()).toBe('2.1');
|
||||
});
|
||||
|
||||
it('should move an article after a next level', function() {
|
||||
var newSummary = moveArticleAfter(summary, '2.1', '2.2');
|
||||
var moved = newSummary.getByLevel('2.2');
|
||||
|
||||
expect(moved.getTitle()).toBe('2.1');
|
||||
expect(newSummary.getByLevel('2.1').getTitle()).toBe('2.2');
|
||||
});
|
||||
|
||||
});
|
||||
@@ -1,6 +1,7 @@
|
||||
module.exports = {
|
||||
insertArticle: require('./insertArticle'),
|
||||
moveArticle: require('./moveArticle'),
|
||||
moveArticleAfter: require('./moveArticleAfter'),
|
||||
removeArticle: require('./removeArticle'),
|
||||
unshiftArticle: require('./unshiftArticle'),
|
||||
editArticleTitle: require('./editArticleTitle'),
|
||||
|
||||
@@ -0,0 +1,58 @@
|
||||
var is = require('is');
|
||||
var removeArticle = require('./removeArticle');
|
||||
var insertArticle = require('./insertArticle');
|
||||
|
||||
/**
|
||||
Returns a new summary, with the an article moved after another article.
|
||||
|
||||
@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;
|
||||
Reference in New Issue
Block a user