MCPcopy Create free account
hub / github.com/bigskysoftware/_hyperscript / parse

Method parse

www/js/_hyperscript-max.js:10211–10266  ·  view source on GitHub ↗
(parser)

Source from the content-addressed store, hash-verified

10209 this.errors = errors;
10210 }
10211 static parse(parser) {
10212 var tok = parser.currentToken();
10213 if (tok.type !== "TEMPLATE_LINE") return;
10214 parser.consumeToken();
10215 var parts = [];
10216 var errors = [];
10217 var raw = tok.content;
10218 var i = 0;
10219 while (i < raw.length) {
10220 var nextDollar = raw.indexOf("${", i);
10221 if (nextDollar === -1) {
10222 if (i < raw.length) parts.push({ type: "literal", value: raw.slice(i) });
10223 break;
10224 }
10225 if (nextDollar > i) {
10226 parts.push({ type: "literal", value: raw.slice(i, nextDollar) });
10227 }
10228 var depth = 1;
10229 var j = nextDollar + 2;
10230 while (j < raw.length && depth > 0) {
10231 if (raw[j] === "{") depth++;
10232 else if (raw[j] === "}") depth--;
10233 j++;
10234 }
10235 if (depth > 0) {
10236 errors.push({ line: tok.line, message: "Unterminated ${} expression", expr: raw.slice(nextDollar) });
10237 parts.push({ type: "literal", value: "" });
10238 break;
10239 }
10240 var exprStr = raw.slice(nextDollar + 2, j - 1);
10241 var escape = true;
10242 try {
10243 var exprTokens = new Tokenizer().tokenize(exprStr);
10244 var exprParser = parser.createChildParser(exprTokens);
10245 if (exprParser.matchToken("unescaped")) escape = false;
10246 var valueNode = exprParser.requireElement("expression");
10247 if (exprParser.matchToken("if")) {
10248 var conditionNode = exprParser.requireElement("expression");
10249 var elseNode = exprParser.matchToken("else") ? exprParser.requireElement("expression") : null;
10250 parts.push({ type: "conditional", valueNode, conditionNode, elseNode, escape });
10251 } else {
10252 parts.push({ type: "expr", node: valueNode, escape });
10253 }
10254 } catch (e) {
10255 errors.push({
10256 line: tok.line,
10257 column: tok.column + nextDollar,
10258 message: e.message || String(e),
10259 expr: exprStr
10260 });
10261 parts.push({ type: "literal", value: "" });
10262 }
10263 i = j;
10264 }
10265 return new _TemplateTextCommand(parts, errors);
10266 }
10267 resolve(ctx) {
10268 var parts = this.parts;

Callers

nothing calls this directly

Calls 6

currentTokenMethod · 0.45
consumeTokenMethod · 0.45
tokenizeMethod · 0.45
createChildParserMethod · 0.45
matchTokenMethod · 0.45
requireElementMethod · 0.45

Tested by

no test coverage detected