UserScriptsPublic/meta.js
2024-08-02 13:17:42 -04:00

74 lines
1.7 KiB
JavaScript

// 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;