6491 lines
175 KiB
JavaScript
6491 lines
175 KiB
JavaScript
(function (e, t) {
|
|
const r = t(e);
|
|
if (typeof exports === "object" && typeof exports["nodeName"] !== "string") {
|
|
module.exports = r;
|
|
} else {
|
|
e["_hyperscript"] = r;
|
|
if ("document" in e) e["_hyperscript"].browserInit();
|
|
}
|
|
})(typeof self !== "undefined" ? self : this, (e) => {
|
|
"use strict";
|
|
const t = {
|
|
dynamicResolvers: [
|
|
function (e, t) {
|
|
if (e === "Fixed") {
|
|
return Number(t).toFixed();
|
|
} else if (e.indexOf("Fixed:") === 0) {
|
|
let r = e.split(":")[1];
|
|
return Number(t).toFixed(parseInt(r));
|
|
}
|
|
},
|
|
],
|
|
String: function (e) {
|
|
if (e.toString) {
|
|
return e.toString();
|
|
} else {
|
|
return "" + e;
|
|
}
|
|
},
|
|
Int: function (e) {
|
|
return parseInt(e);
|
|
},
|
|
Float: function (e) {
|
|
return parseFloat(e);
|
|
},
|
|
Number: function (e) {
|
|
return Number(e);
|
|
},
|
|
Date: function (e) {
|
|
return new Date(e);
|
|
},
|
|
Array: function (e) {
|
|
return Array.from(e);
|
|
},
|
|
JSON: function (e) {
|
|
return JSON.stringify(e);
|
|
},
|
|
Object: function (e) {
|
|
if (e instanceof String) {
|
|
e = e.toString();
|
|
}
|
|
if (typeof e === "string") {
|
|
return JSON.parse(e);
|
|
} else {
|
|
return Object.assign({}, e);
|
|
}
|
|
},
|
|
};
|
|
const r = {
|
|
attributes: "_, script, data-script",
|
|
defaultTransition: "all 500ms ease-in",
|
|
disableSelector: "[disable-scripting], [data-disable-scripting]",
|
|
hideShowStrategies: {},
|
|
conversions: t,
|
|
};
|
|
class n {
|
|
static OP_TABLE = {
|
|
"+": "PLUS",
|
|
"-": "MINUS",
|
|
"*": "MULTIPLY",
|
|
"/": "DIVIDE",
|
|
".": "PERIOD",
|
|
"..": "ELLIPSIS",
|
|
"\\": "BACKSLASH",
|
|
":": "COLON",
|
|
"%": "PERCENT",
|
|
"|": "PIPE",
|
|
"!": "EXCLAMATION",
|
|
"?": "QUESTION",
|
|
"#": "POUND",
|
|
"&": "AMPERSAND",
|
|
$: "DOLLAR",
|
|
";": "SEMI",
|
|
",": "COMMA",
|
|
"(": "L_PAREN",
|
|
")": "R_PAREN",
|
|
"<": "L_ANG",
|
|
">": "R_ANG",
|
|
"<=": "LTE_ANG",
|
|
">=": "GTE_ANG",
|
|
"==": "EQ",
|
|
"===": "EQQ",
|
|
"!=": "NEQ",
|
|
"!==": "NEQQ",
|
|
"{": "L_BRACE",
|
|
"}": "R_BRACE",
|
|
"[": "L_BRACKET",
|
|
"]": "R_BRACKET",
|
|
"=": "EQUALS",
|
|
};
|
|
static isValidCSSClassChar(e) {
|
|
return (
|
|
n.isAlpha(e) || n.isNumeric(e) || e === "-" || e === "_" || e === ":"
|
|
);
|
|
}
|
|
static isValidCSSIDChar(e) {
|
|
return (
|
|
n.isAlpha(e) || n.isNumeric(e) || e === "-" || e === "_" || e === ":"
|
|
);
|
|
}
|
|
static isWhitespace(e) {
|
|
return e === " " || e === "\t" || n.isNewline(e);
|
|
}
|
|
static positionString(e) {
|
|
return "[Line: " + e.line + ", Column: " + e.column + "]";
|
|
}
|
|
static isNewline(e) {
|
|
return e === "\r" || e === "\n";
|
|
}
|
|
static isNumeric(e) {
|
|
return e >= "0" && e <= "9";
|
|
}
|
|
static isAlpha(e) {
|
|
return (e >= "a" && e <= "z") || (e >= "A" && e <= "Z");
|
|
}
|
|
static isIdentifierChar(e, t) {
|
|
return e === "_" || e === "$";
|
|
}
|
|
static isReservedChar(e) {
|
|
return e === "`" || e === "^";
|
|
}
|
|
static isValidSingleQuoteStringStart(e) {
|
|
if (e.length > 0) {
|
|
var t = e[e.length - 1];
|
|
if (
|
|
t.type === "IDENTIFIER" ||
|
|
t.type === "CLASS_REF" ||
|
|
t.type === "ID_REF"
|
|
) {
|
|
return false;
|
|
}
|
|
if (t.op && (t.value === ">" || t.value === ")")) {
|
|
return false;
|
|
}
|
|
}
|
|
return true;
|
|
}
|
|
static tokenize(e, t) {
|
|
var r = [];
|
|
var a = e;
|
|
var o = 0;
|
|
var s = 0;
|
|
var u = 1;
|
|
var l = "<START>";
|
|
var c = 0;
|
|
function f() {
|
|
return t && c === 0;
|
|
}
|
|
while (o < a.length) {
|
|
if (
|
|
(q() === "-" &&
|
|
N() === "-" &&
|
|
(n.isWhitespace(I(2)) || I(2) === "" || I(2) === "-")) ||
|
|
(q() === "/" &&
|
|
N() === "/" &&
|
|
(n.isWhitespace(I(2)) || I(2) === "" || I(2) === "/"))
|
|
) {
|
|
h();
|
|
} else if (
|
|
q() === "/" &&
|
|
N() === "*" &&
|
|
(n.isWhitespace(I(2)) || I(2) === "" || I(2) === "*")
|
|
) {
|
|
v();
|
|
} else {
|
|
if (n.isWhitespace(q())) {
|
|
r.push(A());
|
|
} else if (
|
|
!R() &&
|
|
q() === "." &&
|
|
(n.isAlpha(N()) || N() === "{" || N() === "-")
|
|
) {
|
|
r.push(d());
|
|
} else if (!R() && q() === "#" && (n.isAlpha(N()) || N() === "{")) {
|
|
r.push(k());
|
|
} else if (q() === "[" && N() === "@") {
|
|
r.push(E());
|
|
} else if (q() === "@") {
|
|
r.push(T());
|
|
} else if (q() === "*" && n.isAlpha(N())) {
|
|
r.push(y());
|
|
} else if (n.isAlpha(q()) || (!f() && n.isIdentifierChar(q()))) {
|
|
r.push(x());
|
|
} else if (n.isNumeric(q())) {
|
|
r.push(g());
|
|
} else if (!f() && (q() === '"' || q() === "`")) {
|
|
r.push(w());
|
|
} else if (!f() && q() === "'") {
|
|
if (n.isValidSingleQuoteStringStart(r)) {
|
|
r.push(w());
|
|
} else {
|
|
r.push(b());
|
|
}
|
|
} else if (n.OP_TABLE[q()]) {
|
|
if (l === "$" && q() === "{") {
|
|
c++;
|
|
}
|
|
if (q() === "}") {
|
|
c--;
|
|
}
|
|
r.push(b());
|
|
} else if (f() || n.isReservedChar(q())) {
|
|
r.push(p("RESERVED", C()));
|
|
} else {
|
|
if (o < a.length) {
|
|
throw Error("Unknown token: " + q() + " ");
|
|
}
|
|
}
|
|
}
|
|
}
|
|
return new i(r, [], a);
|
|
function m(e, t) {
|
|
var r = p(e, t);
|
|
r.op = true;
|
|
return r;
|
|
}
|
|
function p(e, t) {
|
|
return {
|
|
type: e,
|
|
value: t || "",
|
|
start: o,
|
|
end: o + 1,
|
|
column: s,
|
|
line: u,
|
|
};
|
|
}
|
|
function h() {
|
|
while (q() && !n.isNewline(q())) {
|
|
C();
|
|
}
|
|
C();
|
|
}
|
|
function v() {
|
|
while (q() && !(q() === "*" && N() === "/")) {
|
|
C();
|
|
}
|
|
C();
|
|
C();
|
|
}
|
|
function d() {
|
|
var e = p("CLASS_REF");
|
|
var t = C();
|
|
if (q() === "{") {
|
|
e.template = true;
|
|
t += C();
|
|
while (q() && q() !== "}") {
|
|
t += C();
|
|
}
|
|
if (q() !== "}") {
|
|
throw Error("Unterminated class reference");
|
|
} else {
|
|
t += C();
|
|
}
|
|
} else {
|
|
while (n.isValidCSSClassChar(q())) {
|
|
t += C();
|
|
}
|
|
}
|
|
e.value = t;
|
|
e.end = o;
|
|
return e;
|
|
}
|
|
function E() {
|
|
var e = p("ATTRIBUTE_REF");
|
|
var t = C();
|
|
while (o < a.length && q() !== "]") {
|
|
t += C();
|
|
}
|
|
if (q() === "]") {
|
|
t += C();
|
|
}
|
|
e.value = t;
|
|
e.end = o;
|
|
return e;
|
|
}
|
|
function T() {
|
|
var e = p("ATTRIBUTE_REF");
|
|
var t = C();
|
|
while (n.isValidCSSIDChar(q())) {
|
|
t += C();
|
|
}
|
|
if (q() === "=") {
|
|
t += C();
|
|
if (q() === '"' || q() === "'") {
|
|
let e = w();
|
|
t += e.value;
|
|
} else if (
|
|
n.isAlpha(q()) ||
|
|
n.isNumeric(q()) ||
|
|
n.isIdentifierChar(q())
|
|
) {
|
|
let e = x();
|
|
t += e.value;
|
|
}
|
|
}
|
|
e.value = t;
|
|
e.end = o;
|
|
return e;
|
|
}
|
|
function y() {
|
|
var e = p("STYLE_REF");
|
|
var t = C();
|
|
while (n.isAlpha(q()) || q() === "-") {
|
|
t += C();
|
|
}
|
|
e.value = t;
|
|
e.end = o;
|
|
return e;
|
|
}
|
|
function k() {
|
|
var e = p("ID_REF");
|
|
var t = C();
|
|
if (q() === "{") {
|
|
e.template = true;
|
|
t += C();
|
|
while (q() && q() !== "}") {
|
|
t += C();
|
|
}
|
|
if (q() !== "}") {
|
|
throw Error("Unterminated id reference");
|
|
} else {
|
|
C();
|
|
}
|
|
} else {
|
|
while (n.isValidCSSIDChar(q())) {
|
|
t += C();
|
|
}
|
|
}
|
|
e.value = t;
|
|
e.end = o;
|
|
return e;
|
|
}
|
|
function x() {
|
|
var e = p("IDENTIFIER");
|
|
var t = C();
|
|
while (n.isAlpha(q()) || n.isNumeric(q()) || n.isIdentifierChar(q())) {
|
|
t += C();
|
|
}
|
|
if (q() === "!" && t === "beep") {
|
|
t += C();
|
|
}
|
|
e.value = t;
|
|
e.end = o;
|
|
return e;
|
|
}
|
|
function g() {
|
|
var e = p("NUMBER");
|
|
var t = C();
|
|
while (n.isNumeric(q())) {
|
|
t += C();
|
|
}
|
|
if (q() === "." && n.isNumeric(N())) {
|
|
t += C();
|
|
}
|
|
while (n.isNumeric(q())) {
|
|
t += C();
|
|
}
|
|
if (q() === "e" || q() === "E") {
|
|
if (n.isNumeric(N())) {
|
|
t += C();
|
|
} else if (N() === "-") {
|
|
t += C();
|
|
t += C();
|
|
}
|
|
}
|
|
while (n.isNumeric(q())) {
|
|
t += C();
|
|
}
|
|
e.value = t;
|
|
e.end = o;
|
|
return e;
|
|
}
|
|
function b() {
|
|
var e = m();
|
|
var t = C();
|
|
while (q() && n.OP_TABLE[t + q()]) {
|
|
t += C();
|
|
}
|
|
e.type = n.OP_TABLE[t];
|
|
e.value = t;
|
|
e.end = o;
|
|
return e;
|
|
}
|
|
function w() {
|
|
var e = p("STRING");
|
|
var t = C();
|
|
var r = "";
|
|
while (q() && q() !== t) {
|
|
if (q() === "\\") {
|
|
C();
|
|
let t = C();
|
|
if (t === "b") {
|
|
r += "\b";
|
|
} else if (t === "f") {
|
|
r += "\f";
|
|
} else if (t === "n") {
|
|
r += "\n";
|
|
} else if (t === "r") {
|
|
r += "\r";
|
|
} else if (t === "t") {
|
|
r += "\t";
|
|
} else if (t === "v") {
|
|
r += "\v";
|
|
} else if (t === "x") {
|
|
const t = S();
|
|
if (Number.isNaN(t)) {
|
|
throw Error(
|
|
"Invalid hexadecimal escape at " + n.positionString(e),
|
|
);
|
|
}
|
|
r += String.fromCharCode(t);
|
|
} else {
|
|
r += t;
|
|
}
|
|
} else {
|
|
r += C();
|
|
}
|
|
}
|
|
if (q() !== t) {
|
|
throw Error("Unterminated string at " + n.positionString(e));
|
|
} else {
|
|
C();
|
|
}
|
|
e.value = r;
|
|
e.end = o;
|
|
e.template = t === "`";
|
|
return e;
|
|
}
|
|
function S() {
|
|
const e = 16;
|
|
if (!q()) {
|
|
return NaN;
|
|
}
|
|
let t = e * Number.parseInt(C(), e);
|
|
if (!q()) {
|
|
return NaN;
|
|
}
|
|
t += Number.parseInt(C(), e);
|
|
return t;
|
|
}
|
|
function q() {
|
|
return a.charAt(o);
|
|
}
|
|
function N() {
|
|
return a.charAt(o + 1);
|
|
}
|
|
function I(e = 1) {
|
|
return a.charAt(o + e);
|
|
}
|
|
function C() {
|
|
l = q();
|
|
o++;
|
|
s++;
|
|
return l;
|
|
}
|
|
function R() {
|
|
return (
|
|
n.isAlpha(l) ||
|
|
n.isNumeric(l) ||
|
|
l === ")" ||
|
|
l === '"' ||
|
|
l === "'" ||
|
|
l === "`" ||
|
|
l === "}" ||
|
|
l === "]"
|
|
);
|
|
}
|
|
function A() {
|
|
var e = p("WHITESPACE");
|
|
var t = "";
|
|
while (q() && n.isWhitespace(q())) {
|
|
if (n.isNewline(q())) {
|
|
s = 0;
|
|
u++;
|
|
}
|
|
t += C();
|
|
}
|
|
e.value = t;
|
|
e.end = o;
|
|
return e;
|
|
}
|
|
}
|
|
tokenize(e, t) {
|
|
return n.tokenize(e, t);
|
|
}
|
|
}
|
|
class i {
|
|
constructor(e, t, r) {
|
|
this.tokens = e;
|
|
this.consumed = t;
|
|
this.source = r;
|
|
this.consumeWhitespace();
|
|
}
|
|
get list() {
|
|
return this.tokens;
|
|
}
|
|
_lastConsumed = null;
|
|
consumeWhitespace() {
|
|
while (this.token(0, true).type === "WHITESPACE") {
|
|
this.consumed.push(this.tokens.shift());
|
|
}
|
|
}
|
|
raiseError(e, t) {
|
|
a.raiseParseError(e, t);
|
|
}
|
|
requireOpToken(e) {
|
|
var t = this.matchOpToken(e);
|
|
if (t) {
|
|
return t;
|
|
} else {
|
|
this.raiseError(
|
|
this,
|
|
"Expected '" + e + "' but found '" + this.currentToken().value + "'",
|
|
);
|
|
}
|
|
}
|
|
matchAnyOpToken(e, t, r) {
|
|
for (var n = 0; n < arguments.length; n++) {
|
|
var i = arguments[n];
|
|
var a = this.matchOpToken(i);
|
|
if (a) {
|
|
return a;
|
|
}
|
|
}
|
|
}
|
|
matchAnyToken(e, t, r) {
|
|
for (var n = 0; n < arguments.length; n++) {
|
|
var i = arguments[n];
|
|
var a = this.matchToken(i);
|
|
if (a) {
|
|
return a;
|
|
}
|
|
}
|
|
}
|
|
matchOpToken(e) {
|
|
if (
|
|
this.currentToken() &&
|
|
this.currentToken().op &&
|
|
this.currentToken().value === e
|
|
) {
|
|
return this.consumeToken();
|
|
}
|
|
}
|
|
requireTokenType(e, t, r, n) {
|
|
var i = this.matchTokenType(e, t, r, n);
|
|
if (i) {
|
|
return i;
|
|
} else {
|
|
this.raiseError(this, "Expected one of " + JSON.stringify([e, t, r]));
|
|
}
|
|
}
|
|
matchTokenType(e, t, r, n) {
|
|
if (
|
|
this.currentToken() &&
|
|
this.currentToken().type &&
|
|
[e, t, r, n].indexOf(this.currentToken().type) >= 0
|
|
) {
|
|
return this.consumeToken();
|
|
}
|
|
}
|
|
requireToken(e, t) {
|
|
var r = this.matchToken(e, t);
|
|
if (r) {
|
|
return r;
|
|
} else {
|
|
this.raiseError(
|
|
this,
|
|
"Expected '" + e + "' but found '" + this.currentToken().value + "'",
|
|
);
|
|
}
|
|
}
|
|
peekToken(e, t, r) {
|
|
t = t || 0;
|
|
r = r || "IDENTIFIER";
|
|
if (
|
|
this.tokens[t] &&
|
|
this.tokens[t].value === e &&
|
|
this.tokens[t].type === r
|
|
) {
|
|
return this.tokens[t];
|
|
}
|
|
}
|
|
matchToken(e, t) {
|
|
if (this.follows.indexOf(e) !== -1) {
|
|
return;
|
|
}
|
|
t = t || "IDENTIFIER";
|
|
if (
|
|
this.currentToken() &&
|
|
this.currentToken().value === e &&
|
|
this.currentToken().type === t
|
|
) {
|
|
return this.consumeToken();
|
|
}
|
|
}
|
|
consumeToken() {
|
|
var e = this.tokens.shift();
|
|
this.consumed.push(e);
|
|
this._lastConsumed = e;
|
|
this.consumeWhitespace();
|
|
return e;
|
|
}
|
|
consumeUntil(e, t) {
|
|
var r = [];
|
|
var n = this.token(0, true);
|
|
while (
|
|
(t == null || n.type !== t) &&
|
|
(e == null || n.value !== e) &&
|
|
n.type !== "EOF"
|
|
) {
|
|
var i = this.tokens.shift();
|
|
this.consumed.push(i);
|
|
r.push(n);
|
|
n = this.token(0, true);
|
|
}
|
|
this.consumeWhitespace();
|
|
return r;
|
|
}
|
|
lastWhitespace() {
|
|
if (
|
|
this.consumed[this.consumed.length - 1] &&
|
|
this.consumed[this.consumed.length - 1].type === "WHITESPACE"
|
|
) {
|
|
return this.consumed[this.consumed.length - 1].value;
|
|
} else {
|
|
return "";
|
|
}
|
|
}
|
|
consumeUntilWhitespace() {
|
|
return this.consumeUntil(null, "WHITESPACE");
|
|
}
|
|
hasMore() {
|
|
return this.tokens.length > 0;
|
|
}
|
|
token(e, t) {
|
|
var r;
|
|
var n = 0;
|
|
do {
|
|
if (!t) {
|
|
while (this.tokens[n] && this.tokens[n].type === "WHITESPACE") {
|
|
n++;
|
|
}
|
|
}
|
|
r = this.tokens[n];
|
|
e--;
|
|
n++;
|
|
} while (e > -1);
|
|
if (r) {
|
|
return r;
|
|
} else {
|
|
return { type: "EOF", value: "<<<EOF>>>" };
|
|
}
|
|
}
|
|
currentToken() {
|
|
return this.token(0);
|
|
}
|
|
lastMatch() {
|
|
return this._lastConsumed;
|
|
}
|
|
static sourceFor = function () {
|
|
return this.programSource.substring(
|
|
this.startToken.start,
|
|
this.endToken.end,
|
|
);
|
|
};
|
|
static lineFor = function () {
|
|
return this.programSource.split("\n")[this.startToken.line - 1];
|
|
};
|
|
follows = [];
|
|
pushFollow(e) {
|
|
this.follows.push(e);
|
|
}
|
|
popFollow() {
|
|
this.follows.pop();
|
|
}
|
|
clearFollows() {
|
|
var e = this.follows;
|
|
this.follows = [];
|
|
return e;
|
|
}
|
|
restoreFollows(e) {
|
|
this.follows = e;
|
|
}
|
|
}
|
|
class a {
|
|
constructor(e) {
|
|
this.runtime = e;
|
|
this.possessivesDisabled = false;
|
|
this.addGrammarElement("feature", function (e, t, r) {
|
|
if (r.matchOpToken("(")) {
|
|
var n = e.requireElement("feature", r);
|
|
r.requireOpToken(")");
|
|
return n;
|
|
}
|
|
var i = e.FEATURES[r.currentToken().value || ""];
|
|
if (i) {
|
|
return i(e, t, r);
|
|
}
|
|
});
|
|
this.addGrammarElement("command", function (e, t, r) {
|
|
if (r.matchOpToken("(")) {
|
|
const t = e.requireElement("command", r);
|
|
r.requireOpToken(")");
|
|
return t;
|
|
}
|
|
var n = e.COMMANDS[r.currentToken().value || ""];
|
|
let i;
|
|
if (n) {
|
|
i = n(e, t, r);
|
|
} else if (r.currentToken().type === "IDENTIFIER") {
|
|
i = e.parseElement("pseudoCommand", r);
|
|
}
|
|
if (i) {
|
|
return e.parseElement("indirectStatement", r, i);
|
|
}
|
|
return i;
|
|
});
|
|
this.addGrammarElement("commandList", function (e, t, r) {
|
|
if (r.hasMore()) {
|
|
var n = e.parseElement("command", r);
|
|
if (n) {
|
|
r.matchToken("then");
|
|
const t = e.parseElement("commandList", r);
|
|
if (t) n.next = t;
|
|
return n;
|
|
}
|
|
}
|
|
return {
|
|
type: "emptyCommandListCommand",
|
|
op: function (e) {
|
|
return t.findNext(this, e);
|
|
},
|
|
execute: function (e) {
|
|
return t.unifiedExec(this, e);
|
|
},
|
|
};
|
|
});
|
|
this.addGrammarElement("leaf", function (e, t, r) {
|
|
var n = e.parseAnyOf(e.LEAF_EXPRESSIONS, r);
|
|
if (n == null) {
|
|
return e.parseElement("symbol", r);
|
|
}
|
|
return n;
|
|
});
|
|
this.addGrammarElement("indirectExpression", function (e, t, r, n) {
|
|
for (var i = 0; i < e.INDIRECT_EXPRESSIONS.length; i++) {
|
|
var a = e.INDIRECT_EXPRESSIONS[i];
|
|
n.endToken = r.lastMatch();
|
|
var o = e.parseElement(a, r, n);
|
|
if (o) {
|
|
return o;
|
|
}
|
|
}
|
|
return n;
|
|
});
|
|
this.addGrammarElement("indirectStatement", function (e, t, r, n) {
|
|
if (r.matchToken("unless")) {
|
|
n.endToken = r.lastMatch();
|
|
var i = e.requireElement("expression", r);
|
|
var a = {
|
|
type: "unlessStatementModifier",
|
|
args: [i],
|
|
op: function (e, t) {
|
|
if (t) {
|
|
return this.next;
|
|
} else {
|
|
return n;
|
|
}
|
|
},
|
|
execute: function (e) {
|
|
return t.unifiedExec(this, e);
|
|
},
|
|
};
|
|
n.parent = a;
|
|
return a;
|
|
}
|
|
return n;
|
|
});
|
|
this.addGrammarElement("primaryExpression", function (e, t, r) {
|
|
var n = e.parseElement("leaf", r);
|
|
if (n) {
|
|
return e.parseElement("indirectExpression", r, n);
|
|
}
|
|
e.raiseParseError(r, "Unexpected value: " + r.currentToken().value);
|
|
});
|
|
}
|
|
use(e) {
|
|
e(this);
|
|
return this;
|
|
}
|
|
GRAMMAR = {};
|
|
COMMANDS = {};
|
|
FEATURES = {};
|
|
LEAF_EXPRESSIONS = [];
|
|
INDIRECT_EXPRESSIONS = [];
|
|
initElt(e, t, r) {
|
|
e.startToken = t;
|
|
e.sourceFor = i.sourceFor;
|
|
e.lineFor = i.lineFor;
|
|
e.programSource = r.source;
|
|
}
|
|
parseElement(e, t, r = undefined) {
|
|
var n = this.GRAMMAR[e];
|
|
if (n) {
|
|
var i = t.currentToken();
|
|
var a = n(this, this.runtime, t, r);
|
|
if (a) {
|
|
this.initElt(a, i, t);
|
|
a.endToken = a.endToken || t.lastMatch();
|
|
var r = a.root;
|
|
while (r != null) {
|
|
this.initElt(r, i, t);
|
|
r = r.root;
|
|
}
|
|
}
|
|
return a;
|
|
}
|
|
}
|
|
requireElement(e, t, r, n) {
|
|
var i = this.parseElement(e, t, n);
|
|
if (!i) a.raiseParseError(t, r || "Expected " + e);
|
|
return i;
|
|
}
|
|
parseAnyOf(e, t) {
|
|
for (var r = 0; r < e.length; r++) {
|
|
var n = e[r];
|
|
var i = this.parseElement(n, t);
|
|
if (i) {
|
|
return i;
|
|
}
|
|
}
|
|
}
|
|
addGrammarElement(e, t) {
|
|
this.GRAMMAR[e] = t;
|
|
}
|
|
addCommand(e, t) {
|
|
var r = e + "Command";
|
|
var n = function (e, n, i) {
|
|
const a = t(e, n, i);
|
|
if (a) {
|
|
a.type = r;
|
|
a.execute = function (e) {
|
|
e.meta.command = a;
|
|
return n.unifiedExec(this, e);
|
|
};
|
|
return a;
|
|
}
|
|
};
|
|
this.GRAMMAR[r] = n;
|
|
this.COMMANDS[e] = n;
|
|
}
|
|
addFeature(e, t) {
|
|
var r = e + "Feature";
|
|
var n = function (n, i, a) {
|
|
var o = t(n, i, a);
|
|
if (o) {
|
|
o.isFeature = true;
|
|
o.keyword = e;
|
|
o.type = r;
|
|
return o;
|
|
}
|
|
};
|
|
this.GRAMMAR[r] = n;
|
|
this.FEATURES[e] = n;
|
|
}
|
|
addLeafExpression(e, t) {
|
|
this.LEAF_EXPRESSIONS.push(e);
|
|
this.addGrammarElement(e, t);
|
|
}
|
|
addIndirectExpression(e, t) {
|
|
this.INDIRECT_EXPRESSIONS.push(e);
|
|
this.addGrammarElement(e, t);
|
|
}
|
|
static createParserContext(e) {
|
|
var t = e.currentToken();
|
|
var r = e.source;
|
|
var n = r.split("\n");
|
|
var i = t && t.line ? t.line - 1 : n.length - 1;
|
|
var a = n[i];
|
|
var o = t && t.line ? t.column : a.length - 1;
|
|
return a + "\n" + " ".repeat(o) + "^^\n\n";
|
|
}
|
|
static raiseParseError(e, t) {
|
|
t =
|
|
(t || "Unexpected Token : " + e.currentToken().value) +
|
|
"\n\n" +
|
|
a.createParserContext(e);
|
|
var r = new Error(t);
|
|
r["tokens"] = e;
|
|
throw r;
|
|
}
|
|
raiseParseError(e, t) {
|
|
a.raiseParseError(e, t);
|
|
}
|
|
parseHyperScript(e) {
|
|
var t = this.parseElement("hyperscript", e);
|
|
if (e.hasMore()) this.raiseParseError(e);
|
|
if (t) return t;
|
|
}
|
|
setParent(e, t) {
|
|
if (typeof e === "object") {
|
|
e.parent = t;
|
|
if (typeof t === "object") {
|
|
t.children = t.children || new Set();
|
|
t.children.add(e);
|
|
}
|
|
this.setParent(e.next, t);
|
|
}
|
|
}
|
|
commandStart(e) {
|
|
return this.COMMANDS[e.value || ""];
|
|
}
|
|
featureStart(e) {
|
|
return this.FEATURES[e.value || ""];
|
|
}
|
|
commandBoundary(e) {
|
|
if (
|
|
e.value == "end" ||
|
|
e.value == "then" ||
|
|
e.value == "else" ||
|
|
e.value == "otherwise" ||
|
|
e.value == ")" ||
|
|
this.commandStart(e) ||
|
|
this.featureStart(e) ||
|
|
e.type == "EOF"
|
|
) {
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
parseStringTemplate(e) {
|
|
var t = [""];
|
|
do {
|
|
t.push(e.lastWhitespace());
|
|
if (e.currentToken().value === "$") {
|
|
e.consumeToken();
|
|
var r = e.matchOpToken("{");
|
|
t.push(this.requireElement("expression", e));
|
|
if (r) {
|
|
e.requireOpToken("}");
|
|
}
|
|
t.push("");
|
|
} else if (e.currentToken().value === "\\") {
|
|
e.consumeToken();
|
|
e.consumeToken();
|
|
} else {
|
|
var n = e.consumeToken();
|
|
t[t.length - 1] += n ? n.value : "";
|
|
}
|
|
} while (e.hasMore());
|
|
t.push(e.lastWhitespace());
|
|
return t;
|
|
}
|
|
ensureTerminated(e) {
|
|
const t = this.runtime;
|
|
var r = {
|
|
type: "implicitReturn",
|
|
op: function (e) {
|
|
e.meta.returned = true;
|
|
if (e.meta.resolve) {
|
|
e.meta.resolve();
|
|
}
|
|
return t.HALT;
|
|
},
|
|
execute: function (e) {},
|
|
};
|
|
var n = e;
|
|
while (n.next) {
|
|
n = n.next;
|
|
}
|
|
n.next = r;
|
|
}
|
|
}
|
|
class o {
|
|
constructor(e, t) {
|
|
this.lexer = e ?? new n();
|
|
this.parser = t ?? new a(this).use(T).use(y);
|
|
this.parser.runtime = this;
|
|
}
|
|
matchesSelector(e, t) {
|
|
var r =
|
|
e.matches ||
|
|
e.matchesSelector ||
|
|
e.msMatchesSelector ||
|
|
e.mozMatchesSelector ||
|
|
e.webkitMatchesSelector ||
|
|
e.oMatchesSelector;
|
|
return r && r.call(e, t);
|
|
}
|
|
makeEvent(t, r) {
|
|
var n;
|
|
if (e.Event && typeof e.Event === "function") {
|
|
n = new Event(t, { bubbles: true, cancelable: true });
|
|
n["detail"] = r;
|
|
} else {
|
|
n = document.createEvent("CustomEvent");
|
|
n.initCustomEvent(t, true, true, r);
|
|
}
|
|
return n;
|
|
}
|
|
triggerEvent(e, t, r, n) {
|
|
r = r || {};
|
|
r["sender"] = n;
|
|
var i = this.makeEvent(t, r);
|
|
var a = e.dispatchEvent(i);
|
|
return a;
|
|
}
|
|
isArrayLike(e) {
|
|
return (
|
|
Array.isArray(e) ||
|
|
(typeof NodeList !== "undefined" &&
|
|
(e instanceof NodeList || e instanceof HTMLCollection))
|
|
);
|
|
}
|
|
isIterable(e) {
|
|
return (
|
|
typeof e === "object" &&
|
|
Symbol.iterator in e &&
|
|
typeof e[Symbol.iterator] === "function"
|
|
);
|
|
}
|
|
shouldAutoIterate(e) {
|
|
return (e != null && e[p]) || this.isArrayLike(e);
|
|
}
|
|
forEach(e, t) {
|
|
if (e == null) {
|
|
} else if (this.isIterable(e)) {
|
|
for (const r of e) {
|
|
t(r);
|
|
}
|
|
} else if (this.isArrayLike(e)) {
|
|
for (var r = 0; r < e.length; r++) {
|
|
t(e[r]);
|
|
}
|
|
} else {
|
|
t(e);
|
|
}
|
|
}
|
|
implicitLoop(e, t) {
|
|
if (this.shouldAutoIterate(e)) {
|
|
for (const r of e) t(r);
|
|
} else {
|
|
t(e);
|
|
}
|
|
}
|
|
wrapArrays(e) {
|
|
var t = [];
|
|
for (var r = 0; r < e.length; r++) {
|
|
var n = e[r];
|
|
if (Array.isArray(n)) {
|
|
t.push(Promise.all(n));
|
|
} else {
|
|
t.push(n);
|
|
}
|
|
}
|
|
return t;
|
|
}
|
|
unwrapAsyncs(e) {
|
|
for (var t = 0; t < e.length; t++) {
|
|
var r = e[t];
|
|
if (r.asyncWrapper) {
|
|
e[t] = r.value;
|
|
}
|
|
if (Array.isArray(r)) {
|
|
for (var n = 0; n < r.length; n++) {
|
|
var i = r[n];
|
|
if (i.asyncWrapper) {
|
|
r[n] = i.value;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
static HALT = {};
|
|
HALT = o.HALT;
|
|
unifiedExec(e, t) {
|
|
while (true) {
|
|
try {
|
|
var r = this.unifiedEval(e, t);
|
|
} catch (n) {
|
|
if (t.meta.handlingFinally) {
|
|
console.error(" Exception in finally block: ", n);
|
|
r = o.HALT;
|
|
} else {
|
|
this.registerHyperTrace(t, n);
|
|
if (t.meta.errorHandler && !t.meta.handlingError) {
|
|
t.meta.handlingError = true;
|
|
t.locals[t.meta.errorSymbol] = n;
|
|
e = t.meta.errorHandler;
|
|
continue;
|
|
} else {
|
|
t.meta.currentException = n;
|
|
r = o.HALT;
|
|
}
|
|
}
|
|
}
|
|
if (r == null) {
|
|
console.error(
|
|
e,
|
|
" did not return a next element to execute! context: ",
|
|
t,
|
|
);
|
|
return;
|
|
} else if (r.then) {
|
|
r.then((e) => {
|
|
this.unifiedExec(e, t);
|
|
}).catch((e) => {
|
|
this.unifiedExec(
|
|
{
|
|
op: function () {
|
|
throw e;
|
|
},
|
|
},
|
|
t,
|
|
);
|
|
});
|
|
return;
|
|
} else if (r === o.HALT) {
|
|
if (t.meta.finallyHandler && !t.meta.handlingFinally) {
|
|
t.meta.handlingFinally = true;
|
|
e = t.meta.finallyHandler;
|
|
} else {
|
|
if (t.meta.onHalt) {
|
|
t.meta.onHalt();
|
|
}
|
|
if (t.meta.currentException) {
|
|
if (t.meta.reject) {
|
|
t.meta.reject(t.meta.currentException);
|
|
return;
|
|
} else {
|
|
throw t.meta.currentException;
|
|
}
|
|
} else {
|
|
return;
|
|
}
|
|
}
|
|
} else {
|
|
e = r;
|
|
}
|
|
}
|
|
}
|
|
unifiedEval(e, t) {
|
|
var r = [t];
|
|
var n = false;
|
|
var i = false;
|
|
if (e.args) {
|
|
for (var a = 0; a < e.args.length; a++) {
|
|
var o = e.args[a];
|
|
if (o == null) {
|
|
r.push(null);
|
|
} else if (Array.isArray(o)) {
|
|
var s = [];
|
|
for (var u = 0; u < o.length; u++) {
|
|
var l = o[u];
|
|
var c = l ? l.evaluate(t) : null;
|
|
if (c) {
|
|
if (c.then) {
|
|
n = true;
|
|
} else if (c.asyncWrapper) {
|
|
i = true;
|
|
}
|
|
}
|
|
s.push(c);
|
|
}
|
|
r.push(s);
|
|
} else if (o.evaluate) {
|
|
var c = o.evaluate(t);
|
|
if (c) {
|
|
if (c.then) {
|
|
n = true;
|
|
} else if (c.asyncWrapper) {
|
|
i = true;
|
|
}
|
|
}
|
|
r.push(c);
|
|
} else {
|
|
r.push(o);
|
|
}
|
|
}
|
|
}
|
|
if (n) {
|
|
return new Promise((t, n) => {
|
|
r = this.wrapArrays(r);
|
|
Promise.all(r)
|
|
.then(function (r) {
|
|
if (i) {
|
|
this.unwrapAsyncs(r);
|
|
}
|
|
try {
|
|
var a = e.op.apply(e, r);
|
|
t(a);
|
|
} catch (e) {
|
|
n(e);
|
|
}
|
|
})
|
|
.catch(function (e) {
|
|
n(e);
|
|
});
|
|
});
|
|
} else {
|
|
if (i) {
|
|
this.unwrapAsyncs(r);
|
|
}
|
|
return e.op.apply(e, r);
|
|
}
|
|
}
|
|
_scriptAttrs = null;
|
|
getScriptAttributes() {
|
|
if (this._scriptAttrs == null) {
|
|
this._scriptAttrs = r.attributes.replace(/ /g, "").split(",");
|
|
}
|
|
return this._scriptAttrs;
|
|
}
|
|
getScript(e) {
|
|
for (var t = 0; t < this.getScriptAttributes().length; t++) {
|
|
var r = this.getScriptAttributes()[t];
|
|
if (e.hasAttribute && e.hasAttribute(r)) {
|
|
return e.getAttribute(r);
|
|
}
|
|
}
|
|
if (e instanceof HTMLScriptElement && e.type === "text/hyperscript") {
|
|
return e.innerText;
|
|
}
|
|
return null;
|
|
}
|
|
hyperscriptFeaturesMap = new WeakMap();
|
|
getHyperscriptFeatures(e) {
|
|
var t = this.hyperscriptFeaturesMap.get(e);
|
|
if (typeof t === "undefined") {
|
|
if (e) {
|
|
this.hyperscriptFeaturesMap.set(e, (t = {}));
|
|
}
|
|
}
|
|
return t;
|
|
}
|
|
addFeatures(e, t) {
|
|
if (e) {
|
|
Object.assign(t.locals, this.getHyperscriptFeatures(e));
|
|
this.addFeatures(e.parentElement, t);
|
|
}
|
|
}
|
|
makeContext(e, t, r, n) {
|
|
return new f(e, t, r, n, this);
|
|
}
|
|
getScriptSelector() {
|
|
return this.getScriptAttributes()
|
|
.map(function (e) {
|
|
return "[" + e + "]";
|
|
})
|
|
.join(", ");
|
|
}
|
|
convertValue(e, r) {
|
|
var n = t.dynamicResolvers;
|
|
for (var i = 0; i < n.length; i++) {
|
|
var a = n[i];
|
|
var o = a(r, e);
|
|
if (o !== undefined) {
|
|
return o;
|
|
}
|
|
}
|
|
if (e == null) {
|
|
return null;
|
|
}
|
|
var s = t[r];
|
|
if (s) {
|
|
return s(e);
|
|
}
|
|
throw "Unknown conversion : " + r;
|
|
}
|
|
parse(e) {
|
|
const t = this.lexer,
|
|
r = this.parser;
|
|
var n = t.tokenize(e);
|
|
if (this.parser.commandStart(n.currentToken())) {
|
|
var i = r.requireElement("commandList", n);
|
|
if (n.hasMore()) r.raiseParseError(n);
|
|
r.ensureTerminated(i);
|
|
return i;
|
|
} else if (r.featureStart(n.currentToken())) {
|
|
var a = r.requireElement("hyperscript", n);
|
|
if (n.hasMore()) r.raiseParseError(n);
|
|
return a;
|
|
} else {
|
|
var o = r.requireElement("expression", n);
|
|
if (n.hasMore()) r.raiseParseError(n);
|
|
return o;
|
|
}
|
|
}
|
|
evaluateNoPromise(e, t) {
|
|
let r = e.evaluate(t);
|
|
if (r.next) {
|
|
throw new Error(
|
|
i.sourceFor.call(e) +
|
|
" returned a Promise in a context that they are not allowed.",
|
|
);
|
|
}
|
|
return r;
|
|
}
|
|
evaluate(t, r, n) {
|
|
class i extends EventTarget {
|
|
constructor(e) {
|
|
super();
|
|
this.module = e;
|
|
}
|
|
toString() {
|
|
return this.module.id;
|
|
}
|
|
}
|
|
var a = "document" in e ? e.document.body : new i(n && n.module);
|
|
r = Object.assign(this.makeContext(a, null, a, null), r || {});
|
|
var o = this.parse(t);
|
|
if (o.execute) {
|
|
o.execute(r);
|
|
if (typeof r.meta.returnValue !== "undefined") {
|
|
return r.meta.returnValue;
|
|
} else {
|
|
return r.result;
|
|
}
|
|
} else if (o.apply) {
|
|
o.apply(a, a, n);
|
|
return this.getHyperscriptFeatures(a);
|
|
} else {
|
|
return o.evaluate(r);
|
|
}
|
|
function s() {
|
|
return {};
|
|
}
|
|
}
|
|
processNode(e) {
|
|
var t = this.getScriptSelector();
|
|
if (this.matchesSelector(e, t)) {
|
|
this.initElement(e, e);
|
|
}
|
|
if (e instanceof HTMLScriptElement && e.type === "text/hyperscript") {
|
|
this.initElement(e, document.body);
|
|
}
|
|
if (e.querySelectorAll) {
|
|
this.forEach(
|
|
e.querySelectorAll(t + ", [type='text/hyperscript']"),
|
|
(e) => {
|
|
this.initElement(
|
|
e,
|
|
e instanceof HTMLScriptElement && e.type === "text/hyperscript"
|
|
? document.body
|
|
: e,
|
|
);
|
|
},
|
|
);
|
|
}
|
|
}
|
|
initElement(e, t) {
|
|
if (e.closest && e.closest(r.disableSelector)) {
|
|
return;
|
|
}
|
|
var n = this.getInternalData(e);
|
|
if (!n.initialized) {
|
|
var i = this.getScript(e);
|
|
if (i) {
|
|
try {
|
|
n.initialized = true;
|
|
n.script = i;
|
|
const r = this.lexer,
|
|
s = this.parser;
|
|
var a = r.tokenize(i);
|
|
var o = s.parseHyperScript(a);
|
|
if (!o) return;
|
|
o.apply(t || e, e);
|
|
setTimeout(() => {
|
|
this.triggerEvent(t || e, "load", { hyperscript: true });
|
|
}, 1);
|
|
} catch (t) {
|
|
this.triggerEvent(e, "exception", { error: t });
|
|
console.error(
|
|
"hyperscript errors were found on the following element:",
|
|
e,
|
|
"\n\n",
|
|
t.message,
|
|
t.stack,
|
|
);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
internalDataMap = new WeakMap();
|
|
getInternalData(e) {
|
|
var t = this.internalDataMap.get(e);
|
|
if (typeof t === "undefined") {
|
|
this.internalDataMap.set(e, (t = {}));
|
|
}
|
|
return t;
|
|
}
|
|
typeCheck(e, t, r) {
|
|
if (e == null && r) {
|
|
return true;
|
|
}
|
|
var n = Object.prototype.toString.call(e).slice(8, -1);
|
|
return n === t;
|
|
}
|
|
getElementScope(e) {
|
|
var t = e.meta && e.meta.owner;
|
|
if (t) {
|
|
var r = this.getInternalData(t);
|
|
var n = "elementScope";
|
|
if (e.meta.feature && e.meta.feature.behavior) {
|
|
n = e.meta.feature.behavior + "Scope";
|
|
}
|
|
var i = h(r, n);
|
|
return i;
|
|
} else {
|
|
return {};
|
|
}
|
|
}
|
|
isReservedWord(e) {
|
|
return [
|
|
"meta",
|
|
"it",
|
|
"result",
|
|
"locals",
|
|
"event",
|
|
"target",
|
|
"detail",
|
|
"sender",
|
|
"body",
|
|
].includes(e);
|
|
}
|
|
isHyperscriptContext(e) {
|
|
return e instanceof f;
|
|
}
|
|
resolveSymbol(t, r, n) {
|
|
if (t === "me" || t === "my" || t === "I") {
|
|
return r.me;
|
|
}
|
|
if (t === "it" || t === "its" || t === "result") {
|
|
return r.result;
|
|
}
|
|
if (t === "you" || t === "your" || t === "yourself") {
|
|
return r.you;
|
|
} else {
|
|
if (n === "global") {
|
|
return e[t];
|
|
} else if (n === "element") {
|
|
var i = this.getElementScope(r);
|
|
return i[t];
|
|
} else if (n === "local") {
|
|
return r.locals[t];
|
|
} else {
|
|
if (r.meta && r.meta.context) {
|
|
var a = r.meta.context[t];
|
|
if (typeof a !== "undefined") {
|
|
return a;
|
|
}
|
|
if (r.meta.context.detail) {
|
|
a = r.meta.context.detail[t];
|
|
if (typeof a !== "undefined") {
|
|
return a;
|
|
}
|
|
}
|
|
}
|
|
if (this.isHyperscriptContext(r) && !this.isReservedWord(t)) {
|
|
var o = r.locals[t];
|
|
} else {
|
|
var o = r[t];
|
|
}
|
|
if (typeof o !== "undefined") {
|
|
return o;
|
|
} else {
|
|
var i = this.getElementScope(r);
|
|
o = i[t];
|
|
if (typeof o !== "undefined") {
|
|
return o;
|
|
} else {
|
|
return e[t];
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
setSymbol(t, r, n, i) {
|
|
if (n === "global") {
|
|
e[t] = i;
|
|
} else if (n === "element") {
|
|
var a = this.getElementScope(r);
|
|
a[t] = i;
|
|
} else if (n === "local") {
|
|
r.locals[t] = i;
|
|
} else {
|
|
if (
|
|
this.isHyperscriptContext(r) &&
|
|
!this.isReservedWord(t) &&
|
|
typeof r.locals[t] !== "undefined"
|
|
) {
|
|
r.locals[t] = i;
|
|
} else {
|
|
var a = this.getElementScope(r);
|
|
var o = a[t];
|
|
if (typeof o !== "undefined") {
|
|
a[t] = i;
|
|
} else {
|
|
if (this.isHyperscriptContext(r) && !this.isReservedWord(t)) {
|
|
r.locals[t] = i;
|
|
} else {
|
|
r[t] = i;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
findNext(e, t) {
|
|
if (e) {
|
|
if (e.resolveNext) {
|
|
return e.resolveNext(t);
|
|
} else if (e.next) {
|
|
return e.next;
|
|
} else {
|
|
return this.findNext(e.parent, t);
|
|
}
|
|
}
|
|
}
|
|
flatGet(e, t, r) {
|
|
if (e != null) {
|
|
var n = r(e, t);
|
|
if (typeof n !== "undefined") {
|
|
return n;
|
|
}
|
|
if (this.shouldAutoIterate(e)) {
|
|
var i = [];
|
|
for (var a of e) {
|
|
var o = r(a, t);
|
|
i.push(o);
|
|
}
|
|
return i;
|
|
}
|
|
}
|
|
}
|
|
resolveProperty(e, t) {
|
|
return this.flatGet(e, t, (e, t) => e[t]);
|
|
}
|
|
resolveAttribute(e, t) {
|
|
return this.flatGet(e, t, (e, t) => e.getAttribute && e.getAttribute(t));
|
|
}
|
|
resolveStyle(e, t) {
|
|
return this.flatGet(e, t, (e, t) => e.style && e.style[t]);
|
|
}
|
|
resolveComputedStyle(e, t) {
|
|
return this.flatGet(e, t, (e, t) =>
|
|
getComputedStyle(e).getPropertyValue(t),
|
|
);
|
|
}
|
|
assignToNamespace(t, r, n, i) {
|
|
let a;
|
|
if (typeof document !== "undefined" && t === document.body) {
|
|
a = e;
|
|
} else {
|
|
a = this.getHyperscriptFeatures(t);
|
|
}
|
|
var o;
|
|
while ((o = r.shift()) !== undefined) {
|
|
var s = a[o];
|
|
if (s == null) {
|
|
s = {};
|
|
a[o] = s;
|
|
}
|
|
a = s;
|
|
}
|
|
a[n] = i;
|
|
}
|
|
getHyperTrace(e, t) {
|
|
var r = [];
|
|
var n = e;
|
|
while (n.meta.caller) {
|
|
n = n.meta.caller;
|
|
}
|
|
if (n.meta.traceMap) {
|
|
return n.meta.traceMap.get(t, r);
|
|
}
|
|
}
|
|
registerHyperTrace(e, t) {
|
|
var r = [];
|
|
var n = null;
|
|
while (e != null) {
|
|
r.push(e);
|
|
n = e;
|
|
e = e.meta.caller;
|
|
}
|
|
if (n.meta.traceMap == null) {
|
|
n.meta.traceMap = new Map();
|
|
}
|
|
if (!n.meta.traceMap.get(t)) {
|
|
var i = {
|
|
trace: r,
|
|
print: function (e) {
|
|
e = e || console.error;
|
|
e("hypertrace /// ");
|
|
var t = 0;
|
|
for (var n = 0; n < r.length; n++) {
|
|
t = Math.max(t, r[n].meta.feature.displayName.length);
|
|
}
|
|
for (var n = 0; n < r.length; n++) {
|
|
var i = r[n];
|
|
e(
|
|
" ->",
|
|
i.meta.feature.displayName.padEnd(t + 2),
|
|
"-",
|
|
i.meta.owner,
|
|
);
|
|
}
|
|
},
|
|
};
|
|
n.meta.traceMap.set(t, i);
|
|
}
|
|
}
|
|
escapeSelector(e) {
|
|
return e.replace(/:/g, function (e) {
|
|
return "\\" + e;
|
|
});
|
|
}
|
|
nullCheck(e, t) {
|
|
if (e == null) {
|
|
throw new Error("'" + t.sourceFor() + "' is null");
|
|
}
|
|
}
|
|
isEmpty(e) {
|
|
return e == undefined || e.length === 0;
|
|
}
|
|
doesExist(e) {
|
|
if (e == null) {
|
|
return false;
|
|
}
|
|
if (this.shouldAutoIterate(e)) {
|
|
for (const t of e) {
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
return true;
|
|
}
|
|
getRootNode(e) {
|
|
if (e && e instanceof Node) {
|
|
var t = e.getRootNode();
|
|
if (t instanceof Document || t instanceof ShadowRoot) return t;
|
|
}
|
|
return document;
|
|
}
|
|
getEventQueueFor(e, t) {
|
|
let r = this.getInternalData(e);
|
|
var n = r.eventQueues;
|
|
if (n == null) {
|
|
n = new Map();
|
|
r.eventQueues = n;
|
|
}
|
|
var i = n.get(t);
|
|
if (i == null) {
|
|
i = { queue: [], executing: false };
|
|
n.set(t, i);
|
|
}
|
|
return i;
|
|
}
|
|
beepValueToConsole(e, t, r) {
|
|
if (
|
|
this.triggerEvent(e, "hyperscript:beep", {
|
|
element: e,
|
|
expression: t,
|
|
value: r,
|
|
})
|
|
) {
|
|
var n;
|
|
if (r) {
|
|
if (r instanceof m) {
|
|
n = "ElementCollection";
|
|
} else if (r.constructor) {
|
|
n = r.constructor.name;
|
|
} else {
|
|
n = "unknown";
|
|
}
|
|
} else {
|
|
n = "object (null)";
|
|
}
|
|
var a = r;
|
|
if (n === "String") {
|
|
a = '"' + a + '"';
|
|
} else if (r instanceof m) {
|
|
a = Array.from(r);
|
|
}
|
|
console.log(
|
|
"///_ BEEP! The expression (" +
|
|
i.sourceFor.call(t).replace("beep! ", "") +
|
|
") evaluates to:",
|
|
a,
|
|
"of type " + n,
|
|
);
|
|
}
|
|
}
|
|
hyperscriptUrl =
|
|
"document" in e && document.currentScript
|
|
? document.currentScript.src
|
|
: null;
|
|
}
|
|
function s() {
|
|
let e = document.cookie.split("; ").map((e) => {
|
|
let t = e.split("=");
|
|
return { name: t[0], value: decodeURIComponent(t[1]) };
|
|
});
|
|
return e;
|
|
}
|
|
function u(e) {
|
|
document.cookie = e + "=;expires=Thu, 01 Jan 1970 00:00:00 GMT";
|
|
}
|
|
function l() {
|
|
for (const e of s()) {
|
|
u(e.name);
|
|
}
|
|
}
|
|
const c = new Proxy(
|
|
{},
|
|
{
|
|
get(e, t) {
|
|
if (t === "then" || t === "asyncWrapper") {
|
|
return null;
|
|
} else if (t === "length") {
|
|
return s().length;
|
|
} else if (t === "clear") {
|
|
return u;
|
|
} else if (t === "clearAll") {
|
|
return l;
|
|
} else if (typeof t === "string") {
|
|
if (!isNaN(t)) {
|
|
return s()[parseInt(t)];
|
|
} else {
|
|
let e = document.cookie
|
|
.split("; ")
|
|
.find((e) => e.startsWith(t + "="))
|
|
?.split("=")[1];
|
|
if (e) {
|
|
return decodeURIComponent(e);
|
|
}
|
|
}
|
|
} else if (t === Symbol.iterator) {
|
|
return s()[t];
|
|
}
|
|
},
|
|
set(e, t, r) {
|
|
var n = null;
|
|
if ("string" === typeof r) {
|
|
n = encodeURIComponent(r);
|
|
n += ";samesite=lax";
|
|
} else {
|
|
n = encodeURIComponent(r.value);
|
|
if (r.expires) {
|
|
n += ";expires=" + r.maxAge;
|
|
}
|
|
if (r.maxAge) {
|
|
n += ";max-age=" + r.maxAge;
|
|
}
|
|
if (r.partitioned) {
|
|
n += ";partitioned=" + r.partitioned;
|
|
}
|
|
if (r.path) {
|
|
n += ";path=" + r.path;
|
|
}
|
|
if (r.samesite) {
|
|
n += ";samesite=" + r.path;
|
|
}
|
|
if (r.secure) {
|
|
n += ";secure=" + r.path;
|
|
}
|
|
}
|
|
document.cookie = t + "=" + n;
|
|
return true;
|
|
},
|
|
},
|
|
);
|
|
class f {
|
|
constructor(t, r, n, i, a) {
|
|
this.meta = {
|
|
parser: a.parser,
|
|
lexer: a.lexer,
|
|
runtime: a,
|
|
owner: t,
|
|
feature: r,
|
|
iterators: {},
|
|
ctx: this,
|
|
};
|
|
this.locals = { cookies: c };
|
|
(this.me = n), (this.you = undefined);
|
|
this.result = undefined;
|
|
this.event = i;
|
|
this.target = i ? i.target : null;
|
|
this.detail = i ? i.detail : null;
|
|
this.sender = i ? (i.detail ? i.detail.sender : null) : null;
|
|
this.body = "document" in e ? document.body : null;
|
|
a.addFeatures(t, this);
|
|
}
|
|
}
|
|
class m {
|
|
constructor(e, t, r) {
|
|
this._css = e;
|
|
this.relativeToElement = t;
|
|
this.escape = r;
|
|
this[p] = true;
|
|
}
|
|
get css() {
|
|
if (this.escape) {
|
|
return o.prototype.escapeSelector(this._css);
|
|
} else {
|
|
return this._css;
|
|
}
|
|
}
|
|
get className() {
|
|
return this._css.substr(1);
|
|
}
|
|
get id() {
|
|
return this.className();
|
|
}
|
|
contains(e) {
|
|
for (let t of this) {
|
|
if (t.contains(e)) {
|
|
return true;
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
get length() {
|
|
return this.selectMatches().length;
|
|
}
|
|
[Symbol.iterator]() {
|
|
let e = this.selectMatches();
|
|
return e[Symbol.iterator]();
|
|
}
|
|
selectMatches() {
|
|
let e = o.prototype
|
|
.getRootNode(this.relativeToElement)
|
|
.querySelectorAll(this.css);
|
|
return e;
|
|
}
|
|
}
|
|
const p = Symbol();
|
|
function h(e, t) {
|
|
var r = e[t];
|
|
if (r) {
|
|
return r;
|
|
} else {
|
|
var n = {};
|
|
e[t] = n;
|
|
return n;
|
|
}
|
|
}
|
|
function v(e) {
|
|
try {
|
|
return JSON.parse(e);
|
|
} catch (e) {
|
|
d(e);
|
|
return null;
|
|
}
|
|
}
|
|
function d(e) {
|
|
if (console.error) {
|
|
console.error(e);
|
|
} else if (console.log) {
|
|
console.log("ERROR: ", e);
|
|
}
|
|
}
|
|
function E(e, t) {
|
|
return new (e.bind.apply(e, [e].concat(t)))();
|
|
}
|
|
function T(t) {
|
|
t.addLeafExpression("parenthesized", function (e, t, r) {
|
|
if (r.matchOpToken("(")) {
|
|
var n = r.clearFollows();
|
|
try {
|
|
var i = e.requireElement("expression", r);
|
|
} finally {
|
|
r.restoreFollows(n);
|
|
}
|
|
r.requireOpToken(")");
|
|
return i;
|
|
}
|
|
});
|
|
t.addLeafExpression("string", function (e, t, r) {
|
|
var i = r.matchTokenType("STRING");
|
|
if (!i) return;
|
|
var a = i.value;
|
|
var o;
|
|
if (i.template) {
|
|
var s = n.tokenize(a, true);
|
|
o = e.parseStringTemplate(s);
|
|
} else {
|
|
o = [];
|
|
}
|
|
return {
|
|
type: "string",
|
|
token: i,
|
|
args: o,
|
|
op: function (e) {
|
|
var t = "";
|
|
for (var r = 1; r < arguments.length; r++) {
|
|
var n = arguments[r];
|
|
if (n !== undefined) {
|
|
t += n;
|
|
}
|
|
}
|
|
return t;
|
|
},
|
|
evaluate: function (e) {
|
|
if (o.length === 0) {
|
|
return a;
|
|
} else {
|
|
return t.unifiedEval(this, e);
|
|
}
|
|
},
|
|
};
|
|
});
|
|
t.addGrammarElement("nakedString", function (e, t, r) {
|
|
if (r.hasMore()) {
|
|
var n = r.consumeUntilWhitespace();
|
|
r.matchTokenType("WHITESPACE");
|
|
return {
|
|
type: "nakedString",
|
|
tokens: n,
|
|
evaluate: function (e) {
|
|
return n
|
|
.map(function (e) {
|
|
return e.value;
|
|
})
|
|
.join("");
|
|
},
|
|
};
|
|
}
|
|
});
|
|
t.addLeafExpression("number", function (e, t, r) {
|
|
var n = r.matchTokenType("NUMBER");
|
|
if (!n) return;
|
|
var i = n;
|
|
var a = parseFloat(n.value);
|
|
return {
|
|
type: "number",
|
|
value: a,
|
|
numberToken: i,
|
|
evaluate: function () {
|
|
return a;
|
|
},
|
|
};
|
|
});
|
|
t.addLeafExpression("idRef", function (e, t, r) {
|
|
var i = r.matchTokenType("ID_REF");
|
|
if (!i) return;
|
|
if (!i.value) return;
|
|
if (i.template) {
|
|
var a = i.value.substring(2);
|
|
var o = n.tokenize(a);
|
|
var s = e.requireElement("expression", o);
|
|
return {
|
|
type: "idRefTemplate",
|
|
args: [s],
|
|
op: function (e, r) {
|
|
return t.getRootNode(e.me).getElementById(r);
|
|
},
|
|
evaluate: function (e) {
|
|
return t.unifiedEval(this, e);
|
|
},
|
|
};
|
|
} else {
|
|
const e = i.value.substring(1);
|
|
return {
|
|
type: "idRef",
|
|
css: i.value,
|
|
value: e,
|
|
evaluate: function (r) {
|
|
return t.getRootNode(r.me).getElementById(e);
|
|
},
|
|
};
|
|
}
|
|
});
|
|
t.addLeafExpression("classRef", function (e, t, r) {
|
|
var i = r.matchTokenType("CLASS_REF");
|
|
if (!i) return;
|
|
if (!i.value) return;
|
|
if (i.template) {
|
|
var a = i.value.substring(2);
|
|
var o = n.tokenize(a);
|
|
var s = e.requireElement("expression", o);
|
|
return {
|
|
type: "classRefTemplate",
|
|
args: [s],
|
|
op: function (e, t) {
|
|
return new m("." + t, e.me, true);
|
|
},
|
|
evaluate: function (e) {
|
|
return t.unifiedEval(this, e);
|
|
},
|
|
};
|
|
} else {
|
|
const e = i.value;
|
|
return {
|
|
type: "classRef",
|
|
css: e,
|
|
evaluate: function (t) {
|
|
return new m(e, t.me, true);
|
|
},
|
|
};
|
|
}
|
|
});
|
|
class r extends m {
|
|
constructor(e, t, r) {
|
|
super(e, t);
|
|
this.templateParts = r;
|
|
this.elements = r.filter((e) => e instanceof Element);
|
|
}
|
|
get css() {
|
|
let e = "",
|
|
t = 0;
|
|
for (const r of this.templateParts) {
|
|
if (r instanceof Element) {
|
|
e += "[data-hs-query-id='" + t++ + "']";
|
|
} else e += r;
|
|
}
|
|
return e;
|
|
}
|
|
[Symbol.iterator]() {
|
|
this.elements.forEach((e, t) => (e.dataset.hsQueryId = t));
|
|
const e = super[Symbol.iterator]();
|
|
this.elements.forEach((e) => e.removeAttribute("data-hs-query-id"));
|
|
return e;
|
|
}
|
|
}
|
|
t.addLeafExpression("queryRef", function (e, t, i) {
|
|
var a = i.matchOpToken("<");
|
|
if (!a) return;
|
|
var o = i.consumeUntil("/");
|
|
i.requireOpToken("/");
|
|
i.requireOpToken(">");
|
|
var s = o
|
|
.map(function (e) {
|
|
if (e.type === "STRING") {
|
|
return '"' + e.value + '"';
|
|
} else {
|
|
return e.value;
|
|
}
|
|
})
|
|
.join("");
|
|
var u, l, c;
|
|
if (s.indexOf("$") >= 0) {
|
|
u = true;
|
|
l = n.tokenize(s, true);
|
|
c = e.parseStringTemplate(l);
|
|
}
|
|
return {
|
|
type: "queryRef",
|
|
css: s,
|
|
args: c,
|
|
op: function (e, ...t) {
|
|
if (u) {
|
|
return new r(s, e.me, t);
|
|
} else {
|
|
return new m(s, e.me);
|
|
}
|
|
},
|
|
evaluate: function (e) {
|
|
return t.unifiedEval(this, e);
|
|
},
|
|
};
|
|
});
|
|
t.addLeafExpression("attributeRef", function (e, t, r) {
|
|
var n = r.matchTokenType("ATTRIBUTE_REF");
|
|
if (!n) return;
|
|
if (!n.value) return;
|
|
var i = n.value;
|
|
if (i.indexOf("[") === 0) {
|
|
var a = i.substring(2, i.length - 1);
|
|
} else {
|
|
var a = i.substring(1);
|
|
}
|
|
var o = "[" + a + "]";
|
|
var s = a.split("=");
|
|
var u = s[0];
|
|
var l = s[1];
|
|
if (l) {
|
|
if (l.indexOf('"') === 0) {
|
|
l = l.substring(1, l.length - 1);
|
|
}
|
|
}
|
|
return {
|
|
type: "attributeRef",
|
|
name: u,
|
|
css: o,
|
|
value: l,
|
|
op: function (e) {
|
|
var t = e.you || e.me;
|
|
if (t) {
|
|
return t.getAttribute(u);
|
|
}
|
|
},
|
|
evaluate: function (e) {
|
|
return t.unifiedEval(this, e);
|
|
},
|
|
};
|
|
});
|
|
t.addLeafExpression("styleRef", function (e, t, r) {
|
|
var n = r.matchTokenType("STYLE_REF");
|
|
if (!n) return;
|
|
if (!n.value) return;
|
|
var i = n.value.substr(1);
|
|
if (i.startsWith("computed-")) {
|
|
i = i.substr("computed-".length);
|
|
return {
|
|
type: "computedStyleRef",
|
|
name: i,
|
|
op: function (e) {
|
|
var r = e.you || e.me;
|
|
if (r) {
|
|
return t.resolveComputedStyle(r, i);
|
|
}
|
|
},
|
|
evaluate: function (e) {
|
|
return t.unifiedEval(this, e);
|
|
},
|
|
};
|
|
} else {
|
|
return {
|
|
type: "styleRef",
|
|
name: i,
|
|
op: function (e) {
|
|
var r = e.you || e.me;
|
|
if (r) {
|
|
return t.resolveStyle(r, i);
|
|
}
|
|
},
|
|
evaluate: function (e) {
|
|
return t.unifiedEval(this, e);
|
|
},
|
|
};
|
|
}
|
|
});
|
|
t.addGrammarElement("objectKey", function (e, t, r) {
|
|
var n;
|
|
if ((n = r.matchTokenType("STRING"))) {
|
|
return {
|
|
type: "objectKey",
|
|
key: n.value,
|
|
evaluate: function () {
|
|
return n.value;
|
|
},
|
|
};
|
|
} else if (r.matchOpToken("[")) {
|
|
var i = e.parseElement("expression", r);
|
|
r.requireOpToken("]");
|
|
return {
|
|
type: "objectKey",
|
|
expr: i,
|
|
args: [i],
|
|
op: function (e, t) {
|
|
return t;
|
|
},
|
|
evaluate: function (e) {
|
|
return t.unifiedEval(this, e);
|
|
},
|
|
};
|
|
} else {
|
|
var a = "";
|
|
do {
|
|
n = r.matchTokenType("IDENTIFIER") || r.matchOpToken("-");
|
|
if (n) a += n.value;
|
|
} while (n);
|
|
return {
|
|
type: "objectKey",
|
|
key: a,
|
|
evaluate: function () {
|
|
return a;
|
|
},
|
|
};
|
|
}
|
|
});
|
|
t.addLeafExpression("objectLiteral", function (e, t, r) {
|
|
if (!r.matchOpToken("{")) return;
|
|
var n = [];
|
|
var i = [];
|
|
if (!r.matchOpToken("}")) {
|
|
do {
|
|
var a = e.requireElement("objectKey", r);
|
|
r.requireOpToken(":");
|
|
var o = e.requireElement("expression", r);
|
|
i.push(o);
|
|
n.push(a);
|
|
} while (r.matchOpToken(","));
|
|
r.requireOpToken("}");
|
|
}
|
|
return {
|
|
type: "objectLiteral",
|
|
args: [n, i],
|
|
op: function (e, t, r) {
|
|
var n = {};
|
|
for (var i = 0; i < t.length; i++) {
|
|
n[t[i]] = r[i];
|
|
}
|
|
return n;
|
|
},
|
|
evaluate: function (e) {
|
|
return t.unifiedEval(this, e);
|
|
},
|
|
};
|
|
});
|
|
t.addGrammarElement("nakedNamedArgumentList", function (e, t, r) {
|
|
var n = [];
|
|
var i = [];
|
|
if (r.currentToken().type === "IDENTIFIER") {
|
|
do {
|
|
var a = r.requireTokenType("IDENTIFIER");
|
|
r.requireOpToken(":");
|
|
var o = e.requireElement("expression", r);
|
|
i.push(o);
|
|
n.push({ name: a, value: o });
|
|
} while (r.matchOpToken(","));
|
|
}
|
|
return {
|
|
type: "namedArgumentList",
|
|
fields: n,
|
|
args: [i],
|
|
op: function (e, t) {
|
|
var r = { _namedArgList_: true };
|
|
for (var i = 0; i < t.length; i++) {
|
|
var a = n[i];
|
|
r[a.name.value] = t[i];
|
|
}
|
|
return r;
|
|
},
|
|
evaluate: function (e) {
|
|
return t.unifiedEval(this, e);
|
|
},
|
|
};
|
|
});
|
|
t.addGrammarElement("namedArgumentList", function (e, t, r) {
|
|
if (!r.matchOpToken("(")) return;
|
|
var n = e.requireElement("nakedNamedArgumentList", r);
|
|
r.requireOpToken(")");
|
|
return n;
|
|
});
|
|
t.addGrammarElement("symbol", function (e, t, r) {
|
|
var n = "default";
|
|
if (r.matchToken("global")) {
|
|
n = "global";
|
|
} else if (r.matchToken("element") || r.matchToken("module")) {
|
|
n = "element";
|
|
if (r.matchOpToken("'")) {
|
|
r.requireToken("s");
|
|
}
|
|
} else if (r.matchToken("local")) {
|
|
n = "local";
|
|
}
|
|
let i = r.matchOpToken(":");
|
|
let a = r.matchTokenType("IDENTIFIER");
|
|
if (a && a.value) {
|
|
var o = a.value;
|
|
if (i) {
|
|
o = ":" + o;
|
|
}
|
|
if (n === "default") {
|
|
if (o.indexOf("$") === 0) {
|
|
n = "global";
|
|
}
|
|
if (o.indexOf(":") === 0) {
|
|
n = "element";
|
|
}
|
|
}
|
|
return {
|
|
type: "symbol",
|
|
token: a,
|
|
scope: n,
|
|
name: o,
|
|
evaluate: function (e) {
|
|
return t.resolveSymbol(o, e, n);
|
|
},
|
|
};
|
|
}
|
|
});
|
|
t.addGrammarElement("implicitMeTarget", function (e, t, r) {
|
|
return {
|
|
type: "implicitMeTarget",
|
|
evaluate: function (e) {
|
|
return e.you || e.me;
|
|
},
|
|
};
|
|
});
|
|
t.addLeafExpression("boolean", function (e, t, r) {
|
|
var n = r.matchToken("true") || r.matchToken("false");
|
|
if (!n) return;
|
|
const i = n.value === "true";
|
|
return {
|
|
type: "boolean",
|
|
evaluate: function (e) {
|
|
return i;
|
|
},
|
|
};
|
|
});
|
|
t.addLeafExpression("null", function (e, t, r) {
|
|
if (r.matchToken("null")) {
|
|
return {
|
|
type: "null",
|
|
evaluate: function (e) {
|
|
return null;
|
|
},
|
|
};
|
|
}
|
|
});
|
|
t.addLeafExpression("arrayLiteral", function (e, t, r) {
|
|
if (!r.matchOpToken("[")) return;
|
|
var n = [];
|
|
if (!r.matchOpToken("]")) {
|
|
do {
|
|
var i = e.requireElement("expression", r);
|
|
n.push(i);
|
|
} while (r.matchOpToken(","));
|
|
r.requireOpToken("]");
|
|
}
|
|
return {
|
|
type: "arrayLiteral",
|
|
values: n,
|
|
args: [n],
|
|
op: function (e, t) {
|
|
return t;
|
|
},
|
|
evaluate: function (e) {
|
|
return t.unifiedEval(this, e);
|
|
},
|
|
};
|
|
});
|
|
t.addLeafExpression("blockLiteral", function (e, t, r) {
|
|
if (!r.matchOpToken("\\")) return;
|
|
var n = [];
|
|
var i = r.matchTokenType("IDENTIFIER");
|
|
if (i) {
|
|
n.push(i);
|
|
while (r.matchOpToken(",")) {
|
|
n.push(r.requireTokenType("IDENTIFIER"));
|
|
}
|
|
}
|
|
r.requireOpToken("-");
|
|
r.requireOpToken(">");
|
|
var a = e.requireElement("expression", r);
|
|
return {
|
|
type: "blockLiteral",
|
|
args: n,
|
|
expr: a,
|
|
evaluate: function (e) {
|
|
var t = function () {
|
|
for (var t = 0; t < n.length; t++) {
|
|
e.locals[n[t].value] = arguments[t];
|
|
}
|
|
return a.evaluate(e);
|
|
};
|
|
return t;
|
|
},
|
|
};
|
|
});
|
|
t.addIndirectExpression("propertyAccess", function (e, t, r, n) {
|
|
if (!r.matchOpToken(".")) return;
|
|
var i = r.requireTokenType("IDENTIFIER");
|
|
var a = {
|
|
type: "propertyAccess",
|
|
root: n,
|
|
prop: i,
|
|
args: [n],
|
|
op: function (e, r) {
|
|
var n = t.resolveProperty(r, i.value);
|
|
return n;
|
|
},
|
|
evaluate: function (e) {
|
|
return t.unifiedEval(this, e);
|
|
},
|
|
};
|
|
return e.parseElement("indirectExpression", r, a);
|
|
});
|
|
t.addIndirectExpression("of", function (e, t, r, n) {
|
|
if (!r.matchToken("of")) return;
|
|
var i = e.requireElement("unaryExpression", r);
|
|
var a = null;
|
|
var o = n;
|
|
while (o.root) {
|
|
a = o;
|
|
o = o.root;
|
|
}
|
|
if (
|
|
o.type !== "symbol" &&
|
|
o.type !== "attributeRef" &&
|
|
o.type !== "styleRef" &&
|
|
o.type !== "computedStyleRef"
|
|
) {
|
|
e.raiseParseError(
|
|
r,
|
|
"Cannot take a property of a non-symbol: " + o.type,
|
|
);
|
|
}
|
|
var s = o.type === "attributeRef";
|
|
var u = o.type === "styleRef" || o.type === "computedStyleRef";
|
|
if (s || u) {
|
|
var l = o;
|
|
}
|
|
var c = o.name;
|
|
var f = {
|
|
type: "ofExpression",
|
|
prop: o.token,
|
|
root: i,
|
|
attribute: l,
|
|
expression: n,
|
|
args: [i],
|
|
op: function (e, r) {
|
|
if (s) {
|
|
return t.resolveAttribute(r, c);
|
|
} else if (u) {
|
|
if (o.type === "computedStyleRef") {
|
|
return t.resolveComputedStyle(r, c);
|
|
} else {
|
|
return t.resolveStyle(r, c);
|
|
}
|
|
} else {
|
|
return t.resolveProperty(r, c);
|
|
}
|
|
},
|
|
evaluate: function (e) {
|
|
return t.unifiedEval(this, e);
|
|
},
|
|
};
|
|
if (o.type === "attributeRef") {
|
|
f.attribute = o;
|
|
}
|
|
if (a) {
|
|
a.root = f;
|
|
a.args = [f];
|
|
} else {
|
|
n = f;
|
|
}
|
|
return e.parseElement("indirectExpression", r, n);
|
|
});
|
|
t.addIndirectExpression("possessive", function (e, t, r, n) {
|
|
if (e.possessivesDisabled) {
|
|
return;
|
|
}
|
|
var i = r.matchOpToken("'");
|
|
if (
|
|
i ||
|
|
(n.type === "symbol" &&
|
|
(n.name === "my" || n.name === "its" || n.name === "your") &&
|
|
(r.currentToken().type === "IDENTIFIER" ||
|
|
r.currentToken().type === "ATTRIBUTE_REF" ||
|
|
r.currentToken().type === "STYLE_REF"))
|
|
) {
|
|
if (i) {
|
|
r.requireToken("s");
|
|
}
|
|
var a, o, s;
|
|
a = e.parseElement("attributeRef", r);
|
|
if (a == null) {
|
|
o = e.parseElement("styleRef", r);
|
|
if (o == null) {
|
|
s = r.requireTokenType("IDENTIFIER");
|
|
}
|
|
}
|
|
var u = {
|
|
type: "possessive",
|
|
root: n,
|
|
attribute: a || o,
|
|
prop: s,
|
|
args: [n],
|
|
op: function (e, r) {
|
|
if (a) {
|
|
var n = t.resolveAttribute(r, a.name);
|
|
} else if (o) {
|
|
var n;
|
|
if (o.type === "computedStyleRef") {
|
|
n = t.resolveComputedStyle(r, o["name"]);
|
|
} else {
|
|
n = t.resolveStyle(r, o["name"]);
|
|
}
|
|
} else {
|
|
var n = t.resolveProperty(r, s.value);
|
|
}
|
|
return n;
|
|
},
|
|
evaluate: function (e) {
|
|
return t.unifiedEval(this, e);
|
|
},
|
|
};
|
|
return e.parseElement("indirectExpression", r, u);
|
|
}
|
|
});
|
|
t.addIndirectExpression("inExpression", function (e, t, r, n) {
|
|
if (!r.matchToken("in")) return;
|
|
var i = e.requireElement("unaryExpression", r);
|
|
var a = {
|
|
type: "inExpression",
|
|
root: n,
|
|
args: [n, i],
|
|
op: function (e, r, n) {
|
|
var i = [];
|
|
if (r.css) {
|
|
t.implicitLoop(n, function (e) {
|
|
var t = e.querySelectorAll(r.css);
|
|
for (var n = 0; n < t.length; n++) {
|
|
i.push(t[n]);
|
|
}
|
|
});
|
|
} else if (r instanceof Element) {
|
|
var a = false;
|
|
t.implicitLoop(n, function (e) {
|
|
if (e.contains(r)) {
|
|
a = true;
|
|
}
|
|
});
|
|
if (a) {
|
|
return r;
|
|
}
|
|
} else {
|
|
t.implicitLoop(r, function (e) {
|
|
t.implicitLoop(n, function (t) {
|
|
if (e === t) {
|
|
i.push(e);
|
|
}
|
|
});
|
|
});
|
|
}
|
|
return i;
|
|
},
|
|
evaluate: function (e) {
|
|
return t.unifiedEval(this, e);
|
|
},
|
|
};
|
|
return e.parseElement("indirectExpression", r, a);
|
|
});
|
|
t.addIndirectExpression("asExpression", function (e, t, r, n) {
|
|
if (!r.matchToken("as")) return;
|
|
r.matchToken("a") || r.matchToken("an");
|
|
var i = e.requireElement("dotOrColonPath", r).evaluate();
|
|
var a = {
|
|
type: "asExpression",
|
|
root: n,
|
|
args: [n],
|
|
op: function (e, r) {
|
|
return t.convertValue(r, i);
|
|
},
|
|
evaluate: function (e) {
|
|
return t.unifiedEval(this, e);
|
|
},
|
|
};
|
|
return e.parseElement("indirectExpression", r, a);
|
|
});
|
|
t.addIndirectExpression("functionCall", function (e, t, r, n) {
|
|
if (!r.matchOpToken("(")) return;
|
|
var i = [];
|
|
if (!r.matchOpToken(")")) {
|
|
do {
|
|
i.push(e.requireElement("expression", r));
|
|
} while (r.matchOpToken(","));
|
|
r.requireOpToken(")");
|
|
}
|
|
if (n.root) {
|
|
var a = {
|
|
type: "functionCall",
|
|
root: n,
|
|
argExressions: i,
|
|
args: [n.root, i],
|
|
op: function (e, r, i) {
|
|
t.nullCheck(r, n.root);
|
|
var a = r[n.prop.value];
|
|
t.nullCheck(a, n);
|
|
if (a.hyperfunc) {
|
|
i.push(e);
|
|
}
|
|
return a.apply(r, i);
|
|
},
|
|
evaluate: function (e) {
|
|
return t.unifiedEval(this, e);
|
|
},
|
|
};
|
|
} else {
|
|
var a = {
|
|
type: "functionCall",
|
|
root: n,
|
|
argExressions: i,
|
|
args: [n, i],
|
|
op: function (e, r, i) {
|
|
t.nullCheck(r, n);
|
|
if (r.hyperfunc) {
|
|
i.push(e);
|
|
}
|
|
var a = r.apply(null, i);
|
|
return a;
|
|
},
|
|
evaluate: function (e) {
|
|
return t.unifiedEval(this, e);
|
|
},
|
|
};
|
|
}
|
|
return e.parseElement("indirectExpression", r, a);
|
|
});
|
|
t.addIndirectExpression("attributeRefAccess", function (e, t, r, n) {
|
|
var i = e.parseElement("attributeRef", r);
|
|
if (!i) return;
|
|
var a = {
|
|
type: "attributeRefAccess",
|
|
root: n,
|
|
attribute: i,
|
|
args: [n],
|
|
op: function (e, r) {
|
|
var n = t.resolveAttribute(r, i.name);
|
|
return n;
|
|
},
|
|
evaluate: function (e) {
|
|
return t.unifiedEval(this, e);
|
|
},
|
|
};
|
|
return a;
|
|
});
|
|
t.addIndirectExpression("arrayIndex", function (e, t, r, n) {
|
|
if (!r.matchOpToken("[")) return;
|
|
var i = false;
|
|
var a = false;
|
|
var o = null;
|
|
var s = null;
|
|
if (r.matchOpToken("..")) {
|
|
i = true;
|
|
o = e.requireElement("expression", r);
|
|
} else {
|
|
o = e.requireElement("expression", r);
|
|
if (r.matchOpToken("..")) {
|
|
a = true;
|
|
var u = r.currentToken();
|
|
if (u.type !== "R_BRACKET") {
|
|
s = e.parseElement("expression", r);
|
|
}
|
|
}
|
|
}
|
|
r.requireOpToken("]");
|
|
var l = {
|
|
type: "arrayIndex",
|
|
root: n,
|
|
prop: o,
|
|
firstIndex: o,
|
|
secondIndex: s,
|
|
args: [n, o, s],
|
|
op: function (e, t, r, n) {
|
|
if (t == null) {
|
|
return null;
|
|
}
|
|
if (i) {
|
|
if (r < 0) {
|
|
r = t.length + r;
|
|
}
|
|
return t.slice(0, r + 1);
|
|
} else if (a) {
|
|
if (n != null) {
|
|
if (n < 0) {
|
|
n = t.length + n;
|
|
}
|
|
return t.slice(r, n + 1);
|
|
} else {
|
|
return t.slice(r);
|
|
}
|
|
} else {
|
|
return t[r];
|
|
}
|
|
},
|
|
evaluate: function (e) {
|
|
return t.unifiedEval(this, e);
|
|
},
|
|
};
|
|
return e.parseElement("indirectExpression", r, l);
|
|
});
|
|
var a = [
|
|
"em",
|
|
"ex",
|
|
"cap",
|
|
"ch",
|
|
"ic",
|
|
"rem",
|
|
"lh",
|
|
"rlh",
|
|
"vw",
|
|
"vh",
|
|
"vi",
|
|
"vb",
|
|
"vmin",
|
|
"vmax",
|
|
"cm",
|
|
"mm",
|
|
"Q",
|
|
"pc",
|
|
"pt",
|
|
"px",
|
|
];
|
|
t.addGrammarElement("postfixExpression", function (e, t, r) {
|
|
var n = e.parseElement("primaryExpression", r);
|
|
let i = r.matchAnyToken.apply(r, a) || r.matchOpToken("%");
|
|
if (i) {
|
|
return {
|
|
type: "stringPostfix",
|
|
postfix: i.value,
|
|
args: [n],
|
|
op: function (e, t) {
|
|
return "" + t + i.value;
|
|
},
|
|
evaluate: function (e) {
|
|
return t.unifiedEval(this, e);
|
|
},
|
|
};
|
|
}
|
|
var o = null;
|
|
if (r.matchToken("s") || r.matchToken("seconds")) {
|
|
o = 1e3;
|
|
} else if (r.matchToken("ms") || r.matchToken("milliseconds")) {
|
|
o = 1;
|
|
}
|
|
if (o) {
|
|
return {
|
|
type: "timeExpression",
|
|
time: n,
|
|
factor: o,
|
|
args: [n],
|
|
op: function (e, t) {
|
|
return t * o;
|
|
},
|
|
evaluate: function (e) {
|
|
return t.unifiedEval(this, e);
|
|
},
|
|
};
|
|
}
|
|
if (r.matchOpToken(":")) {
|
|
var s = r.requireTokenType("IDENTIFIER");
|
|
if (!s.value) return;
|
|
var u = !r.matchOpToken("!");
|
|
return {
|
|
type: "typeCheck",
|
|
typeName: s,
|
|
nullOk: u,
|
|
args: [n],
|
|
op: function (e, r) {
|
|
var n = t.typeCheck(r, this.typeName.value, u);
|
|
if (n) {
|
|
return r;
|
|
} else {
|
|
throw new Error("Typecheck failed! Expected: " + s.value);
|
|
}
|
|
},
|
|
evaluate: function (e) {
|
|
return t.unifiedEval(this, e);
|
|
},
|
|
};
|
|
} else {
|
|
return n;
|
|
}
|
|
});
|
|
t.addGrammarElement("logicalNot", function (e, t, r) {
|
|
if (!r.matchToken("not")) return;
|
|
var n = e.requireElement("unaryExpression", r);
|
|
return {
|
|
type: "logicalNot",
|
|
root: n,
|
|
args: [n],
|
|
op: function (e, t) {
|
|
return !t;
|
|
},
|
|
evaluate: function (e) {
|
|
return t.unifiedEval(this, e);
|
|
},
|
|
};
|
|
});
|
|
t.addGrammarElement("noExpression", function (e, t, r) {
|
|
if (!r.matchToken("no")) return;
|
|
var n = e.requireElement("unaryExpression", r);
|
|
return {
|
|
type: "noExpression",
|
|
root: n,
|
|
args: [n],
|
|
op: function (e, r) {
|
|
return t.isEmpty(r);
|
|
},
|
|
evaluate: function (e) {
|
|
return t.unifiedEval(this, e);
|
|
},
|
|
};
|
|
});
|
|
t.addLeafExpression("some", function (e, t, r) {
|
|
if (!r.matchToken("some")) return;
|
|
var n = e.requireElement("expression", r);
|
|
return {
|
|
type: "noExpression",
|
|
root: n,
|
|
args: [n],
|
|
op: function (e, r) {
|
|
return !t.isEmpty(r);
|
|
},
|
|
evaluate(e) {
|
|
return t.unifiedEval(this, e);
|
|
},
|
|
};
|
|
});
|
|
t.addGrammarElement("negativeNumber", function (e, t, r) {
|
|
if (!r.matchOpToken("-")) return;
|
|
var n = e.requireElement("unaryExpression", r);
|
|
return {
|
|
type: "negativeNumber",
|
|
root: n,
|
|
args: [n],
|
|
op: function (e, t) {
|
|
return -1 * t;
|
|
},
|
|
evaluate: function (e) {
|
|
return t.unifiedEval(this, e);
|
|
},
|
|
};
|
|
});
|
|
t.addGrammarElement("unaryExpression", function (e, t, r) {
|
|
r.matchToken("the");
|
|
return e.parseAnyOf(
|
|
[
|
|
"beepExpression",
|
|
"logicalNot",
|
|
"relativePositionalExpression",
|
|
"positionalExpression",
|
|
"noExpression",
|
|
"negativeNumber",
|
|
"postfixExpression",
|
|
],
|
|
r,
|
|
);
|
|
});
|
|
t.addGrammarElement("beepExpression", function (e, t, r) {
|
|
if (!r.matchToken("beep!")) return;
|
|
var n = e.parseElement("unaryExpression", r);
|
|
if (n) {
|
|
n["booped"] = true;
|
|
var i = n.evaluate;
|
|
n.evaluate = function (e) {
|
|
let r = i.apply(n, arguments);
|
|
let a = e.me;
|
|
t.beepValueToConsole(a, n, r);
|
|
return r;
|
|
};
|
|
return n;
|
|
}
|
|
});
|
|
var s = function (e, t, r, n) {
|
|
var i = t.querySelectorAll(r);
|
|
for (var a = 0; a < i.length; a++) {
|
|
var o = i[a];
|
|
if (o.compareDocumentPosition(e) === Node.DOCUMENT_POSITION_PRECEDING) {
|
|
return o;
|
|
}
|
|
}
|
|
if (n) {
|
|
return i[0];
|
|
}
|
|
};
|
|
var u = function (e, t, r, n) {
|
|
var i = t.querySelectorAll(r);
|
|
for (var a = i.length - 1; a >= 0; a--) {
|
|
var o = i[a];
|
|
if (o.compareDocumentPosition(e) === Node.DOCUMENT_POSITION_FOLLOWING) {
|
|
return o;
|
|
}
|
|
}
|
|
if (n) {
|
|
return i[i.length - 1];
|
|
}
|
|
};
|
|
var l = function (e, t, r, n) {
|
|
var i = [];
|
|
o.prototype.forEach(t, function (t) {
|
|
if (t.matches(r) || t === e) {
|
|
i.push(t);
|
|
}
|
|
});
|
|
for (var a = 0; a < i.length - 1; a++) {
|
|
var s = i[a];
|
|
if (s === e) {
|
|
return i[a + 1];
|
|
}
|
|
}
|
|
if (n) {
|
|
var u = i[0];
|
|
if (u && u.matches(r)) {
|
|
return u;
|
|
}
|
|
}
|
|
};
|
|
var c = function (e, t, r, n) {
|
|
return l(e, Array.from(t).reverse(), r, n);
|
|
};
|
|
t.addGrammarElement("relativePositionalExpression", function (e, t, r) {
|
|
var n = r.matchAnyToken("next", "previous");
|
|
if (!n) return;
|
|
var a = n.value === "next";
|
|
var o = e.parseElement("expression", r);
|
|
if (r.matchToken("from")) {
|
|
r.pushFollow("in");
|
|
try {
|
|
var f = e.requireElement("unaryExpression", r);
|
|
} finally {
|
|
r.popFollow();
|
|
}
|
|
} else {
|
|
var f = e.requireElement("implicitMeTarget", r);
|
|
}
|
|
var m = false;
|
|
var p;
|
|
if (r.matchToken("in")) {
|
|
m = true;
|
|
var h = e.requireElement("unaryExpression", r);
|
|
} else if (r.matchToken("within")) {
|
|
p = e.requireElement("unaryExpression", r);
|
|
} else {
|
|
p = document.body;
|
|
}
|
|
var v = false;
|
|
if (r.matchToken("with")) {
|
|
r.requireToken("wrapping");
|
|
v = true;
|
|
}
|
|
return {
|
|
type: "relativePositionalExpression",
|
|
from: f,
|
|
forwardSearch: a,
|
|
inSearch: m,
|
|
wrapping: v,
|
|
inElt: h,
|
|
withinElt: p,
|
|
operator: n.value,
|
|
args: [o, f, h, p],
|
|
op: function (e, t, r, n, f) {
|
|
var p = t.css;
|
|
if (p == null) {
|
|
throw (
|
|
"Expected a CSS value to be returned by " + i.sourceFor.apply(o)
|
|
);
|
|
}
|
|
if (m) {
|
|
if (n) {
|
|
if (a) {
|
|
return l(r, n, p, v);
|
|
} else {
|
|
return c(r, n, p, v);
|
|
}
|
|
}
|
|
} else {
|
|
if (f) {
|
|
if (a) {
|
|
return s(r, f, p, v);
|
|
} else {
|
|
return u(r, f, p, v);
|
|
}
|
|
}
|
|
}
|
|
},
|
|
evaluate: function (e) {
|
|
return t.unifiedEval(this, e);
|
|
},
|
|
};
|
|
});
|
|
t.addGrammarElement("positionalExpression", function (e, t, r) {
|
|
var n = r.matchAnyToken("first", "last", "random");
|
|
if (!n) return;
|
|
r.matchAnyToken("in", "from", "of");
|
|
var i = e.requireElement("unaryExpression", r);
|
|
const a = n.value;
|
|
return {
|
|
type: "positionalExpression",
|
|
rhs: i,
|
|
operator: n.value,
|
|
args: [i],
|
|
op: function (e, t) {
|
|
if (t && !Array.isArray(t)) {
|
|
if (t.children) {
|
|
t = t.children;
|
|
} else {
|
|
t = Array.from(t);
|
|
}
|
|
}
|
|
if (t) {
|
|
if (a === "first") {
|
|
return t[0];
|
|
} else if (a === "last") {
|
|
return t[t.length - 1];
|
|
} else if (a === "random") {
|
|
return t[Math.floor(Math.random() * t.length)];
|
|
}
|
|
}
|
|
},
|
|
evaluate: function (e) {
|
|
return t.unifiedEval(this, e);
|
|
},
|
|
};
|
|
});
|
|
t.addGrammarElement("mathOperator", function (e, t, r) {
|
|
var n = e.parseElement("unaryExpression", r);
|
|
var i,
|
|
a = null;
|
|
i = r.matchAnyOpToken("+", "-", "*", "/") || r.matchToken("mod");
|
|
while (i) {
|
|
a = a || i;
|
|
var o = i.value;
|
|
if (a.value !== o) {
|
|
e.raiseParseError(
|
|
r,
|
|
"You must parenthesize math operations with different operators",
|
|
);
|
|
}
|
|
var s = e.parseElement("unaryExpression", r);
|
|
n = {
|
|
type: "mathOperator",
|
|
lhs: n,
|
|
rhs: s,
|
|
operator: o,
|
|
args: [n, s],
|
|
op: function (e, t, r) {
|
|
if (o === "+") {
|
|
return t + r;
|
|
} else if (o === "-") {
|
|
return t - r;
|
|
} else if (o === "*") {
|
|
return t * r;
|
|
} else if (o === "/") {
|
|
return t / r;
|
|
} else if (o === "mod") {
|
|
return t % r;
|
|
}
|
|
},
|
|
evaluate: function (e) {
|
|
return t.unifiedEval(this, e);
|
|
},
|
|
};
|
|
i = r.matchAnyOpToken("+", "-", "*", "/") || r.matchToken("mod");
|
|
}
|
|
return n;
|
|
});
|
|
t.addGrammarElement("mathExpression", function (e, t, r) {
|
|
return e.parseAnyOf(["mathOperator", "unaryExpression"], r);
|
|
});
|
|
function f(e, t, r) {
|
|
if (t["contains"]) {
|
|
return t.contains(r);
|
|
} else if (t["includes"]) {
|
|
return t.includes(r);
|
|
} else {
|
|
throw Error(
|
|
"The value of " +
|
|
e.sourceFor() +
|
|
" does not have a contains or includes method on it",
|
|
);
|
|
}
|
|
}
|
|
function p(e, t, r) {
|
|
if (t["match"]) {
|
|
return !!t.match(r);
|
|
} else if (t["matches"]) {
|
|
return t.matches(r);
|
|
} else {
|
|
throw Error(
|
|
"The value of " +
|
|
e.sourceFor() +
|
|
" does not have a match or matches method on it",
|
|
);
|
|
}
|
|
}
|
|
t.addGrammarElement("comparisonOperator", function (e, t, r) {
|
|
var n = e.parseElement("mathExpression", r);
|
|
var i = r.matchAnyOpToken("<", ">", "<=", ">=", "==", "===", "!=", "!==");
|
|
var a = i ? i.value : null;
|
|
var o = true;
|
|
var s = false;
|
|
if (a == null) {
|
|
if (r.matchToken("is") || r.matchToken("am")) {
|
|
if (r.matchToken("not")) {
|
|
if (r.matchToken("in")) {
|
|
a = "not in";
|
|
} else if (r.matchToken("a")) {
|
|
a = "not a";
|
|
s = true;
|
|
} else if (r.matchToken("empty")) {
|
|
a = "not empty";
|
|
o = false;
|
|
} else {
|
|
if (r.matchToken("really")) {
|
|
a = "!==";
|
|
} else {
|
|
a = "!=";
|
|
}
|
|
if (r.matchToken("equal")) {
|
|
r.matchToken("to");
|
|
}
|
|
}
|
|
} else if (r.matchToken("in")) {
|
|
a = "in";
|
|
} else if (r.matchToken("a")) {
|
|
a = "a";
|
|
s = true;
|
|
} else if (r.matchToken("empty")) {
|
|
a = "empty";
|
|
o = false;
|
|
} else if (r.matchToken("less")) {
|
|
r.requireToken("than");
|
|
if (r.matchToken("or")) {
|
|
r.requireToken("equal");
|
|
r.requireToken("to");
|
|
a = "<=";
|
|
} else {
|
|
a = "<";
|
|
}
|
|
} else if (r.matchToken("greater")) {
|
|
r.requireToken("than");
|
|
if (r.matchToken("or")) {
|
|
r.requireToken("equal");
|
|
r.requireToken("to");
|
|
a = ">=";
|
|
} else {
|
|
a = ">";
|
|
}
|
|
} else {
|
|
if (r.matchToken("really")) {
|
|
a = "===";
|
|
} else {
|
|
a = "==";
|
|
}
|
|
if (r.matchToken("equal")) {
|
|
r.matchToken("to");
|
|
}
|
|
}
|
|
} else if (r.matchToken("equals")) {
|
|
a = "==";
|
|
} else if (r.matchToken("really")) {
|
|
r.requireToken("equals");
|
|
a = "===";
|
|
} else if (r.matchToken("exist") || r.matchToken("exists")) {
|
|
a = "exist";
|
|
o = false;
|
|
} else if (r.matchToken("matches") || r.matchToken("match")) {
|
|
a = "match";
|
|
} else if (r.matchToken("contains") || r.matchToken("contain")) {
|
|
a = "contain";
|
|
} else if (r.matchToken("includes") || r.matchToken("include")) {
|
|
a = "include";
|
|
} else if (r.matchToken("do") || r.matchToken("does")) {
|
|
r.requireToken("not");
|
|
if (r.matchToken("matches") || r.matchToken("match")) {
|
|
a = "not match";
|
|
} else if (r.matchToken("contains") || r.matchToken("contain")) {
|
|
a = "not contain";
|
|
} else if (r.matchToken("exist") || r.matchToken("exist")) {
|
|
a = "not exist";
|
|
o = false;
|
|
} else if (r.matchToken("include")) {
|
|
a = "not include";
|
|
} else {
|
|
e.raiseParseError(r, "Expected matches or contains");
|
|
}
|
|
}
|
|
}
|
|
if (a) {
|
|
var u, l, c;
|
|
if (s) {
|
|
u = r.requireTokenType("IDENTIFIER");
|
|
l = !r.matchOpToken("!");
|
|
} else if (o) {
|
|
c = e.requireElement("mathExpression", r);
|
|
if (a === "match" || a === "not match") {
|
|
c = c.css ? c.css : c;
|
|
}
|
|
}
|
|
var m = n;
|
|
n = {
|
|
type: "comparisonOperator",
|
|
operator: a,
|
|
typeName: u,
|
|
nullOk: l,
|
|
lhs: n,
|
|
rhs: c,
|
|
args: [n, c],
|
|
op: function (e, r, n) {
|
|
if (a === "==") {
|
|
return r == n;
|
|
} else if (a === "!=") {
|
|
return r != n;
|
|
}
|
|
if (a === "===") {
|
|
return r === n;
|
|
} else if (a === "!==") {
|
|
return r !== n;
|
|
}
|
|
if (a === "match") {
|
|
return r != null && p(m, r, n);
|
|
}
|
|
if (a === "not match") {
|
|
return r == null || !p(m, r, n);
|
|
}
|
|
if (a === "in") {
|
|
return n != null && f(c, n, r);
|
|
}
|
|
if (a === "not in") {
|
|
return n == null || !f(c, n, r);
|
|
}
|
|
if (a === "contain") {
|
|
return r != null && f(m, r, n);
|
|
}
|
|
if (a === "not contain") {
|
|
return r == null || !f(m, r, n);
|
|
}
|
|
if (a === "include") {
|
|
return r != null && f(m, r, n);
|
|
}
|
|
if (a === "not include") {
|
|
return r == null || !f(m, r, n);
|
|
}
|
|
if (a === "===") {
|
|
return r === n;
|
|
} else if (a === "!==") {
|
|
return r !== n;
|
|
} else if (a === "<") {
|
|
return r < n;
|
|
} else if (a === ">") {
|
|
return r > n;
|
|
} else if (a === "<=") {
|
|
return r <= n;
|
|
} else if (a === ">=") {
|
|
return r >= n;
|
|
} else if (a === "empty") {
|
|
return t.isEmpty(r);
|
|
} else if (a === "not empty") {
|
|
return !t.isEmpty(r);
|
|
} else if (a === "exist") {
|
|
return t.doesExist(r);
|
|
} else if (a === "not exist") {
|
|
return !t.doesExist(r);
|
|
} else if (a === "a") {
|
|
return t.typeCheck(r, u.value, l);
|
|
} else if (a === "not a") {
|
|
return !t.typeCheck(r, u.value, l);
|
|
} else {
|
|
throw "Unknown comparison : " + a;
|
|
}
|
|
},
|
|
evaluate: function (e) {
|
|
return t.unifiedEval(this, e);
|
|
},
|
|
};
|
|
}
|
|
return n;
|
|
});
|
|
t.addGrammarElement("comparisonExpression", function (e, t, r) {
|
|
return e.parseAnyOf(["comparisonOperator", "mathExpression"], r);
|
|
});
|
|
t.addGrammarElement("logicalOperator", function (e, t, r) {
|
|
var n = e.parseElement("comparisonExpression", r);
|
|
var i,
|
|
a = null;
|
|
i = r.matchToken("and") || r.matchToken("or");
|
|
while (i) {
|
|
a = a || i;
|
|
if (a.value !== i.value) {
|
|
e.raiseParseError(
|
|
r,
|
|
"You must parenthesize logical operations with different operators",
|
|
);
|
|
}
|
|
var o = e.requireElement("comparisonExpression", r);
|
|
const s = i.value;
|
|
n = {
|
|
type: "logicalOperator",
|
|
operator: s,
|
|
lhs: n,
|
|
rhs: o,
|
|
args: [n, o],
|
|
op: function (e, t, r) {
|
|
if (s === "and") {
|
|
return t && r;
|
|
} else {
|
|
return t || r;
|
|
}
|
|
},
|
|
evaluate: function (e) {
|
|
return t.unifiedEval(this, e);
|
|
},
|
|
};
|
|
i = r.matchToken("and") || r.matchToken("or");
|
|
}
|
|
return n;
|
|
});
|
|
t.addGrammarElement("logicalExpression", function (e, t, r) {
|
|
return e.parseAnyOf(["logicalOperator", "mathExpression"], r);
|
|
});
|
|
t.addGrammarElement("asyncExpression", function (e, t, r) {
|
|
if (r.matchToken("async")) {
|
|
var n = e.requireElement("logicalExpression", r);
|
|
var i = {
|
|
type: "asyncExpression",
|
|
value: n,
|
|
evaluate: function (e) {
|
|
return { asyncWrapper: true, value: this.value.evaluate(e) };
|
|
},
|
|
};
|
|
return i;
|
|
} else {
|
|
return e.parseElement("logicalExpression", r);
|
|
}
|
|
});
|
|
t.addGrammarElement("expression", function (e, t, r) {
|
|
r.matchToken("the");
|
|
return e.parseElement("asyncExpression", r);
|
|
});
|
|
t.addGrammarElement("assignableExpression", function (e, t, r) {
|
|
r.matchToken("the");
|
|
var n = e.parseElement("primaryExpression", r);
|
|
if (
|
|
n &&
|
|
(n.type === "symbol" ||
|
|
n.type === "ofExpression" ||
|
|
n.type === "propertyAccess" ||
|
|
n.type === "attributeRefAccess" ||
|
|
n.type === "attributeRef" ||
|
|
n.type === "styleRef" ||
|
|
n.type === "arrayIndex" ||
|
|
n.type === "possessive")
|
|
) {
|
|
return n;
|
|
} else {
|
|
e.raiseParseError(
|
|
r,
|
|
"A target expression must be writable. The expression type '" +
|
|
(n && n.type) +
|
|
"' is not.",
|
|
);
|
|
}
|
|
return n;
|
|
});
|
|
t.addGrammarElement("hyperscript", function (e, t, r) {
|
|
var n = [];
|
|
if (r.hasMore()) {
|
|
while (
|
|
e.featureStart(r.currentToken()) ||
|
|
r.currentToken().value === "("
|
|
) {
|
|
var i = e.requireElement("feature", r);
|
|
n.push(i);
|
|
r.matchToken("end");
|
|
}
|
|
}
|
|
return {
|
|
type: "hyperscript",
|
|
features: n,
|
|
apply: function (e, t, r) {
|
|
for (const i of n) {
|
|
i.install(e, t, r);
|
|
}
|
|
},
|
|
};
|
|
});
|
|
var v = function (e) {
|
|
var t = [];
|
|
if (
|
|
e.token(0).value === "(" &&
|
|
(e.token(1).value === ")" ||
|
|
e.token(2).value === "," ||
|
|
e.token(2).value === ")")
|
|
) {
|
|
e.matchOpToken("(");
|
|
do {
|
|
t.push(e.requireTokenType("IDENTIFIER"));
|
|
} while (e.matchOpToken(","));
|
|
e.requireOpToken(")");
|
|
}
|
|
return t;
|
|
};
|
|
t.addFeature("on", function (e, t, r) {
|
|
if (!r.matchToken("on")) return;
|
|
var n = false;
|
|
if (r.matchToken("every")) {
|
|
n = true;
|
|
}
|
|
var i = [];
|
|
var a = null;
|
|
do {
|
|
var o = e.requireElement("eventName", r, "Expected event name");
|
|
var s = o.evaluate();
|
|
if (a) {
|
|
a = a + " or " + s;
|
|
} else {
|
|
a = "on " + s;
|
|
}
|
|
var u = v(r);
|
|
var l = null;
|
|
if (r.matchOpToken("[")) {
|
|
l = e.requireElement("expression", r);
|
|
r.requireOpToken("]");
|
|
}
|
|
var c, f, m;
|
|
if (r.currentToken().type === "NUMBER") {
|
|
var p = r.consumeToken();
|
|
if (!p.value) return;
|
|
c = parseInt(p.value);
|
|
if (r.matchToken("to")) {
|
|
var h = r.consumeToken();
|
|
if (!h.value) return;
|
|
f = parseInt(h.value);
|
|
} else if (r.matchToken("and")) {
|
|
m = true;
|
|
r.requireToken("on");
|
|
}
|
|
}
|
|
var d, E;
|
|
if (s === "intersection") {
|
|
d = {};
|
|
if (r.matchToken("with")) {
|
|
d["with"] = e.requireElement("expression", r).evaluate();
|
|
}
|
|
if (r.matchToken("having")) {
|
|
do {
|
|
if (r.matchToken("margin")) {
|
|
d["rootMargin"] = e.requireElement("stringLike", r).evaluate();
|
|
} else if (r.matchToken("threshold")) {
|
|
d["threshold"] = e.requireElement("expression", r).evaluate();
|
|
} else {
|
|
e.raiseParseError(
|
|
r,
|
|
"Unknown intersection config specification",
|
|
);
|
|
}
|
|
} while (r.matchToken("and"));
|
|
}
|
|
} else if (s === "mutation") {
|
|
E = {};
|
|
if (r.matchToken("of")) {
|
|
do {
|
|
if (r.matchToken("anything")) {
|
|
E["attributes"] = true;
|
|
E["subtree"] = true;
|
|
E["characterData"] = true;
|
|
E["childList"] = true;
|
|
} else if (r.matchToken("childList")) {
|
|
E["childList"] = true;
|
|
} else if (r.matchToken("attributes")) {
|
|
E["attributes"] = true;
|
|
E["attributeOldValue"] = true;
|
|
} else if (r.matchToken("subtree")) {
|
|
E["subtree"] = true;
|
|
} else if (r.matchToken("characterData")) {
|
|
E["characterData"] = true;
|
|
E["characterDataOldValue"] = true;
|
|
} else if (r.currentToken().type === "ATTRIBUTE_REF") {
|
|
var T = r.consumeToken();
|
|
if (E["attributeFilter"] == null) {
|
|
E["attributeFilter"] = [];
|
|
}
|
|
if (T.value.indexOf("@") == 0) {
|
|
E["attributeFilter"].push(T.value.substring(1));
|
|
} else {
|
|
e.raiseParseError(
|
|
r,
|
|
"Only shorthand attribute references are allowed here",
|
|
);
|
|
}
|
|
} else {
|
|
e.raiseParseError(r, "Unknown mutation config specification");
|
|
}
|
|
} while (r.matchToken("or"));
|
|
} else {
|
|
E["attributes"] = true;
|
|
E["characterData"] = true;
|
|
E["childList"] = true;
|
|
}
|
|
}
|
|
var y = null;
|
|
var k = false;
|
|
if (r.matchToken("from")) {
|
|
if (r.matchToken("elsewhere")) {
|
|
k = true;
|
|
} else {
|
|
r.pushFollow("or");
|
|
try {
|
|
y = e.requireElement("expression", r);
|
|
} finally {
|
|
r.popFollow();
|
|
}
|
|
if (!y) {
|
|
e.raiseParseError(
|
|
r,
|
|
'Expected either target value or "elsewhere".',
|
|
);
|
|
}
|
|
}
|
|
}
|
|
if (y === null && k === false && r.matchToken("elsewhere")) {
|
|
k = true;
|
|
}
|
|
if (r.matchToken("in")) {
|
|
var x = e.parseElement("unaryExpression", r);
|
|
}
|
|
if (r.matchToken("debounced")) {
|
|
r.requireToken("at");
|
|
var g = e.requireElement("unaryExpression", r);
|
|
var b = g.evaluate({});
|
|
} else if (r.matchToken("throttled")) {
|
|
r.requireToken("at");
|
|
var g = e.requireElement("unaryExpression", r);
|
|
var w = g.evaluate({});
|
|
}
|
|
i.push({
|
|
execCount: 0,
|
|
every: n,
|
|
on: s,
|
|
args: u,
|
|
filter: l,
|
|
from: y,
|
|
inExpr: x,
|
|
elsewhere: k,
|
|
startCount: c,
|
|
endCount: f,
|
|
unbounded: m,
|
|
debounceTime: b,
|
|
throttleTime: w,
|
|
mutationSpec: E,
|
|
intersectionSpec: d,
|
|
debounced: undefined,
|
|
lastExec: undefined,
|
|
});
|
|
} while (r.matchToken("or"));
|
|
var S = true;
|
|
if (!n) {
|
|
if (r.matchToken("queue")) {
|
|
if (r.matchToken("all")) {
|
|
var q = true;
|
|
var S = false;
|
|
} else if (r.matchToken("first")) {
|
|
var N = true;
|
|
} else if (r.matchToken("none")) {
|
|
var I = true;
|
|
} else {
|
|
r.requireToken("last");
|
|
}
|
|
}
|
|
}
|
|
var C = e.requireElement("commandList", r);
|
|
e.ensureTerminated(C);
|
|
var R, A;
|
|
if (r.matchToken("catch")) {
|
|
R = r.requireTokenType("IDENTIFIER").value;
|
|
A = e.requireElement("commandList", r);
|
|
e.ensureTerminated(A);
|
|
}
|
|
if (r.matchToken("finally")) {
|
|
var L = e.requireElement("commandList", r);
|
|
e.ensureTerminated(L);
|
|
}
|
|
var O = {
|
|
displayName: a,
|
|
events: i,
|
|
start: C,
|
|
every: n,
|
|
execCount: 0,
|
|
errorHandler: A,
|
|
errorSymbol: R,
|
|
execute: function (e) {
|
|
let r = t.getEventQueueFor(e.me, O);
|
|
if (r.executing && n === false) {
|
|
if (I || (N && r.queue.length > 0)) {
|
|
return;
|
|
}
|
|
if (S) {
|
|
r.queue.length = 0;
|
|
}
|
|
r.queue.push(e);
|
|
return;
|
|
}
|
|
O.execCount++;
|
|
r.executing = true;
|
|
e.meta.onHalt = function () {
|
|
r.executing = false;
|
|
var e = r.queue.shift();
|
|
if (e) {
|
|
setTimeout(function () {
|
|
O.execute(e);
|
|
}, 1);
|
|
}
|
|
};
|
|
e.meta.reject = function (r) {
|
|
console.error(r.message ? r.message : r);
|
|
var n = t.getHyperTrace(e, r);
|
|
if (n) {
|
|
n.print();
|
|
}
|
|
t.triggerEvent(e.me, "exception", { error: r });
|
|
};
|
|
C.execute(e);
|
|
},
|
|
install: function (e, r) {
|
|
for (const r of O.events) {
|
|
var n;
|
|
if (r.elsewhere) {
|
|
n = [document];
|
|
} else if (r.from) {
|
|
n = r.from.evaluate(t.makeContext(e, O, e, null));
|
|
} else {
|
|
n = [e];
|
|
}
|
|
t.implicitLoop(n, function (n) {
|
|
var i = r.on;
|
|
if (n == null) {
|
|
console.warn(
|
|
"'%s' feature ignored because target does not exists:",
|
|
a,
|
|
e,
|
|
);
|
|
return;
|
|
}
|
|
if (r.mutationSpec) {
|
|
i = "hyperscript:mutation";
|
|
const e = new MutationObserver(function (e, r) {
|
|
if (!O.executing) {
|
|
t.triggerEvent(n, i, { mutationList: e, observer: r });
|
|
}
|
|
});
|
|
e.observe(n, r.mutationSpec);
|
|
}
|
|
if (r.intersectionSpec) {
|
|
i = "hyperscript:intersection";
|
|
const e = new IntersectionObserver(function (r) {
|
|
for (const o of r) {
|
|
var a = { observer: e };
|
|
a = Object.assign(a, o);
|
|
a["intersecting"] = o.isIntersecting;
|
|
t.triggerEvent(n, i, a);
|
|
}
|
|
}, r.intersectionSpec);
|
|
e.observe(n);
|
|
}
|
|
var o = n.addEventListener || n.on;
|
|
o.call(n, i, function a(o) {
|
|
if (
|
|
typeof Node !== "undefined" &&
|
|
e instanceof Node &&
|
|
n !== e &&
|
|
!e.isConnected
|
|
) {
|
|
n.removeEventListener(i, a);
|
|
return;
|
|
}
|
|
var s = t.makeContext(e, O, e, o);
|
|
if (r.elsewhere && e.contains(o.target)) {
|
|
return;
|
|
}
|
|
if (r.from) {
|
|
s.result = n;
|
|
}
|
|
for (const e of r.args) {
|
|
let t = s.event[e.value];
|
|
if (t !== undefined) {
|
|
s.locals[e.value] = t;
|
|
} else if ("detail" in s.event) {
|
|
s.locals[e.value] = s.event["detail"][e.value];
|
|
}
|
|
}
|
|
s.meta.errorHandler = A;
|
|
s.meta.errorSymbol = R;
|
|
s.meta.finallyHandler = L;
|
|
if (r.filter) {
|
|
var u = s.meta.context;
|
|
s.meta.context = s.event;
|
|
try {
|
|
var l = r.filter.evaluate(s);
|
|
if (l) {
|
|
} else {
|
|
return;
|
|
}
|
|
} finally {
|
|
s.meta.context = u;
|
|
}
|
|
}
|
|
if (r.inExpr) {
|
|
var c = o.target;
|
|
while (true) {
|
|
if (c.matches && c.matches(r.inExpr.css)) {
|
|
s.result = c;
|
|
break;
|
|
} else {
|
|
c = c.parentElement;
|
|
if (c == null) {
|
|
return;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
r.execCount++;
|
|
if (r.startCount) {
|
|
if (r.endCount) {
|
|
if (
|
|
r.execCount < r.startCount ||
|
|
r.execCount > r.endCount
|
|
) {
|
|
return;
|
|
}
|
|
} else if (r.unbounded) {
|
|
if (r.execCount < r.startCount) {
|
|
return;
|
|
}
|
|
} else if (r.execCount !== r.startCount) {
|
|
return;
|
|
}
|
|
}
|
|
if (r.debounceTime) {
|
|
if (r.debounced) {
|
|
clearTimeout(r.debounced);
|
|
}
|
|
r.debounced = setTimeout(function () {
|
|
O.execute(s);
|
|
}, r.debounceTime);
|
|
return;
|
|
}
|
|
if (r.throttleTime) {
|
|
if (r.lastExec && Date.now() < r.lastExec + r.throttleTime) {
|
|
return;
|
|
} else {
|
|
r.lastExec = Date.now();
|
|
}
|
|
}
|
|
O.execute(s);
|
|
});
|
|
});
|
|
}
|
|
},
|
|
};
|
|
e.setParent(C, O);
|
|
return O;
|
|
});
|
|
t.addFeature("def", function (e, t, r) {
|
|
if (!r.matchToken("def")) return;
|
|
var n = e.requireElement("dotOrColonPath", r);
|
|
var i = n.evaluate();
|
|
var a = i.split(".");
|
|
var o = a.pop();
|
|
var s = [];
|
|
if (r.matchOpToken("(")) {
|
|
if (r.matchOpToken(")")) {
|
|
} else {
|
|
do {
|
|
s.push(r.requireTokenType("IDENTIFIER"));
|
|
} while (r.matchOpToken(","));
|
|
r.requireOpToken(")");
|
|
}
|
|
}
|
|
var u = e.requireElement("commandList", r);
|
|
var l, c;
|
|
if (r.matchToken("catch")) {
|
|
l = r.requireTokenType("IDENTIFIER").value;
|
|
c = e.parseElement("commandList", r);
|
|
}
|
|
if (r.matchToken("finally")) {
|
|
var f = e.requireElement("commandList", r);
|
|
e.ensureTerminated(f);
|
|
}
|
|
var m = {
|
|
displayName:
|
|
o +
|
|
"(" +
|
|
s
|
|
.map(function (e) {
|
|
return e.value;
|
|
})
|
|
.join(", ") +
|
|
")",
|
|
name: o,
|
|
args: s,
|
|
start: u,
|
|
errorHandler: c,
|
|
errorSymbol: l,
|
|
finallyHandler: f,
|
|
install: function (e, r) {
|
|
var n = function () {
|
|
var n = t.makeContext(r, m, e, null);
|
|
n.meta.errorHandler = c;
|
|
n.meta.errorSymbol = l;
|
|
n.meta.finallyHandler = f;
|
|
for (var i = 0; i < s.length; i++) {
|
|
var a = s[i];
|
|
var o = arguments[i];
|
|
if (a) {
|
|
n.locals[a.value] = o;
|
|
}
|
|
}
|
|
n.meta.caller = arguments[s.length];
|
|
if (n.meta.caller) {
|
|
n.meta.callingCommand = n.meta.caller.meta.command;
|
|
}
|
|
var p,
|
|
h = null;
|
|
var v = new Promise(function (e, t) {
|
|
p = e;
|
|
h = t;
|
|
});
|
|
u.execute(n);
|
|
if (n.meta.returned) {
|
|
return n.meta.returnValue;
|
|
} else {
|
|
n.meta.resolve = p;
|
|
n.meta.reject = h;
|
|
return v;
|
|
}
|
|
};
|
|
n.hyperfunc = true;
|
|
n.hypername = i;
|
|
t.assignToNamespace(e, a, o, n);
|
|
},
|
|
};
|
|
e.ensureTerminated(u);
|
|
if (c) {
|
|
e.ensureTerminated(c);
|
|
}
|
|
e.setParent(u, m);
|
|
return m;
|
|
});
|
|
t.addFeature("set", function (e, t, r) {
|
|
let n = e.parseElement("setCommand", r);
|
|
if (n) {
|
|
if (n.target.scope !== "element") {
|
|
e.raiseParseError(
|
|
r,
|
|
"variables declared at the feature level must be element scoped.",
|
|
);
|
|
}
|
|
let i = {
|
|
start: n,
|
|
install: function (e, r) {
|
|
n && n.execute(t.makeContext(e, i, e, null));
|
|
},
|
|
};
|
|
e.ensureTerminated(n);
|
|
return i;
|
|
}
|
|
});
|
|
t.addFeature("init", function (e, t, r) {
|
|
if (!r.matchToken("init")) return;
|
|
var n = r.matchToken("immediately");
|
|
var i = e.requireElement("commandList", r);
|
|
var a = {
|
|
start: i,
|
|
install: function (e, r) {
|
|
let o = function () {
|
|
i && i.execute(t.makeContext(e, a, e, null));
|
|
};
|
|
if (n) {
|
|
o();
|
|
} else {
|
|
setTimeout(o, 0);
|
|
}
|
|
},
|
|
};
|
|
e.ensureTerminated(i);
|
|
e.setParent(i, a);
|
|
return a;
|
|
});
|
|
t.addFeature("worker", function (e, t, r) {
|
|
if (r.matchToken("worker")) {
|
|
e.raiseParseError(
|
|
r,
|
|
"In order to use the 'worker' feature, include " +
|
|
"the _hyperscript worker plugin. See " +
|
|
"https://hyperscript.org/features/worker/ for " +
|
|
"more info.",
|
|
);
|
|
return undefined;
|
|
}
|
|
});
|
|
t.addFeature("behavior", function (t, r, n) {
|
|
if (!n.matchToken("behavior")) return;
|
|
var i = t.requireElement("dotOrColonPath", n).evaluate();
|
|
var a = i.split(".");
|
|
var o = a.pop();
|
|
var s = [];
|
|
if (n.matchOpToken("(") && !n.matchOpToken(")")) {
|
|
do {
|
|
s.push(n.requireTokenType("IDENTIFIER").value);
|
|
} while (n.matchOpToken(","));
|
|
n.requireOpToken(")");
|
|
}
|
|
var u = t.requireElement("hyperscript", n);
|
|
for (var l = 0; l < u.features.length; l++) {
|
|
var c = u.features[l];
|
|
c.behavior = i;
|
|
}
|
|
return {
|
|
install: function (t, n) {
|
|
r.assignToNamespace(
|
|
e.document && e.document.body,
|
|
a,
|
|
o,
|
|
function (e, t, n) {
|
|
var a = r.getInternalData(e);
|
|
var o = h(a, i + "Scope");
|
|
for (var l = 0; l < s.length; l++) {
|
|
o[s[l]] = n[s[l]];
|
|
}
|
|
u.apply(e, t);
|
|
},
|
|
);
|
|
},
|
|
};
|
|
});
|
|
t.addFeature("install", function (t, r, n) {
|
|
if (!n.matchToken("install")) return;
|
|
var i = t.requireElement("dotOrColonPath", n).evaluate();
|
|
var a = i.split(".");
|
|
var o = t.parseElement("namedArgumentList", n);
|
|
var s;
|
|
return (s = {
|
|
install: function (t, n) {
|
|
r.unifiedEval(
|
|
{
|
|
args: [o],
|
|
op: function (r, o) {
|
|
var s = e;
|
|
for (var u = 0; u < a.length; u++) {
|
|
s = s[a[u]];
|
|
if (typeof s !== "object" && typeof s !== "function")
|
|
throw new Error("No such behavior defined as " + i);
|
|
}
|
|
if (!(s instanceof Function))
|
|
throw new Error(i + " is not a behavior");
|
|
s(t, n, o);
|
|
},
|
|
},
|
|
r.makeContext(t, s, t, null),
|
|
);
|
|
},
|
|
});
|
|
});
|
|
t.addGrammarElement("jsBody", function (e, t, r) {
|
|
var n = r.currentToken().start;
|
|
var i = r.currentToken();
|
|
var a = [];
|
|
var o = "";
|
|
var s = false;
|
|
while (r.hasMore()) {
|
|
i = r.consumeToken();
|
|
var u = r.token(0, true);
|
|
if (u.type === "IDENTIFIER" && u.value === "end") {
|
|
break;
|
|
}
|
|
if (s) {
|
|
if (i.type === "IDENTIFIER" || i.type === "NUMBER") {
|
|
o += i.value;
|
|
} else {
|
|
if (o !== "") a.push(o);
|
|
o = "";
|
|
s = false;
|
|
}
|
|
} else if (i.type === "IDENTIFIER" && i.value === "function") {
|
|
s = true;
|
|
}
|
|
}
|
|
var l = i.end + 1;
|
|
return {
|
|
type: "jsBody",
|
|
exposedFunctionNames: a,
|
|
jsSource: r.source.substring(n, l),
|
|
};
|
|
});
|
|
t.addFeature("js", function (t, r, n) {
|
|
if (!n.matchToken("js")) return;
|
|
var i = t.requireElement("jsBody", n);
|
|
var a =
|
|
i.jsSource +
|
|
"\nreturn { " +
|
|
i.exposedFunctionNames
|
|
.map(function (e) {
|
|
return e + ":" + e;
|
|
})
|
|
.join(",") +
|
|
" } ";
|
|
var o = new Function(a);
|
|
return {
|
|
jsSource: a,
|
|
function: o,
|
|
exposedFunctionNames: i.exposedFunctionNames,
|
|
install: function () {
|
|
Object.assign(e, o());
|
|
},
|
|
};
|
|
});
|
|
t.addCommand("js", function (t, r, n) {
|
|
if (!n.matchToken("js")) return;
|
|
var i = [];
|
|
if (n.matchOpToken("(")) {
|
|
if (n.matchOpToken(")")) {
|
|
} else {
|
|
do {
|
|
var a = n.requireTokenType("IDENTIFIER");
|
|
i.push(a.value);
|
|
} while (n.matchOpToken(","));
|
|
n.requireOpToken(")");
|
|
}
|
|
}
|
|
var o = t.requireElement("jsBody", n);
|
|
n.matchToken("end");
|
|
var s = E(Function, i.concat([o.jsSource]));
|
|
var u = {
|
|
jsSource: o.jsSource,
|
|
function: s,
|
|
inputs: i,
|
|
op: function (t) {
|
|
var n = [];
|
|
i.forEach(function (e) {
|
|
n.push(r.resolveSymbol(e, t, "default"));
|
|
});
|
|
var a = s.apply(e, n);
|
|
if (a && typeof a.then === "function") {
|
|
return new Promise(function (e) {
|
|
a.then(function (n) {
|
|
t.result = n;
|
|
e(r.findNext(this, t));
|
|
});
|
|
});
|
|
} else {
|
|
t.result = a;
|
|
return r.findNext(this, t);
|
|
}
|
|
},
|
|
};
|
|
return u;
|
|
});
|
|
t.addCommand("async", function (e, t, r) {
|
|
if (!r.matchToken("async")) return;
|
|
if (r.matchToken("do")) {
|
|
var n = e.requireElement("commandList", r);
|
|
var i = n;
|
|
while (i.next) i = i.next;
|
|
i.next = t.HALT;
|
|
r.requireToken("end");
|
|
} else {
|
|
var n = e.requireElement("command", r);
|
|
}
|
|
var a = {
|
|
body: n,
|
|
op: function (e) {
|
|
setTimeout(function () {
|
|
n.execute(e);
|
|
});
|
|
return t.findNext(this, e);
|
|
},
|
|
};
|
|
e.setParent(n, a);
|
|
return a;
|
|
});
|
|
t.addCommand("tell", function (e, t, r) {
|
|
var n = r.currentToken();
|
|
if (!r.matchToken("tell")) return;
|
|
var i = e.requireElement("expression", r);
|
|
var a = e.requireElement("commandList", r);
|
|
if (r.hasMore() && !e.featureStart(r.currentToken())) {
|
|
r.requireToken("end");
|
|
}
|
|
var o = "tell_" + n.start;
|
|
var s = {
|
|
value: i,
|
|
body: a,
|
|
args: [i],
|
|
resolveNext: function (e) {
|
|
var r = e.meta.iterators[o];
|
|
if (r.index < r.value.length) {
|
|
e.you = r.value[r.index++];
|
|
return a;
|
|
} else {
|
|
e.you = r.originalYou;
|
|
if (this.next) {
|
|
return this.next;
|
|
} else {
|
|
return t.findNext(this.parent, e);
|
|
}
|
|
}
|
|
},
|
|
op: function (e, t) {
|
|
if (t == null) {
|
|
t = [];
|
|
} else if (!(Array.isArray(t) || t instanceof NodeList)) {
|
|
t = [t];
|
|
}
|
|
e.meta.iterators[o] = { originalYou: e.you, index: 0, value: t };
|
|
return this.resolveNext(e);
|
|
},
|
|
};
|
|
e.setParent(a, s);
|
|
return s;
|
|
});
|
|
t.addCommand("wait", function (e, t, r) {
|
|
if (!r.matchToken("wait")) return;
|
|
var n;
|
|
if (r.matchToken("for")) {
|
|
r.matchToken("a");
|
|
var i = [];
|
|
do {
|
|
var a = r.token(0);
|
|
if (a.type === "NUMBER" || a.type === "L_PAREN") {
|
|
i.push({ time: e.requireElement("expression", r).evaluate() });
|
|
} else {
|
|
i.push({
|
|
name: e
|
|
.requireElement("dotOrColonPath", r, "Expected event name")
|
|
.evaluate(),
|
|
args: v(r),
|
|
});
|
|
}
|
|
} while (r.matchToken("or"));
|
|
if (r.matchToken("from")) {
|
|
var o = e.requireElement("expression", r);
|
|
}
|
|
n = {
|
|
event: i,
|
|
on: o,
|
|
args: [o],
|
|
op: function (e, r) {
|
|
var n = r ? r : e.me;
|
|
if (!(n instanceof EventTarget))
|
|
throw new Error(
|
|
"Not a valid event target: " + this.on.sourceFor(),
|
|
);
|
|
return new Promise((r) => {
|
|
var a = false;
|
|
for (const s of i) {
|
|
var o = (n) => {
|
|
e.result = n;
|
|
if (s.args) {
|
|
for (const t of s.args) {
|
|
e.locals[t.value] =
|
|
n[t.value] || (n.detail ? n.detail[t.value] : null);
|
|
}
|
|
}
|
|
if (!a) {
|
|
a = true;
|
|
r(t.findNext(this, e));
|
|
}
|
|
};
|
|
if (s.name) {
|
|
n.addEventListener(s.name, o, { once: true });
|
|
} else if (s.time != null) {
|
|
setTimeout(o, s.time, s.time);
|
|
}
|
|
}
|
|
});
|
|
},
|
|
};
|
|
return n;
|
|
} else {
|
|
var s;
|
|
if (r.matchToken("a")) {
|
|
r.requireToken("tick");
|
|
s = 0;
|
|
} else {
|
|
s = e.requireElement("expression", r);
|
|
}
|
|
n = {
|
|
type: "waitCmd",
|
|
time: s,
|
|
args: [s],
|
|
op: function (e, r) {
|
|
return new Promise((n) => {
|
|
setTimeout(() => {
|
|
n(t.findNext(this, e));
|
|
}, r);
|
|
});
|
|
},
|
|
execute: function (e) {
|
|
return t.unifiedExec(this, e);
|
|
},
|
|
};
|
|
return n;
|
|
}
|
|
});
|
|
t.addGrammarElement("dotOrColonPath", function (e, t, r) {
|
|
var n = r.matchTokenType("IDENTIFIER");
|
|
if (n) {
|
|
var i = [n.value];
|
|
var a = r.matchOpToken(".") || r.matchOpToken(":");
|
|
if (a) {
|
|
do {
|
|
i.push(r.requireTokenType("IDENTIFIER", "NUMBER").value);
|
|
} while (r.matchOpToken(a.value));
|
|
}
|
|
return {
|
|
type: "dotOrColonPath",
|
|
path: i,
|
|
evaluate: function () {
|
|
return i.join(a ? a.value : "");
|
|
},
|
|
};
|
|
}
|
|
});
|
|
t.addGrammarElement("eventName", function (e, t, r) {
|
|
var n;
|
|
if ((n = r.matchTokenType("STRING"))) {
|
|
return {
|
|
evaluate: function () {
|
|
return n.value;
|
|
},
|
|
};
|
|
}
|
|
return e.parseElement("dotOrColonPath", r);
|
|
});
|
|
function d(e, t, r, n) {
|
|
var i = t.requireElement("eventName", n);
|
|
var a = t.parseElement("namedArgumentList", n);
|
|
if (
|
|
(e === "send" && n.matchToken("to")) ||
|
|
(e === "trigger" && n.matchToken("on"))
|
|
) {
|
|
var o = t.requireElement("expression", n);
|
|
} else {
|
|
var o = t.requireElement("implicitMeTarget", n);
|
|
}
|
|
var s = {
|
|
eventName: i,
|
|
details: a,
|
|
to: o,
|
|
args: [o, i, a],
|
|
op: function (e, t, n, i) {
|
|
r.nullCheck(t, o);
|
|
r.implicitLoop(t, function (t) {
|
|
r.triggerEvent(t, n, i, e.me);
|
|
});
|
|
return r.findNext(s, e);
|
|
},
|
|
};
|
|
return s;
|
|
}
|
|
t.addCommand("trigger", function (e, t, r) {
|
|
if (r.matchToken("trigger")) {
|
|
return d("trigger", e, t, r);
|
|
}
|
|
});
|
|
t.addCommand("send", function (e, t, r) {
|
|
if (r.matchToken("send")) {
|
|
return d("send", e, t, r);
|
|
}
|
|
});
|
|
var T = function (e, t, r, n) {
|
|
if (n) {
|
|
if (e.commandBoundary(r.currentToken())) {
|
|
e.raiseParseError(
|
|
r,
|
|
"'return' commands must return a value. If you do not wish to return a value, use 'exit' instead.",
|
|
);
|
|
} else {
|
|
var i = e.requireElement("expression", r);
|
|
}
|
|
}
|
|
var a = {
|
|
value: i,
|
|
args: [i],
|
|
op: function (e, r) {
|
|
var n = e.meta.resolve;
|
|
e.meta.returned = true;
|
|
e.meta.returnValue = r;
|
|
if (n) {
|
|
if (r) {
|
|
n(r);
|
|
} else {
|
|
n();
|
|
}
|
|
}
|
|
return t.HALT;
|
|
},
|
|
};
|
|
return a;
|
|
};
|
|
t.addCommand("return", function (e, t, r) {
|
|
if (r.matchToken("return")) {
|
|
return T(e, t, r, true);
|
|
}
|
|
});
|
|
t.addCommand("exit", function (e, t, r) {
|
|
if (r.matchToken("exit")) {
|
|
return T(e, t, r, false);
|
|
}
|
|
});
|
|
t.addCommand("halt", function (e, t, r) {
|
|
if (r.matchToken("halt")) {
|
|
if (r.matchToken("the")) {
|
|
r.requireToken("event");
|
|
if (r.matchOpToken("'")) {
|
|
r.requireToken("s");
|
|
}
|
|
var n = true;
|
|
}
|
|
if (r.matchToken("bubbling")) {
|
|
var i = true;
|
|
} else if (r.matchToken("default")) {
|
|
var a = true;
|
|
}
|
|
var o = T(e, t, r, false);
|
|
var s = {
|
|
keepExecuting: true,
|
|
bubbling: i,
|
|
haltDefault: a,
|
|
exit: o,
|
|
op: function (e) {
|
|
if (e.event) {
|
|
if (i) {
|
|
e.event.stopPropagation();
|
|
} else if (a) {
|
|
e.event.preventDefault();
|
|
} else {
|
|
e.event.stopPropagation();
|
|
e.event.preventDefault();
|
|
}
|
|
if (n) {
|
|
return t.findNext(this, e);
|
|
} else {
|
|
return o;
|
|
}
|
|
}
|
|
},
|
|
};
|
|
return s;
|
|
}
|
|
});
|
|
t.addCommand("log", function (e, t, r) {
|
|
if (!r.matchToken("log")) return;
|
|
var n = [e.parseElement("expression", r)];
|
|
while (r.matchOpToken(",")) {
|
|
n.push(e.requireElement("expression", r));
|
|
}
|
|
if (r.matchToken("with")) {
|
|
var i = e.requireElement("expression", r);
|
|
}
|
|
var a = {
|
|
exprs: n,
|
|
withExpr: i,
|
|
args: [i, n],
|
|
op: function (e, r, n) {
|
|
if (r) {
|
|
r.apply(null, n);
|
|
} else {
|
|
console.log.apply(null, n);
|
|
}
|
|
return t.findNext(this, e);
|
|
},
|
|
};
|
|
return a;
|
|
});
|
|
t.addCommand("beep!", function (e, t, r) {
|
|
if (!r.matchToken("beep!")) return;
|
|
var n = [e.parseElement("expression", r)];
|
|
while (r.matchOpToken(",")) {
|
|
n.push(e.requireElement("expression", r));
|
|
}
|
|
var i = {
|
|
exprs: n,
|
|
args: [n],
|
|
op: function (e, r) {
|
|
for (let i = 0; i < n.length; i++) {
|
|
const a = n[i];
|
|
const o = r[i];
|
|
t.beepValueToConsole(e.me, a, o);
|
|
}
|
|
return t.findNext(this, e);
|
|
},
|
|
};
|
|
return i;
|
|
});
|
|
t.addCommand("throw", function (e, t, r) {
|
|
if (!r.matchToken("throw")) return;
|
|
var n = e.requireElement("expression", r);
|
|
var i = {
|
|
expr: n,
|
|
args: [n],
|
|
op: function (e, r) {
|
|
t.registerHyperTrace(e, r);
|
|
throw r;
|
|
},
|
|
};
|
|
return i;
|
|
});
|
|
var y = function (e, t, r) {
|
|
var n = e.requireElement("expression", r);
|
|
var i = {
|
|
expr: n,
|
|
args: [n],
|
|
op: function (e, r) {
|
|
e.result = r;
|
|
return t.findNext(i, e);
|
|
},
|
|
};
|
|
return i;
|
|
};
|
|
t.addCommand("call", function (e, t, r) {
|
|
if (!r.matchToken("call")) return;
|
|
var n = y(e, t, r);
|
|
if (n.expr && n.expr.type !== "functionCall") {
|
|
e.raiseParseError(r, "Must be a function invocation");
|
|
}
|
|
return n;
|
|
});
|
|
t.addCommand("get", function (e, t, r) {
|
|
if (r.matchToken("get")) {
|
|
return y(e, t, r);
|
|
}
|
|
});
|
|
t.addCommand("make", function (e, t, r) {
|
|
if (!r.matchToken("make")) return;
|
|
r.matchToken("a") || r.matchToken("an");
|
|
var n = e.requireElement("expression", r);
|
|
var i = [];
|
|
if (n.type !== "queryRef" && r.matchToken("from")) {
|
|
do {
|
|
i.push(e.requireElement("expression", r));
|
|
} while (r.matchOpToken(","));
|
|
}
|
|
if (r.matchToken("called")) {
|
|
var a = e.requireElement("symbol", r);
|
|
}
|
|
var o;
|
|
if (n.type === "queryRef") {
|
|
o = {
|
|
op: function (e) {
|
|
var r,
|
|
i = "div",
|
|
o,
|
|
s = [];
|
|
var u = /(?:(^|#|\.)([^#\. ]+))/g;
|
|
while ((r = u.exec(n.css))) {
|
|
if (r[1] === "") i = r[2].trim();
|
|
else if (r[1] === "#") o = r[2].trim();
|
|
else s.push(r[2].trim());
|
|
}
|
|
var l = document.createElement(i);
|
|
if (o !== undefined) l.id = o;
|
|
for (var c = 0; c < s.length; c++) {
|
|
var f = s[c];
|
|
l.classList.add(f);
|
|
}
|
|
e.result = l;
|
|
if (a) {
|
|
t.setSymbol(a.name, e, a.scope, l);
|
|
}
|
|
return t.findNext(this, e);
|
|
},
|
|
};
|
|
return o;
|
|
} else {
|
|
o = {
|
|
args: [n, i],
|
|
op: function (e, r, n) {
|
|
e.result = E(r, n);
|
|
if (a) {
|
|
t.setSymbol(a.name, e, a.scope, e.result);
|
|
}
|
|
return t.findNext(this, e);
|
|
},
|
|
};
|
|
return o;
|
|
}
|
|
});
|
|
t.addGrammarElement("pseudoCommand", function (e, t, r) {
|
|
let n = r.token(1);
|
|
if (!(n && n.op && (n.value === "." || n.value === "("))) {
|
|
return null;
|
|
}
|
|
var i = e.requireElement("primaryExpression", r);
|
|
var a = i.root;
|
|
var o = i;
|
|
while (a.root != null) {
|
|
o = o.root;
|
|
a = a.root;
|
|
}
|
|
if (i.type !== "functionCall") {
|
|
e.raiseParseError(r, "Pseudo-commands must be function calls");
|
|
}
|
|
if (o.type === "functionCall" && o.root.root == null) {
|
|
if (r.matchAnyToken("the", "to", "on", "with", "into", "from", "at")) {
|
|
var s = e.requireElement("expression", r);
|
|
} else if (r.matchToken("me")) {
|
|
var s = e.requireElement("implicitMeTarget", r);
|
|
}
|
|
}
|
|
var u;
|
|
if (s) {
|
|
u = {
|
|
type: "pseudoCommand",
|
|
root: s,
|
|
argExressions: o.argExressions,
|
|
args: [s, o.argExressions],
|
|
op: function (e, r, n) {
|
|
t.nullCheck(r, s);
|
|
var i = r[o.root.name];
|
|
t.nullCheck(i, o);
|
|
if (i.hyperfunc) {
|
|
n.push(e);
|
|
}
|
|
e.result = i.apply(r, n);
|
|
return t.findNext(u, e);
|
|
},
|
|
execute: function (e) {
|
|
return t.unifiedExec(this, e);
|
|
},
|
|
};
|
|
} else {
|
|
u = {
|
|
type: "pseudoCommand",
|
|
expr: i,
|
|
args: [i],
|
|
op: function (e, r) {
|
|
e.result = r;
|
|
return t.findNext(u, e);
|
|
},
|
|
execute: function (e) {
|
|
return t.unifiedExec(this, e);
|
|
},
|
|
};
|
|
}
|
|
return u;
|
|
});
|
|
var k = function (e, t, r, n, i) {
|
|
var a = n.type === "symbol";
|
|
var o = n.type === "attributeRef";
|
|
var s = n.type === "styleRef";
|
|
var u = n.type === "arrayIndex";
|
|
if (!(o || s || a) && n.root == null) {
|
|
e.raiseParseError(
|
|
r,
|
|
"Can only put directly into symbols, not references",
|
|
);
|
|
}
|
|
var l = null;
|
|
var c = null;
|
|
if (a) {
|
|
} else if (o || s) {
|
|
l = e.requireElement("implicitMeTarget", r);
|
|
var f = n;
|
|
} else if (u) {
|
|
c = n.firstIndex;
|
|
l = n.root;
|
|
} else {
|
|
c = n.prop ? n.prop.value : null;
|
|
var f = n.attribute;
|
|
l = n.root;
|
|
}
|
|
var m = {
|
|
target: n,
|
|
symbolWrite: a,
|
|
value: i,
|
|
args: [l, c, i],
|
|
op: function (e, r, i, o) {
|
|
if (a) {
|
|
t.setSymbol(n.name, e, n.scope, o);
|
|
} else {
|
|
t.nullCheck(r, l);
|
|
if (u) {
|
|
r[i] = o;
|
|
} else {
|
|
t.implicitLoop(r, function (e) {
|
|
if (f) {
|
|
if (f.type === "attributeRef") {
|
|
if (o == null) {
|
|
e.removeAttribute(f.name);
|
|
} else {
|
|
e.setAttribute(f.name, o);
|
|
}
|
|
} else {
|
|
e.style[f.name] = o;
|
|
}
|
|
} else {
|
|
e[i] = o;
|
|
}
|
|
});
|
|
}
|
|
}
|
|
return t.findNext(this, e);
|
|
},
|
|
};
|
|
return m;
|
|
};
|
|
t.addCommand("default", function (e, t, r) {
|
|
if (!r.matchToken("default")) return;
|
|
var n = e.requireElement("assignableExpression", r);
|
|
r.requireToken("to");
|
|
var i = e.requireElement("expression", r);
|
|
var a = k(e, t, r, n, i);
|
|
var o = {
|
|
target: n,
|
|
value: i,
|
|
setter: a,
|
|
args: [n],
|
|
op: function (e, r) {
|
|
if (r) {
|
|
return t.findNext(this, e);
|
|
} else {
|
|
return a;
|
|
}
|
|
},
|
|
};
|
|
a.parent = o;
|
|
return o;
|
|
});
|
|
t.addCommand("set", function (e, t, r) {
|
|
if (!r.matchToken("set")) return;
|
|
if (r.currentToken().type === "L_BRACE") {
|
|
var n = e.requireElement("objectLiteral", r);
|
|
r.requireToken("on");
|
|
var i = e.requireElement("expression", r);
|
|
var a = {
|
|
objectLiteral: n,
|
|
target: i,
|
|
args: [n, i],
|
|
op: function (e, r, n) {
|
|
Object.assign(n, r);
|
|
return t.findNext(this, e);
|
|
},
|
|
};
|
|
return a;
|
|
}
|
|
try {
|
|
r.pushFollow("to");
|
|
var i = e.requireElement("assignableExpression", r);
|
|
} finally {
|
|
r.popFollow();
|
|
}
|
|
r.requireToken("to");
|
|
var o = e.requireElement("expression", r);
|
|
return k(e, t, r, i, o);
|
|
});
|
|
t.addCommand("if", function (e, t, r) {
|
|
if (!r.matchToken("if")) return;
|
|
var n = e.requireElement("expression", r);
|
|
r.matchToken("then");
|
|
var i = e.parseElement("commandList", r);
|
|
var a = false;
|
|
let o = r.matchToken("else") || r.matchToken("otherwise");
|
|
if (o) {
|
|
let t = r.peekToken("if");
|
|
a = t != null && t.line === o.line;
|
|
if (a) {
|
|
var s = e.parseElement("command", r);
|
|
} else {
|
|
var s = e.parseElement("commandList", r);
|
|
}
|
|
}
|
|
if (r.hasMore() && !a) {
|
|
r.requireToken("end");
|
|
}
|
|
var u = {
|
|
expr: n,
|
|
trueBranch: i,
|
|
falseBranch: s,
|
|
args: [n],
|
|
op: function (e, r) {
|
|
if (r) {
|
|
return i;
|
|
} else if (s) {
|
|
return s;
|
|
} else {
|
|
return t.findNext(this, e);
|
|
}
|
|
},
|
|
};
|
|
e.setParent(i, u);
|
|
e.setParent(s, u);
|
|
return u;
|
|
});
|
|
var x = function (e, t, r, n) {
|
|
var i = t.currentToken();
|
|
var a;
|
|
if (t.matchToken("for") || n) {
|
|
var o = t.requireTokenType("IDENTIFIER");
|
|
a = o.value;
|
|
t.requireToken("in");
|
|
var s = e.requireElement("expression", t);
|
|
} else if (t.matchToken("in")) {
|
|
a = "it";
|
|
var s = e.requireElement("expression", t);
|
|
} else if (t.matchToken("while")) {
|
|
var u = e.requireElement("expression", t);
|
|
} else if (t.matchToken("until")) {
|
|
var l = true;
|
|
if (t.matchToken("event")) {
|
|
var c = e.requireElement("dotOrColonPath", t, "Expected event name");
|
|
if (t.matchToken("from")) {
|
|
var f = e.requireElement("expression", t);
|
|
}
|
|
} else {
|
|
var u = e.requireElement("expression", t);
|
|
}
|
|
} else {
|
|
if (
|
|
!e.commandBoundary(t.currentToken()) &&
|
|
t.currentToken().value !== "forever"
|
|
) {
|
|
var m = e.requireElement("expression", t);
|
|
t.requireToken("times");
|
|
} else {
|
|
t.matchToken("forever");
|
|
var p = true;
|
|
}
|
|
}
|
|
if (t.matchToken("index")) {
|
|
var o = t.requireTokenType("IDENTIFIER");
|
|
var h = o.value;
|
|
}
|
|
var v = e.parseElement("commandList", t);
|
|
if (v && c) {
|
|
var d = v;
|
|
while (d.next) {
|
|
d = d.next;
|
|
}
|
|
var E = {
|
|
type: "waitATick",
|
|
op: function () {
|
|
return new Promise(function (e) {
|
|
setTimeout(function () {
|
|
e(r.findNext(E));
|
|
}, 0);
|
|
});
|
|
},
|
|
};
|
|
d.next = E;
|
|
}
|
|
if (t.hasMore()) {
|
|
t.requireToken("end");
|
|
}
|
|
if (a == null) {
|
|
a = "_implicit_repeat_" + i.start;
|
|
var T = a;
|
|
} else {
|
|
var T = a + "_" + i.start;
|
|
}
|
|
var y = {
|
|
identifier: a,
|
|
indexIdentifier: h,
|
|
slot: T,
|
|
expression: s,
|
|
forever: p,
|
|
times: m,
|
|
until: l,
|
|
event: c,
|
|
on: f,
|
|
whileExpr: u,
|
|
resolveNext: function () {
|
|
return this;
|
|
},
|
|
loop: v,
|
|
args: [u, m],
|
|
op: function (e, t, n) {
|
|
var i = e.meta.iterators[T];
|
|
var o = false;
|
|
var s = null;
|
|
if (this.forever) {
|
|
o = true;
|
|
} else if (this.until) {
|
|
if (c) {
|
|
o = e.meta.iterators[T].eventFired === false;
|
|
} else {
|
|
o = t !== true;
|
|
}
|
|
} else if (u) {
|
|
o = t;
|
|
} else if (n) {
|
|
o = i.index < n;
|
|
} else {
|
|
var l = i.iterator.next();
|
|
o = !l.done;
|
|
s = l.value;
|
|
}
|
|
if (o) {
|
|
if (i.value) {
|
|
e.result = e.locals[a] = s;
|
|
} else {
|
|
e.result = i.index;
|
|
}
|
|
if (h) {
|
|
e.locals[h] = i.index;
|
|
}
|
|
i.index++;
|
|
return v;
|
|
} else {
|
|
e.meta.iterators[T] = null;
|
|
return r.findNext(this.parent, e);
|
|
}
|
|
},
|
|
};
|
|
e.setParent(v, y);
|
|
var k = {
|
|
name: "repeatInit",
|
|
args: [s, c, f],
|
|
op: function (e, t, r, n) {
|
|
var i = { index: 0, value: t, eventFired: false };
|
|
e.meta.iterators[T] = i;
|
|
if (t && t[Symbol.iterator]) {
|
|
i.iterator = t[Symbol.iterator]();
|
|
}
|
|
if (c) {
|
|
var a = n || e.me;
|
|
a.addEventListener(
|
|
r,
|
|
function (t) {
|
|
e.meta.iterators[T].eventFired = true;
|
|
},
|
|
{ once: true },
|
|
);
|
|
}
|
|
return y;
|
|
},
|
|
execute: function (e) {
|
|
return r.unifiedExec(this, e);
|
|
},
|
|
};
|
|
e.setParent(y, k);
|
|
return k;
|
|
};
|
|
t.addCommand("repeat", function (e, t, r) {
|
|
if (r.matchToken("repeat")) {
|
|
return x(e, r, t, false);
|
|
}
|
|
});
|
|
t.addCommand("for", function (e, t, r) {
|
|
if (r.matchToken("for")) {
|
|
return x(e, r, t, true);
|
|
}
|
|
});
|
|
t.addCommand("continue", function (e, t, r) {
|
|
if (!r.matchToken("continue")) return;
|
|
var n = {
|
|
op: function (t) {
|
|
for (var n = this.parent; true; n = n.parent) {
|
|
if (n == undefined) {
|
|
e.raiseParseError(
|
|
r,
|
|
"Command `continue` cannot be used outside of a `repeat` loop.",
|
|
);
|
|
}
|
|
if (n.loop != undefined) {
|
|
return n.resolveNext(t);
|
|
}
|
|
}
|
|
},
|
|
};
|
|
return n;
|
|
});
|
|
t.addCommand("break", function (e, t, r) {
|
|
if (!r.matchToken("break")) return;
|
|
var n = {
|
|
op: function (n) {
|
|
for (var i = this.parent; true; i = i.parent) {
|
|
if (i == undefined) {
|
|
e.raiseParseError(
|
|
r,
|
|
"Command `continue` cannot be used outside of a `repeat` loop.",
|
|
);
|
|
}
|
|
if (i.loop != undefined) {
|
|
return t.findNext(i.parent, n);
|
|
}
|
|
}
|
|
},
|
|
};
|
|
return n;
|
|
});
|
|
t.addGrammarElement("stringLike", function (e, t, r) {
|
|
return e.parseAnyOf(["string", "nakedString"], r);
|
|
});
|
|
t.addCommand("append", function (e, t, r) {
|
|
if (!r.matchToken("append")) return;
|
|
var n = null;
|
|
var i = e.requireElement("expression", r);
|
|
var a = {
|
|
type: "symbol",
|
|
evaluate: function (e) {
|
|
return t.resolveSymbol("result", e);
|
|
},
|
|
};
|
|
if (r.matchToken("to")) {
|
|
n = e.requireElement("expression", r);
|
|
} else {
|
|
n = a;
|
|
}
|
|
var o = null;
|
|
if (n.type === "symbol" || n.type === "attributeRef" || n.root != null) {
|
|
o = k(e, t, r, n, a);
|
|
}
|
|
var s = {
|
|
value: i,
|
|
target: n,
|
|
args: [n, i],
|
|
op: function (e, r, n) {
|
|
if (Array.isArray(r)) {
|
|
r.push(n);
|
|
return t.findNext(this, e);
|
|
} else if (r instanceof Element) {
|
|
r.innerHTML += n;
|
|
return t.findNext(this, e);
|
|
} else if (o) {
|
|
e.result = (r || "") + n;
|
|
return o;
|
|
} else {
|
|
throw Error("Unable to append a value!");
|
|
}
|
|
},
|
|
execute: function (e) {
|
|
return t.unifiedExec(this, e);
|
|
},
|
|
};
|
|
if (o != null) {
|
|
o.parent = s;
|
|
}
|
|
return s;
|
|
});
|
|
function g(e, t, r) {
|
|
r.matchToken("at") || r.matchToken("from");
|
|
const n = { includeStart: true, includeEnd: false };
|
|
n.from = r.matchToken("start") ? 0 : e.requireElement("expression", r);
|
|
if (r.matchToken("to") || r.matchOpToken("..")) {
|
|
if (r.matchToken("end")) {
|
|
n.toEnd = true;
|
|
} else {
|
|
n.to = e.requireElement("expression", r);
|
|
}
|
|
}
|
|
if (r.matchToken("inclusive")) n.includeEnd = true;
|
|
else if (r.matchToken("exclusive")) n.includeStart = false;
|
|
return n;
|
|
}
|
|
class b {
|
|
constructor(e, t) {
|
|
this.re = e;
|
|
this.str = t;
|
|
}
|
|
next() {
|
|
const e = this.re.exec(this.str);
|
|
if (e === null) return { done: true };
|
|
else return { value: e };
|
|
}
|
|
}
|
|
class w {
|
|
constructor(e, t, r) {
|
|
this.re = e;
|
|
this.flags = t;
|
|
this.str = r;
|
|
}
|
|
[Symbol.iterator]() {
|
|
return new b(new RegExp(this.re, this.flags), this.str);
|
|
}
|
|
}
|
|
t.addCommand("pick", (e, t, r) => {
|
|
if (!r.matchToken("pick")) return;
|
|
r.matchToken("the");
|
|
if (
|
|
r.matchToken("item") ||
|
|
r.matchToken("items") ||
|
|
r.matchToken("character") ||
|
|
r.matchToken("characters")
|
|
) {
|
|
const n = g(e, t, r);
|
|
r.requireToken("from");
|
|
const i = e.requireElement("expression", r);
|
|
return {
|
|
args: [i, n.from, n.to],
|
|
op(e, r, i, a) {
|
|
if (n.toEnd) a = r.length;
|
|
if (!n.includeStart) i++;
|
|
if (n.includeEnd) a++;
|
|
if (a == null || a == undefined) a = i + 1;
|
|
e.result = r.slice(i, a);
|
|
return t.findNext(this, e);
|
|
},
|
|
};
|
|
}
|
|
if (r.matchToken("match")) {
|
|
r.matchToken("of");
|
|
const n = e.parseElement("expression", r);
|
|
let i = "";
|
|
if (r.matchOpToken("|")) {
|
|
i = r.requireToken("identifier").value;
|
|
}
|
|
r.requireToken("from");
|
|
const a = e.parseElement("expression", r);
|
|
return {
|
|
args: [a, n],
|
|
op(e, r, n) {
|
|
e.result = new RegExp(n, i).exec(r);
|
|
return t.findNext(this, e);
|
|
},
|
|
};
|
|
}
|
|
if (r.matchToken("matches")) {
|
|
r.matchToken("of");
|
|
const n = e.parseElement("expression", r);
|
|
let i = "gu";
|
|
if (r.matchOpToken("|")) {
|
|
i = "g" + r.requireToken("identifier").value.replace("g", "");
|
|
}
|
|
console.log("flags", i);
|
|
r.requireToken("from");
|
|
const a = e.parseElement("expression", r);
|
|
return {
|
|
args: [a, n],
|
|
op(e, r, n) {
|
|
e.result = new w(n, i, r);
|
|
return t.findNext(this, e);
|
|
},
|
|
};
|
|
}
|
|
});
|
|
t.addCommand("increment", function (e, t, r) {
|
|
if (!r.matchToken("increment")) return;
|
|
var n;
|
|
var i = e.parseElement("assignableExpression", r);
|
|
if (r.matchToken("by")) {
|
|
n = e.requireElement("expression", r);
|
|
}
|
|
var a = {
|
|
type: "implicitIncrementOp",
|
|
target: i,
|
|
args: [i, n],
|
|
op: function (e, t, r) {
|
|
t = t ? parseFloat(t) : 0;
|
|
r = n ? parseFloat(r) : 1;
|
|
var i = t + r;
|
|
e.result = i;
|
|
return i;
|
|
},
|
|
evaluate: function (e) {
|
|
return t.unifiedEval(this, e);
|
|
},
|
|
};
|
|
return k(e, t, r, i, a);
|
|
});
|
|
t.addCommand("decrement", function (e, t, r) {
|
|
if (!r.matchToken("decrement")) return;
|
|
var n;
|
|
var i = e.parseElement("assignableExpression", r);
|
|
if (r.matchToken("by")) {
|
|
n = e.requireElement("expression", r);
|
|
}
|
|
var a = {
|
|
type: "implicitDecrementOp",
|
|
target: i,
|
|
args: [i, n],
|
|
op: function (e, t, r) {
|
|
t = t ? parseFloat(t) : 0;
|
|
r = n ? parseFloat(r) : 1;
|
|
var i = t - r;
|
|
e.result = i;
|
|
return i;
|
|
},
|
|
evaluate: function (e) {
|
|
return t.unifiedEval(this, e);
|
|
},
|
|
};
|
|
return k(e, t, r, i, a);
|
|
});
|
|
function S(e, t) {
|
|
var r = "text";
|
|
var n;
|
|
e.matchToken("a") || e.matchToken("an");
|
|
if (e.matchToken("json") || e.matchToken("Object")) {
|
|
r = "json";
|
|
} else if (e.matchToken("response")) {
|
|
r = "response";
|
|
} else if (e.matchToken("html")) {
|
|
r = "html";
|
|
} else if (e.matchToken("text")) {
|
|
} else {
|
|
n = t.requireElement("dotOrColonPath", e).evaluate();
|
|
}
|
|
return { type: r, conversion: n };
|
|
}
|
|
t.addCommand("fetch", function (e, t, r) {
|
|
if (!r.matchToken("fetch")) return;
|
|
var n = e.requireElement("stringLike", r);
|
|
if (r.matchToken("as")) {
|
|
var i = S(r, e);
|
|
}
|
|
if (r.matchToken("with") && r.currentToken().value !== "{") {
|
|
var a = e.parseElement("nakedNamedArgumentList", r);
|
|
} else {
|
|
var a = e.parseElement("objectLiteral", r);
|
|
}
|
|
if (i == null && r.matchToken("as")) {
|
|
i = S(r, e);
|
|
}
|
|
var o = i ? i.type : "text";
|
|
var s = i ? i.conversion : null;
|
|
var u = {
|
|
url: n,
|
|
argExpressions: a,
|
|
args: [n, a],
|
|
op: function (e, r, n) {
|
|
var i = n || {};
|
|
i["sender"] = e.me;
|
|
i["headers"] = i["headers"] || {};
|
|
var a = new AbortController();
|
|
let l = e.me.addEventListener(
|
|
"fetch:abort",
|
|
function () {
|
|
a.abort();
|
|
},
|
|
{ once: true },
|
|
);
|
|
i["signal"] = a.signal;
|
|
t.triggerEvent(e.me, "hyperscript:beforeFetch", i);
|
|
t.triggerEvent(e.me, "fetch:beforeRequest", i);
|
|
n = i;
|
|
var c = false;
|
|
if (n.timeout) {
|
|
setTimeout(function () {
|
|
if (!c) {
|
|
a.abort();
|
|
}
|
|
}, n.timeout);
|
|
}
|
|
return fetch(r, n)
|
|
.then(function (r) {
|
|
let n = { response: r };
|
|
t.triggerEvent(e.me, "fetch:afterResponse", n);
|
|
r = n.response;
|
|
if (o === "response") {
|
|
e.result = r;
|
|
t.triggerEvent(e.me, "fetch:afterRequest", { result: r });
|
|
c = true;
|
|
return t.findNext(u, e);
|
|
}
|
|
if (o === "json") {
|
|
return r.json().then(function (r) {
|
|
e.result = r;
|
|
t.triggerEvent(e.me, "fetch:afterRequest", { result: r });
|
|
c = true;
|
|
return t.findNext(u, e);
|
|
});
|
|
}
|
|
return r.text().then(function (r) {
|
|
if (s) r = t.convertValue(r, s);
|
|
if (o === "html") r = t.convertValue(r, "Fragment");
|
|
e.result = r;
|
|
t.triggerEvent(e.me, "fetch:afterRequest", { result: r });
|
|
c = true;
|
|
return t.findNext(u, e);
|
|
});
|
|
})
|
|
.catch(function (r) {
|
|
t.triggerEvent(e.me, "fetch:error", { reason: r });
|
|
throw r;
|
|
})
|
|
.finally(function () {
|
|
e.me.removeEventListener("fetch:abort", l);
|
|
});
|
|
},
|
|
};
|
|
return u;
|
|
});
|
|
}
|
|
function y(e) {
|
|
e.addCommand("settle", function (e, t, r) {
|
|
if (r.matchToken("settle")) {
|
|
if (!e.commandBoundary(r.currentToken())) {
|
|
var n = e.requireElement("expression", r);
|
|
} else {
|
|
var n = e.requireElement("implicitMeTarget", r);
|
|
}
|
|
var i = {
|
|
type: "settleCmd",
|
|
args: [n],
|
|
op: function (e, r) {
|
|
t.nullCheck(r, n);
|
|
var a = null;
|
|
var o = false;
|
|
var s = false;
|
|
var u = new Promise(function (e) {
|
|
a = e;
|
|
});
|
|
r.addEventListener(
|
|
"transitionstart",
|
|
function () {
|
|
s = true;
|
|
},
|
|
{ once: true },
|
|
);
|
|
setTimeout(function () {
|
|
if (!s && !o) {
|
|
a(t.findNext(i, e));
|
|
}
|
|
}, 500);
|
|
r.addEventListener(
|
|
"transitionend",
|
|
function () {
|
|
if (!o) {
|
|
a(t.findNext(i, e));
|
|
}
|
|
},
|
|
{ once: true },
|
|
);
|
|
return u;
|
|
},
|
|
execute: function (e) {
|
|
return t.unifiedExec(this, e);
|
|
},
|
|
};
|
|
return i;
|
|
}
|
|
});
|
|
e.addCommand("add", function (e, t, r) {
|
|
if (r.matchToken("add")) {
|
|
var n = e.parseElement("classRef", r);
|
|
var i = null;
|
|
var a = null;
|
|
if (n == null) {
|
|
i = e.parseElement("attributeRef", r);
|
|
if (i == null) {
|
|
a = e.parseElement("styleLiteral", r);
|
|
if (a == null) {
|
|
e.raiseParseError(
|
|
r,
|
|
"Expected either a class reference or attribute expression",
|
|
);
|
|
}
|
|
}
|
|
} else {
|
|
var o = [n];
|
|
while ((n = e.parseElement("classRef", r))) {
|
|
o.push(n);
|
|
}
|
|
}
|
|
if (r.matchToken("to")) {
|
|
var s = e.requireElement("expression", r);
|
|
} else {
|
|
var s = e.requireElement("implicitMeTarget", r);
|
|
}
|
|
if (r.matchToken("when")) {
|
|
if (a) {
|
|
e.raiseParseError(
|
|
r,
|
|
"Only class and properties are supported with a when clause",
|
|
);
|
|
}
|
|
var u = e.requireElement("expression", r);
|
|
}
|
|
if (o) {
|
|
return {
|
|
classRefs: o,
|
|
to: s,
|
|
args: [s, o],
|
|
op: function (e, r, n) {
|
|
t.nullCheck(r, s);
|
|
t.forEach(n, function (n) {
|
|
t.implicitLoop(r, function (r) {
|
|
if (u) {
|
|
e.result = r;
|
|
let i = t.evaluateNoPromise(u, e);
|
|
if (i) {
|
|
if (r instanceof Element) r.classList.add(n.className);
|
|
} else {
|
|
if (r instanceof Element) r.classList.remove(n.className);
|
|
}
|
|
e.result = null;
|
|
} else {
|
|
if (r instanceof Element) r.classList.add(n.className);
|
|
}
|
|
});
|
|
});
|
|
return t.findNext(this, e);
|
|
},
|
|
};
|
|
} else if (i) {
|
|
return {
|
|
type: "addCmd",
|
|
attributeRef: i,
|
|
to: s,
|
|
args: [s],
|
|
op: function (e, r, n) {
|
|
t.nullCheck(r, s);
|
|
t.implicitLoop(r, function (r) {
|
|
if (u) {
|
|
e.result = r;
|
|
let n = t.evaluateNoPromise(u, e);
|
|
if (n) {
|
|
r.setAttribute(i.name, i.value);
|
|
} else {
|
|
r.removeAttribute(i.name);
|
|
}
|
|
e.result = null;
|
|
} else {
|
|
r.setAttribute(i.name, i.value);
|
|
}
|
|
});
|
|
return t.findNext(this, e);
|
|
},
|
|
execute: function (e) {
|
|
return t.unifiedExec(this, e);
|
|
},
|
|
};
|
|
} else {
|
|
return {
|
|
type: "addCmd",
|
|
cssDeclaration: a,
|
|
to: s,
|
|
args: [s, a],
|
|
op: function (e, r, n) {
|
|
t.nullCheck(r, s);
|
|
t.implicitLoop(r, function (e) {
|
|
e.style.cssText += n;
|
|
});
|
|
return t.findNext(this, e);
|
|
},
|
|
execute: function (e) {
|
|
return t.unifiedExec(this, e);
|
|
},
|
|
};
|
|
}
|
|
}
|
|
});
|
|
e.addGrammarElement("styleLiteral", function (e, t, r) {
|
|
if (!r.matchOpToken("{")) return;
|
|
var n = [""];
|
|
var i = [];
|
|
while (r.hasMore()) {
|
|
if (r.matchOpToken("\\")) {
|
|
r.consumeToken();
|
|
} else if (r.matchOpToken("}")) {
|
|
break;
|
|
} else if (r.matchToken("$")) {
|
|
var a = r.matchOpToken("{");
|
|
var o = e.parseElement("expression", r);
|
|
if (a) r.requireOpToken("}");
|
|
i.push(o);
|
|
n.push("");
|
|
} else {
|
|
var s = r.consumeToken();
|
|
n[n.length - 1] += r.source.substring(s.start, s.end);
|
|
}
|
|
n[n.length - 1] += r.lastWhitespace();
|
|
}
|
|
return {
|
|
type: "styleLiteral",
|
|
args: [i],
|
|
op: function (e, t) {
|
|
var r = "";
|
|
n.forEach(function (e, n) {
|
|
r += e;
|
|
if (n in t) r += t[n];
|
|
});
|
|
return r;
|
|
},
|
|
evaluate: function (e) {
|
|
return t.unifiedEval(this, e);
|
|
},
|
|
};
|
|
});
|
|
e.addCommand("remove", function (e, t, r) {
|
|
if (r.matchToken("remove")) {
|
|
var n = e.parseElement("classRef", r);
|
|
var i = null;
|
|
var a = null;
|
|
if (n == null) {
|
|
i = e.parseElement("attributeRef", r);
|
|
if (i == null) {
|
|
a = e.parseElement("expression", r);
|
|
if (a == null) {
|
|
e.raiseParseError(
|
|
r,
|
|
"Expected either a class reference, attribute expression or value expression",
|
|
);
|
|
}
|
|
}
|
|
} else {
|
|
var o = [n];
|
|
while ((n = e.parseElement("classRef", r))) {
|
|
o.push(n);
|
|
}
|
|
}
|
|
if (r.matchToken("from")) {
|
|
var s = e.requireElement("expression", r);
|
|
} else {
|
|
if (a == null) {
|
|
var s = e.requireElement("implicitMeTarget", r);
|
|
}
|
|
}
|
|
if (a) {
|
|
return {
|
|
elementExpr: a,
|
|
from: s,
|
|
args: [a, s],
|
|
op: function (e, r, n) {
|
|
t.nullCheck(r, a);
|
|
t.implicitLoop(r, function (e) {
|
|
if (e.parentElement && (n == null || n.contains(e))) {
|
|
e.parentElement.removeChild(e);
|
|
}
|
|
});
|
|
return t.findNext(this, e);
|
|
},
|
|
};
|
|
} else {
|
|
return {
|
|
classRefs: o,
|
|
attributeRef: i,
|
|
elementExpr: a,
|
|
from: s,
|
|
args: [o, s],
|
|
op: function (e, r, n) {
|
|
t.nullCheck(n, s);
|
|
if (r) {
|
|
t.forEach(r, function (e) {
|
|
t.implicitLoop(n, function (t) {
|
|
t.classList.remove(e.className);
|
|
});
|
|
});
|
|
} else {
|
|
t.implicitLoop(n, function (e) {
|
|
e.removeAttribute(i.name);
|
|
});
|
|
}
|
|
return t.findNext(this, e);
|
|
},
|
|
};
|
|
}
|
|
}
|
|
});
|
|
e.addCommand("toggle", function (e, t, r) {
|
|
if (r.matchToken("toggle")) {
|
|
r.matchAnyToken("the", "my");
|
|
if (r.currentToken().type === "STYLE_REF") {
|
|
let t = r.consumeToken();
|
|
var n = t.value.substr(1);
|
|
var a = true;
|
|
var o = i(e, r, n);
|
|
if (r.matchToken("of")) {
|
|
r.pushFollow("with");
|
|
try {
|
|
var s = e.requireElement("expression", r);
|
|
} finally {
|
|
r.popFollow();
|
|
}
|
|
} else {
|
|
var s = e.requireElement("implicitMeTarget", r);
|
|
}
|
|
} else if (r.matchToken("between")) {
|
|
var u = true;
|
|
var l = e.parseElement("classRef", r);
|
|
r.requireToken("and");
|
|
var c = e.requireElement("classRef", r);
|
|
} else {
|
|
var l = e.parseElement("classRef", r);
|
|
var f = null;
|
|
if (l == null) {
|
|
f = e.parseElement("attributeRef", r);
|
|
if (f == null) {
|
|
e.raiseParseError(
|
|
r,
|
|
"Expected either a class reference or attribute expression",
|
|
);
|
|
}
|
|
} else {
|
|
var m = [l];
|
|
while ((l = e.parseElement("classRef", r))) {
|
|
m.push(l);
|
|
}
|
|
}
|
|
}
|
|
if (a !== true) {
|
|
if (r.matchToken("on")) {
|
|
var s = e.requireElement("expression", r);
|
|
} else {
|
|
var s = e.requireElement("implicitMeTarget", r);
|
|
}
|
|
}
|
|
if (r.matchToken("for")) {
|
|
var p = e.requireElement("expression", r);
|
|
} else if (r.matchToken("until")) {
|
|
var h = e.requireElement("dotOrColonPath", r, "Expected event name");
|
|
if (r.matchToken("from")) {
|
|
var v = e.requireElement("expression", r);
|
|
}
|
|
}
|
|
var d = {
|
|
classRef: l,
|
|
classRef2: c,
|
|
classRefs: m,
|
|
attributeRef: f,
|
|
on: s,
|
|
time: p,
|
|
evt: h,
|
|
from: v,
|
|
toggle: function (e, r, n, i) {
|
|
t.nullCheck(e, s);
|
|
if (a) {
|
|
t.implicitLoop(e, function (e) {
|
|
o("toggle", e);
|
|
});
|
|
} else if (u) {
|
|
t.implicitLoop(e, function (e) {
|
|
if (e.classList.contains(r.className)) {
|
|
e.classList.remove(r.className);
|
|
e.classList.add(n.className);
|
|
} else {
|
|
e.classList.add(r.className);
|
|
e.classList.remove(n.className);
|
|
}
|
|
});
|
|
} else if (i) {
|
|
t.forEach(i, function (r) {
|
|
t.implicitLoop(e, function (e) {
|
|
e.classList.toggle(r.className);
|
|
});
|
|
});
|
|
} else {
|
|
t.forEach(e, function (e) {
|
|
if (e.hasAttribute(f.name)) {
|
|
e.removeAttribute(f.name);
|
|
} else {
|
|
e.setAttribute(f.name, f.value);
|
|
}
|
|
});
|
|
}
|
|
},
|
|
args: [s, p, h, v, l, c, m],
|
|
op: function (e, r, n, i, a, o, s, u) {
|
|
if (n) {
|
|
return new Promise(function (i) {
|
|
d.toggle(r, o, s, u);
|
|
setTimeout(function () {
|
|
d.toggle(r, o, s, u);
|
|
i(t.findNext(d, e));
|
|
}, n);
|
|
});
|
|
} else if (i) {
|
|
return new Promise(function (n) {
|
|
var l = a || e.me;
|
|
l.addEventListener(
|
|
i,
|
|
function () {
|
|
d.toggle(r, o, s, u);
|
|
n(t.findNext(d, e));
|
|
},
|
|
{ once: true },
|
|
);
|
|
d.toggle(r, o, s, u);
|
|
});
|
|
} else {
|
|
this.toggle(r, o, s, u);
|
|
return t.findNext(d, e);
|
|
}
|
|
},
|
|
};
|
|
return d;
|
|
}
|
|
});
|
|
var t = {
|
|
display: function (r, n, i) {
|
|
if (i) {
|
|
n.style.display = i;
|
|
} else if (r === "toggle") {
|
|
if (getComputedStyle(n).display === "none") {
|
|
t.display("show", n, i);
|
|
} else {
|
|
t.display("hide", n, i);
|
|
}
|
|
} else if (r === "hide") {
|
|
const t = e.runtime.getInternalData(n);
|
|
if (t.originalDisplay == null) {
|
|
t.originalDisplay = n.style.display;
|
|
}
|
|
n.style.display = "none";
|
|
} else {
|
|
const t = e.runtime.getInternalData(n);
|
|
if (t.originalDisplay && t.originalDisplay !== "none") {
|
|
n.style.display = t.originalDisplay;
|
|
} else {
|
|
n.style.removeProperty("display");
|
|
}
|
|
}
|
|
},
|
|
visibility: function (e, r, n) {
|
|
if (n) {
|
|
r.style.visibility = n;
|
|
} else if (e === "toggle") {
|
|
if (getComputedStyle(r).visibility === "hidden") {
|
|
t.visibility("show", r, n);
|
|
} else {
|
|
t.visibility("hide", r, n);
|
|
}
|
|
} else if (e === "hide") {
|
|
r.style.visibility = "hidden";
|
|
} else {
|
|
r.style.visibility = "visible";
|
|
}
|
|
},
|
|
opacity: function (e, r, n) {
|
|
if (n) {
|
|
r.style.opacity = n;
|
|
} else if (e === "toggle") {
|
|
if (getComputedStyle(r).opacity === "0") {
|
|
t.opacity("show", r, n);
|
|
} else {
|
|
t.opacity("hide", r, n);
|
|
}
|
|
} else if (e === "hide") {
|
|
r.style.opacity = "0";
|
|
} else {
|
|
r.style.opacity = "1";
|
|
}
|
|
},
|
|
};
|
|
var n = function (e, t, r) {
|
|
var n;
|
|
var i = r.currentToken();
|
|
if (i.value === "when" || i.value === "with" || e.commandBoundary(i)) {
|
|
n = e.parseElement("implicitMeTarget", r);
|
|
} else {
|
|
n = e.parseElement("expression", r);
|
|
}
|
|
return n;
|
|
};
|
|
var i = function (e, n, i) {
|
|
var a = r.defaultHideShowStrategy;
|
|
var o = t;
|
|
if (r.hideShowStrategies) {
|
|
o = Object.assign(o, r.hideShowStrategies);
|
|
}
|
|
i = i || a || "display";
|
|
var s = o[i];
|
|
if (s == null) {
|
|
e.raiseParseError(n, "Unknown show/hide strategy : " + i);
|
|
}
|
|
return s;
|
|
};
|
|
e.addCommand("hide", function (e, t, r) {
|
|
if (r.matchToken("hide")) {
|
|
var a = n(e, t, r);
|
|
var o = null;
|
|
if (r.matchToken("with")) {
|
|
o = r.requireTokenType("IDENTIFIER", "STYLE_REF").value;
|
|
if (o.indexOf("*") === 0) {
|
|
o = o.substr(1);
|
|
}
|
|
}
|
|
var s = i(e, r, o);
|
|
return {
|
|
target: a,
|
|
args: [a],
|
|
op: function (e, r) {
|
|
t.nullCheck(r, a);
|
|
t.implicitLoop(r, function (e) {
|
|
s("hide", e);
|
|
});
|
|
return t.findNext(this, e);
|
|
},
|
|
};
|
|
}
|
|
});
|
|
e.addCommand("show", function (e, t, r) {
|
|
if (r.matchToken("show")) {
|
|
var a = n(e, t, r);
|
|
var o = null;
|
|
if (r.matchToken("with")) {
|
|
o = r.requireTokenType("IDENTIFIER", "STYLE_REF").value;
|
|
if (o.indexOf("*") === 0) {
|
|
o = o.substr(1);
|
|
}
|
|
}
|
|
var s = null;
|
|
if (r.matchOpToken(":")) {
|
|
var u = r.consumeUntilWhitespace();
|
|
r.matchTokenType("WHITESPACE");
|
|
s = u
|
|
.map(function (e) {
|
|
return e.value;
|
|
})
|
|
.join("");
|
|
}
|
|
if (r.matchToken("when")) {
|
|
var l = e.requireElement("expression", r);
|
|
}
|
|
var c = i(e, r, o);
|
|
return {
|
|
target: a,
|
|
when: l,
|
|
args: [a],
|
|
op: function (e, r) {
|
|
t.nullCheck(r, a);
|
|
t.implicitLoop(r, function (r) {
|
|
if (l) {
|
|
e.result = r;
|
|
let n = t.evaluateNoPromise(l, e);
|
|
if (n) {
|
|
c("show", r, s);
|
|
} else {
|
|
c("hide", r);
|
|
}
|
|
e.result = null;
|
|
} else {
|
|
c("show", r, s);
|
|
}
|
|
});
|
|
return t.findNext(this, e);
|
|
},
|
|
};
|
|
}
|
|
});
|
|
e.addCommand("take", function (e, t, r) {
|
|
if (r.matchToken("take")) {
|
|
let u = null;
|
|
let l = [];
|
|
while ((u = e.parseElement("classRef", r))) {
|
|
l.push(u);
|
|
}
|
|
var n = null;
|
|
var i = null;
|
|
let c = l.length > 0;
|
|
if (!c) {
|
|
n = e.parseElement("attributeRef", r);
|
|
if (n == null) {
|
|
e.raiseParseError(
|
|
r,
|
|
"Expected either a class reference or attribute expression",
|
|
);
|
|
}
|
|
if (r.matchToken("with")) {
|
|
i = e.requireElement("expression", r);
|
|
}
|
|
}
|
|
if (r.matchToken("from")) {
|
|
var a = e.requireElement("expression", r);
|
|
}
|
|
if (r.matchToken("for")) {
|
|
var o = e.requireElement("expression", r);
|
|
} else {
|
|
var o = e.requireElement("implicitMeTarget", r);
|
|
}
|
|
if (c) {
|
|
var s = {
|
|
classRefs: l,
|
|
from: a,
|
|
forElt: o,
|
|
args: [l, a, o],
|
|
op: function (e, r, n, i) {
|
|
t.nullCheck(i, o);
|
|
t.implicitLoop(r, function (e) {
|
|
var r = e.className;
|
|
if (n) {
|
|
t.implicitLoop(n, function (e) {
|
|
e.classList.remove(r);
|
|
});
|
|
} else {
|
|
t.implicitLoop(e, function (e) {
|
|
e.classList.remove(r);
|
|
});
|
|
}
|
|
t.implicitLoop(i, function (e) {
|
|
e.classList.add(r);
|
|
});
|
|
});
|
|
return t.findNext(this, e);
|
|
},
|
|
};
|
|
return s;
|
|
} else {
|
|
var s = {
|
|
attributeRef: n,
|
|
from: a,
|
|
forElt: o,
|
|
args: [a, o, i],
|
|
op: function (e, r, i, s) {
|
|
t.nullCheck(r, a);
|
|
t.nullCheck(i, o);
|
|
t.implicitLoop(r, function (e) {
|
|
if (!s) {
|
|
e.removeAttribute(n.name);
|
|
} else {
|
|
e.setAttribute(n.name, s);
|
|
}
|
|
});
|
|
t.implicitLoop(i, function (e) {
|
|
e.setAttribute(n.name, n.value || "");
|
|
});
|
|
return t.findNext(this, e);
|
|
},
|
|
};
|
|
return s;
|
|
}
|
|
}
|
|
});
|
|
function a(t, r, n, i) {
|
|
if (n != null) {
|
|
var a = t.resolveSymbol(n, r);
|
|
} else {
|
|
var a = r;
|
|
}
|
|
if (a instanceof Element || a instanceof HTMLDocument) {
|
|
while (a.firstChild) a.removeChild(a.firstChild);
|
|
a.append(e.runtime.convertValue(i, "Fragment"));
|
|
t.processNode(a);
|
|
} else {
|
|
if (n != null) {
|
|
t.setSymbol(n, r, null, i);
|
|
} else {
|
|
throw "Don't know how to put a value into " + typeof r;
|
|
}
|
|
}
|
|
}
|
|
e.addCommand("put", function (e, t, r) {
|
|
if (r.matchToken("put")) {
|
|
var n = e.requireElement("expression", r);
|
|
var i = r.matchAnyToken("into", "before", "after");
|
|
if (i == null && r.matchToken("at")) {
|
|
r.matchToken("the");
|
|
i = r.matchAnyToken("start", "end");
|
|
r.requireToken("of");
|
|
}
|
|
if (i == null) {
|
|
e.raiseParseError(
|
|
r,
|
|
"Expected one of 'into', 'before', 'at start of', 'at end of', 'after'",
|
|
);
|
|
}
|
|
var o = e.requireElement("expression", r);
|
|
var s = i.value;
|
|
var u = false;
|
|
var l = false;
|
|
var c = null;
|
|
var f = null;
|
|
if (o.type === "arrayIndex" && s === "into") {
|
|
u = true;
|
|
f = o.prop;
|
|
c = o.root;
|
|
} else if (o.prop && o.root && s === "into") {
|
|
f = o.prop.value;
|
|
c = o.root;
|
|
} else if (o.type === "symbol" && s === "into") {
|
|
l = true;
|
|
f = o.name;
|
|
} else if (o.type === "attributeRef" && s === "into") {
|
|
var m = true;
|
|
f = o.name;
|
|
c = e.requireElement("implicitMeTarget", r);
|
|
} else if (o.type === "styleRef" && s === "into") {
|
|
var p = true;
|
|
f = o.name;
|
|
c = e.requireElement("implicitMeTarget", r);
|
|
} else if (o.attribute && s === "into") {
|
|
var m = o.attribute.type === "attributeRef";
|
|
var p = o.attribute.type === "styleRef";
|
|
f = o.attribute.name;
|
|
c = o.root;
|
|
} else {
|
|
c = o;
|
|
}
|
|
var h = {
|
|
target: o,
|
|
operation: s,
|
|
symbolWrite: l,
|
|
value: n,
|
|
args: [c, f, n],
|
|
op: function (e, r, n, i) {
|
|
if (l) {
|
|
a(t, e, n, i);
|
|
} else {
|
|
t.nullCheck(r, c);
|
|
if (s === "into") {
|
|
if (m) {
|
|
t.implicitLoop(r, function (e) {
|
|
e.setAttribute(n, i);
|
|
});
|
|
} else if (p) {
|
|
t.implicitLoop(r, function (e) {
|
|
e.style[n] = i;
|
|
});
|
|
} else if (u) {
|
|
r[n] = i;
|
|
} else {
|
|
t.implicitLoop(r, function (e) {
|
|
a(t, e, n, i);
|
|
});
|
|
}
|
|
} else {
|
|
var o =
|
|
s === "before"
|
|
? Element.prototype.before
|
|
: s === "after"
|
|
? Element.prototype.after
|
|
: s === "start"
|
|
? Element.prototype.prepend
|
|
: s === "end"
|
|
? Element.prototype.append
|
|
: Element.prototype.append;
|
|
t.implicitLoop(r, function (e) {
|
|
o.call(
|
|
e,
|
|
i instanceof Node ? i : t.convertValue(i, "Fragment"),
|
|
);
|
|
if (e.parentElement) {
|
|
t.processNode(e.parentElement);
|
|
} else {
|
|
t.processNode(e);
|
|
}
|
|
});
|
|
}
|
|
}
|
|
return t.findNext(this, e);
|
|
},
|
|
};
|
|
return h;
|
|
}
|
|
});
|
|
function o(e, t, r) {
|
|
var n;
|
|
if (
|
|
r.matchToken("the") ||
|
|
r.matchToken("element") ||
|
|
r.matchToken("elements") ||
|
|
r.currentToken().type === "CLASS_REF" ||
|
|
r.currentToken().type === "ID_REF" ||
|
|
(r.currentToken().op && r.currentToken().value === "<")
|
|
) {
|
|
e.possessivesDisabled = true;
|
|
try {
|
|
n = e.parseElement("expression", r);
|
|
} finally {
|
|
delete e.possessivesDisabled;
|
|
}
|
|
if (r.matchOpToken("'")) {
|
|
r.requireToken("s");
|
|
}
|
|
} else if (
|
|
r.currentToken().type === "IDENTIFIER" &&
|
|
r.currentToken().value === "its"
|
|
) {
|
|
var i = r.matchToken("its");
|
|
n = {
|
|
type: "pseudopossessiveIts",
|
|
token: i,
|
|
name: i.value,
|
|
evaluate: function (e) {
|
|
return t.resolveSymbol("it", e);
|
|
},
|
|
};
|
|
} else {
|
|
r.matchToken("my") || r.matchToken("me");
|
|
n = e.parseElement("implicitMeTarget", r);
|
|
}
|
|
return n;
|
|
}
|
|
e.addCommand("transition", function (e, t, n) {
|
|
if (n.matchToken("transition")) {
|
|
var i = o(e, t, n);
|
|
var a = [];
|
|
var s = [];
|
|
var u = [];
|
|
var l = n.currentToken();
|
|
while (
|
|
!e.commandBoundary(l) &&
|
|
l.value !== "over" &&
|
|
l.value !== "using"
|
|
) {
|
|
if (n.currentToken().type === "STYLE_REF") {
|
|
let e = n.consumeToken();
|
|
let t = e.value.substr(1);
|
|
a.push({
|
|
type: "styleRefValue",
|
|
evaluate: function () {
|
|
return t;
|
|
},
|
|
});
|
|
} else {
|
|
a.push(e.requireElement("stringLike", n));
|
|
}
|
|
if (n.matchToken("from")) {
|
|
s.push(e.requireElement("expression", n));
|
|
} else {
|
|
s.push(null);
|
|
}
|
|
n.requireToken("to");
|
|
if (n.matchToken("initial")) {
|
|
u.push({
|
|
type: "initial_literal",
|
|
evaluate: function () {
|
|
return "initial";
|
|
},
|
|
});
|
|
} else {
|
|
u.push(e.requireElement("expression", n));
|
|
}
|
|
l = n.currentToken();
|
|
}
|
|
if (n.matchToken("over")) {
|
|
var c = e.requireElement("expression", n);
|
|
} else if (n.matchToken("using")) {
|
|
var f = e.requireElement("expression", n);
|
|
}
|
|
var m = {
|
|
to: u,
|
|
args: [i, a, s, u, f, c],
|
|
op: function (e, n, a, o, s, u, l) {
|
|
t.nullCheck(n, i);
|
|
var c = [];
|
|
t.implicitLoop(n, function (e) {
|
|
var n = new Promise(function (n, i) {
|
|
var c = e.style.transition;
|
|
if (l) {
|
|
e.style.transition = "all " + l + "ms ease-in";
|
|
} else if (u) {
|
|
e.style.transition = u;
|
|
} else {
|
|
e.style.transition = r.defaultTransition;
|
|
}
|
|
var f = t.getInternalData(e);
|
|
var m = getComputedStyle(e);
|
|
var p = {};
|
|
for (var h = 0; h < m.length; h++) {
|
|
var v = m[h];
|
|
var d = m[v];
|
|
p[v] = d;
|
|
}
|
|
if (!f.initialStyles) {
|
|
f.initialStyles = p;
|
|
}
|
|
for (var h = 0; h < a.length; h++) {
|
|
var E = a[h];
|
|
var T = o[h];
|
|
if (T === "computed" || T == null) {
|
|
e.style[E] = p[E];
|
|
} else {
|
|
e.style[E] = T;
|
|
}
|
|
}
|
|
var y = false;
|
|
var k = false;
|
|
e.addEventListener(
|
|
"transitionend",
|
|
function () {
|
|
if (!k) {
|
|
e.style.transition = c;
|
|
k = true;
|
|
n();
|
|
}
|
|
},
|
|
{ once: true },
|
|
);
|
|
e.addEventListener(
|
|
"transitionstart",
|
|
function () {
|
|
y = true;
|
|
},
|
|
{ once: true },
|
|
);
|
|
setTimeout(function () {
|
|
if (!k && !y) {
|
|
e.style.transition = c;
|
|
k = true;
|
|
n();
|
|
}
|
|
}, 100);
|
|
setTimeout(function () {
|
|
var t = [];
|
|
for (var r = 0; r < a.length; r++) {
|
|
var n = a[r];
|
|
var i = s[r];
|
|
if (i === "initial") {
|
|
var o = f.initialStyles[n];
|
|
e.style[n] = o;
|
|
} else {
|
|
e.style[n] = i;
|
|
}
|
|
}
|
|
}, 0);
|
|
});
|
|
c.push(n);
|
|
});
|
|
return Promise.all(c).then(function () {
|
|
return t.findNext(m, e);
|
|
});
|
|
},
|
|
};
|
|
return m;
|
|
}
|
|
});
|
|
e.addCommand("measure", function (e, t, r) {
|
|
if (!r.matchToken("measure")) return;
|
|
var n = o(e, t, r);
|
|
var i = [];
|
|
if (!e.commandBoundary(r.currentToken()))
|
|
do {
|
|
i.push(r.matchTokenType("IDENTIFIER").value);
|
|
} while (r.matchOpToken(","));
|
|
return {
|
|
properties: i,
|
|
args: [n],
|
|
op: function (e, r) {
|
|
t.nullCheck(r, n);
|
|
if (0 in r) r = r[0];
|
|
var a = r.getBoundingClientRect();
|
|
var o = {
|
|
top: r.scrollTop,
|
|
left: r.scrollLeft,
|
|
topMax: r.scrollTopMax,
|
|
leftMax: r.scrollLeftMax,
|
|
height: r.scrollHeight,
|
|
width: r.scrollWidth,
|
|
};
|
|
e.result = {
|
|
x: a.x,
|
|
y: a.y,
|
|
left: a.left,
|
|
top: a.top,
|
|
right: a.right,
|
|
bottom: a.bottom,
|
|
width: a.width,
|
|
height: a.height,
|
|
bounds: a,
|
|
scrollLeft: o.left,
|
|
scrollTop: o.top,
|
|
scrollLeftMax: o.leftMax,
|
|
scrollTopMax: o.topMax,
|
|
scrollWidth: o.width,
|
|
scrollHeight: o.height,
|
|
scroll: o,
|
|
};
|
|
t.forEach(i, function (t) {
|
|
if (t in e.result) e.locals[t] = e.result[t];
|
|
else throw "No such measurement as " + t;
|
|
});
|
|
return t.findNext(this, e);
|
|
},
|
|
};
|
|
});
|
|
e.addLeafExpression("closestExpr", function (e, t, r) {
|
|
if (r.matchToken("closest")) {
|
|
if (r.matchToken("parent")) {
|
|
var n = true;
|
|
}
|
|
var i = null;
|
|
if (r.currentToken().type === "ATTRIBUTE_REF") {
|
|
var a = e.requireElement("attributeRefAccess", r, null);
|
|
i = "[" + a.attribute.name + "]";
|
|
}
|
|
if (i == null) {
|
|
var o = e.requireElement("expression", r);
|
|
if (o.css == null) {
|
|
e.raiseParseError(r, "Expected a CSS expression");
|
|
} else {
|
|
i = o.css;
|
|
}
|
|
}
|
|
if (r.matchToken("to")) {
|
|
var s = e.parseElement("expression", r);
|
|
} else {
|
|
var s = e.parseElement("implicitMeTarget", r);
|
|
}
|
|
var u = {
|
|
type: "closestExpr",
|
|
parentSearch: n,
|
|
expr: o,
|
|
css: i,
|
|
to: s,
|
|
args: [s],
|
|
op: function (e, r) {
|
|
if (r == null) {
|
|
return null;
|
|
} else {
|
|
let e = [];
|
|
t.implicitLoop(r, function (t) {
|
|
if (n) {
|
|
e.push(t.parentElement ? t.parentElement.closest(i) : null);
|
|
} else {
|
|
e.push(t.closest(i));
|
|
}
|
|
});
|
|
if (t.shouldAutoIterate(r)) {
|
|
return e;
|
|
} else {
|
|
return e[0];
|
|
}
|
|
}
|
|
},
|
|
evaluate: function (e) {
|
|
return t.unifiedEval(this, e);
|
|
},
|
|
};
|
|
if (a) {
|
|
a.root = u;
|
|
a.args = [u];
|
|
return a;
|
|
} else {
|
|
return u;
|
|
}
|
|
}
|
|
});
|
|
e.addCommand("go", function (e, t, r) {
|
|
if (r.matchToken("go")) {
|
|
if (r.matchToken("back")) {
|
|
var n = true;
|
|
} else {
|
|
r.matchToken("to");
|
|
if (r.matchToken("url")) {
|
|
var i = e.requireElement("stringLike", r);
|
|
var a = true;
|
|
if (r.matchToken("in")) {
|
|
r.requireToken("new");
|
|
r.requireToken("window");
|
|
var o = true;
|
|
}
|
|
} else {
|
|
r.matchToken("the");
|
|
var s = r.matchAnyToken("top", "middle", "bottom");
|
|
var u = r.matchAnyToken("left", "center", "right");
|
|
if (s || u) {
|
|
r.requireToken("of");
|
|
}
|
|
var i = e.requireElement("unaryExpression", r);
|
|
var l = r.matchAnyOpToken("+", "-");
|
|
if (l) {
|
|
r.pushFollow("px");
|
|
try {
|
|
var c = e.requireElement("expression", r);
|
|
} finally {
|
|
r.popFollow();
|
|
}
|
|
}
|
|
r.matchToken("px");
|
|
var f = r.matchAnyToken("smoothly", "instantly");
|
|
var m = { block: "start", inline: "nearest" };
|
|
if (s) {
|
|
if (s.value === "top") {
|
|
m.block = "start";
|
|
} else if (s.value === "bottom") {
|
|
m.block = "end";
|
|
} else if (s.value === "middle") {
|
|
m.block = "center";
|
|
}
|
|
}
|
|
if (u) {
|
|
if (u.value === "left") {
|
|
m.inline = "start";
|
|
} else if (u.value === "center") {
|
|
m.inline = "center";
|
|
} else if (u.value === "right") {
|
|
m.inline = "end";
|
|
}
|
|
}
|
|
if (f) {
|
|
if (f.value === "smoothly") {
|
|
m.behavior = "smooth";
|
|
} else if (f.value === "instantly") {
|
|
m.behavior = "instant";
|
|
}
|
|
}
|
|
}
|
|
}
|
|
var p = {
|
|
target: i,
|
|
args: [i, c],
|
|
op: function (e, r, i) {
|
|
if (n) {
|
|
window.history.back();
|
|
} else if (a) {
|
|
if (r) {
|
|
if (o) {
|
|
window.open(r);
|
|
} else {
|
|
window.location.href = r;
|
|
}
|
|
}
|
|
} else {
|
|
t.implicitLoop(r, function (e) {
|
|
if (e === window) {
|
|
e = document.body;
|
|
}
|
|
if (l) {
|
|
let t = e.getBoundingClientRect();
|
|
let r = document.createElement("div");
|
|
let n = l.value === "+" ? i : i * -1;
|
|
let a = m.inline == "start" || m.inline == "end" ? n : 0;
|
|
let o = m.block == "start" || m.block == "end" ? n : 0;
|
|
r.style.position = "absolute";
|
|
r.style.top = t.top + window.scrollY + o + "px";
|
|
r.style.left = t.left + window.scrollX + a + "px";
|
|
r.style.height = t.height + "px";
|
|
r.style.width = t.width + "px";
|
|
r.style.zIndex = "" + Number.MIN_SAFE_INTEGER;
|
|
r.style.opacity = "0";
|
|
document.body.appendChild(r);
|
|
setTimeout(function () {
|
|
document.body.removeChild(r);
|
|
}, 100);
|
|
e = r;
|
|
}
|
|
e.scrollIntoView(m);
|
|
});
|
|
}
|
|
return t.findNext(p, e);
|
|
},
|
|
};
|
|
return p;
|
|
}
|
|
});
|
|
r.conversions.dynamicResolvers.push(function (t, r) {
|
|
if (!(t === "Values" || t.indexOf("Values:") === 0)) {
|
|
return;
|
|
}
|
|
var n = t.split(":")[1];
|
|
var i = {};
|
|
var a = e.runtime.implicitLoop.bind(e.runtime);
|
|
a(r, function (e) {
|
|
var t = s(e);
|
|
if (t !== undefined) {
|
|
i[t.name] = t.value;
|
|
return;
|
|
}
|
|
if (e.querySelectorAll != undefined) {
|
|
var r = e.querySelectorAll("input,select,textarea");
|
|
r.forEach(o);
|
|
}
|
|
});
|
|
if (n) {
|
|
if (n === "JSON") {
|
|
return JSON.stringify(i);
|
|
} else if (n === "Form") {
|
|
return new URLSearchParams(i).toString();
|
|
} else {
|
|
throw "Unknown conversion: " + n;
|
|
}
|
|
} else {
|
|
return i;
|
|
}
|
|
function o(e) {
|
|
var t = s(e);
|
|
if (t == undefined) {
|
|
return;
|
|
}
|
|
if (i[t.name] == undefined) {
|
|
i[t.name] = t.value;
|
|
return;
|
|
}
|
|
if (Array.isArray(i[t.name]) && Array.isArray(t.value)) {
|
|
i[t.name] = [].concat(i[t.name], t.value);
|
|
return;
|
|
}
|
|
}
|
|
function s(e) {
|
|
try {
|
|
var t = { name: e.name, value: e.value };
|
|
if (t.name == undefined || t.value == undefined) {
|
|
return undefined;
|
|
}
|
|
if (e.type == "radio" && e.checked == false) {
|
|
return undefined;
|
|
}
|
|
if (e.type == "checkbox") {
|
|
if (e.checked == false) {
|
|
t.value = undefined;
|
|
} else if (typeof t.value === "string") {
|
|
t.value = [t.value];
|
|
}
|
|
}
|
|
if (e.type == "select-multiple") {
|
|
var r = e.querySelectorAll("option[selected]");
|
|
t.value = [];
|
|
for (var n = 0; n < r.length; n++) {
|
|
t.value.push(r[n].value);
|
|
}
|
|
}
|
|
return t;
|
|
} catch (e) {
|
|
return undefined;
|
|
}
|
|
}
|
|
});
|
|
r.conversions["HTML"] = function (e) {
|
|
var t = function (e) {
|
|
if (e instanceof Array) {
|
|
return e
|
|
.map(function (e) {
|
|
return t(e);
|
|
})
|
|
.join("");
|
|
}
|
|
if (e instanceof HTMLElement) {
|
|
return e.outerHTML;
|
|
}
|
|
if (e instanceof NodeList) {
|
|
var r = "";
|
|
for (var n = 0; n < e.length; n++) {
|
|
var i = e[n];
|
|
if (i instanceof HTMLElement) {
|
|
r += i.outerHTML;
|
|
}
|
|
}
|
|
return r;
|
|
}
|
|
if (e.toString) {
|
|
return e.toString();
|
|
}
|
|
return "";
|
|
};
|
|
return t(e);
|
|
};
|
|
r.conversions["Fragment"] = function (t) {
|
|
var r = document.createDocumentFragment();
|
|
e.runtime.implicitLoop(t, function (e) {
|
|
if (e instanceof Node) r.append(e);
|
|
else {
|
|
var t = document.createElement("template");
|
|
t.innerHTML = e;
|
|
r.append(t.content);
|
|
}
|
|
});
|
|
return r;
|
|
};
|
|
}
|
|
const k = new o(),
|
|
x = k.lexer,
|
|
g = k.parser;
|
|
function b(e, t) {
|
|
return k.evaluate(e, t);
|
|
}
|
|
function w() {
|
|
var t = Array.from(
|
|
e.document.querySelectorAll("script[type='text/hyperscript'][src]"),
|
|
);
|
|
Promise.all(
|
|
t.map(function (e) {
|
|
return fetch(e.src).then(function (e) {
|
|
return e.text();
|
|
});
|
|
}),
|
|
)
|
|
.then((e) => e.forEach((e) => S(e)))
|
|
.then(() =>
|
|
n(function () {
|
|
a();
|
|
k.processNode(document.documentElement);
|
|
e.document.addEventListener("htmx:load", function (e) {
|
|
k.processNode(e.detail.elt);
|
|
});
|
|
}),
|
|
);
|
|
function n(e) {
|
|
if (document.readyState !== "loading") {
|
|
setTimeout(e);
|
|
} else {
|
|
document.addEventListener("DOMContentLoaded", e);
|
|
}
|
|
}
|
|
function i() {
|
|
var e = document.querySelector('meta[name="htmx-config"]');
|
|
if (e) {
|
|
return v(e.content);
|
|
} else {
|
|
return null;
|
|
}
|
|
}
|
|
function a() {
|
|
var e = i();
|
|
if (e) {
|
|
Object.assign(r, e);
|
|
}
|
|
}
|
|
}
|
|
const S = Object.assign(b, {
|
|
config: r,
|
|
use(e) {
|
|
e(S);
|
|
},
|
|
internals: {
|
|
lexer: x,
|
|
parser: g,
|
|
runtime: k,
|
|
Lexer: n,
|
|
Tokens: i,
|
|
Parser: a,
|
|
Runtime: o,
|
|
},
|
|
ElementCollection: m,
|
|
addFeature: g.addFeature.bind(g),
|
|
addCommand: g.addCommand.bind(g),
|
|
addLeafExpression: g.addLeafExpression.bind(g),
|
|
addIndirectExpression: g.addIndirectExpression.bind(g),
|
|
evaluate: k.evaluate.bind(k),
|
|
parse: k.parse.bind(k),
|
|
processNode: k.processNode.bind(k),
|
|
version: "0.9.12",
|
|
browserInit: w,
|
|
});
|
|
return S;
|
|
});
|