@@ -128,10 +128,24 @@ return (function () {
128
128
return "[hx-" + verb + "], [data-hx-" + verb + "]"
129
129
} ) . join ( ", " ) ;
130
130
131
+ var HEAD_TAG_REGEX = newTagRegex ( 'head' ) ,
132
+ TITLE_TAG_REGEX = newTagRegex ( 'title' ) ,
133
+ SVG_TAGS_REGEX = newTagRegex ( 'svg' , true ) ;
134
+
131
135
//====================================================================
132
136
// Utilities
133
137
//====================================================================
134
138
139
+ /**
140
+ * @param {string } tag
141
+ * @param {boolean } global
142
+ * @returns {RegExp }
143
+ */
144
+ function newTagRegex ( tag , global = false ) {
145
+ return new RegExp ( `<${ tag } (\\s[^>]*>|>)([\\s\\S]*?)<\\/${ tag } >` ,
146
+ global ? 'gim' : 'im' ) ;
147
+ }
148
+
135
149
function parseInterval ( str ) {
136
150
if ( str == undefined ) {
137
151
return undefined
@@ -282,38 +296,41 @@ return (function () {
282
296
283
297
/**
284
298
*
285
- * @param {string } resp
299
+ * @param {string } response
286
300
* @returns {Element }
287
301
*/
288
- function makeFragment ( resp ) {
289
- var partialResponse = ! aFullPageResponse ( resp ) ;
302
+ function makeFragment ( response ) {
303
+ var partialResponse = ! aFullPageResponse ( response ) ;
304
+ var startTag = getStartTag ( response ) ;
305
+ var content = response ;
306
+ if ( startTag === 'head' ) {
307
+ content = content . replace ( HEAD_TAG_REGEX , '' ) ;
308
+ }
290
309
if ( htmx . config . useTemplateFragments && partialResponse ) {
291
- var documentFragment = parseHTML ( "<body><template>" + resp + "</template></body>" , 0 ) ;
310
+ var documentFragment = parseHTML ( "<body><template>" + content + "</template></body>" , 0 ) ;
292
311
// @ts -ignore type mismatch between DocumentFragment and Element.
293
312
// TODO: Are these close enough for htmx to use interchangeably?
294
313
return documentFragment . querySelector ( 'template' ) . content ;
295
- } else {
296
- var startTag = getStartTag ( resp ) ;
297
- switch ( startTag ) {
298
- case "thead" :
299
- case "tbody" :
300
- case "tfoot" :
301
- case "colgroup" :
302
- case "caption" :
303
- return parseHTML ( "<table>" + resp + "</table>" , 1 ) ;
304
- case "col" :
305
- return parseHTML ( "<table><colgroup>" + resp + "</colgroup></table>" , 2 ) ;
306
- case "tr" :
307
- return parseHTML ( "<table><tbody>" + resp + "</tbody></table>" , 2 ) ;
308
- case "td" :
309
- case "th" :
310
- return parseHTML ( "<table><tbody><tr>" + resp + "</tr></tbody></table>" , 3 ) ;
311
- case "script" :
312
- case "style" :
313
- return parseHTML ( "<div>" + resp + "</div>" , 1 ) ;
314
- default :
315
- return parseHTML ( resp , 0 ) ;
316
- }
314
+ }
315
+ switch ( startTag ) {
316
+ case "thead" :
317
+ case "tbody" :
318
+ case "tfoot" :
319
+ case "colgroup" :
320
+ case "caption" :
321
+ return parseHTML ( "<table>" + content + "</table>" , 1 ) ;
322
+ case "col" :
323
+ return parseHTML ( "<table><colgroup>" + content + "</colgroup></table>" , 2 ) ;
324
+ case "tr" :
325
+ return parseHTML ( "<table><tbody>" + content + "</tbody></table>" , 2 ) ;
326
+ case "td" :
327
+ case "th" :
328
+ return parseHTML ( "<table><tbody><tr>" + content + "</tr></tbody></table>" , 3 ) ;
329
+ case "script" :
330
+ case "style" :
331
+ return parseHTML ( "<div>" + content + "</div>" , 1 ) ;
332
+ default :
333
+ return parseHTML ( content , 0 ) ;
317
334
}
318
335
}
319
336
@@ -1097,9 +1114,8 @@ return (function () {
1097
1114
1098
1115
function findTitle ( content ) {
1099
1116
if ( content . indexOf ( '<title' ) > - 1 ) {
1100
- var contentWithSvgsRemoved = content . replace ( / < s v g ( \s [ ^ > ] * > | > ) ( [ \s \S ] * ?) < \/ s v g > / gim, '' ) ;
1101
- var result = contentWithSvgsRemoved . match ( / < t i t l e ( \s [ ^ > ] * > | > ) ( [ \s \S ] * ?) < \/ t i t l e > / im) ;
1102
-
1117
+ var contentWithSvgsRemoved = content . replace ( SVG_TAGS_REGEX , '' ) ;
1118
+ var result = contentWithSvgsRemoved . match ( TITLE_TAG_REGEX ) ;
1103
1119
if ( result ) {
1104
1120
return result [ 2 ] ;
1105
1121
}
0 commit comments