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