Skip to content

Commit 6539132

Browse files
committed
JS EDSL for HTML
1 parent dd07e3d commit 6539132

5 files changed

Lines changed: 38 additions & 0 deletions

File tree

20250303/node/.editorconfig

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
[*]
2+
charset = utf-8
3+
insert_final_newline = true
4+
end_of_line = lf
5+
indent_style = space
6+
indent_size = 2
7+
max_line_length = 80

20250304/javascript/.editorconfig

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
[*]
2+
charset = utf-8
3+
insert_final_newline = true
4+
end_of_line = lf
5+
indent_style = space
6+
indent_size = 2
7+
max_line_length = 80

20250304/javascript/.tool-versions

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
node 22.14.0

20250304/javascript/README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
# JavaScript EDSL for HTML

20250304/javascript/index.js

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
function generateHTML(tag, props, elements) {
2+
const keys = Object.keys(props);
3+
const propsString = keys.length
4+
? ' ' + keys.map((key) => `${key}="${props[key]}"`).join(' ')
5+
: '';
6+
return `<${tag}${propsString}>${elements.join('')}</${tag}>`;
7+
}
8+
9+
['html', 'body', 'div', 'p', 'a'].forEach((tag) => {
10+
globalThis[tag] = (props, elements) => generateHTML(tag, props, elements);
11+
});
12+
13+
console.log((
14+
html({}, [
15+
body({}, [
16+
div({ id: 'app' }, [
17+
p({}, ['Hello, World!']),
18+
a({ href: 'https://example.com/' }, ['Click me!']),
19+
]),
20+
]),
21+
])
22+
));

0 commit comments

Comments
 (0)