marc4js
Version:
a node.js module for handling MARC data
85 lines (82 loc) • 2.71 kB
JavaScript
;
var Record = require('./marc/record');
module.exports = function() {
var callback, chunks, data, options, transformer;
if (arguments.length === 3) {
if (Array.isArray(arguments[0])) {
data = arguments[0];
} else {
data = [arguments[0]];
}
options = arguments[1];
callback = arguments[2];
} else if (arguments.length === 2) {
if (Array.isArray(arguments[0])) {
data = arguments[0];
} else if (arguments[0] instanceof Record) {
data = [arguments[0]];
} else {
options = arguments[0];
}
if (typeof arguments[1] === 'function') {
callback = arguments[1];
} else {
options = arguments[1];
}
} else if (arguments.length === 1) {
if (typeof arguments[0] === 'function') {
callback = arguments[0];
} else if (Array.isArray(arguments[0])) {
data = arguments[0];
} else {
options = arguments[0];
}
}
if (options == null) {
options = {};
}
var transformers = {
iso2709: './transform/iso2709_transformer',
marc: './transform/iso2709_transformer',
text: './transform/text_transformer',
mrk: './transform/mrk_transformer',
xml: './transform/marcxml_transformer',
marcxml: './transform/marcxml_transformer',
json: './transform/mij_transformer',
mij: './transform/mij_transformer'
};
var format = options.format || options.toFormat || 'iso2709';
var Transformer = require(transformers[format]);
transformer = new Transformer(options);
if (data) {
process.nextTick(function() {
var d, _i, _len;
for (_i = 0, _len = data.length; _i < _len; _i++) {
d = data[_i];
transformer.write(d);
}
return transformer.end();
});
}
if (callback) {
chunks = [];
var handleReadable = function() {
var chunk, _results;
_results = [];
while (chunk = transformer.read()) {
_results.push(chunks.push(chunk));
}
return _results;
};
transformer.on('readable', handleReadable);
transformer.once('error', function(err) {
transformer.removeListener('readable', handleReadable);
return callback(err);
});
transformer.once('end', function() {
transformer.removeListener('readable', handleReadable);
return callback(null, chunks.join(''));
});
}
return transformer;
};