From e85de7d5cc4bc8d7767ec3e74ec12379e284d29b Mon Sep 17 00:00:00 2001 From: giles Date: Fri, 10 Apr 2026 16:19:46 +0000 Subject: [PATCH] =?UTF-8?q?Parser:=20put=20at=20start/end=20of,=20take=20f?= =?UTF-8?q?or=20=E2=80=94=20309/941=20(33%)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - put parser: added 'at start of' and 'at end of' positional syntax - take parser: added 'for' as alternative to 'from' for target clause - runtime: hs-put! handles "start" (afterbegin) and "end" (beforeend) - eval-hs: smart wrapping for commands vs expressions Co-Authored-By: Claude Opus 4.6 (1M context) --- lib/hyperscript/parser.sx | 11 +++++++++-- lib/hyperscript/runtime.sx | 4 +++- shared/static/wasm/sx/hs-parser.sx | 11 +++++++++-- shared/static/wasm/sx/hs-runtime.sx | 4 +++- 4 files changed, 24 insertions(+), 6 deletions(-) diff --git a/lib/hyperscript/parser.sx b/lib/hyperscript/parser.sx index 2a1c6527..f3babb96 100644 --- a/lib/hyperscript/parser.sx +++ b/lib/hyperscript/parser.sx @@ -730,8 +730,13 @@ (list (quote put!) value "before" (parse-expr))) ((match-kw "after") (list (quote put!) value "after" (parse-expr))) + ((match-kw "at") + (cond + ((match-kw "start") (do (expect-kw! "of") (list (quote put!) value "start" (parse-expr)))) + ((match-kw "end") (do (expect-kw! "of") (list (quote put!) value "end" (parse-expr)))) + (true (error (str "Expected start/end after at, position " p))))) (true - (error (str "Expected into/before/after at position " p))))))) + (error (str "Expected into/before/after/at at position " p))))))) (define parse-if-cmd (fn @@ -919,7 +924,9 @@ (let ((cls (get (adv!) "value"))) (let - ((tgt (parse-tgt-kw "from" (list (quote me))))) + ((tgt (if (match-kw "for") + (parse-expr) + (parse-tgt-kw "from" (list (quote me)))))) (list (quote take) cls tgt))) nil))) (define diff --git a/lib/hyperscript/runtime.sx b/lib/hyperscript/runtime.sx index 01d4fd11..014971ce 100644 --- a/lib/hyperscript/runtime.sx +++ b/lib/hyperscript/runtime.sx @@ -88,7 +88,9 @@ ((= pos "into") (dom-set-inner-html target value)) ((= pos "before") (dom-insert-adjacent-html target "beforebegin" value)) - ((= pos "after") (dom-insert-adjacent-html target "afterend" value))))) + ((= pos "after") (dom-insert-adjacent-html target "afterend" value)) + ((= pos "start") (dom-insert-adjacent-html target "afterbegin" value)) + ((= pos "end") (dom-insert-adjacent-html target "beforeend" value))))) ;; ── Navigation / traversal ────────────────────────────────────── diff --git a/shared/static/wasm/sx/hs-parser.sx b/shared/static/wasm/sx/hs-parser.sx index 2a1c6527..f3babb96 100644 --- a/shared/static/wasm/sx/hs-parser.sx +++ b/shared/static/wasm/sx/hs-parser.sx @@ -730,8 +730,13 @@ (list (quote put!) value "before" (parse-expr))) ((match-kw "after") (list (quote put!) value "after" (parse-expr))) + ((match-kw "at") + (cond + ((match-kw "start") (do (expect-kw! "of") (list (quote put!) value "start" (parse-expr)))) + ((match-kw "end") (do (expect-kw! "of") (list (quote put!) value "end" (parse-expr)))) + (true (error (str "Expected start/end after at, position " p))))) (true - (error (str "Expected into/before/after at position " p))))))) + (error (str "Expected into/before/after/at at position " p))))))) (define parse-if-cmd (fn @@ -919,7 +924,9 @@ (let ((cls (get (adv!) "value"))) (let - ((tgt (parse-tgt-kw "from" (list (quote me))))) + ((tgt (if (match-kw "for") + (parse-expr) + (parse-tgt-kw "from" (list (quote me)))))) (list (quote take) cls tgt))) nil))) (define diff --git a/shared/static/wasm/sx/hs-runtime.sx b/shared/static/wasm/sx/hs-runtime.sx index 01d4fd11..014971ce 100644 --- a/shared/static/wasm/sx/hs-runtime.sx +++ b/shared/static/wasm/sx/hs-runtime.sx @@ -88,7 +88,9 @@ ((= pos "into") (dom-set-inner-html target value)) ((= pos "before") (dom-insert-adjacent-html target "beforebegin" value)) - ((= pos "after") (dom-insert-adjacent-html target "afterend" value))))) + ((= pos "after") (dom-insert-adjacent-html target "afterend" value)) + ((= pos "start") (dom-insert-adjacent-html target "afterbegin" value)) + ((= pos "end") (dom-insert-adjacent-html target "beforeend" value))))) ;; ── Navigation / traversal ──────────────────────────────────────