var fs = require('fs'),
async = require('async').nextTick,
regexStart = /^(\s*\/\/\s?==userscript)\s?==/im,
regexEnd = /^(\s*\/\/\s?==\/userscript\s?==)/im;
/**
* Extract the entire metadata block
* @author Art <a.molcanovas@gmail.com>
* @exports userscript-utils/getMetablock
*/
var exp = {
/**
* Synchronously extracts the metablock from the given file
* @author Art <a.molcanovas@gmail.com>
* @param {string} file Path to the file
* @returns {string} The extracted metadata block
* @throws Error If the metadata block is not found or a FS error occurds (e.g. file not found)
*/
fromFileSync: function (file) {
fs.accessSync(file, fs.R_OK);
return exp.fromStringSync(fs.readFileSync(file, 'utf8'));
},
/**
* Asynchronously extracts the metablock from the given file
* @author Art <a.molcanovas@gmail.com>
* @param {string} file Path to the file
* @param {UserscriptUtilsErrStringCallback} callback The callback function
*/
fromFile: function (file, callback) {
fs.access(file, fs.R_OK, function (err) {
if (err) {
callback(err, null);
} else {
fs.readFile(file, 'utf8', function (err, contents) {
if (err) {
callback(err, null);
} else {
exp.fromString(contents, callback);
}
});
}
});
},
/**
* Synchronously extracts the metablock from the given string
* @author Art <a.molcanovas@gmail.com>
* @param {string} contents The string to extract from
* @returns {string} The extracted metadata block
* @throws {Error} If the metadata block is not found
*/
fromStringSync: function (contents) {
var split1 = contents.split(regexEnd),
split2;
if (split1.length === 3) {
split2 = split1[0].split(regexStart);
if (split2.length === 3) {
return (split2[1] + split2[2] + split1[1]).trim();
}
}
throw new Error("Metadata block not found");
},
/**
* Asynchronously extracts the metablock from the given string
* @author Art <a.molcanovas@gmail.com>
* @param {string} contents The string to extract from
* @param {UserscriptUtilsErrStringCallback} callback The callback function
*/
fromString: function (contents, callback) {
async(function () {
try {
callback(null, exp.fromStringSync(contents));
} catch (e) {
callback(e, null);
}
});
}
};
module.exports = exp;