Skip to content

Commit 6b0a9ce

Browse files
committed
Add more info on property names and values
1 parent 4c25d95 commit 6b0a9ce

File tree

1 file changed

+80
-24
lines changed

1 file changed

+80
-24
lines changed

readme.md

+80-24
Original file line numberDiff line numberDiff line change
@@ -16,10 +16,10 @@ The reason for introducing a new “virtual” DOM is primarily:
1616
a lean and stripped down virtual DOM can be used everywhere
1717
* Most virtual DOMs do not focus on ease of use in transformations
1818
* Other virtual DOMs cannot represent the syntax of HTML in its
19-
entirety, think comments, document types, and character data
19+
entirety (think comments, document types, and character data)
2020
* Neither HTML nor virtual DOMs focus on positional information
2121

22-
**HAST** is a subset of [Unist][], and implemented by [rehype][].
22+
**HAST** is a subset of [Unist][] and implemented by [rehype][].
2323

2424
This document may not be released. See [releases][] for released
2525
documents. The latest released version is [`2.1.0`][latest].
@@ -223,22 +223,74 @@ interface Properties {}
223223
##### Property names
224224

225225
Property names are keys on [`properties`][properties] objects and
226-
reflect HTML attribute names. Often, they have the same value as
227-
the corresponding HTML attribute (for example, `href` is a property
228-
name reflecting the `href` attribute name).
229-
If the HTML attribute name contains one or more dashes, the HAST
230-
property name must be camel-cased (for example, `ariaLabel` is a
231-
property reflecting the `aria-label` attribute).
232-
If the HTML attribute is a reserved ECMAScript keyword, a common
233-
alternative must be used. This is the case for `class`, which uses
234-
`className` in HAST (and DOM), and `for`, which uses `htmlFor`.
235-
236-
> DOM uses other prefixes and suffixes too, for example, `relList`
237-
> for HTML `rel` attributes. This does not occur in HAST.
238-
239-
When possible, HAST properties must be camel-cased if the HTML property
240-
name originates from multiple words. For example, the `minlength` HTML
241-
attribute is cased as `minLength`, and `typemustmatch` as `typeMustMatch`.
226+
reflect HTML, SVG, ARIA, XML, XMLNS, or XLink attribute names.
227+
Often, they have the same value as the corresponding attribute
228+
(for example, `id` is a property name reflecting the `id` attribute
229+
name), but there are some notable differences.
230+
231+
> These rules aren’t simple. Use [`hastscript`][h] (or
232+
> [`property-information`][pi] directly) to help.
233+
234+
The following rules are used to disambiguate the names of attributes and their
235+
corresponding HAST property name.
236+
These rules are based on [how ARIA is reflected in the DOM][aria-dfn], and
237+
differs from how some (older) HTML attributes are reflected in the DOM.
238+
239+
1. Any name referencing a combinations of multiple words (such as “stroke
240+
miter limit”) becomes a camel-cased property name capitalising each word
241+
boundary.
242+
This includes combinations that are sometimes written as several words.
243+
For example, `stroke-miterlimit` becomes `strokeMiterLimit`, `autocorrect`
244+
becomes `autoCorrect`, and `allowfullscreen` becomes `allowFullScreen`.
245+
2. Any name that can be hyphenated, becomes a camel-cased property name
246+
capitalising each boundary.
247+
For example, “read-only” becomes `readOnly`.
248+
3. Compound words that are not used with spaces or hyphens are treated as a
249+
normal word and the previous rules apply.
250+
For example, “placeholder”, “strikethrough”, and “playback” stay the same.
251+
4. Acronyms in names are treated as a normal word and the previous rules apply.
252+
For example, `itemid` become `itemId` and `bgcolor` becomes `bgColor`.
253+
254+
###### Exceptions
255+
256+
Some jargon is seen as one word even though it may not be seen as such by
257+
dictionaries.
258+
For example, `nohref` becomes `noHref`, `playsinline` becomes `playsInline`,
259+
and `accept-charset` becomes `acceptCharset`.
260+
261+
The HTML attributes `class` and `for` respectively become `className` and
262+
`htmlFor` in alignment with the DOM.
263+
No other attributes gain different names as properties, other than a change in
264+
casing.
265+
266+
###### Notes
267+
268+
The HAST rules for property names differ from how HTML is reflected in the DOM
269+
for the following attributes:
270+
271+
<details>
272+
<summary>View list of differences</summary>
273+
274+
* `charoff` becomes `charOff` (not `chOff`)
275+
* `char` stays `char` (does not become `ch`)
276+
* `rel` stays `rel` (does not become `relList`)
277+
* `checked` stays `checked` (does not become `defaultChecked`)
278+
* `muted` stays `muted` (does not become `defaultMuted`)
279+
* `value` stays `value` (does not become `defaultValue`)
280+
* `selected` stays `selected` (does not become `defaultSelected`)
281+
* `char` stays `char` (does not become `ch`)
282+
* `allowfullscreen` becomes `allowFullScreen` (not `allowFullscreen`)
283+
* `hreflang` becomes `hrefLang`, not `hreflang`
284+
* `autoplay` becomes `autoPlay`, not `autoplay`
285+
* `autocomplete` becomes `autoComplete` (not `autocomplete`)
286+
* `autofocus` becomes `autoFocus`, not `autofocus`
287+
* `enctype` becomes `encType`, not `enctype`
288+
* `formenctype` becomes `formEncType` (not `formEnctype`)
289+
* `vspace` becomes `vSpace`, not `vspace`
290+
* `hspace` becomes `hSpace`, not `hspace`
291+
* `lowsrc` becomes `lowSrc`, not `lowsrc`
292+
293+
</details>
242294

243295
##### Property values
244296

@@ -247,13 +299,11 @@ property name. For example, the following HTML `<div hidden></div>`
247299
contains a `hidden` (boolean) attribute, which is reflected as a `hidden`
248300
property name set to `true` (boolean) as value in HAST, and
249301
`<input minlength="5">`, which contains a `minlength` (valid
250-
non-negative integer) attribute, is reflected as a property `minLength`
302+
integer) attribute, is reflected as a property `minLength`
251303
set to `5` (number) in HAST.
252304

253-
> In JSON, the property value `null` must be treated as if the
254-
> property was not included.
255-
> In JavaScript, both `null` and `undefined` must be similarly
256-
> ignored.
305+
> In JSON, the value `null` must be treated as if the property was not included.
306+
> In JavaScript, both `null` and `undefined` must be similarly ignored.
257307
258308
The DOM is strict in reflecting those properties, and HAST is not,
259309
where the DOM treats `<div hidden=no></div>` as having a `true`
@@ -262,7 +312,7 @@ as having a `0` (number) value for the `width` attribute, these should
262312
be reflected as `'no'` and `'yes'`, respectively, in HAST.
263313

264314
> The reason for this is to allow plug-ins and utilities to inspect
265-
> these values.
315+
> these non-standard values.
266316
267317
The DOM also specifies comma- and space-separated lists attribute
268318
values. In HAST, these should be treated as ordered lists.
@@ -444,3 +494,9 @@ Thanks to [**@kthjm**](https://github.com/kthjm)
444494
[license]: https://creativecommons.org/licenses/by/4.0/
445495

446496
[author]: http://wooorm.com
497+
498+
[aria-dfn]: https://www.w3.org/TR/wai-aria-1.2/#idl_attr_disambiguation
499+
500+
[h]: https://github.com/syntax-tree/hastscript
501+
502+
[pi]: https://github.com/wooorm/property-information

0 commit comments

Comments
 (0)