(l *xml.Lexer)
| 386 | } |
| 387 | |
| 388 | func (svg *svgParser) parseTag(l *xml.Lexer) *svgTag { |
| 389 | var root, parent *svgTag |
| 390 | for { |
| 391 | tt, data := l.Next() |
| 392 | if tt == xml.ErrorToken { |
| 393 | if l.Err() != io.EOF { |
| 394 | svg.err = l.Err() |
| 395 | } else { |
| 396 | svg.err = parse.NewErrorLexer(svg.z, "unexpected end-of-file") |
| 397 | } |
| 398 | break |
| 399 | } else if tt == xml.StartTagToken { |
| 400 | var attrNames []string |
| 401 | var attrs map[string]string |
| 402 | name := string(data[1:]) |
| 403 | tt, attrNames, attrs = svg.parseAttributes(l) |
| 404 | tag := &svgTag{ |
| 405 | parent: parent, |
| 406 | name: name, |
| 407 | attrNames: attrNames, |
| 408 | attrs: attrs, |
| 409 | } |
| 410 | |
| 411 | if parent == nil { |
| 412 | root = tag |
| 413 | } else { |
| 414 | parent.content = append(parent.content, tag) |
| 415 | } |
| 416 | |
| 417 | if tt == xml.StartTagCloseVoidToken { |
| 418 | if parent == nil { |
| 419 | break |
| 420 | } |
| 421 | } else { |
| 422 | parent = tag |
| 423 | } |
| 424 | |
| 425 | // Handle <style> being nested in <defs>. Adobe Illustrator |
| 426 | // does this, for example. |
| 427 | if name == "style" { |
| 428 | tt, data = l.Next() |
| 429 | if tt == xml.TextToken { |
| 430 | svg.parseStyle(data) |
| 431 | tt, data = l.Next() |
| 432 | } else { |
| 433 | svg.err = parse.NewErrorLexer(svg.z, "Bad style tag") |
| 434 | } |
| 435 | break |
| 436 | } |
| 437 | } else if tt == xml.EndTagToken { |
| 438 | if parent == nil { |
| 439 | break // when starting on an end tag |
| 440 | } |
| 441 | parent = parent.parent |
| 442 | if parent == nil { |
| 443 | break |
| 444 | } |
| 445 | } |
no test coverage detected