summaryrefslogtreecommitdiffstats
path: root/packages/gitbook/src/models/glossary.js
blob: f958f6306a07cfe6bfa08fc8c32f989cf8915eeb (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
const { Record, OrderedMap } = require('immutable');

const File = require('./file');
const GlossaryEntry = require('./glossaryEntry');

const DEFAULTS = {
    file:    new File(),
    entries: OrderedMap()
};

class Glossary extends Record(DEFAULTS) {
    getFile() {
        return this.get('file');
    }

    getEntries() {
        return this.get('entries');
    }

    /**
     * Set file linked to the glossary.
     * @param  {File} file
     * @return {Readme}
     */
    setFile(file) {
        return this.merge({ file });
    }

    /**
     * Return an entry by its name.
     * @param {String} name
     * @return {GlossaryEntry}
     */
    getEntry(name) {
        const { entries } = this;
        const id = GlossaryEntry.nameToID(name);

        return entries.get(id);
    }

    /**
     * Add/Replace an entry to a glossary.
     * @param {GlossaryEntry} entry
     * @return {Glossary}
     */
    addEntry(entry) {
        const id = entry.getID();
        let { entries } = this;

        entries = entries.set(id, entry);
        return this.set('entries', entries);
    }

    /**
     * Add/Replace an entry to a glossary by name/description.
     * @param {GlossaryEntry} entry
     * @return {Glossary}
     */
    addEntryByName(name, description) {
        const entry = new GlossaryEntry({
            name,
            description
        });

        return this.addEntry(entry);
    }

    /**
     * Create a glossary from a list of entries.
     *
     * @param {Array|List} entries
     * @return {Glossary}
     */
    static createFromEntries(entries) {
        entries = entries.map((entry) => {
            if (!(entry instanceof GlossaryEntry)) {
                entry = new GlossaryEntry(entry);
            }

            return [entry.id, entry];
        });

        return new Glossary({
            entries: OrderedMap(entries)
        });
    }
}

module.exports = Glossary;