From d470ff3e1296ecc1225e0a213ffa83977eb83dd3 Mon Sep 17 00:00:00 2001 From: Arthur Wallendorff Date: Sat, 22 Feb 2025 14:01:46 +0100 Subject: [PATCH 01/25] docs: add `clear` command docs page --- www/commands/clear.md | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) create mode 100644 www/commands/clear.md diff --git a/www/commands/clear.md b/www/commands/clear.md new file mode 100644 index 000000000..645613c64 --- /dev/null +++ b/www/commands/clear.md @@ -0,0 +1,32 @@ +--- +title: clear - ///_hyperscript +--- + +## The `clear` Command + +### Syntax + +```ebnf +clear [from ] +``` + +### Description + +The `clear` command allows you to clear an element's children or content. + +### Examples + +```html +
Clear Me!
+ +
Clear This Span Content!
+ +
+ Clear

This

Not This

This Too

! +
+ +
+ Clear Another Div! +
+ +``` From 70de59f043243629568de0cde75c72f375cdb89a Mon Sep 17 00:00:00 2001 From: Arthur Wallendorff Date: Sat, 22 Feb 2025 14:02:40 +0100 Subject: [PATCH 02/25] feat: add `clear` command --- src/_hyperscript.js | 41 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) diff --git a/src/_hyperscript.js b/src/_hyperscript.js index 5f1dfad93..c2aa66e02 100644 --- a/src/_hyperscript.js +++ b/src/_hyperscript.js @@ -7454,6 +7454,47 @@ } }); + parser.addCommand("clear", function (parser, runtime, tokens) { + if (tokens.matchToken("clear")) { + var elementExpr = null; + var attributeRef = parser.parseElement("attributeRef", tokens); + if (attributeRef == null) { + elementExpr = parser.parseElement("expression", tokens); + if (elementExpr == null) { + parser.raiseParseError( + tokens, + "Expected either an attribute expression or value expression" + ); + } + } + + if (tokens.matchToken("from")) { + var fromExpr = parser.requireElement("expression", tokens); + } else { + if (elementExpr == null) { + var fromExpr = parser.requireElement("implicitMeTarget", tokens); + } + } + + return { + elementExpr: elementExpr, + from: fromExpr, + args: [elementExpr, fromExpr], + op: function (context, element, from) { + runtime.nullCheck(element, elementExpr); + runtime.implicitLoop(element, function (target) { + if (target === element) { + target.replaceChildren() + } else if (target.parentElement && (from == null || from.contains(target))) { + target.parentElement.removeChild(target) + } + }); + return runtime.findNext(this, context); + }, + }; + } + }); + config.conversions.dynamicResolvers.push(function (str, node) { if (!(str === "Values" || str.indexOf("Values:") === 0)) { return; From e24473efbcebff033921755d6a1be226cf2b558c Mon Sep 17 00:00:00 2001 From: Arthur Wallendorff Date: Sat, 22 Feb 2025 14:05:29 +0100 Subject: [PATCH 03/25] chore: add `clear` tests --- test/commands/clear.js | 58 +++++++++++++++++++++++ www/test/1.0.0-rc1/test/commands/clear.js | 58 +++++++++++++++++++++++ 2 files changed, 116 insertions(+) create mode 100644 test/commands/clear.js create mode 100644 www/test/1.0.0-rc1/test/commands/clear.js diff --git a/test/commands/clear.js b/test/commands/clear.js new file mode 100644 index 000000000..a739a6903 --- /dev/null +++ b/test/commands/clear.js @@ -0,0 +1,58 @@ +describe("the clear command", function () { + beforeEach(function () { + clearWorkArea(); + }); + afterEach(function () { + clearWorkArea(); + }); + + it("can clear inner text", function () { + var div = make("
foo
"); + div.innerHTML.should.equal("foo") + div.click(); + div.innerHTML.should.equal("") + }); + + it("can clear other inner text", function () { + var div = make("
"); + var div2 = make("
foo
"); + div2.innerHTML.should.equal("foo") + div.click(); + div2.innerHTML.should.equal("") + }); + + it("can clear elements", function () { + var div = make("

foo

"); + div.innerHTML.should.equal("

foo

") + div.click(); + div.innerHTML.should.equal("") + }); + + it("can clear other elements", function () { + var div = make("
"); + var div2 = make("

foo

"); + div2.innerHTML.should.equal("

foo

") + div.click(); + div2.innerHTML.should.equal("") + }); + + it("can clear parent element", function () { + var div = make("
"); + var btn = byId("b1"); + div.childElementCount.should.equal(1) + btn.click(); + div.childElementCount.should.equal(0) + }); + + it("can clear query refs from specific things", function () { + var div = make("

foo

bar

doh

"); + var d1 = byId('d1'); + div.innerHTML.includes("

foo

").should.equal(true); + div.innerHTML.includes("bar").should.equal(true); + div.innerHTML.includes("

doh

").should.equal(true); + d1.click(); + div.innerHTML.includes("

foo

").should.equal(false); + div.innerHTML.includes("bar").should.equal(true); + div.innerHTML.includes("

doh

").should.equal(true); + }); +}); diff --git a/www/test/1.0.0-rc1/test/commands/clear.js b/www/test/1.0.0-rc1/test/commands/clear.js new file mode 100644 index 000000000..a739a6903 --- /dev/null +++ b/www/test/1.0.0-rc1/test/commands/clear.js @@ -0,0 +1,58 @@ +describe("the clear command", function () { + beforeEach(function () { + clearWorkArea(); + }); + afterEach(function () { + clearWorkArea(); + }); + + it("can clear inner text", function () { + var div = make("
foo
"); + div.innerHTML.should.equal("foo") + div.click(); + div.innerHTML.should.equal("") + }); + + it("can clear other inner text", function () { + var div = make("
"); + var div2 = make("
foo
"); + div2.innerHTML.should.equal("foo") + div.click(); + div2.innerHTML.should.equal("") + }); + + it("can clear elements", function () { + var div = make("

foo

"); + div.innerHTML.should.equal("

foo

") + div.click(); + div.innerHTML.should.equal("") + }); + + it("can clear other elements", function () { + var div = make("
"); + var div2 = make("

foo

"); + div2.innerHTML.should.equal("

foo

") + div.click(); + div2.innerHTML.should.equal("") + }); + + it("can clear parent element", function () { + var div = make("
"); + var btn = byId("b1"); + div.childElementCount.should.equal(1) + btn.click(); + div.childElementCount.should.equal(0) + }); + + it("can clear query refs from specific things", function () { + var div = make("

foo

bar

doh

"); + var d1 = byId('d1'); + div.innerHTML.includes("

foo

").should.equal(true); + div.innerHTML.includes("bar").should.equal(true); + div.innerHTML.includes("

doh

").should.equal(true); + d1.click(); + div.innerHTML.includes("

foo

").should.equal(false); + div.innerHTML.includes("bar").should.equal(true); + div.innerHTML.includes("

doh

").should.equal(true); + }); +}); From cf519937928b1df3830cd35ccb7ed7bf5a852c47 Mon Sep 17 00:00:00 2001 From: Arthur Wallendorff Date: Sat, 22 Feb 2025 14:07:05 +0100 Subject: [PATCH 04/25] chore: add `clear` test to test suite --- test/index.html | 1 + www/test/1.0.0-rc1/test/index.html | 1 + 2 files changed, 2 insertions(+) diff --git a/test/index.html b/test/index.html index 254d88431..c781df7d4 100644 --- a/test/index.html +++ b/test/index.html @@ -102,6 +102,7 @@

Mocha Test Suite

+