Skip to content

Commit 3468c73

Browse files
authored
Merge pull request #13 from wildlyinaccurate/render-svg-tags
SVG XLink attributes are rendered incorrectly
2 parents 3a50238 + fe97be3 commit 3468c73

File tree

2 files changed

+22
-2
lines changed

2 files changed

+22
-2
lines changed

src/index.js

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ let shallowRender = (vnode, context) => renderToString(vnode, context, SHALLOW);
4949

5050

5151
/** The default export is an alias of `render()`. */
52-
export default function renderToString(vnode, context, opts, inner) {
52+
export default function renderToString(vnode, context, opts, inner, isSvgMode) {
5353
let { nodeName, attributes, children } = vnode || EMPTY,
5454
isComponent = false;
5555
context = context || {};
@@ -117,6 +117,9 @@ export default function renderToString(vnode, context, opts, inner) {
117117
if (attributes['class']) continue;
118118
name = 'class';
119119
}
120+
else if (isSvgMode && name.match(/^xlink\:?(.+)/)) {
121+
name = name.toLowerCase().replace(/^xlink\:?(.+)/, 'xlink:$1')
122+
}
120123

121124
if (name==='class' && v && typeof v==='object') {
122125
v = hashToClassName(v);
@@ -169,7 +172,8 @@ export default function renderToString(vnode, context, opts, inner) {
169172
for (let i=0; i<len; i++) {
170173
let child = children[i];
171174
if (!falsey(child)) {
172-
let ret = renderToString(child, context, opts, true);
175+
let childSvgMode = nodeName==='svg' ? true : nodeName==='foreignObject' ? false : isSvgMode,
176+
ret = renderToString(child, context, opts, true, childSvgMode);
173177
if (!hasLarge && pretty && isLargeString(ret)) hasLarge = true;
174178
pieces.push(ret);
175179
}

test/render.js

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,22 @@ describe('render', () => {
7171

7272
expect(rendered).to.equal(expected);
7373
});
74+
75+
it('should render SVG elements', () => {
76+
let rendered = render((
77+
<svg>
78+
<image xlinkHref="#" />
79+
<foreignObject>
80+
<div xlinkHref="#" />
81+
</foreignObject>
82+
<g>
83+
<image xlinkHref="#" />
84+
</g>
85+
</svg>
86+
));
87+
88+
expect(rendered).to.equal(`<svg><image xlink:href="#"></image><foreignObject><div xlinkHref="#"></div></foreignObject><g><image xlink:href="#"></image></g></svg>`);
89+
});
7490
});
7591

7692
describe('Functional Components', () => {

0 commit comments

Comments
 (0)