Why script tags
Why light components use <script>
tags instead of <template>
tags
You’ll notice in examples for <light-*>
elements that slotted elements it uses <script type="text/plain">
tags and not <template>
tags.
The <template>
tag is not suitable for syntax highlighting because it applies formatting and is subject to the HTML parser. It is meant purely for HTML intended to be rendered. As a result, it will do things like strip / format text. As a result, <script type="text/plain">
is the best way to get a “plaintext” representation of your code to be highlighted.
TLDR: Use <template>
for displaying HTML. Use <script type="text/plain">
for non-html languages, or for escape sequences like <!DOCTYPE html>
which will get stripped by <template>
as well as invalid HTML. Overall, <script type="text/plain">
results in code that doesn’t get lost.
Unescaping tags
Because we use the workaround of slotting elements like this, there is the edge case of if you need a <script>
within a <script>
.
Like so:
<light-preview preview-mode="shadow-dom">
<script type="text/plain" slot="code">
<script>
console.log("Hello World")
</script>
</script>
</light-preview>
To workaround this, <light-*>
components have a convention of automatically unescaping tags that look like this:
</script>
and turns them into proper closing tags. </script>
So if we were to rewrite the example above, we would write it like this:
<light-preview preview-mode="shadow-dom">
<script type="text/plain" slot="code">
<script>
console.log("Hello World")
</script>
</script>
</light-preview>