svg.go 912 B

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. package svg
  2. import (
  3. "bytes"
  4. "io"
  5. "strings"
  6. "github.com/tdewolff/parse/v2"
  7. "github.com/tdewolff/parse/v2/xml"
  8. )
  9. func Satitize(data []byte) ([]byte, error) {
  10. r := bytes.NewReader(data)
  11. l := xml.NewLexer(parse.NewInput(r))
  12. buf := new(bytes.Buffer)
  13. buf.Grow(len(data))
  14. ignoreTag := 0
  15. for {
  16. tt, tdata := l.Next()
  17. if ignoreTag > 0 {
  18. switch tt {
  19. case xml.EndTagToken, xml.StartTagCloseVoidToken:
  20. ignoreTag--
  21. case xml.StartTagToken:
  22. ignoreTag++
  23. }
  24. continue
  25. }
  26. switch tt {
  27. case xml.ErrorToken:
  28. if l.Err() != io.EOF {
  29. return nil, l.Err()
  30. }
  31. return buf.Bytes(), nil
  32. case xml.StartTagToken:
  33. if strings.ToLower(string(l.Text())) == "script" {
  34. ignoreTag++
  35. continue
  36. }
  37. buf.Write(tdata)
  38. case xml.AttributeToken:
  39. if strings.ToLower(string(l.Text())) == "onload" {
  40. continue
  41. }
  42. buf.Write(tdata)
  43. default:
  44. buf.Write(tdata)
  45. }
  46. }
  47. }