use bytes.Buffer instead

This commit is contained in:
Nazar Kanaev 2022-02-14 11:05:38 +00:00
parent 4c0726412b
commit 18221ef12d

View File

@ -2,11 +2,11 @@ package parser
import ( import (
"bufio" "bufio"
"bytes"
"encoding/xml" "encoding/xml"
"io" "io"
"regexp" "regexp"
"strings" "strings"
"unicode/utf8"
"golang.org/x/net/html/charset" "golang.org/x/net/html/charset"
) )
@ -37,50 +37,34 @@ func xmlDecoder(r io.Reader) *xml.Decoder {
} }
type safexmlreader struct { type safexmlreader struct {
reader *bufio.Reader reader *bufio.Reader
buffer []byte buffer *bytes.Buffer
isEOF bool
runebuf []byte
} }
func NewSafeXMLReader(r io.Reader) io.Reader { func NewSafeXMLReader(r io.Reader) io.Reader {
return &safexmlreader{ return &safexmlreader{
reader: bufio.NewReader(r), reader: bufio.NewReader(r),
runebuf: make([]byte, 6), buffer: bytes.NewBuffer(make([]byte, 0, 4096)),
} }
} }
func (xr *safexmlreader) Read(p []byte) (int, error) { func (xr *safexmlreader) Read(p []byte) (int, error) {
if len(p) == 0 { for xr.buffer.Len() < cap(p) {
return 0, nil
}
for len(xr.buffer) < cap(p) {
r, _, err := xr.reader.ReadRune() r, _, err := xr.reader.ReadRune()
if err == io.EOF { if err == io.EOF {
xr.isEOF = true if xr.buffer.Len() == 0 {
return 0, io.EOF
}
break break
} }
if err != nil { if err != nil {
return 0, err return 0, err
} }
if isInCharacterRange(r) { if isInCharacterRange(r) {
size := utf8.EncodeRune(xr.runebuf, r) xr.buffer.WriteRune(r)
xr.buffer = append(xr.buffer, xr.runebuf[:size]...)
} }
} }
return xr.buffer.Read(p)
if xr.isEOF && len(xr.buffer) == 0 {
return 0, io.EOF
}
n := cap(p)
if len(xr.buffer) < n {
n = len(xr.buffer)
}
copy(p, xr.buffer[:n])
xr.buffer = xr.buffer[n:]
return n, nil
} }
// NOTE: copied from "encoding/xml" package // NOTE: copied from "encoding/xml" package