From 06bed36272e7299c782ff866afe97a6f30277233 Mon Sep 17 00:00:00 2001 From: giles Date: Sat, 18 Apr 2026 21:06:09 +0000 Subject: [PATCH] Fix HTML attribute parsing: strip \" delimiters from JSON-extracted HTML Tests with _=\"...\" attribute delimiters were garbled because HTMLParser interpreted the backslash-quote as content, not delimiters. Now html.replace('\"', '"') normalizes before parsing. Fixes ~15 tests across toggle, transition, and other categories that were previously running with corrupted HS source. Co-Authored-By: Claude Opus 4.6 (1M context) --- spec/tests/test-hyperscript-behavioral.sx | 166 ++++++++++------------ tests/playwright/generate-sx-tests.py | 3 + 2 files changed, 82 insertions(+), 87 deletions(-) diff --git a/spec/tests/test-hyperscript-behavioral.sx b/spec/tests/test-hyperscript-behavioral.sx index 026e64b1..207550f5 100644 --- a/spec/tests/test-hyperscript-behavioral.sx +++ b/spec/tests/test-hyperscript-behavioral.sx @@ -638,9 +638,8 @@ (deftest "can toggle between two attribute values" (hs-cleanup!) (let ((_el-div (dom-create-element "div"))) - (dom-set-attr _el-div "_" "\\\"on") + (dom-set-attr _el-div "_" "on click toggle between [@data-state='active'] and [@data-state='inactive']") (dom-set-attr _el-div "data-state" "active") - ;; SKIP attr [@data-state (contains special chars) (dom-append (dom-body) _el-div) (hs-activate! _el-div) (dom-dispatch _el-div "click" nil) @@ -651,10 +650,8 @@ (deftest "can toggle between different attributes" (hs-cleanup!) (let ((_el-div (dom-create-element "div"))) - (dom-set-attr _el-div "_" "\\\"on") + (dom-set-attr _el-div "_" "on click toggle between [@enabled='true'] and [@disabled='true']") (dom-set-attr _el-div "enabled" "true") - ;; SKIP attr [@enabled (contains special chars) - ;; SKIP attr [@disabled (contains special chars) (dom-append (dom-body) _el-div) (hs-activate! _el-div) (dom-dispatch _el-div "click" nil) @@ -724,7 +721,7 @@ (deftest "can toggle *display between two values" (hs-cleanup!) (let ((_el-div (dom-create-element "div"))) - (dom-set-attr _el-div "_" "\\\"on") + (dom-set-attr _el-div "_" "on click toggle *display of me between 'none' and 'flex'") (dom-set-attr _el-div "style" "display:none") (dom-append (dom-body) _el-div) (hs-activate! _el-div) @@ -736,7 +733,7 @@ (deftest "can toggle *opacity between three values" (hs-cleanup!) (let ((_el-div (dom-create-element "div"))) - (dom-set-attr _el-div "_" "\\\"on") + (dom-set-attr _el-div "_" "on click toggle *opacity of me between '0', '0.5' and '1'") (dom-set-attr _el-div "style" "opacity:0") (dom-append (dom-body) _el-div) (hs-activate! _el-div) @@ -750,7 +747,7 @@ (deftest "can toggle a global variable between two values" (hs-cleanup!) (let ((_el-div (dom-create-element "div"))) - (dom-set-attr _el-div "_" "\\\"on") + (dom-set-attr _el-div "_" "on click toggle $mode between 'edit' and 'preview'") (dom-append (dom-body) _el-div) (hs-activate! _el-div) (dom-dispatch _el-div "click" nil) @@ -760,7 +757,7 @@ (deftest "can toggle a global variable between three values" (hs-cleanup!) (let ((_el-div (dom-create-element "div"))) - (dom-set-attr _el-div "_" "\\\"on") + (dom-set-attr _el-div "_" "on click toggle $state between 'a', 'b' and 'c'") (dom-append (dom-body) _el-div) (hs-activate! _el-div) (dom-dispatch _el-div "click" nil) @@ -2053,7 +2050,7 @@ (deftest "for loop over undefined skips without error" (hs-cleanup!) (let ((_el-div (dom-create-element "div"))) - (dom-set-attr _el-div "_" "on click repeat for x in doesNotExist put x at end of me end put \\\"done\\\" into me") + (dom-set-attr _el-div "_" "on click repeat for x in doesNotExist put x at end of me end put \"done\" into me") (dom-append (dom-body) _el-div) (hs-activate! _el-div) (dom-dispatch _el-div "click" nil) @@ -2710,7 +2707,7 @@ (deftest "can transition on query ref with of syntax" (hs-cleanup!) (let ((_el-div (dom-create-element "div")) (_el-span (dom-create-element "span"))) - (dom-set-attr _el-div "_" "\\\"on") + (dom-set-attr _el-div "_" "on click transition *width of the next from 0px to 100px") (dom-append (dom-body) _el-div) (dom-append (dom-body) _el-span) (hs-activate! _el-div) @@ -2987,7 +2984,7 @@ (deftest "throws on non-2xx response by default" (hs-cleanup!) (let ((_el-div (dom-create-element "div"))) - (dom-set-attr _el-div "_" "on click fetch /test catch e put \\\"caught\\\" into me") + (dom-set-attr _el-div "_" "on click fetch /test catch e put \"caught\" into me") (dom-append (dom-body) _el-div) (hs-activate! _el-div) (dom-dispatch _el-div "click" nil) @@ -3023,7 +3020,7 @@ (deftest "Response can be converted to JSON via as JSON" (hs-cleanup!) (let ((_el-div (dom-create-element "div"))) - (dom-set-attr _el-div "_" "\\\"on") + (dom-set-attr _el-div "_" "on click fetch /test as Response then put (it as JSON).name into me") (dom-append (dom-body) _el-div) (hs-activate! _el-div) (dom-dispatch _el-div "click" nil) @@ -4192,7 +4189,7 @@ (hs-cleanup!) (let ((_el-d1 (dom-create-element "div"))) (dom-set-attr _el-d1 "id" "d1") - (dom-set-attr _el-d1 "_" "on myEvent(foo) if foo put foo into me else put \\\"no-detail\\\" into me") + (dom-set-attr _el-d1 "_" "on myEvent(foo) if foo put foo into me else put \"no-detail\" into me") (dom-append (dom-body) _el-d1) (hs-activate! _el-d1) )) @@ -4211,7 +4208,7 @@ (deftest "caught exceptions do not trigger 'exception' event" (hs-cleanup!) (let ((_el-button (dom-create-element "button"))) - (dom-set-attr _el-button "_" "on click put \\\"foo\\\" into me then throw \\\"bar\\\" catch e log e on exception(error) put error into me") + (dom-set-attr _el-button "_" "on click put \"foo\" into me then throw \"bar\" catch e log e on exception(error) put error into me") (dom-append (dom-body) _el-button) (hs-activate! _el-button) (dom-dispatch _el-button "click" nil) @@ -4220,7 +4217,7 @@ (deftest "rethrown exceptions trigger 'exception' event" (hs-cleanup!) (let ((_el-button (dom-create-element "button"))) - (dom-set-attr _el-button "_" "on click put \\\"foo\\\" into me then throw \\\"bar\\\" catch e throw e on exception(error) put error into me") + (dom-set-attr _el-button "_" "on click put \"foo\" into me then throw \"bar\" catch e throw e on exception(error) put error into me") (dom-append (dom-body) _el-button) (hs-activate! _el-button) (dom-dispatch _el-button "click" nil) @@ -4229,7 +4226,7 @@ (deftest "can ignore when target doesn\'t exist" (hs-cleanup!) (let ((_el-div (dom-create-element "div"))) - (dom-set-attr _el-div "_" "on click from #doesntExist then throw \\\"bar\\\" on click put \\\"clicked\\\" into me") + (dom-set-attr _el-div "_" "on click from #doesntExist then throw \"bar\" on click put \"clicked\" into me") (dom-append (dom-body) _el-div) (hs-activate! _el-div) (dom-dispatch _el-div "click" nil) @@ -4431,7 +4428,7 @@ (deftest "prompts and puts result in it" (hs-cleanup!) (let ((_el-button (dom-create-element "button")) (_el-out (dom-create-element "div"))) - (dom-set-attr _el-button "_" "on click ask \\\"What is your name?\\\" then put it into #out") + (dom-set-attr _el-button "_" "on click ask \"What is your name?\" then put it into #out") (dom-set-inner-html _el-button "Ask") (dom-set-attr _el-out "id" "out") (dom-append (dom-body) _el-button) @@ -4443,7 +4440,7 @@ (deftest "returns null on cancel" (hs-cleanup!) (let ((_el-button (dom-create-element "button")) (_el-out (dom-create-element "div"))) - (dom-set-attr _el-button "_" "on click ask \\\"Name?\\\" then put it into #out") + (dom-set-attr _el-button "_" "on click ask \"Name?\" then put it into #out") (dom-set-inner-html _el-button "Ask") (dom-set-attr _el-out "id" "out") (dom-append (dom-body) _el-button) @@ -4455,7 +4452,7 @@ (deftest "shows an alert" (hs-cleanup!) (let ((_el-button (dom-create-element "button")) (_el-out (dom-create-element "div"))) - (dom-set-attr _el-button "_" "on click answer \\\"Hello!\\\" then put \\\"done\\\" into #out") + (dom-set-attr _el-button "_" "on click answer \"Hello!\" then put \"done\" into #out") (dom-set-inner-html _el-button "Go") (dom-set-attr _el-out "id" "out") (dom-append (dom-body) _el-button) @@ -4467,7 +4464,7 @@ (deftest "confirm returns first choice on OK" (hs-cleanup!) (let ((_el-button (dom-create-element "button")) (_el-out (dom-create-element "div"))) - (dom-set-attr _el-button "_" "on click answer \\\"Save?\\\" with \\\"Yes\\\" or \\\"No\\\" then put it into #out") + (dom-set-attr _el-button "_" "on click answer \"Save?\" with \"Yes\" or \"No\" then put it into #out") (dom-set-inner-html _el-button "Go") (dom-set-attr _el-out "id" "out") (dom-append (dom-body) _el-button) @@ -4479,7 +4476,7 @@ (deftest "confirm returns second choice on cancel" (hs-cleanup!) (let ((_el-button (dom-create-element "button")) (_el-out (dom-create-element "div"))) - (dom-set-attr _el-button "_" "on click answer \\\"Save?\\\" with \\\"Yes\\\" or \\\"No\\\" then put it into #out") + (dom-set-attr _el-button "_" "on click answer \"Save?\" with \"Yes\" or \"No\" then put it into #out") (dom-set-inner-html _el-button "Go") (dom-set-attr _el-out "id" "out") (dom-append (dom-body) _el-button) @@ -4858,7 +4855,7 @@ (deftest "can parse go to with string URL" (hs-cleanup!) (let ((_el-div (dom-create-element "div"))) - (dom-set-attr _el-div "_" "on click go to \\\"#test-hash\\\"") + (dom-set-attr _el-div "_" "on click go to \"#test-hash\"") (dom-append (dom-body) _el-div) (hs-activate! _el-div) )) @@ -4954,7 +4951,7 @@ (dom-set-attr _el-outer "id" "outer") (dom-set-attr _el-outer "_" "on click add .outer-clicked") (dom-set-attr _el-inner "id" "inner") - (dom-set-attr _el-inner "_" "\\\"on") + (dom-set-attr _el-inner "_" "on click halt the event's then add .continued") (dom-set-inner-html _el-inner "click me") (dom-append (dom-body) _el-outer) (dom-append _el-outer _el-inner) @@ -5041,53 +5038,46 @@ )) (deftest "morph adds new children" (hs-cleanup!) - (let ((_el-target (dom-create-element "div")) (_el-span (dom-create-element "span")) (_el-target2 (dom-create-element "button")) (_el-span3 (dom-create-element "span")) (_el-span4 (dom-create-element "span"))) + (let ((_el-target (dom-create-element "div")) (_el-span (dom-create-element "span")) (_el-go (dom-create-element "button"))) (dom-set-attr _el-target "id" "target") (dom-set-inner-html _el-span "first") - (dom-set-attr _el-target2 "id" "target") - (dom-set-attr _el-target2 "_" "\\\"on") - (dom-set-inner-html _el-span3 "first") - (dom-set-inner-html _el-span4 "second") + (dom-set-attr _el-go "id" "go") + (dom-set-attr _el-go "_" "on click morph #target to '
firstsecond
'") + (dom-set-inner-html _el-go "go") (dom-append (dom-body) _el-target) (dom-append _el-target _el-span) - (dom-append (dom-body) _el-target2) - (dom-append _el-target2 _el-span3) - (dom-append _el-target2 _el-span4) - (hs-activate! _el-target2) + (dom-append (dom-body) _el-go) + (hs-activate! _el-go) (dom-dispatch (dom-query-by-id "go") "click" nil) )) (deftest "morph removes old children" (hs-cleanup!) - (let ((_el-target (dom-create-element "div")) (_el-span (dom-create-element "span")) (_el-span2 (dom-create-element "span")) (_el-target3 (dom-create-element "button")) (_el-span4 (dom-create-element "span"))) + (let ((_el-target (dom-create-element "div")) (_el-span (dom-create-element "span")) (_el-span2 (dom-create-element "span")) (_el-go (dom-create-element "button"))) (dom-set-attr _el-target "id" "target") (dom-set-inner-html _el-span "first") (dom-set-inner-html _el-span2 "second") - (dom-set-attr _el-target3 "id" "target") - (dom-set-attr _el-target3 "_" "\\\"on") - (dom-set-inner-html _el-span4 "first") + (dom-set-attr _el-go "id" "go") + (dom-set-attr _el-go "_" "on click morph #target to '
first
'") + (dom-set-inner-html _el-go "go") (dom-append (dom-body) _el-target) (dom-append _el-target _el-span) (dom-append _el-target _el-span2) - (dom-append (dom-body) _el-target3) - (dom-append _el-target3 _el-span4) - (hs-activate! _el-target3) + (dom-append (dom-body) _el-go) + (hs-activate! _el-go) (dom-dispatch (dom-query-by-id "go") "click" nil) )) (deftest "morph initializes hyperscript on new elements" (hs-cleanup!) - (let ((_el-target (dom-create-element "div")) (_el-p (dom-create-element "p")) (_el-target2 (dom-create-element "button")) (_el-inner (dom-create-element "p"))) + (let ((_el-target (dom-create-element "div")) (_el-p (dom-create-element "p")) (_el-go (dom-create-element "button"))) (dom-set-attr _el-target "id" "target") (dom-set-inner-html _el-p "old") - (dom-set-attr _el-target2 "id" "target") - (dom-set-attr _el-target2 "_" "\\\"on") - (dom-set-attr _el-inner "id" "inner") - ;; HS source has bare quotes or embedded HTML - (dom-set-inner-html _el-inner "new") + (dom-set-attr _el-go "id" "go") + (dom-set-attr _el-go "_" "on click morph #target to '

new

'") + (dom-set-inner-html _el-go "go") (dom-append (dom-body) _el-target) (dom-append _el-target _el-p) - (dom-append (dom-body) _el-target2) - (dom-append _el-target2 _el-inner) - (hs-activate! _el-target2) + (dom-append (dom-body) _el-go) + (hs-activate! _el-go) (dom-dispatch (dom-query-by-id "go") "click" nil) (assert= (dom-text-content (dom-query-by-id "inner")) "new") (dom-dispatch (dom-query-by-id "inner") "click" nil) @@ -5098,7 +5088,7 @@ (let ((_el-target (dom-create-element "div")) (_el-child (dom-create-element "div")) (_el-button (dom-create-element "button"))) (dom-set-attr _el-target "id" "target") (dom-set-attr _el-child "id" "child") - (dom-set-attr _el-child "_" "on click put \\\"alive\\\" into me") + (dom-set-attr _el-child "_" "on click put \"alive\" into me") (dom-set-inner-html _el-child "child") ;; HS source has bare quotes or embedded HTML (dom-set-inner-html _el-button "go") @@ -5144,7 +5134,7 @@ (dom-set-attr _el-target "id" "target") (dom-set-inner-html _el-target "original") (dom-set-attr _el-go "id" "go") - (dom-set-attr _el-go "_" "on click set content to \\\"
morphed
\\\" then morph #target to content") + (dom-set-attr _el-go "_" "on click set content to \"
morphed
\" then morph #target to content") (dom-set-inner-html _el-go "go") (dom-append (dom-body) _el-target) (dom-append (dom-body) _el-go) @@ -7267,7 +7257,7 @@ (let ((_el-target (dom-create-element "div")) (_el-button (dom-create-element "button"))) (dom-set-attr _el-target "id" "target") (dom-set-inner-html _el-target "old") - (dom-set-attr _el-button "_" "on click make a then put \\\"moved\\\" into it then set #target to it") + (dom-set-attr _el-button "_" "on click make a then put \"moved\" into it then set #target to it") (dom-set-inner-html _el-button "go") (dom-append (dom-body) _el-target) (dom-append (dom-body) _el-button) @@ -7320,14 +7310,15 @@ )) (deftest "hyperscript in replacement content is initialized" (hs-cleanup!) - (let ((_el-target (dom-create-element "div")) (_el-target1 (dom-create-element "button"))) + (let ((_el-target (dom-create-element "div")) (_el-go (dom-create-element "button"))) (dom-set-attr _el-target "id" "target") (dom-set-inner-html _el-target "old") - (dom-set-attr _el-target1 "id" "target") - ;; HS source has bare quotes or embedded HTML - (dom-set-inner-html _el-target1 "new'\\\">go") + (dom-set-attr _el-go "id" "go") + (dom-set-attr _el-go "_" "on click set #target to '
new
'") + (dom-set-inner-html _el-go "go") (dom-append (dom-body) _el-target) - (dom-append (dom-body) _el-target1) + (dom-append (dom-body) _el-go) + (hs-activate! _el-go) (dom-dispatch (dom-query-by-id "go") "click" nil) (assert= (dom-text-content (dom-query-by-id "target")) "new") (dom-dispatch (dom-query-by-id "target") "click" nil) @@ -7355,7 +7346,7 @@ (let ((_el-target (dom-create-element "div")) (_el-button (dom-create-element "button"))) (dom-set-attr _el-target "id" "target") (dom-set-inner-html _el-target "old") - (dom-set-attr _el-button "_" "on click put \\\"new\\\" into #target") + (dom-set-attr _el-button "_" "on click put \"new\" into #target") (dom-set-inner-html _el-button "go") (dom-append (dom-body) _el-target) (dom-append (dom-body) _el-button) @@ -7476,9 +7467,11 @@ (dom-set-inner-html _el-span2 "B") (dom-add-class _el-span3 "a") (dom-set-inner-html _el-span3 "C") - (dom-set-attr _el-button "_" "\\\"on") + (dom-set-attr _el-button "_" "on click set result to ( in #box) where it matches .a then put result.length into me") + (dom-set-inner-html _el-button "go (parens)") (dom-set-attr _el-b2 "id" "b2") - (dom-set-attr _el-b2 "_" "\\\"on") + (dom-set-attr _el-b2 "_" "on click set result to in #box where it matches .a then put result.length into me") + (dom-set-inner-html _el-b2 "go") (dom-append (dom-body) _el-box) (dom-append _el-box _el-span) (dom-append _el-box _el-span2) @@ -7500,7 +7493,8 @@ (dom-set-inner-html _el-span "A") (dom-add-class _el-span2 "b") (dom-set-inner-html _el-span2 "B") - (dom-set-attr _el-button "_" "\\\"set") + (dom-set-attr _el-button "_" "set :items to in #box where it matches .a on click put :items.length into me") + (dom-set-inner-html _el-button "go") (dom-append (dom-body) _el-box) (dom-append _el-box _el-span) (dom-append _el-box _el-span2) @@ -7926,7 +7920,7 @@ (hs-cleanup!) (let ((_el-d1 (dom-create-element "div"))) (dom-set-attr _el-d1 "id" "d1") - (dom-set-attr _el-d1 "_" "\\\"on") + (dom-set-attr _el-d1 "_" "on click default #d1's foo to 'bar' then put #d1's foo into me") (dom-append (dom-body) _el-d1) (hs-activate! _el-d1) (dom-dispatch (dom-query-by-id "d1") "click" nil) @@ -7936,7 +7930,7 @@ (hs-cleanup!) (let ((_el-d1 (dom-create-element "div"))) (dom-set-attr _el-d1 "id" "d1") - (dom-set-attr _el-d1 "_" "\\\"on") + (dom-set-attr _el-d1 "_" "on click default foo of me to 'bar' then put my foo into me") (dom-append (dom-body) _el-d1) (hs-activate! _el-d1) (dom-dispatch (dom-query-by-id "d1") "click" nil) @@ -8013,7 +8007,7 @@ (deftest "handles rejected promises without hanging" (hs-cleanup!) (let ((_el-div (dom-create-element "div"))) - (dom-set-attr _el-div "_" "on click js return Promise.reject(\\\"boom\\\") end catch e put e into my.innerHTML") + (dom-set-attr _el-div "_" "on click js return Promise.reject(\"boom\") end catch e put e into my.innerHTML") (dom-append (dom-body) _el-div) (hs-activate! _el-div) (dom-dispatch _el-div "click" nil) @@ -8095,7 +8089,7 @@ (deftest "the result in a when clause refers to previous command result, not element being tested" (hs-cleanup!) (let ((_el-div (dom-create-element "div")) (_el-s1 (dom-create-element "span")) (_el-s2 (dom-create-element "span"))) - (dom-set-attr _el-div "_" "\\\"on") + (dom-set-attr _el-div "_" "on click get 'found' then show in me when the result is 'found'") (dom-set-attr _el-s1 "id" "s1") (dom-set-attr _el-s1 "style" "display:none") (dom-set-inner-html _el-s1 "A") @@ -8103,8 +8097,8 @@ (dom-set-attr _el-s2 "style" "display:none") (dom-set-inner-html _el-s2 "B") (dom-append (dom-body) _el-div) - (dom-append (dom-body) _el-s1) - (dom-append (dom-body) _el-s2) + (dom-append _el-div _el-s1) + (dom-append _el-div _el-s2) (hs-activate! _el-div) (dom-dispatch _el-div "click" nil) (assert (dom-visible? (dom-query-by-id "s1"))) @@ -8113,7 +8107,7 @@ (deftest "the result after show...when is the matched elements" (hs-cleanup!) (let ((_el-div (dom-create-element "div")) (_el-p (dom-create-element "p")) (_el-p2 (dom-create-element "p")) (_el-out (dom-create-element "span"))) - (dom-set-attr _el-div "_" "\\\"on") + (dom-set-attr _el-div "_" "on click show

in me when its textContent is 'yes' then if the result is empty put 'none' into #out else put 'some' into #out") (dom-set-attr _el-p "style" "display:none") (dom-set-inner-html _el-p "yes") (dom-set-attr _el-p2 "style" "display:none") @@ -8121,9 +8115,9 @@ (dom-set-attr _el-out "id" "out") (dom-set-inner-html _el-out "--") (dom-append (dom-body) _el-div) - (dom-append (dom-body) _el-p) - (dom-append (dom-body) _el-p2) - (dom-append (dom-body) _el-out) + (dom-append _el-div _el-p) + (dom-append _el-div _el-p2) + (dom-append _el-div _el-out) (hs-activate! _el-div) (dom-dispatch _el-div "click" nil) (assert= (dom-text-content (dom-query-by-id "out")) "some") @@ -8253,7 +8247,7 @@ (deftest "can have comments in attributes (triple dash)" (hs-cleanup!) (let ((_el-div (dom-create-element "div"))) - (dom-set-attr _el-div "_" "on click put \\\"clicked\\\" into my.innerHTML ---put some content into the div...") + (dom-set-attr _el-div "_" "on click put \"clicked\" into my.innerHTML ---put some content into the div...") (dom-append (dom-body) _el-div) (hs-activate! _el-div) (dom-dispatch _el-div "click" nil) @@ -8263,7 +8257,7 @@ (hs-cleanup!) (let ((_el-d1 (dom-create-element "div"))) (dom-set-attr _el-d1 "id" "d1") - (dom-set-attr _el-d1 "_" "on click blargh end on mouseenter put \\\"hovered\\\" into my.innerHTML") + (dom-set-attr _el-d1 "_" "on click blargh end on mouseenter put \"hovered\" into my.innerHTML") (dom-append (dom-body) _el-d1) (hs-activate! _el-d1) )) @@ -8271,7 +8265,7 @@ (hs-cleanup!) (let ((_el-d1 (dom-create-element "div"))) (dom-set-attr _el-d1 "id" "d1") - (dom-set-attr _el-d1 "_" "on click blargh end on mouseenter also_bad end on focus put \\\"focused\\\" into my.innerHTML") + (dom-set-attr _el-d1 "_" "on click blargh end on mouseenter also_bad end on focus put \"focused\" into my.innerHTML") (dom-append (dom-body) _el-d1) (hs-activate! _el-d1) )) @@ -8283,7 +8277,7 @@ (dom-set-attr _el-d1 "id" "d1") (dom-set-attr _el-d1 "_" "on click blargh end on mouseenter also_bad") (dom-set-attr _el-d2 "id" "d2") - (dom-set-attr _el-d2 "_" "on click put \\\"clicked\\\" into my.innerHTML") + (dom-set-attr _el-d2 "_" "on click put \"clicked\" into my.innerHTML") (dom-append (dom-body) _el-div) (dom-append _el-div _el-d1) (dom-append _el-div _el-d2) @@ -8370,7 +8364,7 @@ (hs-cleanup!) (let ((_el-arDiv (dom-create-element "div"))) (dom-set-attr _el-arDiv "id" "arDiv") - (dom-set-attr _el-arDiv "_" "on click set my @data-foo to \\\"blue\\\"") + (dom-set-attr _el-arDiv "_" "on click set my @data-foo to \"blue\"") (dom-set-attr _el-arDiv "data-foo" "red") (dom-append (dom-body) _el-arDiv) (hs-activate! _el-arDiv) @@ -8386,7 +8380,7 @@ (dom-set-attr _el-outerDiv2 "id" "outerDiv2") (dom-set-attr _el-outerDiv2 "foo" "bar") (dom-set-attr _el-d1b "id" "d1b") - (dom-set-attr _el-d1b "_" "on click set closest @foo to \\\"doh\\\"") + (dom-set-attr _el-d1b "_" "on click set closest @foo to \"doh\"") (dom-append (dom-body) _el-outerDiv2) (dom-append _el-outerDiv2 _el-d1b) (hs-activate! _el-d1b) @@ -8394,16 +8388,14 @@ )) (deftest "closest does not consume a following where clause" (hs-cleanup!) - (let ((_el-table (dom-create-element "table")) (_el-tr (dom-create-element "tr")) (_el-td (dom-create-element "td")) (_el-input (dom-create-element "input")) (_el-input4 (dom-create-element "input")) (_el-master (dom-create-element "input")) (_el-table6 (dom-create-element "table")) (_el-out (dom-create-element "div"))) + (let ((_el-table (dom-create-element "table")) (_el-tr (dom-create-element "tr")) (_el-td (dom-create-element "td")) (_el-input (dom-create-element "input")) (_el-input4 (dom-create-element "input")) (_el-master (dom-create-element "input")) (_el-out (dom-create-element "div"))) (dom-add-class _el-input "cb") (dom-set-attr _el-input "type" "checkbox") (dom-add-class _el-input4 "cb") (dom-set-attr _el-input4 "type" "checkbox") (dom-set-attr _el-master "id" "master") - (dom-set-attr _el-master "_" "\\\"set") + (dom-set-attr _el-master "_" "set :others to in the closest where it is not me on click put :others.length into #out") (dom-set-attr _el-master "type" "checkbox") - (dom-set-attr _el-master " in #box where it matches .c then put 'none' into #out else put 'found' into #out") + (dom-set-inner-html _el-button "go") (dom-set-attr _el-out "id" "out") (dom-append (dom-body) _el-box) (dom-append _el-box _el-span) diff --git a/tests/playwright/generate-sx-tests.py b/tests/playwright/generate-sx-tests.py index e7339698..7154f030 100644 --- a/tests/playwright/generate-sx-tests.py +++ b/tests/playwright/generate-sx-tests.py @@ -98,6 +98,9 @@ def parse_html(html): # Remove | separators html = html.replace(' | ', '') + # Fix escaped attribute delimiters from JSON extraction (\" → ") + html = html.replace('\\"', '"') + elements = [] stack = []