Skip to content

Commit 36a3c84

Browse files
committed
chore: move create elements, text, comment etc to operations
1 parent a78111f commit 36a3c84

File tree

2 files changed

+55
-21
lines changed

2 files changed

+55
-21
lines changed

packages/svelte/src/internal/client/dom/operations.js

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -204,3 +204,44 @@ export function sibling(node, count = 1, is_text = false) {
204204
export function clear_text_content(node) {
205205
node.textContent = '';
206206
}
207+
208+
/**
209+
*
210+
* @param {string} tag
211+
* @param {string} [namespace]
212+
* @param {string} [is]
213+
* @returns
214+
*/
215+
export function create_element(tag, namespace, is) {
216+
let options = is ? { is } : undefined;
217+
if (namespace) {
218+
return document.createElementNS(namespace, tag, options);
219+
}
220+
return document.createElement(tag, options);
221+
}
222+
223+
export function create_fragment() {
224+
return document.createDocumentFragment();
225+
}
226+
227+
/**
228+
* @param {string} data
229+
* @returns
230+
*/
231+
export function create_comment(data = '') {
232+
return document.createComment(data);
233+
}
234+
235+
/**
236+
* @param {Element} element
237+
* @param {string} key
238+
* @param {string} value
239+
* @returns
240+
*/
241+
export function set_attribute(element, key, value = '') {
242+
if (key.startsWith('xlink:')) {
243+
element.setAttributeNS('http://www.w3.org/1999/xlink', key, value);
244+
return;
245+
}
246+
return element.setAttribute(key, value);
247+
}

packages/svelte/src/internal/client/dom/template.js

Lines changed: 14 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,14 @@
11
/** @import { Effect, TemplateNode } from '#client' */
22
import { hydrate_next, hydrate_node, hydrating, set_hydrate_node } from './hydration.js';
3-
import { create_text, get_first_child, is_firefox } from './operations.js';
3+
import {
4+
create_text,
5+
get_first_child,
6+
is_firefox,
7+
create_element,
8+
create_fragment,
9+
create_comment,
10+
set_attribute
11+
} from './operations.js';
412
import { create_fragment_from_html } from './reconciler.js';
513
import { active_effect } from '../runtime.js';
614
import {
@@ -79,14 +87,14 @@ export function template(content, flags) {
7987
* @param {Array<string | undefined>} [namespace_stack]
8088
*/
8189
function structure_to_fragment(structure, ns, namespace_stack = [], foreign_object_count = 0) {
82-
var fragment = document.createDocumentFragment();
90+
var fragment = create_fragment();
8391
for (var i = 0; i < structure.length; i += 1) {
8492
var item = structure[i];
8593
if (item == null || Array.isArray(item)) {
8694
const data = item ? item[0] : '';
87-
fragment.insertBefore(document.createComment(data), null);
95+
fragment.insertBefore(create_comment(data), null);
8896
} else if (typeof item === 'string') {
89-
fragment.appendChild(document.createTextNode(item));
97+
fragment.appendChild(create_text(item));
9098
continue;
9199
} else {
92100
let namespace =
@@ -107,25 +115,10 @@ function structure_to_fragment(structure, ns, namespace_stack = [], foreign_obje
107115
if (namespace !== namespace_stack[namespace_stack.length - 1]) {
108116
namespace_stack.push(namespace);
109117
}
110-
var args = [item.e];
111-
if (item.is) {
112-
// @ts-ignore
113-
args.push({ is: item.is });
114-
}
115-
if (namespace) {
116-
args.unshift(namespace);
117-
}
118-
var element = /** @type {HTMLElement} */ (
119-
// @ts-ignore
120-
(namespace ? document.createElementNS : document.createElement).call(document, ...args)
121-
);
118+
var element = create_element(item.e, namespace, item.is);
122119

123120
for (var key in item.p) {
124-
if (key.startsWith('xlink:')) {
125-
element.setAttributeNS('http://www.w3.org/1999/xlink', key, item.p[key] ?? '');
126-
continue;
127-
}
128-
element.setAttribute(key, item.p[key] ?? '');
121+
set_attribute(element, key, item.p[key]);
129122
}
130123
if (item.c) {
131124
(element.tagName === 'TEMPLATE'

0 commit comments

Comments
 (0)