Skip to content

Commit

Permalink
[fix] render of svg elements when using svelte:element (#7695)
Browse files Browse the repository at this point in the history
* fixed render statement for svg when using  svelte:element

* removed unecessary stuff in test
  • Loading branch information
MathiasWP committed Sep 11, 2022
1 parent 1afcfd2 commit 6ec8ecf
Show file tree
Hide file tree
Showing 3 changed files with 116 additions and 2 deletions.
4 changes: 2 additions & 2 deletions src/compiler/compile/render_dom/wrappers/Element/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -504,9 +504,10 @@ export default class ElementWrapper extends Wrapper {

get_render_statement(block: Block) {
const { name, namespace, tag_expr } = this.node;
const reference = tag_expr.manipulate(block);

if (namespace === namespaces.svg) {
return x`@svg_element("${name}")`;
return x`@svg_element(${reference})`;
}

if (namespace) {
Expand All @@ -518,7 +519,6 @@ export default class ElementWrapper extends Wrapper {
return x`@element_is("${name}", ${is.render_chunks(block).reduce((lhs, rhs) => x`${lhs} + ${rhs}`)})`;
}

const reference = tag_expr.manipulate(block);
return x`@element(${reference})`;
}

Expand Down
111 changes: 111 additions & 0 deletions test/js/samples/svelte-element-svg/expected.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,111 @@
/* generated by Svelte vX.Y.Z */
import {
SvelteComponent,
append,
assign,
detach,
empty,
get_spread_update,
init,
insert,
noop,
safe_not_equal,
set_svg_attributes,
svg_element
} from "svelte/internal";

function create_dynamic_element_1(ctx) {
return { c: noop, m: noop, p: noop, d: noop };
}

// (1:0) <svelte:element this="svg" xmlns="http://www.w3.org/2000/svg">
function create_dynamic_element(ctx) {
let svelte_element1;
let svelte_element0;
let svelte_element0_levels = [{ xmlns: "http://www.w3.org/2000/svg" }];
let svelte_element0_data = {};

for (let i = 0; i < svelte_element0_levels.length; i += 1) {
svelte_element0_data = assign(svelte_element0_data, svelte_element0_levels[i]);
}

let svelte_element1_levels = [{ xmlns: "http://www.w3.org/2000/svg" }];
let svelte_element1_data = {};

for (let i = 0; i < svelte_element1_levels.length; i += 1) {
svelte_element1_data = assign(svelte_element1_data, svelte_element1_levels[i]);
}

return {
c() {
svelte_element1 = svg_element("svg");
svelte_element0 = svg_element("path");
set_svg_attributes(svelte_element0, svelte_element0_data);
set_svg_attributes(svelte_element1, svelte_element1_data);
},
m(target, anchor) {
insert(target, svelte_element1, anchor);
append(svelte_element1, svelte_element0);
},
p(ctx, dirty) {
set_svg_attributes(svelte_element0, svelte_element0_data = get_spread_update(svelte_element0_levels, [{ xmlns: "http://www.w3.org/2000/svg" }]));
set_svg_attributes(svelte_element1, svelte_element1_data = get_spread_update(svelte_element1_levels, [{ xmlns: "http://www.w3.org/2000/svg" }]));
},
d(detaching) {
if (detaching) detach(svelte_element1);
}
};
}

function create_fragment(ctx) {
let previous_tag = "svg";
let svelte_element1_anchor;
let svelte_element1 = "svg" && create_dynamic_element(ctx);

return {
c() {
if (svelte_element1) svelte_element1.c();
svelte_element1_anchor = empty();
},
m(target, anchor) {
if (svelte_element1) svelte_element1.m(target, anchor);
insert(target, svelte_element1_anchor, anchor);
},
p(ctx, [dirty]) {
if ("svg") {
if (!previous_tag) {
svelte_element1 = create_dynamic_element(ctx);
svelte_element1.c();
svelte_element1.m(svelte_element1_anchor.parentNode, svelte_element1_anchor);
} else if (safe_not_equal(previous_tag, "svg")) {
svelte_element1.d(1);
svelte_element1 = create_dynamic_element(ctx);
svelte_element1.c();
svelte_element1.m(svelte_element1_anchor.parentNode, svelte_element1_anchor);
} else {
svelte_element1.p(ctx, dirty);
}
} else if (previous_tag) {
svelte_element1.d(1);
svelte_element1 = null;
}

previous_tag = "svg";
},
i: noop,
o: noop,
d(detaching) {
if (detaching) detach(svelte_element1_anchor);
if (svelte_element1) svelte_element1.d(detaching);
}
};
}

class Component extends SvelteComponent {
constructor(options) {
super();
init(this, options, null, create_fragment, safe_not_equal, {});
}
}

export default Component;
3 changes: 3 additions & 0 deletions test/js/samples/svelte-element-svg/input.svelte
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
<svelte:element this="svg" xmlns="http://www.w3.org/2000/svg">
<svelte:element this="path" xmlns="http://www.w3.org/2000/svg"></svelte:element>
</svelte:element>

0 comments on commit 6ec8ecf

Please sign in to comment.