Skip to content

Commit 8168b49

Browse files
committed
Close #26: treat tags.script like an HTML dependency inside of JSXTag
1 parent a78b32a commit 8168b49

File tree

2 files changed

+25
-3
lines changed

2 files changed

+25
-3
lines changed

htmltools/_jsx.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
HTML,
2424
MetadataNode,
2525
HTMLDependency,
26+
head_content,
2627
)
2728
from ._versions import versions
2829

@@ -129,6 +130,12 @@ def tagify_tagifiable_and_get_metadata(x: Any) -> Any:
129130
x = copy.copy(x)
130131
if isinstance(x, MetadataNode):
131132
metadata_nodes.append(x)
133+
# React.createElement("script") won't invoke it contents in the same
134+
# way ordinary HTML tags do, but we can circumvent that by 'hoisting' it
135+
# as head_content.
136+
if isinstance(x, Tag) and x.name == "script":
137+
metadata_nodes.append(head_content(x))
138+
return ""
132139
return x
133140

134141
cp = copy.copy(self)

tests/test_jsx_tags.py

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,7 @@ def test_jsx_tags():
7575
jsx("`childexpression`"),
7676
Foo(),
7777
[Foo(), Bar()],
78+
tags.script("alert('hello')"),
7879
TagList(Foo(), Bar()),
7980
span(Foo(span()), Bar()),
8081
int=1,
@@ -84,9 +85,19 @@ def test_jsx_tags():
8485
string="string",
8586
list=[1, 2, 3],
8687
)
87-
assert str(x) == textwrap.dedent(
88+
assert HTMLDocument(x).render()["html"] == textwrap.dedent(
8889
"""\
89-
<script type="text/javascript" data-needs-render="">
90+
<!DOCTYPE html>
91+
<html>
92+
<head>
93+
<meta charset="utf-8"/>
94+
<script type="application/html-dependencies">react[%s];react-dom[%s];headcontent_eb156e81fa07b6cf22e580f33fa4f1e4b3ee0431[0.0]</script>
95+
<script src="lib/react-%s/react.production.min.js"></script>
96+
<script src="lib/react-dom-%s/react-dom.production.min.js"></script>
97+
<script>alert('hello')</script>
98+
</head>
99+
<body>
100+
<script type="text/javascript" data-needs-render="">
90101
(function() {
91102
var container = new DocumentFragment();
92103
ReactDOM.render(
@@ -98,6 +109,7 @@ def test_jsx_tags():
98109
React.createElement(Foo),
99110
React.createElement(Foo),
100111
React.createElement(Bar),
112+
"",
101113
React.createElement(Foo),
102114
React.createElement(Bar),
103115
React.createElement(
@@ -115,7 +127,10 @@ def test_jsx_tags():
115127
thisScript.after(container);
116128
thisScript.removeAttribute('data-needs-render');
117129
})();
118-
</script>"""
130+
</script>
131+
</body>
132+
</html>"""
133+
% (react_ver, react_dom_ver, react_ver, react_dom_ver)
119134
)
120135

121136
x = Foo(

0 commit comments

Comments
 (0)