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) <noreply@anthropic.com>
This commit is contained in:
2026-04-18 21:06:09 +00:00
parent 5a0740d3ce
commit 06bed36272
2 changed files with 82 additions and 87 deletions

View File

@@ -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 <span/> 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 '<div id=target><span>first</span><span>second</span></div>'")
(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 '<div id=target><span>first</span></div>'")
(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 '<div id=target><p id=inner _=\"on click put `clicked` into me\">new</p></div>'")
(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 \\\"<div id=target>morphed</div>\\\" then morph #target to content")
(dom-set-attr _el-go "_" "on click set content to \"<div id=target>morphed</div>\" 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 <span.replaced/> then put \\\"moved\\\" into it then set #target to it")
(dom-set-attr _el-button "_" "on click make a <span.replaced/> 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 '<div id=target _=\"on click put `clicked` into me\">new</div>'")
(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 (<span/> 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 <span/> 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 <span/> 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 <span/> 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 <p/> 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 <input[type=checkbox]/> in the closest <table/> where it is not me on click put :others.length into #out")
(dom-set-attr _el-master "type" "checkbox")
(dom-set-attr _el-master "<input[type" "checkbox]/")
(dom-set-inner-html _el-master "in the closest")
(dom-set-attr _el-out "id" "out")
(dom-append (dom-body) _el-table)
(dom-append _el-table _el-tr)
@@ -8411,7 +8403,6 @@
(dom-append _el-td _el-input)
(dom-append _el-input _el-input4)
(dom-append _el-input4 _el-master)
(dom-append _el-master _el-table6)
(dom-append _el-master _el-out)
(hs-activate! _el-master)
(dom-dispatch (dom-query-by-id "master") "click" nil)
@@ -8433,7 +8424,7 @@
(hs-cleanup!)
(let ((_el-d1 (dom-create-element "div")))
(dom-set-attr _el-d1 "id" "d1")
(dom-set-attr _el-d1 "_" "on click if I am a Element put \\\"yes\\\" into me")
(dom-set-attr _el-d1 "_" "on click if I am a Element put \"yes\" into me")
(dom-append (dom-body) _el-d1)
(hs-activate! _el-d1)
(dom-dispatch (dom-query-by-id "d1") "click" nil)
@@ -8443,7 +8434,7 @@
(hs-cleanup!)
(let ((_el-d1 (dom-create-element "div")))
(dom-set-attr _el-d1 "id" "d1")
(dom-set-attr _el-d1 "_" "on click if I am a Node put \\\"yes\\\" into me")
(dom-set-attr _el-d1 "_" "on click if I am a Node put \"yes\" into me")
(dom-append (dom-body) _el-d1)
(hs-activate! _el-d1)
(dom-dispatch (dom-query-by-id "d1") "click" nil)
@@ -8453,7 +8444,7 @@
(hs-cleanup!)
(let ((_el-d1 (dom-create-element "div")))
(dom-set-attr _el-d1 "id" "d1")
(dom-set-attr _el-d1 "_" "on click if \\\"hello\\\" is not a Element put \\\"yes\\\" into me")
(dom-set-attr _el-d1 "_" "on click if \"hello\" is not a Element put \"yes\" into me")
(dom-append (dom-body) _el-d1)
(hs-activate! _el-d1)
(dom-dispatch (dom-query-by-id "d1") "click" nil)
@@ -8593,7 +8584,7 @@
(hs-cleanup!)
(let ((_el-a (dom-create-element "div")) (_el-b (dom-create-element "div")))
(dom-set-attr _el-a "id" "a")
(dom-set-attr _el-a "_" "\\\"on")
(dom-set-attr _el-a "_" "on click if I precede #b put 'yes' into me")
(dom-set-attr _el-b "id" "b")
(dom-append (dom-body) _el-a)
(dom-append (dom-body) _el-b)
@@ -8746,7 +8737,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 "_" "\\\"on")
(dom-set-attr _el-button "_" "on click if no <span/> 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)

View File

@@ -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 = []