diff --git a/meta.js b/meta.js new file mode 100644 index 0000000..7c47536 --- /dev/null +++ b/meta.js @@ -0,0 +1,67 @@ +// This is a copy of https://github.com/pd4d10/userscript-meta/blob/master/index.js +'use strict' + +function isUndefined(val) { + return typeof val === 'undefined' +} + +function isObject(val) { + return typeof val === 'object' && val !== null +} + +// Parse metadata to an object +function parse(meta) { + if (typeof meta !== 'string') { + throw new Error('`Parse`\'s first argument should be a string') + } + + return meta.split(/[\r\n]/) + .filter(function (line) { // remove blank line + return /\S+/.test(line) && + line.indexOf('==UserScript==') === -1 && + line.indexOf('==/UserScript==') === -1 + }) + .reduce(function (obj, line) { + var arr = line.trim().replace(/^\/\//, '').trim().split(/\s+/) + var key = arr[0].slice(1) + var value = arr.slice(1).join(' ') + + if (isUndefined(obj[key])) { + obj[key] = value + } else if (Array.isArray(obj[key])) { + obj[key].push(value) + } else { + obj[key] = [obj[key], value] + } + + return obj + }, {}) +} + +function getLine(key, value) { + // For field which has multiple values, like `match` + if (Array.isArray(value)) { + return value.map(function (value) { + return getLine(key, value) + }).join('') + } + + return '// @' + key + ' ' + value + '\n' +} + +// Stringify metadata from an object +function stringify(obj) { + if (!isObject(obj)) { + throw new Error('`Stringify`\'s first argument should be an object') + } + + var meta = Object.keys(obj) + .map(function (key) { + return getLine(key, obj[key]) + }).join('') + + return '// ==UserScript==\n' + meta + '// ==/UserScript==\n' +} + +exports.parse = parse +exports.stringify = stringify \ No newline at end of file