diff --git a/parser.js b/parser.js index f8c4d89..a144eb3 100644 --- a/parser.js +++ b/parser.js @@ -1,40 +1,57 @@ const {dom, rule, ruleset} = require('fathom-web'); const DEFAULT_RULESET = require('./lib/default-ruleset'); -const MetadataParser = { - metadataRules: Object.assign({}, DEFAULT_RULESET), - buildRuleset(name, rules) { - const reversedRules = Array.from(rules).reverse(); - const builtRuleset = ruleset(...reversedRules.map(([query, handler], order) => rule( - dom(query), - node => [{ - score: order, - flavor: name, - notes: handler(node), - }] - ))); +function buildRuleset(name, rules) { + const reversedRules = Array.from(rules).reverse(); + const builtRuleset = ruleset(...reversedRules.map(([query, handler], order) => rule( + dom(query), + node => [{ + score: order, + flavor: name, + notes: handler(node), + }] + ))); - return doc => { - const kb = builtRuleset.score(doc); - const maxNode = kb.max(name); - if (maxNode) { - const value = maxNode.flavors.get(name); - if (value) { - return value.trim(); - } + return doc => { + const kb = builtRuleset.score(doc); + const maxNode = kb.max(name); + if (maxNode) { + const value = maxNode.flavors.get(name); + if (value) { + return value.trim(); } - }; - }, - getMetadata(doc) { - const metadata = {}; - - Object.keys(MetadataParser.metadataRules).forEach(metadataKey => { - const metadataRule = MetadataParser.buildRuleset(metadataKey, MetadataParser.metadataRules[metadataKey]); - metadata[metadataKey] = metadataRule(doc); - }); + } + }; +} +function getMetadata(doc, rules) { + return Object.keys(rules).reduce((metadata, key) => { + metadata[key] = buildRuleset(key, rules[key])(doc); return metadata; + }, {}); +} + +class MetadataParser { + constructor(customRules = {}, options = {}) { + this._rules = options.replace ? customRules : Object.assign({}, MetadataParser.metadataRules, customRules); + } + get rules() { + return this._rules; + } + extend(key, rules, prepend) { + if (!this._rules[key]) this._rules[key] = []; + if (prepend) { + this._rules[key] = rules.concat(this._rules[key]); + } else { + this._rules[key] = this._rules[key].concat(rules); + } + } + getMetadata(doc) { + return getMetadata(doc, this._rules); } -}; +} +MetadataParser.metadataRules = Object.assign({}, DEFAULT_RULESET); +MetadataParser.buildRuleset = buildRuleset; +MetadataParser.getMetadata = doc => getMetadata(doc, MetadataParser.metadataRules); module.exports = MetadataParser;