Skip to content

Commit 2c5657c

Browse files
committed
Support bool attrs
1 parent 3455e63 commit 2c5657c

File tree

2 files changed

+26
-11
lines changed

2 files changed

+26
-11
lines changed

src/index.js

Lines changed: 17 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,8 @@ const VOID_ELEMENTS = /^(area|base|br|col|embed|hr|img|input|link|meta|param|sou
2020
const DASHED_ATTRS = /^(acceptC|httpE)/;
2121
const CAMEL_ATTRS = /^(viewB|isP)/;
2222
const COLON_ATTRS = /^(xmlS|xlinkH)/;
23-
const transformAttr = (attr, separator) =>
24-
attr.replace(/([A-Z])/g, (w) => separator + w.toLowerCase());
23+
24+
const CAPITAL_REGEXP = /([A-Z])/g;
2525

2626
const UNSAFE_NAME = /[\s\n\\/='"\0<>]/;
2727

@@ -287,6 +287,8 @@ function _renderToString(vnode, context, opts, inner, isSvgMode, selectValue) {
287287
// <textarea value="a&b"> --> <textarea>a&amp;b</textarea>
288288
propChildren = v;
289289
} else if ((v || v === 0 || v === '') && typeof v !== 'function') {
290+
name = getAttributeNameInHtmlCase(name);
291+
290292
if (v === true || v === '') {
291293
v = name;
292294
// in non-xml mode, allow boolean attributes
@@ -305,15 +307,6 @@ function _renderToString(vnode, context, opts, inner, isSvgMode, selectValue) {
305307
}
306308
}
307309

308-
// Convert attribute names to proper html casing
309-
if (DASHED_ATTRS.test(name)) {
310-
name = transformAttr(name, '-');
311-
} else if (COLON_ATTRS.test(name)) {
312-
name = transformAttr(name, ':');
313-
} else if (!CAMEL_ATTRS.test(name)) {
314-
name = name.toLowerCase();
315-
}
316-
317310
s += ` ${name}="${encodeEntities(v)}"`;
318311
}
319312
}
@@ -442,6 +435,19 @@ function getFallbackComponentName(component) {
442435
}
443436
return name;
444437
}
438+
439+
function getAttributeNameInHtmlCase(name) {
440+
if (CAMEL_ATTRS.test(name)) return name;
441+
442+
if (DASHED_ATTRS.test(name))
443+
return name.replace(CAPITAL_REGEXP, (w) => '-' + w.toLowerCase());
444+
445+
if (COLON_ATTRS.test(name))
446+
return name.replace(CAPITAL_REGEXP, (w) => ':' + w.toLowerCase());
447+
448+
return name.toLowerCase();
449+
}
450+
445451
renderToString.shallowRender = shallowRender;
446452

447453
export default renderToString;

test/render.test.js

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,15 @@ describe('render', () => {
9696
expect(rendered).to.equal(expected);
9797
});
9898

99+
it('should decamelize bool attributes', () => {
100+
let rendered = render(
101+
<link rel="preconnect" href="https://foo.com" crossOrigin />
102+
),
103+
expected = `<link rel="preconnect" href="https://foo.com" crossorigin />`;
104+
105+
expect(rendered).to.equal(expected);
106+
});
107+
99108
it('should dasherize certain attributes', () => {
100109
let rendered = render(<meta httpEquiv="refresh" />),
101110
expected = `<meta http-equiv="refresh" />`;

0 commit comments

Comments
 (0)