summaryrefslogtreecommitdiffstats
path: root/lib/modifiers
diff options
context:
space:
mode:
authorSoreine <nicolas@gitbook.com>2016-05-03 16:02:58 +0200
committerSoreine <nicolas@gitbook.com>2016-05-03 16:02:58 +0200
commit3fc90554f5e7e6ff2fb4f023319799e1e8f81454 (patch)
treedc34d87ba50d004c9fac610a370432ae340ad498 /lib/modifiers
parent4ebe28faaebb8752107ef6cfa6253f7b6f8a2a86 (diff)
downloadgitbook-3fc90554f5e7e6ff2fb4f023319799e1e8f81454.zip
gitbook-3fc90554f5e7e6ff2fb4f023319799e1e8f81454.tar.gz
gitbook-3fc90554f5e7e6ff2fb4f023319799e1e8f81454.tar.bz2
Add tests, and fixes.
Diffstat (limited to 'lib/modifiers')
-rw-r--r--lib/modifiers/summary/__tests__/mergeAtLevel.js45
-rw-r--r--lib/modifiers/summary/__tests__/moveArticle.js68
-rw-r--r--lib/modifiers/summary/editArticleTitle.js4
-rw-r--r--lib/modifiers/summary/editPartTitle.js1
-rw-r--r--lib/modifiers/summary/insertArticle.js22
-rw-r--r--lib/modifiers/summary/mergeAtLevel.js (renamed from lib/modifiers/summary/editArticle.js)37
-rw-r--r--lib/modifiers/summary/moveArticle.js4
-rw-r--r--lib/modifiers/summary/removeArticle.js11
8 files changed, 158 insertions, 34 deletions
diff --git a/lib/modifiers/summary/__tests__/mergeAtLevel.js b/lib/modifiers/summary/__tests__/mergeAtLevel.js
new file mode 100644
index 0000000..e2635ec
--- /dev/null
+++ b/lib/modifiers/summary/__tests__/mergeAtLevel.js
@@ -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);
+ });
+});
diff --git a/lib/modifiers/summary/__tests__/moveArticle.js b/lib/modifiers/summary/__tests__/moveArticle.js
new file mode 100644
index 0000000..9a101f6
--- /dev/null
+++ b/lib/modifiers/summary/__tests__/moveArticle.js
@@ -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');
+ });
+});
diff --git a/lib/modifiers/summary/editArticleTitle.js b/lib/modifiers/summary/editArticleTitle.js
index bd9b6f2..4edee83 100644
--- a/lib/modifiers/summary/editArticleTitle.js
+++ b/lib/modifiers/summary/editArticleTitle.js
@@ -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
});
}
diff --git a/lib/modifiers/summary/editPartTitle.js b/lib/modifiers/summary/editPartTitle.js
index 472399b..b79ac1e 100644
--- a/lib/modifiers/summary/editPartTitle.js
+++ b/lib/modifiers/summary/editPartTitle.js
@@ -1,4 +1,3 @@
-
/**
Edit title of a part in the summary
diff --git a/lib/modifiers/summary/insertArticle.js b/lib/modifiers/summary/insertArticle.js
index 0a010b4..849f39e 100644
--- a/lib/modifiers/summary/insertArticle.js
+++ b/lib/modifiers/summary/insertArticle.js
@@ -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;
diff --git a/lib/modifiers/summary/editArticle.js b/lib/modifiers/summary/mergeAtLevel.js
index 1625398..9a95ffc 100644
--- a/lib/modifiers/summary/editArticle.js
+++ b/lib/modifiers/summary/mergeAtLevel.js
@@ -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;
diff --git a/lib/modifiers/summary/moveArticle.js b/lib/modifiers/summary/moveArticle.js
index 9819245..06d82ca 100644
--- a/lib/modifiers/summary/moveArticle.js
+++ b/lib/modifiers/summary/moveArticle.js
@@ -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.
diff --git a/lib/modifiers/summary/removeArticle.js b/lib/modifiers/summary/removeArticle.js
index 4cb848a..8a30d0a 100644
--- a/lib/modifiers/summary/removeArticle.js
+++ b/lib/modifiers/summary/removeArticle.js
@@ -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;