Modifier moveArticleAfter

This commit is contained in:
Soreine
2016-05-09 19:51:54 +02:00
parent 0945807184
commit 2fef898a1e
3 changed files with 141 additions and 0 deletions
@@ -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
View File
@@ -1,6 +1,7 @@
module.exports = {
insertArticle: require('./insertArticle'),
moveArticle: require('./moveArticle'),
moveArticleAfter: require('./moveArticleAfter'),
removeArticle: require('./removeArticle'),
unshiftArticle: require('./unshiftArticle'),
editArticleTitle: require('./editArticleTitle'),
+58
View File
@@ -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;