@@ -16,7 +16,9 @@ import {
1616 NAMESPACE_MATHML ,
1717 NAMESPACE_SVG ,
1818 TEMPLATE_FRAGMENT ,
19- TEMPLATE_USE_IMPORT_NODE
19+ TEMPLATE_USE_IMPORT_NODE ,
20+ TEMPLATE_USE_MATHML ,
21+ TEMPLATE_USE_SVG
2022} from '../../../constants.js' ;
2123
2224/**
@@ -37,7 +39,7 @@ export function assign_nodes(start, end) {
3739 * @returns {() => Node | Node[] }
3840 */
3941/*#__NO_SIDE_EFFECTS__*/
40- export function template ( content , flags ) {
42+ export function from_html ( content , flags ) {
4143 var is_fragment = ( flags & TEMPLATE_FRAGMENT ) !== 0 ;
4244 var use_import_node = ( flags & TEMPLATE_USE_IMPORT_NODE ) !== 0 ;
4345
@@ -77,99 +79,6 @@ export function template(content, flags) {
7779 return clone ;
7880 } ;
7981}
80- /**
81- * @param {TemplateStructure[] } structure
82- * @param {NAMESPACE_SVG | NAMESPACE_MATHML | undefined } [ns]
83- */
84- function structure_to_fragment ( structure , ns ) {
85- var fragment = create_fragment ( ) ;
86-
87- for ( var item of structure ) {
88- if ( typeof item === 'string' ) {
89- fragment . append ( create_text ( item ) ) ;
90- continue ;
91- }
92-
93- // if `preserveComments === true`, comments are represented as `['// <data>']`
94- if ( item === undefined || item [ 0 ] [ 0 ] === '/' ) {
95- fragment . append ( create_comment ( item ? item [ 0 ] . slice ( 3 ) : '' ) ) ;
96- continue ;
97- }
98-
99- const [ name , attributes , ...children ] = item ;
100-
101- const namespace = name === 'svg' ? NAMESPACE_SVG : name === 'math' ? NAMESPACE_MATHML : ns ;
102-
103- var element = create_element ( name , namespace , attributes ?. is ) ;
104-
105- for ( var key in attributes ) {
106- set_attribute ( element , key , attributes [ key ] ) ;
107- }
108-
109- if ( children . length > 0 ) {
110- var target =
111- element . tagName === 'TEMPLATE'
112- ? /** @type {HTMLTemplateElement } */ ( element ) . content
113- : element ;
114-
115- target . append (
116- structure_to_fragment ( children , element . tagName === 'foreignObject' ? undefined : namespace )
117- ) ;
118- }
119-
120- fragment . append ( element ) ;
121- }
122-
123- return fragment ;
124- }
125-
126- /**
127- * @param {Array<TemplateStructure> } structure
128- * @param {number } flags
129- * @returns {() => Node | Node[] }
130- */
131- /*#__NO_SIDE_EFFECTS__*/
132- export function template_fn ( structure , flags ) {
133- var is_fragment = ( flags & TEMPLATE_FRAGMENT ) !== 0 ;
134- var use_import_node = ( flags & TEMPLATE_USE_IMPORT_NODE ) !== 0 ;
135-
136- /** @type {Node } */
137- var node ;
138-
139- return ( ) => {
140- if ( hydrating ) {
141- assign_nodes ( hydrate_node , null ) ;
142- return hydrate_node ;
143- }
144-
145- if ( node === undefined ) {
146- node = structure_to_fragment ( structure ) ;
147- if ( ! is_fragment ) node = /** @type {Node } */ ( get_first_child ( node ) ) ;
148- }
149-
150- var clone = /** @type {TemplateNode } */ (
151- use_import_node || is_firefox ? document . importNode ( node , true ) : node . cloneNode ( true )
152- ) ;
153-
154- if ( is_fragment ) {
155- var start = /** @type {TemplateNode } */ ( get_first_child ( clone ) ) ;
156- var end = /** @type {TemplateNode } */ ( clone . lastChild ) ;
157-
158- assign_nodes ( start , end ) ;
159- } else {
160- assign_nodes ( clone , clone ) ;
161- }
162-
163- return clone ;
164- } ;
165- }
166-
167- /**
168- * @param {() => Element | DocumentFragment } fn
169- */
170- export function with_script ( fn ) {
171- return ( ) => run_scripts ( fn ( ) ) ;
172- }
17382
17483/**
17584 * @param {string } content
@@ -178,7 +87,7 @@ export function with_script(fn) {
17887 * @returns {() => Node | Node[] }
17988 */
18089/*#__NO_SIDE_EFFECTS__*/
181- export function ns_template ( content , flags , ns = 'svg' ) {
90+ function from_namespace ( content , flags , ns = 'svg' ) {
18291 /**
18392 * Whether or not the first item is a text/element node. If not, we need to
18493 * create an additional comment node to act as `effect.nodes.start`
@@ -227,14 +136,78 @@ export function ns_template(content, flags, ns = 'svg') {
227136}
228137
229138/**
230- * @param {Array<TemplateStructure> } structure
139+ * @param {string } content
140+ * @param {number } flags
141+ */
142+ /*#__NO_SIDE_EFFECTS__*/
143+ export function from_svg ( content , flags ) {
144+ return from_namespace ( content , flags , 'svg' ) ;
145+ }
146+
147+ /**
148+ * @param {string } content
149+ * @param {number } flags
150+ */
151+ /*#__NO_SIDE_EFFECTS__*/
152+ export function from_mathml ( content , flags ) {
153+ return from_namespace ( content , flags , 'math' ) ;
154+ }
155+
156+ /**
157+ * @param {TemplateStructure[] } structure
158+ * @param {NAMESPACE_SVG | NAMESPACE_MATHML | undefined } [ns]
159+ */
160+ function fragment_from_tree ( structure , ns ) {
161+ var fragment = create_fragment ( ) ;
162+
163+ for ( var item of structure ) {
164+ if ( typeof item === 'string' ) {
165+ fragment . append ( create_text ( item ) ) ;
166+ continue ;
167+ }
168+
169+ // if `preserveComments === true`, comments are represented as `['// <data>']`
170+ if ( item === undefined || item [ 0 ] [ 0 ] === '/' ) {
171+ fragment . append ( create_comment ( item ? item [ 0 ] . slice ( 3 ) : '' ) ) ;
172+ continue ;
173+ }
174+
175+ const [ name , attributes , ...children ] = item ;
176+
177+ const namespace = name === 'svg' ? NAMESPACE_SVG : name === 'math' ? NAMESPACE_MATHML : ns ;
178+
179+ var element = create_element ( name , namespace , attributes ?. is ) ;
180+
181+ for ( var key in attributes ) {
182+ set_attribute ( element , key , attributes [ key ] ) ;
183+ }
184+
185+ if ( children . length > 0 ) {
186+ var target =
187+ element . tagName === 'TEMPLATE'
188+ ? /** @type {HTMLTemplateElement } */ ( element ) . content
189+ : element ;
190+
191+ target . append (
192+ fragment_from_tree ( children , element . tagName === 'foreignObject' ? undefined : namespace )
193+ ) ;
194+ }
195+
196+ fragment . append ( element ) ;
197+ }
198+
199+ return fragment ;
200+ }
201+
202+ /**
203+ * @param {TemplateStructure[] } structure
231204 * @param {number } flags
232- * @param {'svg' | 'math' } ns
233205 * @returns {() => Node | Node[] }
234206 */
235207/*#__NO_SIDE_EFFECTS__*/
236- export function ns_template_fn ( structure , flags , ns = 'svg' ) {
208+ export function from_tree ( structure , flags ) {
237209 var is_fragment = ( flags & TEMPLATE_FRAGMENT ) !== 0 ;
210+ var use_import_node = ( flags & TEMPLATE_USE_IMPORT_NODE ) !== 0 ;
238211
239212 /** @type {Node } */
240213 var node ;
@@ -246,11 +219,20 @@ export function ns_template_fn(structure, flags, ns = 'svg') {
246219 }
247220
248221 if ( node === undefined ) {
249- node = structure_to_fragment ( structure , ns === 'svg' ? NAMESPACE_SVG : NAMESPACE_MATHML ) ;
222+ const ns =
223+ ( flags & TEMPLATE_USE_SVG ) !== 0
224+ ? NAMESPACE_SVG
225+ : ( flags & TEMPLATE_USE_MATHML ) !== 0
226+ ? NAMESPACE_MATHML
227+ : undefined ;
228+
229+ node = fragment_from_tree ( structure , ns ) ;
250230 if ( ! is_fragment ) node = /** @type {Node } */ ( get_first_child ( node ) ) ;
251231 }
252232
253- var clone = /** @type {TemplateNode } */ ( node . cloneNode ( true ) ) ;
233+ var clone = /** @type {TemplateNode } */ (
234+ use_import_node || is_firefox ? document . importNode ( node , true ) : node . cloneNode ( true )
235+ ) ;
254236
255237 if ( is_fragment ) {
256238 var start = /** @type {TemplateNode } */ ( get_first_child ( clone ) ) ;
@@ -266,23 +248,10 @@ export function ns_template_fn(structure, flags, ns = 'svg') {
266248}
267249
268250/**
269- * @param {string } content
270- * @param {number } flags
271- * @returns {() => Node | Node[] }
272- */
273- /*#__NO_SIDE_EFFECTS__*/
274- export function mathml_template ( content , flags ) {
275- return ns_template ( content , flags , 'math' ) ;
276- }
277-
278- /**
279- * @param {Array<TemplateStructure> } structure
280- * @param {number } flags
281- * @returns {() => Node | Node[] }
251+ * @param {() => Element | DocumentFragment } fn
282252 */
283- /*#__NO_SIDE_EFFECTS__*/
284- export function mathml_template_fn ( structure , flags ) {
285- return ns_template_fn ( structure , flags , 'math' ) ;
253+ export function with_script ( fn ) {
254+ return ( ) => run_scripts ( fn ( ) ) ;
286255}
287256
288257/**
0 commit comments