100 lines
2.3 KiB
JavaScript
100 lines
2.3 KiB
JavaScript
var _ = require('lodash');
|
|
var util = require('util');
|
|
var BackboneFile = require('./file');
|
|
|
|
// Normalize a glossary entry name into a unique id
|
|
function nameToId(name) {
|
|
return name.toLowerCase()
|
|
.replace(/[\/\\\?\%\*\:\;\|\"\'\\<\\>\#\$\(\)\!\.\@]/g, '')
|
|
.replace(/ /g, '_')
|
|
.trim();
|
|
}
|
|
|
|
|
|
/*
|
|
A glossary entry is represented by a name and a short description
|
|
An unique id for the entry is generated using its name
|
|
*/
|
|
function GlossaryEntry(name, description) {
|
|
if (!(this instanceof GlossaryEntry)) return new GlossaryEntry(name, description);
|
|
|
|
this.name = name;
|
|
this.description = description;
|
|
|
|
Object.defineProperty(this, 'id', {
|
|
get: _.bind(this.getId, this)
|
|
});
|
|
}
|
|
|
|
// Normalizes a glossary entry's name to create an ID
|
|
GlossaryEntry.prototype.getId = function() {
|
|
return nameToId(this.name);
|
|
};
|
|
|
|
|
|
/*
|
|
A glossary is a list of entries stored in a GLOSSARY.md file
|
|
*/
|
|
function Glossary() {
|
|
BackboneFile.apply(this, arguments);
|
|
|
|
this.entries = [];
|
|
}
|
|
util.inherits(Glossary, BackboneFile);
|
|
|
|
Glossary.prototype.type = 'glossary';
|
|
|
|
// Get templating context
|
|
Glossary.prototype.getContext = function() {
|
|
if (!this.path) return {};
|
|
|
|
return {
|
|
glossary: {
|
|
path: this.path
|
|
}
|
|
};
|
|
};
|
|
|
|
// Parse the readme content
|
|
Glossary.prototype.parse = function(content) {
|
|
var that = this;
|
|
|
|
return this.parser.glossary(content)
|
|
.then(function(entries) {
|
|
that.entries = _.map(entries, function(entry) {
|
|
return new GlossaryEntry(entry.name, entry.description);
|
|
});
|
|
});
|
|
};
|
|
|
|
// Return an entry by its id
|
|
Glossary.prototype.get = function(id) {
|
|
return _.find(this.entries, {
|
|
id: id
|
|
});
|
|
};
|
|
|
|
// Find an entry by its name
|
|
Glossary.prototype.find = function(name) {
|
|
return this.get(nameToId(name));
|
|
};
|
|
|
|
// Return false if glossary has entries (and exists)
|
|
Glossary.prototype.isEmpty = function(id) {
|
|
return _.size(this.entries) === 0;
|
|
};
|
|
|
|
// Convert the glossary to a list of annotations
|
|
Glossary.prototype.annotations = function() {
|
|
return _.map(this.entries, function(entry) {
|
|
return {
|
|
id: entry.id,
|
|
name: entry.name,
|
|
description: entry.description,
|
|
href: '/' + this.path + '#' + entry.id
|
|
};
|
|
}, this);
|
|
};
|
|
|
|
module.exports = Glossary;
|