Skip to content

Commit 95c4655

Browse files
authored
feat: make preserveComments effective in DOM renderer (#7182)
1 parent 91e8dfc commit 95c4655

File tree

10 files changed

+150
-2
lines changed

10 files changed

+150
-2
lines changed
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
import Renderer from '../Renderer';
2+
import Block from '../Block';
3+
import Comment from '../../nodes/Comment';
4+
import Wrapper from './shared/Wrapper';
5+
import { x } from 'code-red';
6+
import { Identifier } from 'estree';
7+
8+
export default class CommentWrapper extends Wrapper {
9+
node: Comment;
10+
var: Identifier;
11+
12+
constructor(
13+
renderer: Renderer,
14+
block: Block,
15+
parent: Wrapper,
16+
node: Comment
17+
) {
18+
super(renderer, block, parent, node);
19+
this.var = x`c` as Identifier;
20+
}
21+
22+
render(block: Block, parent_node: Identifier, parent_nodes: Identifier) {
23+
if (!this.renderer.options.preserveComments) return;
24+
25+
const string_literal = {
26+
type: 'Literal',
27+
value: this.node.data,
28+
loc: {
29+
start: this.renderer.locate(this.node.start),
30+
end: this.renderer.locate(this.node.end)
31+
}
32+
};
33+
34+
block.add_element(
35+
this.var,
36+
x`@comment(${string_literal})`,
37+
parent_nodes && x`@claim_comment(${parent_nodes}, ${string_literal})`,
38+
parent_node
39+
);
40+
}
41+
}

src/compiler/compile/render_dom/wrappers/Fragment.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import RawMustacheTag from './RawMustacheTag';
1414
import Slot from './Slot';
1515
import SlotTemplate from './SlotTemplate';
1616
import Text from './Text';
17+
import Comment from './Comment';
1718
import Title from './Title';
1819
import Window from './Window';
1920
import { INode } from '../../nodes/interfaces';
@@ -27,7 +28,7 @@ import { regex_starts_with_whitespace } from '../../../utils/patterns';
2728
const wrappers = {
2829
AwaitBlock,
2930
Body,
30-
Comment: null,
31+
Comment,
3132
DebugTag,
3233
Document,
3334
EachBlock,
@@ -118,7 +119,7 @@ export default class FragmentWrapper {
118119
link(last_child, last_child = wrapper);
119120
} else {
120121
const Wrapper = wrappers[child.type];
121-
if (!Wrapper) continue;
122+
if (!Wrapper || (child.type === 'Comment' && !renderer.options.preserveComments)) continue;
122123

123124
const wrapper = new Wrapper(renderer, block, parent, child, strip_whitespace, last_child || next_sibling);
124125
this.nodes.unshift(wrapper);

src/runtime/internal/dom.ts

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -254,6 +254,10 @@ export function empty() {
254254
return text('');
255255
}
256256

257+
export function comment(content: string) {
258+
return document.createComment(content);
259+
}
260+
257261
export function listen(node: EventTarget, event: string, handler: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions | EventListenerOptions) {
258262
node.addEventListener(event, handler, options);
259263
return () => node.removeEventListener(event, handler, options);
@@ -550,6 +554,19 @@ export function claim_space(nodes) {
550554
return claim_text(nodes, ' ');
551555
}
552556

557+
export function claim_comment(nodes:ChildNodeArray, data) {
558+
return claim_node<Comment>(
559+
nodes,
560+
(node: ChildNode): node is Comment => node.nodeType === 8,
561+
(node: Comment) => {
562+
node.data = '' + data;
563+
return undefined;
564+
},
565+
() => comment(data),
566+
true
567+
);
568+
}
569+
553570
function find_comment(nodes, text, start) {
554571
for (let i = start; i < nodes.length; i += 1) {
555572
const node = nodes[i];
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
<div><!-- test1 --><!-- test2 --></div>
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
<div><!-- test1 --></div>
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
export default {
2+
compileOptions: {
3+
preserveComments:true
4+
},
5+
snapshot(target) {
6+
const div = target.querySelector('div');
7+
8+
return {
9+
div,
10+
comment: div.childNodes[0]
11+
};
12+
},
13+
14+
test(assert, target, snapshot) {
15+
const div = target.querySelector('div');
16+
assert.equal(div, snapshot.div);
17+
assert.equal(div.childNodes[0], snapshot.comment);
18+
assert.equal(div.childNodes[1].nodeType, 8);
19+
}
20+
};
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
<div><!-- test1 --><!-- test2 --></div>
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
export default {
2+
options: {
3+
preserveComments: true
4+
}
5+
};
Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
/* generated by Svelte vX.Y.Z */
2+
import {
3+
SvelteComponent,
4+
comment,
5+
detach,
6+
element,
7+
init,
8+
insert,
9+
noop,
10+
safe_not_equal,
11+
space
12+
} from "svelte/internal";
13+
14+
function create_fragment(ctx) {
15+
let div0;
16+
let t1;
17+
let c;
18+
let t2;
19+
let div1;
20+
21+
return {
22+
c() {
23+
div0 = element("div");
24+
div0.textContent = "content";
25+
t1 = space();
26+
c = comment(" comment ");
27+
t2 = space();
28+
div1 = element("div");
29+
div1.textContent = "more content";
30+
},
31+
m(target, anchor) {
32+
insert(target, div0, anchor);
33+
insert(target, t1, anchor);
34+
insert(target, c, anchor);
35+
insert(target, t2, anchor);
36+
insert(target, div1, anchor);
37+
},
38+
p: noop,
39+
i: noop,
40+
o: noop,
41+
d(detaching) {
42+
if (detaching) detach(div0);
43+
if (detaching) detach(t1);
44+
if (detaching) detach(c);
45+
if (detaching) detach(t2);
46+
if (detaching) detach(div1);
47+
}
48+
};
49+
}
50+
51+
class Component extends SvelteComponent {
52+
constructor(options) {
53+
super();
54+
init(this, options, null, create_fragment, safe_not_equal, {});
55+
}
56+
}
57+
58+
export default Component;
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
<div>content</div>
2+
<!-- comment -->
3+
<div>more content</div>

0 commit comments

Comments
 (0)