summaryrefslogtreecommitdiffstats
path: root/lib/models/summaryArticle.js
blob: 3d642fc2a74e6229d3a7201dcf98436261cdb9f2 (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
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
var Immutable = require('immutable');

var location = require('../utils/location');

/*
    An article represents an entry in the Summary / table of Contents
*/

var SummaryArticle = Immutable.Record({
    level:      String(),
    title:      String(),
    ref:        String(),
    articles:   Immutable.List()
});

SummaryArticle.prototype.getLevel = function() {
    return this.get('level');
};

SummaryArticle.prototype.getTitle = function() {
    return this.get('title');
};

SummaryArticle.prototype.getRef = function() {
    return this.get('ref');
};

SummaryArticle.prototype.getArticles = function() {
    return this.get('articles');
};

/**
    Get path (without anchor) to the pointing file

    @return {String}
*/
SummaryArticle.prototype.getPath = function() {
    var ref = this.getRef();
    var parts = ref.split('#');

    var pathname = (parts.length > 1? parts.slice(0, -1).join('#') : ref);

    // Normalize path to remove ('./', etc)
    return location.normalize(pathname);
};

/**
    Get anchor for this article (or undefined)

    @return {String}
*/
SummaryArticle.prototype.getAnchor = function() {
    var ref = this.getRef();
    var parts = ref.split('#');

    var anchor = (parts.length > 1? '#' + parts[parts.length - 1] : null);
    return anchor;
};

/**
    Is article pointing to a page of an absolute url

    @return {Boolean}
*/
SummaryArticle.prototype.isPage = function() {
    return !this.isExternal() && this.getRef();
};

/**
    Is article pointing to aan absolute url

    @return {Boolean}
*/
SummaryArticle.prototype.isExternal = function() {
    return location.isExternal(this.getRef());
};

/**
    Create a SummaryArticle

    @param {Object} def
    @return {SummaryArticle}
*/
SummaryArticle.create = function(def) {
    var articles = (def.articles || []).map(function(article) {
        if (article instanceof SummaryArticle) {
            return article;
        }
        return SummaryArticle.create(article);
    });

    return new SummaryArticle({
        title: def.title,
        ref: def.ref || def.path,
        articles: Immutable.List(articles)
    });
};


module.exports = SummaryArticle;