HS: extend parser/runtime + new node test runner; ignore test-results/
- Parser: `--` line comments, `|` op, `result` → `the-result`, query-scoped `<sel> in <expr>`, `is a/an <type>` predicate, multi-`as` chaining with `|`, `match`/`precede` keyword aliases, `[attr]` add/toggle, between attr forms - Runtime: per-element listener registry + hs-deactivate!, attr toggle variants, set-inner-html boots subtree, hs-append polymorphic on string/list/element, default? / array-set! / query-all-in / list-set via take+drop, hs-script idempotence guard - Integration: skip reserved (me/it/event/you/yourself) when collecting vars - Tokenizer: emit `--` comments and `|` op - Test framework + conformance runner updates; new tests/hs-run-filtered.js (single-process Node runner using OCaml VM step-limit to bound infinite loops); generate-sx-conformance-dev.py improvements - mcp_tree.ml + run_tests.ml: harness extensions - .gitignore: top-level test-results/ (Playwright artifacts) Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -16,6 +16,14 @@
|
||||
(fn
|
||||
(sx)
|
||||
(define vars (list))
|
||||
(define
|
||||
reserved
|
||||
(list
|
||||
(quote me)
|
||||
(quote it)
|
||||
(quote event)
|
||||
(quote you)
|
||||
(quote yourself)))
|
||||
(define
|
||||
walk
|
||||
(fn
|
||||
@@ -30,7 +38,9 @@
|
||||
(let
|
||||
((name (nth node 1)))
|
||||
(when
|
||||
(not (some (fn (v) (= v name)) vars))
|
||||
(and
|
||||
(not (some (fn (v) (= v name)) vars))
|
||||
(not (some (fn (v) (= v name)) reserved)))
|
||||
(set! vars (cons name vars)))))
|
||||
(for-each walk node))))
|
||||
(walk sx)
|
||||
@@ -67,9 +77,10 @@
|
||||
(fn
|
||||
(el)
|
||||
(let
|
||||
((src (dom-get-attr el "_")))
|
||||
((src (dom-get-attr el "_")) (prev (dom-get-data el "hs-script")))
|
||||
(when
|
||||
(and src (not (dom-get-data el "hs-active")))
|
||||
(and src (not (= src prev)))
|
||||
(dom-set-data el "hs-script" src)
|
||||
(dom-set-data el "hs-active" true)
|
||||
(let ((handler (hs-handler src))) (handler el))))))
|
||||
|
||||
@@ -77,6 +88,21 @@
|
||||
;; Called once at page load. Finds all elements with _ attribute,
|
||||
;; compiles their hyperscript, and activates them.
|
||||
|
||||
(define
|
||||
hs-deactivate!
|
||||
(fn
|
||||
(el)
|
||||
(let
|
||||
((unlisteners (or (dom-get-data el "hs-unlisteners") (list))))
|
||||
(for-each (fn (u) (when u (u))) unlisteners)
|
||||
(dom-set-data el "hs-unlisteners" (list))
|
||||
(dom-set-data el "hs-active" false)
|
||||
(dom-set-data el "hs-script" nil))))
|
||||
|
||||
;; ── Boot subtree: for dynamic content ───────────────────────────
|
||||
;; Called after HTMX swaps or dynamic DOM insertion.
|
||||
;; Only activates elements within the given root.
|
||||
|
||||
(define
|
||||
hs-boot!
|
||||
(fn
|
||||
@@ -85,10 +111,6 @@
|
||||
((elements (dom-query-all (host-get (host-global "document") "body") "[_]")))
|
||||
(for-each (fn (el) (hs-activate! el)) elements))))
|
||||
|
||||
;; ── Boot subtree: for dynamic content ───────────────────────────
|
||||
;; Called after HTMX swaps or dynamic DOM insertion.
|
||||
;; Only activates elements within the given root.
|
||||
|
||||
(define
|
||||
hs-boot-subtree!
|
||||
(fn
|
||||
|
||||
Reference in New Issue
Block a user