Skip to content
This repository has been archived by the owner on May 1, 2022. It is now read-only.

Commit

Permalink
Allow meta information to be loaded from XML.
Browse files Browse the repository at this point in the history
  • Loading branch information
Roel van Uden committed Dec 3, 2014
1 parent b948eda commit d8624cc
Showing 1 changed file with 57 additions and 5 deletions.
62 changes: 57 additions & 5 deletions lib/shared/publisher/meta.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
var xml2js = require('xml2js');

/**
* Represents metadata.
* Represents meta information.
* @constructor
* @param {!ISeries} series
* @param {!IChapter} chapter
Expand All @@ -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
Expand All @@ -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>|!Object)} src
* @param {!Object=} destination
* @return {(!Array.<!Object>|!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>|!Object)} src
* @return {(!Array.<!Object>|!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;
}
Expand Down

0 comments on commit d8624cc

Please sign in to comment.