data-section
Version:
Read data from comment, like as perl's Data::Section::Simple.
59 lines (51 loc) • 1.37 kB
JavaScript
var fs = require('fs');
var dataSection = module.exports;
dataSection.encoding = 'utf8';
dataSection.get = function(opt) {
var callback = arguments[ arguments.length - 1];
if (typeof callback !== 'function') {
throw new Error('callback function required');
}
opt = _parseOpt(opt);
fs.readFile(opt.filename, opt.encoding, function(err, data) {
if (err) {
callback(err);
return;
}
var ret = _parseData(data);
callback(err, opt.key ? ret[opt.key] : ret);
});
};
dataSection.getSync = function(opt) {
opt = _parseOpt(opt);
var ret = _parseData(fs.readFileSync(opt.filename, opt.encoding));
return opt.key ? ret[opt.key] : ret;
};
function _parseData(data) {
var ret = {};
data.replace(/\/\*\s*__DATA__([\s\S]*?)__DATA__\s*\*\//g, function() {
var name;
arguments[1].trim().split(/\n/).forEach(function(line) {
var m = line.match(/^@@\s*(.+)/);
if (m) {
name = m[1];
ret[name] = '';
}
else if (ret[name] !== undefined) {
ret[name] += (ret[name] ? '\n' : '') + line;
}
});
});
return ret;
}
function _parseOpt(opt) {
opt = opt || {};
if (typeof opt === 'string') {
opt = { key: opt };
}
return {
key: opt.key,
filename: opt.filename || module.parent.parent.filename,
encoding: opt.encoding || dataSection.encoding
};
}