@@ -2136,28 +2136,31 @@ func parseForeignContent(p *parser) bool {
2136
2136
Data : p .tok .Data ,
2137
2137
})
2138
2138
case StartTagToken :
2139
- b := breakout [p .tok .Data ]
2140
- if p .tok .DataAtom == a .Font {
2141
- loop:
2142
- for _ , attr := range p .tok .Attr {
2143
- switch attr .Key {
2144
- case "color" , "face" , "size" :
2145
- b = true
2146
- break loop
2139
+ if ! p .fragment {
2140
+ b := breakout [p .tok .Data ]
2141
+ if p .tok .DataAtom == a .Font {
2142
+ loop:
2143
+ for _ , attr := range p .tok .Attr {
2144
+ switch attr .Key {
2145
+ case "color" , "face" , "size" :
2146
+ b = true
2147
+ break loop
2148
+ }
2147
2149
}
2148
2150
}
2149
- }
2150
- if b {
2151
- for i := len ( p .oe ) - 1 ; i >= 0 ; i -- {
2152
- n := p . oe [ i ]
2153
- if n . Namespace == "" || htmlIntegrationPoint ( n ) || mathMLTextIntegrationPoint ( n ) {
2154
- p . oe = p . oe [: i + 1 ]
2155
- break
2151
+ if b {
2152
+ for i := len ( p . oe ) - 1 ; i >= 0 ; i -- {
2153
+ n := p .oe [ i ]
2154
+ if n . Namespace == "" || htmlIntegrationPoint ( n ) || mathMLTextIntegrationPoint ( n ) {
2155
+ p . oe = p . oe [: i + 1 ]
2156
+ break
2157
+ }
2156
2158
}
2159
+ return false
2157
2160
}
2158
- return false
2159
2161
}
2160
- switch p .top ().Namespace {
2162
+ current := p .adjustedCurrentNode ()
2163
+ switch current .Namespace {
2161
2164
case "math" :
2162
2165
adjustAttributeNames (p .tok .Attr , mathMLAttributeAdjustments )
2163
2166
case "svg" :
@@ -2172,7 +2175,7 @@ func parseForeignContent(p *parser) bool {
2172
2175
panic ("html: bad parser state: unexpected namespace" )
2173
2176
}
2174
2177
adjustForeignAttributes (p .tok .Attr )
2175
- namespace := p . top () .Namespace
2178
+ namespace := current .Namespace
2176
2179
p .addElement ()
2177
2180
p .top ().Namespace = namespace
2178
2181
if namespace != "" {
@@ -2201,12 +2204,20 @@ func parseForeignContent(p *parser) bool {
2201
2204
return true
2202
2205
}
2203
2206
2207
+ // Section 12.2.4.2.
2208
+ func (p * parser ) adjustedCurrentNode () * Node {
2209
+ if len (p .oe ) == 1 && p .fragment && p .context != nil {
2210
+ return p .context
2211
+ }
2212
+ return p .oe .top ()
2213
+ }
2214
+
2204
2215
// Section 12.2.6.
2205
2216
func (p * parser ) inForeignContent () bool {
2206
2217
if len (p .oe ) == 0 {
2207
2218
return false
2208
2219
}
2209
- n := p .oe [ len ( p . oe ) - 1 ]
2220
+ n := p .adjustedCurrentNode ()
2210
2221
if n .Namespace == "" {
2211
2222
return false
2212
2223
}
@@ -2364,14 +2375,18 @@ func ParseFragmentWithOptions(r io.Reader, context *Node, opts ...ParseOption) (
2364
2375
contextTag = context .DataAtom .String ()
2365
2376
}
2366
2377
p := & parser {
2367
- tokenizer : NewTokenizerFragment (r , contextTag ),
2368
2378
doc : & Node {
2369
2379
Type : DocumentNode ,
2370
2380
},
2371
2381
scripting : true ,
2372
2382
fragment : true ,
2373
2383
context : context ,
2374
2384
}
2385
+ if context != nil && context .Namespace != "" {
2386
+ p .tokenizer = NewTokenizer (r )
2387
+ } else {
2388
+ p .tokenizer = NewTokenizerFragment (r , contextTag )
2389
+ }
2375
2390
2376
2391
for _ , f := range opts {
2377
2392
f (p )
0 commit comments