MCPcopy Index your code
hub / github.com/bigskysoftware/_hyperscript / parse

Method parse

www/js/_hyperscript.js:10212–10267  ·  view source on GitHub ↗
(parser)

Source from the content-addressed store, hash-verified

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