package tequat import ( "bufio" "bytes" "io" ) func parseTextPlain(r io.Reader) (TQA, error) { var atoms []Atom buf := new(bytes.Buffer) var bufis int const ( bufisNone = iota bufisText bufisQuote ) flush := func() { defer func() { buf.Reset() bufis = bufisNone }() switch bufis { case bufisText: atoms = append(atoms, Text{buf.String()}) case bufisQuote: atoms = append(atoms, Quote{buf.String()}) default: if buf.Len() > 0 { panic("unreachable") } } } scanner := bufio.NewScanner(r) for scanner.Scan() { token := scanner.Bytes() is := bufisText if len(token) > 0 && token[0] == '>' { is = bufisQuote token = token[1:] } if bufis != is { flush() } bufis = is buf.Write(token) buf.WriteRune('\n') } flush() return TQA(atoms).Normalised(), scanner.Err() }