summaryrefslogtreecommitdiffstats
path: root/lib/modifiers/summary/moveArticleAfter.js
blob: e268f73b23e4749a6bfd69c97a2ea4ca9745cdb3 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
var is = require('is');
var removeArticle = require('./removeArticle');
var insertArticle = require('./insertArticle');

/**
    Returns a new summary, with the an article moved after another
    article. Unlike `moveArticle`, does not ensure that the article
    will be found at the target's level plus one.

    @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;