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(init))
100 rtr := NewReadTillReader(str, []byte(fin))
101 bs, err := ioutil.ReadAll(rtr)
102 check(err)
103 return string(bs)
104}