mirror of
https://github.com/GitbookIO/gitbook.git
synced 2026-10-03 20:20:35 +00:00
Add tests, and fixes.
This commit is contained in:
@@ -56,7 +56,7 @@ Summary.prototype.getArticle = function(iter, partIter) {
|
||||
Return a part/article by its level
|
||||
|
||||
@param {String} level
|
||||
@return {Article}
|
||||
@return {Article|Part}
|
||||
*/
|
||||
Summary.prototype.getByLevel = function(level) {
|
||||
function iterByLevel(article) {
|
||||
|
||||
@@ -0,0 +1,45 @@
|
||||
var Immutable = require('immutable');
|
||||
var Summary = require('../../../models/summary');
|
||||
var File = require('../../../models/file');
|
||||
|
||||
describe('mergeAtLevel', function() {
|
||||
var mergeAtLevel = require('../mergeAtLevel');
|
||||
var summary = Summary.createFromParts(File(), [
|
||||
{
|
||||
articles: [
|
||||
{
|
||||
title: '1.1',
|
||||
path: '1.1'
|
||||
},
|
||||
{
|
||||
title: '1.2',
|
||||
path: '1.2'
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
title: 'Part I',
|
||||
articles: []
|
||||
}
|
||||
]);
|
||||
|
||||
it('should edit a part', function() {
|
||||
var beforeChildren = summary.getByLevel('1').getArticles();
|
||||
var newSummary = mergeAtLevel(summary, '1', {title: 'Part O'});
|
||||
var edited = newSummary.getByLevel('1');
|
||||
|
||||
expect(edited.getTitle()).toBe('Part O');
|
||||
// Same children
|
||||
expect(Immutable.is(beforeChildren, edited.getArticles())).toBe(true);
|
||||
});
|
||||
|
||||
it('should edit a part', function() {
|
||||
var beforePath = summary.getByLevel('1.2').getPath();
|
||||
var newSummary = mergeAtLevel(summary, '1.2', {title: 'Renamed article'});
|
||||
var edited = newSummary.getByLevel('1.2');
|
||||
|
||||
expect(edited.getTitle()).toBe('Renamed article');
|
||||
// Same children
|
||||
expect(Immutable.is(beforePath, edited.getPath())).toBe(true);
|
||||
});
|
||||
});
|
||||
@@ -0,0 +1,68 @@
|
||||
var Immutable = require('immutable');
|
||||
var Summary = require('../../../models/summary');
|
||||
var File = require('../../../models/file');
|
||||
|
||||
describe('moveArticle', function() {
|
||||
var moveArticle = require('../moveArticle');
|
||||
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('should move an article at in place', function() {
|
||||
var newSummary = moveArticle(summary, '2.1', '2.1');
|
||||
|
||||
expect(Immutable.is(summary, newSummary)).toBe(true);
|
||||
});
|
||||
|
||||
it('should move an article to an previous level', function() {
|
||||
var newSummary = moveArticle(summary, '2.2', '2.1');
|
||||
var moved = newSummary.getByLevel('2.1');
|
||||
var other = newSummary.getByLevel('2.2');
|
||||
|
||||
expect(moved.getTitle()).toBe('2.2');
|
||||
expect(other.getTitle()).toBe('2.1');
|
||||
});
|
||||
|
||||
it('should move an article to a next level', function() {
|
||||
var newSummary = moveArticle(summary, '2.1', '2.2');
|
||||
var moved = newSummary.getByLevel('2.1');
|
||||
var other = newSummary.getByLevel('2.2');
|
||||
|
||||
expect(moved.getTitle()).toBe('2.2');
|
||||
expect(other.getTitle()).toBe('2.1');
|
||||
});
|
||||
});
|
||||
@@ -1,4 +1,4 @@
|
||||
var editArticle = require('./editArticle');
|
||||
var mergeAtLevel = require('./mergeAtLevel');
|
||||
|
||||
/**
|
||||
Edit title of an article
|
||||
@@ -9,7 +9,7 @@ var editArticle = require('./editArticle');
|
||||
@return {Summary}
|
||||
*/
|
||||
function editArticleTitle(summary, level, newTitle) {
|
||||
return editArticle(summary, level, {
|
||||
return mergeAtLevel(summary, level, {
|
||||
title: newTitle
|
||||
});
|
||||
}
|
||||
|
||||
@@ -1,4 +1,3 @@
|
||||
|
||||
/**
|
||||
Edit title of a part in the summary
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
var is = require('is');
|
||||
var SummaryArticle = require('../../models/summaryArticle');
|
||||
var editArticle = require('./editArticle');
|
||||
var mergeAtLevel = require('./mergeAtLevel');
|
||||
var indexArticleLevels = require('./indexArticleLevels');
|
||||
|
||||
/**
|
||||
@@ -23,12 +23,7 @@ function insertArticle(summary, level, article) {
|
||||
|
||||
// Find the index to insert at
|
||||
var articles = parent.getArticles();
|
||||
var index = articles.findIndex(function(art) {
|
||||
return art.getLevel() === level;
|
||||
});
|
||||
if (!index) {
|
||||
return summary;
|
||||
}
|
||||
var index = getLeafIndex(level);
|
||||
|
||||
// Insert the article at the right index
|
||||
articles = articles.insert(index, article);
|
||||
@@ -37,7 +32,18 @@ function insertArticle(summary, level, article) {
|
||||
parent = parent.set('articles', articles);
|
||||
parent = indexArticleLevels(parent);
|
||||
|
||||
return editArticle(summary, parent.getLevel(), parent);
|
||||
return mergeAtLevel(summary, parent.getLevel(), parent);
|
||||
}
|
||||
|
||||
/**
|
||||
@param {String}
|
||||
@return {Number} The index of this level within its parent's children
|
||||
*/
|
||||
function getLeafIndex(level) {
|
||||
var arr = level.split('.').map(function (char) {
|
||||
return parseInt(char, 10);
|
||||
});
|
||||
return arr[arr.length - 1] - 1;
|
||||
}
|
||||
|
||||
module.exports = insertArticle;
|
||||
|
||||
@@ -11,16 +11,17 @@ function editArticleInList(articles, level, newArticle) {
|
||||
return articles.map(function(article) {
|
||||
var articleLevel = article.getLevel();
|
||||
|
||||
if (articleLevel == level) {
|
||||
if (articleLevel === level) {
|
||||
// it is the article to edit
|
||||
return article.merge(newArticle);
|
||||
}
|
||||
|
||||
if (level.indexOf(articleLevel) === 0) {
|
||||
} else if (level.indexOf(articleLevel) === 0) {
|
||||
// it is a parent
|
||||
var articles = editArticleInList(article.getArticles(), level, newArticle);
|
||||
return article.set('articles', articles);
|
||||
} else {
|
||||
// This is not the article you are looking for
|
||||
return article;
|
||||
}
|
||||
|
||||
return article;
|
||||
});
|
||||
}
|
||||
|
||||
@@ -35,36 +36,40 @@ function editArticleInList(articles, level, newArticle) {
|
||||
*/
|
||||
function editArticleInPart(part, level, newArticle) {
|
||||
var articles = part.getArticles();
|
||||
articles = editArticleInList(articles);
|
||||
articles = editArticleInList(articles, level, newArticle);
|
||||
|
||||
return part.set('articles', articles);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Edit an article in a summary
|
||||
Edit an article, or a part, in a summary. Does a shallow merge.
|
||||
|
||||
@param {Summary} summary
|
||||
@param {String} level
|
||||
@param {Article} newArticle
|
||||
@param {Article|Part} newValue
|
||||
@return {Summary}
|
||||
*/
|
||||
function editArticle(summary, level, newArticle) {
|
||||
var parts = summary.getParts();
|
||||
|
||||
function mergeAtLevel(summary, level, newValue) {
|
||||
var levelParts = level.split('.');
|
||||
var partIndex = Number(levelParts[0]);
|
||||
var partIndex = Number(levelParts[0]) -1;
|
||||
|
||||
var parts = summary.getParts();
|
||||
var part = parts.get(partIndex);
|
||||
if (!part) {
|
||||
return summary;
|
||||
}
|
||||
|
||||
part = editArticleInPart(part, level, newArticle);
|
||||
parts = parts.set(partIndex, part);
|
||||
var isEditingPart = levelParts.length < 2;
|
||||
if (isEditingPart) {
|
||||
part = part.merge(newValue);
|
||||
} else {
|
||||
part = editArticleInPart(part, level, newValue);
|
||||
}
|
||||
|
||||
parts = parts.set(partIndex, part);
|
||||
return summary.set('parts', parts);
|
||||
}
|
||||
|
||||
|
||||
module.exports = editArticle;
|
||||
module.exports = mergeAtLevel;
|
||||
@@ -46,8 +46,8 @@ function shiftLevel(removedLevel, level) {
|
||||
|
||||
var removedRoot = removedLevel[0];
|
||||
var root = level[0];
|
||||
var removedRest = removedLevel.unshift();
|
||||
var rest = level.unshift();
|
||||
var removedRest = removedLevel.slice(1);
|
||||
var rest = level.slice(1);
|
||||
|
||||
if (removedRoot < root) {
|
||||
// It will shift levels at this point. The rest is unchanged.
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
var is = require('is');
|
||||
var editArticle = require('./editArticle');
|
||||
var mergeAtLevel = require('./mergeAtLevel');
|
||||
var indexArticleLevels = require('./indexArticleLevels');
|
||||
|
||||
/**
|
||||
@@ -13,24 +13,25 @@ function removeArticle(summary, level) {
|
||||
// Coerce to level
|
||||
level = is.string(level)? level : level.getLevel();
|
||||
|
||||
var parent = summary.getParent(summary, level);
|
||||
var parent = summary.getParent(level);
|
||||
|
||||
var articles = parent.getArticles();
|
||||
// Find the index to remove
|
||||
var index = articles.findIndex(function(art) {
|
||||
return art.getLevel() === level;
|
||||
});
|
||||
if (!index) {
|
||||
if (index === -1) {
|
||||
return summary;
|
||||
}
|
||||
|
||||
// Remove from children
|
||||
var articles = parent.getArticles().remove(index);
|
||||
articles = articles.remove(index);
|
||||
parent = parent.set('articles', articles);
|
||||
|
||||
// Reindex the level from here
|
||||
parent = indexArticleLevels(parent);
|
||||
|
||||
return editArticle(summary, parent.getLevel(), parent);
|
||||
return mergeAtLevel(summary, parent.getLevel(), parent);
|
||||
}
|
||||
|
||||
module.exports = removeArticle;
|
||||
|
||||
Reference in New Issue
Block a user