hacksoft-interpreter
Version:
A library for interpreting .hks files
680 lines (679 loc) • 22.5 kB
JavaScript
var re = typeof globalThis < "u" ? globalThis : typeof window < "u" ? window : typeof global < "u" ? global : typeof self < "u" ? self : {};
function te(l) {
return l && l.__esModule && Object.prototype.hasOwnProperty.call(l, "default") ? l.default : l;
}
var L = { exports: {} }, q = {}, W, Z;
function ne() {
return Z || (Z = 1, W = function(a) {
return a && typeof a == "object" && typeof a.copy == "function" && typeof a.fill == "function" && typeof a.readUInt8 == "function";
}), W;
}
var H = { exports: {} }, G;
function ie() {
return G || (G = 1, typeof Object.create == "function" ? H.exports = function(a, u) {
a.super_ = u, a.prototype = Object.create(u.prototype, {
constructor: {
value: a,
enumerable: !1,
writable: !0,
configurable: !0
}
});
} : H.exports = function(a, u) {
a.super_ = u;
var d = function() {
};
d.prototype = u.prototype, a.prototype = new d(), a.prototype.constructor = a;
}), H.exports;
}
var V;
function se() {
return V || (V = 1, function(l) {
var a = /%[sdj%]/g;
l.format = function(e) {
if (!b(e)) {
for (var n = [], o = 0; o < arguments.length; o++)
n.push(f(arguments[o]));
return n.join(" ");
}
for (var o = 1, v = arguments, z = v.length, w = String(e).replace(a, function(j) {
if (j === "%%") return "%";
if (o >= z) return j;
switch (j) {
case "%s":
return String(v[o++]);
case "%d":
return Number(v[o++]);
case "%j":
try {
return JSON.stringify(v[o++]);
} catch {
return "[Circular]";
}
default:
return j;
}
}), h = v[o]; o < z; h = v[++o])
s(h) || !D(h) ? w += " " + h : w += " " + f(h);
return w;
}, l.deprecate = function(e, n) {
if (A(re.process))
return function() {
return l.deprecate(e, n).apply(this, arguments);
};
if (process.noDeprecation === !0)
return e;
var o = !1;
function v() {
if (!o) {
if (process.throwDeprecation)
throw new Error(n);
process.traceDeprecation ? console.trace(n) : console.error(n), o = !0;
}
return e.apply(this, arguments);
}
return v;
};
var u = {}, d;
l.debuglog = function(e) {
if (A(d) && (d = process.env.NODE_DEBUG || ""), e = e.toUpperCase(), !u[e])
if (new RegExp("\\b" + e + "\\b", "i").test(d)) {
var n = process.pid;
u[e] = function() {
var o = l.format.apply(l, arguments);
console.error("%s %d: %s", e, n, o);
};
} else
u[e] = function() {
};
return u[e];
};
function f(e, n) {
var o = {
seen: [],
stylize: p
};
return arguments.length >= 3 && (o.depth = arguments[2]), arguments.length >= 4 && (o.colors = arguments[3]), i(n) ? o.showHidden = n : n && l._extend(o, n), A(o.showHidden) && (o.showHidden = !1), A(o.depth) && (o.depth = 2), A(o.colors) && (o.colors = !1), A(o.customInspect) && (o.customInspect = !0), o.colors && (o.stylize = E), m(o, e, o.depth);
}
l.inspect = f, f.colors = {
bold: [1, 22],
italic: [3, 23],
underline: [4, 24],
inverse: [7, 27],
white: [37, 39],
grey: [90, 39],
black: [30, 39],
blue: [34, 39],
cyan: [36, 39],
green: [32, 39],
magenta: [35, 39],
red: [31, 39],
yellow: [33, 39]
}, f.styles = {
special: "cyan",
number: "yellow",
boolean: "yellow",
undefined: "grey",
null: "bold",
string: "green",
date: "magenta",
// "name": intentionally not styling
regexp: "red"
};
function E(e, n) {
var o = f.styles[n];
return o ? "\x1B[" + f.colors[o][0] + "m" + e + "\x1B[" + f.colors[o][1] + "m" : e;
}
function p(e, n) {
return e;
}
function S(e) {
var n = {};
return e.forEach(function(o, v) {
n[o] = !0;
}), n;
}
function m(e, n, o) {
if (e.customInspect && n && k(n.inspect) && // Filter out the util module, it's inspect function is special
n.inspect !== l.inspect && // Also filter out any prototype objects using the circular check.
!(n.constructor && n.constructor.prototype === n)) {
var v = n.inspect(o, e);
return b(v) || (v = m(e, v, o)), v;
}
var z = O(e, n);
if (z)
return z;
var w = Object.keys(n), h = S(w);
if (e.showHidden && (w = Object.getOwnPropertyNames(n)), R(n) && (w.indexOf("message") >= 0 || w.indexOf("description") >= 0))
return N(n);
if (w.length === 0) {
if (k(n)) {
var j = n.name ? ": " + n.name : "";
return e.stylize("[Function" + j + "]", "special");
}
if (T(n))
return e.stylize(RegExp.prototype.toString.call(n), "regexp");
if (I(n))
return e.stylize(Date.prototype.toString.call(n), "date");
if (R(n))
return N(n);
}
var P = "", U = !1, _ = ["{", "}"];
if (t(n) && (U = !0, _ = ["[", "]"]), k(n)) {
var x = n.name ? ": " + n.name : "";
P = " [Function" + x + "]";
}
if (T(n) && (P = " " + RegExp.prototype.toString.call(n)), I(n) && (P = " " + Date.prototype.toUTCString.call(n)), R(n) && (P = " " + N(n)), w.length === 0 && (!U || n.length == 0))
return _[0] + P + _[1];
if (o < 0)
return T(n) ? e.stylize(RegExp.prototype.toString.call(n), "regexp") : e.stylize("[Object]", "special");
e.seen.push(n);
var M;
return U ? M = c(e, n, o, h, w) : M = w.map(function(ee) {
return $(e, n, o, h, ee, U);
}), e.seen.pop(), r(M, P, _);
}
function O(e, n) {
if (A(n))
return e.stylize("undefined", "undefined");
if (b(n)) {
var o = "'" + JSON.stringify(n).replace(/^"|"$/g, "").replace(/'/g, "\\'").replace(/\\"/g, '"') + "'";
return e.stylize(o, "string");
}
if (y(n))
return e.stylize("" + n, "number");
if (i(n))
return e.stylize("" + n, "boolean");
if (s(n))
return e.stylize("null", "null");
}
function N(e) {
return "[" + Error.prototype.toString.call(e) + "]";
}
function c(e, n, o, v, z) {
for (var w = [], h = 0, j = n.length; h < j; ++h)
J(n, String(h)) ? w.push($(
e,
n,
o,
v,
String(h),
!0
)) : w.push("");
return z.forEach(function(P) {
P.match(/^\d+$/) || w.push($(
e,
n,
o,
v,
P,
!0
));
}), w;
}
function $(e, n, o, v, z, w) {
var h, j, P;
if (P = Object.getOwnPropertyDescriptor(n, z) || { value: n[z] }, P.get ? P.set ? j = e.stylize("[Getter/Setter]", "special") : j = e.stylize("[Getter]", "special") : P.set && (j = e.stylize("[Setter]", "special")), J(v, z) || (h = "[" + z + "]"), j || (e.seen.indexOf(P.value) < 0 ? (s(o) ? j = m(e, P.value, null) : j = m(e, P.value, o - 1), j.indexOf(`
`) > -1 && (w ? j = j.split(`
`).map(function(U) {
return " " + U;
}).join(`
`).substr(2) : j = `
` + j.split(`
`).map(function(U) {
return " " + U;
}).join(`
`))) : j = e.stylize("[Circular]", "special")), A(h)) {
if (w && z.match(/^\d+$/))
return j;
h = JSON.stringify("" + z), h.match(/^"([a-zA-Z_][a-zA-Z_0-9]*)"$/) ? (h = h.substr(1, h.length - 2), h = e.stylize(h, "name")) : (h = h.replace(/'/g, "\\'").replace(/\\"/g, '"').replace(/(^"|"$)/g, "'"), h = e.stylize(h, "string"));
}
return h + ": " + j;
}
function r(e, n, o) {
var v = e.reduce(function(z, w) {
return w.indexOf(`
`) >= 0, z + w.replace(/\u001b\[\d\d?m/g, "").length + 1;
}, 0);
return v > 60 ? o[0] + (n === "" ? "" : n + `
`) + " " + e.join(`,
`) + " " + o[1] : o[0] + n + " " + e.join(", ") + " " + o[1];
}
function t(e) {
return Array.isArray(e);
}
l.isArray = t;
function i(e) {
return typeof e == "boolean";
}
l.isBoolean = i;
function s(e) {
return e === null;
}
l.isNull = s;
function g(e) {
return e == null;
}
l.isNullOrUndefined = g;
function y(e) {
return typeof e == "number";
}
l.isNumber = y;
function b(e) {
return typeof e == "string";
}
l.isString = b;
function C(e) {
return typeof e == "symbol";
}
l.isSymbol = C;
function A(e) {
return e === void 0;
}
l.isUndefined = A;
function T(e) {
return D(e) && B(e) === "[object RegExp]";
}
l.isRegExp = T;
function D(e) {
return typeof e == "object" && e !== null;
}
l.isObject = D;
function I(e) {
return D(e) && B(e) === "[object Date]";
}
l.isDate = I;
function R(e) {
return D(e) && (B(e) === "[object Error]" || e instanceof Error);
}
l.isError = R;
function k(e) {
return typeof e == "function";
}
l.isFunction = k;
function Q(e) {
return e === null || typeof e == "boolean" || typeof e == "number" || typeof e == "string" || typeof e == "symbol" || // ES6 symbol
typeof e > "u";
}
l.isPrimitive = Q, l.isBuffer = ne();
function B(e) {
return Object.prototype.toString.call(e);
}
function F(e) {
return e < 10 ? "0" + e.toString(10) : e.toString(10);
}
var X = [
"Jan",
"Feb",
"Mar",
"Apr",
"May",
"Jun",
"Jul",
"Aug",
"Sep",
"Oct",
"Nov",
"Dec"
];
function Y() {
var e = /* @__PURE__ */ new Date(), n = [
F(e.getHours()),
F(e.getMinutes()),
F(e.getSeconds())
].join(":");
return [e.getDate(), X[e.getMonth()], n].join(" ");
}
l.log = function() {
console.log("%s - %s", Y(), l.format.apply(l, arguments));
}, l.inherits = ie(), l._extend = function(e, n) {
if (!n || !D(n)) return e;
for (var o = Object.keys(n), v = o.length; v--; )
e[o[v]] = n[o[v]];
return e;
};
function J(e, n) {
return Object.prototype.hasOwnProperty.call(e, n);
}
}(q)), q;
}
var K;
function oe() {
if (K) return L.exports;
K = 1;
var l = process.platform === "win32", a = se();
function u(r, t) {
for (var i = [], s = 0; s < r.length; s++) {
var g = r[s];
!g || g === "." || (g === ".." ? i.length && i[i.length - 1] !== ".." ? i.pop() : t && i.push("..") : i.push(g));
}
return i;
}
function d(r) {
for (var t = r.length - 1, i = 0; i <= t && !r[i]; i++)
;
for (var s = t; s >= 0 && !r[s]; s--)
;
return i === 0 && s === t ? r : i > s ? [] : r.slice(i, s + 1);
}
var f = /^([a-zA-Z]:|[\\\/]{2}[^\\\/]+[\\\/]+[^\\\/]+)?([\\\/])?([\s\S]*?)$/, E = /^([\s\S]*?)((?:\.{1,2}|[^\\\/]+?|)(\.[^.\/\\]*|))(?:[\\\/]*)$/, p = {};
function S(r) {
var t = f.exec(r), i = (t[1] || "") + (t[2] || ""), s = t[3] || "", g = E.exec(s), y = g[1], b = g[2], C = g[3];
return [i, y, b, C];
}
function m(r) {
var t = f.exec(r), i = t[1] || "", s = !!i && i[1] !== ":";
return {
device: i,
isUnc: s,
isAbsolute: s || !!t[2],
// UNC paths are always absolute
tail: t[3]
};
}
function O(r) {
return "\\\\" + r.replace(/^[\\\/]+/, "").replace(/[\\\/]+/g, "\\");
}
p.resolve = function() {
for (var r = "", t = "", i = !1, s = arguments.length - 1; s >= -1; s--) {
var g;
if (s >= 0 ? g = arguments[s] : r ? (g = process.env["=" + r], (!g || g.substr(0, 3).toLowerCase() !== r.toLowerCase() + "\\") && (g = r + "\\")) : g = process.cwd(), a.isString(g)) {
if (!g)
continue;
} else throw new TypeError("Arguments to path.resolve must be strings");
var y = m(g), b = y.device, C = y.isUnc, A = y.isAbsolute, T = y.tail;
if (!(b && r && b.toLowerCase() !== r.toLowerCase()) && (r || (r = b), i || (t = T + "\\" + t, i = A), r && i))
break;
}
return C && (r = O(r)), t = u(
t.split(/[\\\/]+/),
!i
).join("\\"), r + (i ? "\\" : "") + t || ".";
}, p.normalize = function(r) {
var t = m(r), i = t.device, s = t.isUnc, g = t.isAbsolute, y = t.tail, b = /[\\\/]$/.test(y);
return y = u(y.split(/[\\\/]+/), !g).join("\\"), !y && !g && (y = "."), y && b && (y += "\\"), s && (i = O(i)), i + (g ? "\\" : "") + y;
}, p.isAbsolute = function(r) {
return m(r).isAbsolute;
}, p.join = function() {
for (var r = [], t = 0; t < arguments.length; t++) {
var i = arguments[t];
if (!a.isString(i))
throw new TypeError("Arguments to path.join must be strings");
i && r.push(i);
}
var s = r.join("\\");
return /^[\\\/]{2}[^\\\/]/.test(r[0]) || (s = s.replace(/^[\\\/]{2,}/, "\\")), p.normalize(s);
}, p.relative = function(r, t) {
r = p.resolve(r), t = p.resolve(t);
for (var i = r.toLowerCase(), s = t.toLowerCase(), g = d(t.split("\\")), y = d(i.split("\\")), b = d(s.split("\\")), C = Math.min(y.length, b.length), A = C, T = 0; T < C; T++)
if (y[T] !== b[T]) {
A = T;
break;
}
if (A == 0)
return t;
for (var D = [], T = A; T < y.length; T++)
D.push("..");
return D = D.concat(g.slice(A)), D.join("\\");
}, p._makeLong = function(r) {
if (!a.isString(r))
return r;
if (!r)
return "";
var t = p.resolve(r);
return /^[a-zA-Z]\:\\/.test(t) ? "\\\\?\\" + t : /^\\\\[^?.]/.test(t) ? "\\\\?\\UNC\\" + t.substring(2) : r;
}, p.dirname = function(r) {
var t = S(r), i = t[0], s = t[1];
return !i && !s ? "." : (s && (s = s.substr(0, s.length - 1)), i + s);
}, p.basename = function(r, t) {
var i = S(r)[2];
return t && i.substr(-1 * t.length) === t && (i = i.substr(0, i.length - t.length)), i;
}, p.extname = function(r) {
return S(r)[3];
}, p.format = function(r) {
if (!a.isObject(r))
throw new TypeError(
"Parameter 'pathObject' must be an object, not " + typeof r
);
var t = r.root || "";
if (!a.isString(t))
throw new TypeError(
"'pathObject.root' must be a string or undefined, not " + typeof r.root
);
var i = r.dir, s = r.base || "";
return i ? i[i.length - 1] === p.sep ? i + s : i + p.sep + s : s;
}, p.parse = function(r) {
if (!a.isString(r))
throw new TypeError(
"Parameter 'pathString' must be a string, not " + typeof r
);
var t = S(r);
if (!t || t.length !== 4)
throw new TypeError("Invalid path '" + r + "'");
return {
root: t[0],
dir: t[0] + t[1].slice(0, -1),
base: t[2],
ext: t[3],
name: t[2].slice(0, t[2].length - t[3].length)
};
}, p.sep = "\\", p.delimiter = ";";
var N = /^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/, c = {};
function $(r) {
return N.exec(r).slice(1);
}
return c.resolve = function() {
for (var r = "", t = !1, i = arguments.length - 1; i >= -1 && !t; i--) {
var s = i >= 0 ? arguments[i] : process.cwd();
if (a.isString(s)) {
if (!s)
continue;
} else throw new TypeError("Arguments to path.resolve must be strings");
r = s + "/" + r, t = s[0] === "/";
}
return r = u(
r.split("/"),
!t
).join("/"), (t ? "/" : "") + r || ".";
}, c.normalize = function(r) {
var t = c.isAbsolute(r), i = r && r[r.length - 1] === "/";
return r = u(r.split("/"), !t).join("/"), !r && !t && (r = "."), r && i && (r += "/"), (t ? "/" : "") + r;
}, c.isAbsolute = function(r) {
return r.charAt(0) === "/";
}, c.join = function() {
for (var r = "", t = 0; t < arguments.length; t++) {
var i = arguments[t];
if (!a.isString(i))
throw new TypeError("Arguments to path.join must be strings");
i && (r ? r += "/" + i : r += i);
}
return c.normalize(r);
}, c.relative = function(r, t) {
r = c.resolve(r).substr(1), t = c.resolve(t).substr(1);
for (var i = d(r.split("/")), s = d(t.split("/")), g = Math.min(i.length, s.length), y = g, b = 0; b < g; b++)
if (i[b] !== s[b]) {
y = b;
break;
}
for (var C = [], b = y; b < i.length; b++)
C.push("..");
return C = C.concat(s.slice(y)), C.join("/");
}, c._makeLong = function(r) {
return r;
}, c.dirname = function(r) {
var t = $(r), i = t[0], s = t[1];
return !i && !s ? "." : (s && (s = s.substr(0, s.length - 1)), i + s);
}, c.basename = function(r, t) {
var i = $(r)[2];
return t && i.substr(-1 * t.length) === t && (i = i.substr(0, i.length - t.length)), i;
}, c.extname = function(r) {
return $(r)[3];
}, c.format = function(r) {
if (!a.isObject(r))
throw new TypeError(
"Parameter 'pathObject' must be an object, not " + typeof r
);
var t = r.root || "";
if (!a.isString(t))
throw new TypeError(
"'pathObject.root' must be a string or undefined, not " + typeof r.root
);
var i = r.dir ? r.dir + c.sep : "", s = r.base || "";
return i + s;
}, c.parse = function(r) {
if (!a.isString(r))
throw new TypeError(
"Parameter 'pathString' must be a string, not " + typeof r
);
var t = $(r);
if (!t || t.length !== 4)
throw new TypeError("Invalid path '" + r + "'");
return t[1] = t[1] || "", t[2] = t[2] || "", t[3] = t[3] || "", {
root: t[0],
dir: t[0] + t[1].slice(0, -1),
base: t[2],
ext: t[3],
name: t[2].slice(0, t[2].length - t[3].length)
};
}, c.sep = "/", c.delimiter = ":", l ? L.exports = p : L.exports = c, L.exports.posix = c, L.exports.win32 = p, L.exports;
}
var ae = oe();
const le = /* @__PURE__ */ te(ae);
class ue {
constructor() {
this.ast = null, this.eventHandlers = /* @__PURE__ */ new Map();
}
parse(a) {
var u;
try {
const d = a.split(`
`).map((S) => S.trim()), f = { type: "root", children: [] };
let E = f;
const p = [];
for (let S of d)
if (!(!S || S.startsWith("//"))) {
if (S.startsWith("/*")) {
for (; !S.includes("*/") && d.length; )
S = (u = d.shift()) == null ? void 0 : u.trim();
continue;
}
if (S.includes("{")) {
const [m] = S.split("{"), [O, ...N] = m.trim().split(/\s+/), c = N.join(" ").replace(/"/g, "").trim(), $ = {
type: O,
name: c,
styles: {},
content: "",
children: [],
events: {},
attributes: {}
};
E.children.push($), p.push(E), E = $;
} else if (S.includes("}"))
E = p.pop();
else {
const [m, O] = S.split(":").map((N) => N.trim());
m && O && (m === "text" ? E.content = O.replace(/[";]/g, "") : m.startsWith("on") ? E.events[m] = O.replace(/[";]/g, "") : m === "src" || m === "href" || m === "alt" ? E.attributes[m] = O.replace(/[";]/g, "") : m === "columns" ? (E.styles.display = "grid", E.styles["grid-template-columns"] = `repeat(${O.replace(/[";]/g, "")}, 1fr)`, E.styles.gap = "1rem") : E.styles[this.convertToCSSProperty(m)] = O.replace(/[";]/g, ""));
}
}
return this.ast = f, f;
} catch (d) {
return console.error("Parse error:", d), null;
}
}
convertToCSSProperty(a) {
return a.replace(/([a-z0-9])([A-Z])/g, "$1-$2").toLowerCase();
}
getAppropriateTag(a) {
const u = a.type.toLowerCase();
return {
page: "div",
section: "section",
box: "div",
button: "button",
input: "input",
link: "a",
image: "img",
list: "ul",
item: "li",
table: "table",
row: "tr",
cell: "td",
header: "th",
form: "form",
textarea: "textarea",
select: "select",
option: "option",
h1: "h1",
h2: "h2",
h3: "h3",
h4: "h4",
h5: "h5",
h6: "h6",
p: "p",
span: "span"
}[u] || u;
}
generateHTML(a = this.ast) {
if (!a) return "";
const u = (f) => {
if (!f) return "";
let E = "";
f.styles && (E = Object.entries(f.styles).map(([c, $]) => `${c}: ${$}`).join(";"));
let p = "";
f.attributes && (p = Object.entries(f.attributes).map(([c, $]) => `${c}="${$}"`).join(" "));
let S = "";
if (Object.keys(f.events).length > 0) {
const c = `element-${Math.random().toString(36).substr(2, 9)}`;
Object.entries(f.events).forEach(([$, r]) => {
this.eventHandlers.set(c, {
event: $.toLowerCase().replace("on", ""),
handler: r
});
}), S = `id="${c}"`;
}
const m = this.getAppropriateTag(f), O = f.children.map(u).join(""), N = f.content || "";
return m === "img" || m === "input" ? `<${m} style="${E}" class="hack-soft-${f.type}" ${p} ${S} />` : `
<${m} style="${E}" class="hack-soft-${f.type}" ${p} ${S}>
${N}
${O}
</${m}>
`;
}, d = a.children.map(u).join("");
return this.attachEventHandlers(), d;
}
attachEventHandlers() {
setTimeout(() => {
this.eventHandlers.forEach((a, u) => {
const d = document.getElementById(u);
d && d.addEventListener(a.event, () => {
try {
if (a.handler.startsWith("alert")) {
const f = a.handler.match(/alert\('(.+)'\)/) || a.handler.match(/alert\("(.+)"\)/);
f && alert(f[1]);
} else
new Function(a.handler)();
} catch (f) {
console.error("Event handler error:", f);
}
});
});
}, 0);
}
async loadFile(a) {
if (le.extname(a) !== ".hks")
throw new Error("Invalid file extension. Only .hks files are supported.");
const u = await fetch(a);
if (!u.ok)
throw new Error(`Failed to load file: ${u.statusText}`);
return await u.text();
}
async interpret(a) {
let u;
a.startsWith("http") || a.startsWith("/") ? u = await this.loadFile(a) : u = a;
const d = this.parse(u);
return d ? this.generateHTML(d) : "<div>Error parsing code</div>";
}
}
export {
ue as HackSoftInterpreter
};