diff options
Diffstat (limited to 'packages/gitbook/src/models/glossary.js')
-rw-r--r-- | packages/gitbook/src/models/glossary.js | 109 |
1 files changed, 109 insertions, 0 deletions
diff --git a/packages/gitbook/src/models/glossary.js b/packages/gitbook/src/models/glossary.js new file mode 100644 index 0000000..e269b14 --- /dev/null +++ b/packages/gitbook/src/models/glossary.js @@ -0,0 +1,109 @@ +const Immutable = require('immutable'); + +const error = require('../utils/error'); +const File = require('./file'); +const GlossaryEntry = require('./glossaryEntry'); +const parsers = require('../parsers'); + +const Glossary = Immutable.Record({ + file: File(), + entries: Immutable.OrderedMap() +}); + +Glossary.prototype.getFile = function() { + return this.get('file'); +}; + +Glossary.prototype.getEntries = function() { + return this.get('entries'); +}; + +/** + Return an entry by its name + + @param {String} name + @return {GlossaryEntry} +*/ +Glossary.prototype.getEntry = function(name) { + const entries = this.getEntries(); + const id = GlossaryEntry.nameToID(name); + + return entries.get(id); +}; + +/** + Render glossary as text + + @return {Promise<String>} +*/ +Glossary.prototype.toText = function(parser) { + const file = this.getFile(); + const entries = this.getEntries(); + + parser = parser ? parsers.getByExt(parser) : file.getParser(); + + if (!parser) { + throw error.FileNotParsableError({ + filename: file.getPath() + }); + } + + return parser.renderGlossary(entries.toJS()); +}; + + +/** + Add/Replace an entry to a glossary + + @param {Glossary} glossary + @param {GlossaryEntry} entry + @return {Glossary} +*/ +Glossary.addEntry = function addEntry(glossary, entry) { + const id = entry.getID(); + let entries = glossary.getEntries(); + + entries = entries.set(id, entry); + return glossary.set('entries', entries); +}; + +/** + Add/Replace an entry to a glossary by name/description + + @param {Glossary} glossary + @param {GlossaryEntry} entry + @return {Glossary} +*/ +Glossary.addEntryByName = function addEntryByName(glossary, name, description) { + const entry = new GlossaryEntry({ + name, + description + }); + + return Glossary.addEntry(glossary, entry); +}; + +/** + Create a glossary from a list of entries + + @param {String} filename + @param {Array|List} entries + @return {Glossary} +*/ +Glossary.createFromEntries = function createFromEntries(file, entries) { + entries = entries.map(function(entry) { + if (!(entry instanceof GlossaryEntry)) { + entry = new GlossaryEntry(entry); + } + + return [entry.getID(), entry]; + }); + + return new Glossary({ + file, + entries: Immutable.OrderedMap(entries) + }); +}; + + +module.exports = Glossary; |