arnaucube
arnaucube/konstruiPublic Self-hosted repository
konstrui/extractText.go
extractText.goRaw
  1package main
  2
  3import (
  4	"bufio"
  5	"bytes"
  6	"io"
  7	"io/ioutil"
  8	"strings"
  9)
 10
 11type SkipTillReader struct {
 12	rdr   *bufio.Reader
 13	delim []byte
 14	found bool
 15}
 16
 17func NewSkipTillReader(reader io.Reader, delim []byte) *SkipTillReader {
 18	return &SkipTillReader{
 19		rdr:   bufio.NewReader(reader),
 20		delim: delim,
 21		found: false,
 22	}
 23}
 24
 25func (str *SkipTillReader) Read(p []byte) (n int, err error) {
 26	if str.found {
 27		return str.rdr.Read(p)
 28	} else {
 29		// search byte by byte for the delimiter
 30	outer:
 31		for {
 32			for i := range str.delim {
 33				var c byte
 34				c, err = str.rdr.ReadByte()
 35				if err != nil {
 36					n = 0
 37					return
 38				}
 39				// doens't match so start over
 40				if str.delim[i] != c {
 41					continue outer
 42				}
 43			}
 44			str.found = true
 45			// we read the delimiter so add it back
 46			str.rdr = bufio.NewReader(io.MultiReader(bytes.NewReader(str.delim), str.rdr))
 47			return str.Read(p)
 48		}
 49	}
 50}
 51
 52type ReadTillReader struct {
 53	rdr   *bufio.Reader
 54	delim []byte
 55	found bool
 56}
 57
 58func NewReadTillReader(reader io.Reader, delim []byte) *ReadTillReader {
 59	return &ReadTillReader{
 60		rdr:   bufio.NewReader(reader),
 61		delim: delim,
 62		found: false,
 63	}
 64}
 65
 66func (rtr *ReadTillReader) Read(p []byte) (n int, err error) {
 67	if rtr.found {
 68		return 0, io.EOF
 69	} else {
 70	outer:
 71		for n < len(p) {
 72			for i := range rtr.delim {
 73				var c byte
 74				c, err = rtr.rdr.ReadByte()
 75				if err != nil && n > 0 {
 76					err = nil
 77					return
 78				} else if err != nil {
 79					return
 80				}
 81				p[n] = c
 82				n++
 83				if rtr.delim[i] != c {
 84					continue outer
 85				}
 86			}
 87			rtr.found = true
 88			break
 89		}
 90		if n == 0 {
 91			err = io.EOF
 92		}
 93		return
 94	}
 95}
 96
 97func extractText(original string, init string, fin string) string {
 98	contentReader := strings.NewReader(original)
 99	str := NewSkipTillReader(contentReader, []byte("<konstrui-repeat"))
100	rtr := NewReadTillReader(str, []byte("</konstrui-repeat>"))
101	bs, err := ioutil.ReadAll(rtr)
102	check(err)
103	return string(bs)
104}