developit/htm

Ampersand escapes in text content handled differently to JSX

Open

#76 opened on Mar 15, 2019

View on GitHub
 (11 comments) (5 reactions) (0 assignees)JavaScript (8,453 stars) (181 forks)batch import
discussionhelp wanted

Description

Reproduction

With the following code:

import htm from "https://unpkg.com/htm@2.1.1/dist/htm.mjs";
import { h } from "https://unpkg.com/preact@8.4.2/dist/preact.mjs";
const html = htm.bind(h);

console.log(html`<div>&lt;</div>`)

I get a VNode with .children = ["&lt;"] — i.e. what I mean to render as < gets rendered as &lt; instead.

Expected results

Testing this in JSX via say https://jsx.egoist.moe/?mode=vue, <div>&lt;</div> gets transformed into h("div", ["<"]); as I originally expected.

I haven't poked into how they are doing this… seems like something that ultimately relies on a lookup table.

Workaround

I am able to escape via string interpolation (e.g. ${'<'} instead of &lt;). Changing the last line in my sample code to:

// …

console.log(html`<div>${'<'}</div>`)

Results in a VNode with .children = ["<"] as I need. Is this the recommended style?

Contributor guide

Ampersand escapes in text content handled differently to JSX · developit/htm#76 | Good First Issue