From d8624cc16038d4fca934bd1eee821d87e15cf697 Mon Sep 17 00:00:00 2001 From: Roel van Uden Date: Wed, 3 Dec 2014 20:52:55 +0100 Subject: [PATCH] Allow meta information to be loaded from XML. --- lib/shared/publisher/meta.js | 62 +++++++++++++++++++++++++++++++++--- 1 file changed, 57 insertions(+), 5 deletions(-) diff --git a/lib/shared/publisher/meta.js b/lib/shared/publisher/meta.js index 9160c4e..ed37efe 100644 --- a/lib/shared/publisher/meta.js +++ b/lib/shared/publisher/meta.js @@ -2,7 +2,7 @@ var xml2js = require('xml2js'); /** - * Represents metadata. + * Represents meta information. * @constructor * @param {!ISeries} series * @param {!IChapter} chapter @@ -19,6 +19,30 @@ function Meta(series, chapter) { this.writer = series.authors.join(', '); } +/** + * Loads meta information from xml. + * @param {string} xml + * @param {function(Error, Meta)} done + */ +Meta.load = function(xml, done) { + xml2js.parseString(xml, { + explicitArray: false, + explicitRoot: false + }, function(err, result) { + if (err) return done(err); + var meta = lowerCamelCase(result, Object.create(Meta.prototype)); + meta.genre = defaultTo(meta.genre, ''); + meta.number = defaultTo(meta.number); + meta.penciller = defaultTo(meta.penciller, ''); + meta.series = defaultTo(meta.series); + meta.summary = defaultTo(meta.summary); + meta.title = defaultTo(meta.title); + meta.volume = defaultTo(meta.volume); + meta.writer = defaultTo(meta.writer, ''); + done(undefined, meta); + }); +}; + /** * Add a page to the metadata. * @param {string} key @@ -33,28 +57,56 @@ Meta.prototype.add = function(key, number) { }; /** - * Export metadata to xml. + * Export meta information to xml. * @return {string} */ Meta.prototype.xml = function() { return new xml2js.Builder({ rootName: 'ComicInfo', xmldec: {version: '1.0', encoding: 'utf-8'} - }).buildObject(map(this)); + }).buildObject(titleCase(this)); }; +/** + * Defaults a value. + * @private + * @param {*} value + * @param {*=} defaultValue + * @return {*} + */ +function defaultTo(value, defaultValue) { + return value || defaultValue; +} + +/** + * Map the source to a duplicate with lower camel case case keys. + * @private + * @param {(!Array.|!Object)} src + * @param {!Object=} destination + * @return {(!Array.|!Object)} + */ +function lowerCamelCase(src, destination) { + var res = destination || (Array.isArray(src) ? [] : {}); + Object.keys(src).forEach(function(x) { + if (typeof src[x] === 'undefined') return; + var title = x.charAt(0).toLowerCase() + x.substr(1); + res[title] = typeof src[x] === 'object' ? lowerCamelCase(src[x]) : src[x]; + }); + return res; +} + /** * Map the source to a duplicate with title case keys. * @private * @param {(!Array.|!Object)} src * @return {(!Array.|!Object)} */ -function map(src) { +function titleCase(src) { var res = Array.isArray(src) ? [] : {}; Object.keys(src).forEach(function(x) { if (typeof src[x] === 'undefined') return; var title = x.charAt(0).toUpperCase() + x.substr(1); - res[title] = typeof src[x] === 'object' ? map(src[x]) : src[x]; + res[title] = typeof src[x] === 'object' ? titleCase(src[x]) : src[x]; }); return res; }