From aabe78ed3b9a6716e3b8b9d922f43ded5942db40 Mon Sep 17 00:00:00 2001 From: George Lemon Date: Fri, 19 Jan 2024 12:54:19 +0200 Subject: [PATCH] update iterators and accessor storage Signed-off-by: George Lemon --- src/tim/engine/compilers/html.nim | 75 ++++++++++++++++++------------- src/tim/engine/parser.nim | 5 ++- tim.nimble | 1 - 3 files changed, 48 insertions(+), 33 deletions(-) diff --git a/src/tim/engine/compilers/html.nim b/src/tim/engine/compilers/html.nim index 67d5f74..7ec9651 100755 --- a/src/tim/engine/compilers/html.nim +++ b/src/tim/engine/compilers/html.nim @@ -466,38 +466,48 @@ proc evalConcat(c: var HtmlCompiler, node: Node, scopetables: var seq[ScopeTable add c.output, someValue.toString() else: discard +template loopEvaluator(items: Node) = + case items.nt: + of ntLitString: + for x in items.sVal: + newScope(scopetables) + node.loopItem.varValue = ast.Node(nt: ntLitString, sVal: $(x)) + c.varExpr(node.loopItem, scopetables) + c.evaluateNodes(node.loopBody, scopetables) + clearScope(scopetables) + of ntLitArray: + for x in items.arrayItems: + newScope(scopetables) + node.loopItem.varValue = x + c.varExpr(node.loopItem, scopetables) + c.evaluateNodes(node.loopBody, scopetables) + clearScope(scopetables) + of ntLitObject: + for x, y in items.objectItems: + newScope(scopetables) + node.loopItem.varValue = y + c.varExpr(node.loopItem, scopetables) + c.evaluateNodes(node.loopBody, scopetables) + clearScope(scopetables) + else: + let x = @[ntLitString, ntLitArray, ntLitObject] + compileErrorWithArgs(typeMismatch, [$(items.nt), x.join(" ")]) + proc evalLoop(c: var HtmlCompiler, node: Node, scopetables: var seq[ScopeTable]) = # Evaluates a `for` loop - let some = c.getScope(node.loopItems.identName, scopetables) - if likely(some.scopeTable != nil): - let items = some.scopeTable[node.loopItems.identName] - case items.varValue.nt: - of ntLitString: - for x in items.varValue.sVal: - newScope(scopetables) - node.loopItem.varValue = ast.Node(nt: ntLitString, sVal: $(x)) - c.varExpr(node.loopItem, scopetables) - c.evaluateNodes(node.loopBody, scopetables) - clearScope(scopetables) - of ntLitArray: - for x in items.varValue.arrayItems: - newScope(scopetables) - node.loopItem.varValue = x - c.varExpr(node.loopItem, scopetables) - c.evaluateNodes(node.loopBody, scopetables) - clearScope(scopetables) - of ntLitObject: - for x, y in items.varValue.objectItems: - newScope(scopetables) - node.loopItem.varValue = y - c.varExpr(node.loopItem, scopetables) - c.evaluateNodes(node.loopBody, scopetables) - clearScope(scopetables) - else: - let x = @[ntLitString, ntLitArray, ntLitObject] - compileErrorWithArgs(typeMismatch, [$(items.varValue.nt), x.join(" ")]) - else: - compileErrorWithArgs(undeclaredVariable, [node.loopItems.identName]) + case node.loopItems.nt + of ntIdent: + let some = c.getScope(node.loopItems.identName, scopetables) + if likely(some.scopeTable != nil): + let items = some.scopeTable[node.loopItems.identName] + loopEvaluator(items.varValue) + else: compileErrorWithArgs(undeclaredVariable, [node.loopItems.identName]) + of ntDotExpr: + let items = c.dotEvaluator(node.loopItems, scopetables) + if likely(items != nil): + loopEvaluator(items) + else: compileErrorWithArgs(undeclaredVariable, [node.loopItems.identName]) + else: return proc typeCheck(c: var HtmlCompiler, x, node: Node): bool = if unlikely(x.nt != node.nt): @@ -625,6 +635,11 @@ proc getAttrs(c: var HtmlCompiler, attrs: HtmlAttributes, scopetables: var seq[S if likely(x != nil): add attrStr, x.toString() else: return # undeclaredVariable + of ntDotExpr: + let x = c.dotEvaluator(attrNode, scopetables) + if likely(x != nil): + add attrStr, x.toString() + else: return # undeclaredVariable else: discard add result, attrStr.join(" ") if not skipQuote and i != len: diff --git a/src/tim/engine/parser.nim b/src/tim/engine/parser.nim index 8104844..b1713a5 100755 --- a/src/tim/engine/parser.nim +++ b/src/tim/engine/parser.nim @@ -356,8 +356,9 @@ proc parseAttributes(p: var Parser, attrs: var HtmlAttributes, el: TokenTuple) { attrs[attrKey.value] = @[attrValue] walk p else: - attrs[attrKey.value] = @[ast.newIdent(p.curr)] - walk p + let x = p.pIdent() + if likely(x != nil): + attrs[attrKey.value] = @[x] else: errorWithArgs(duplicateAttribute, attrKey, [attrKey.value]) else: break # errorWithArgs(invalidAttribute, p.prev, [p.prev.value]) diff --git a/tim.nimble b/tim.nimble index 4e82394..1c987b9 100755 --- a/tim.nimble +++ b/tim.nimble @@ -21,7 +21,6 @@ requires "denim#head" requires "checksums" requires "flatty" requires "supersnappy" -requires "stashtable" # requires "httpx" # requires "websocketx"