package gemtext import ( "bufio" "io" ) // Parse parses the full contents of an io.Reader into a gemtext.Document. func Parse(input io.Reader) (Document, error) { rdr := bufio.NewReader(input) var lines []Line inPFT := false for { raw, err := rdr.ReadBytes('\n') if err != io.EOF && err != nil { return nil, err } var line Line if inPFT && (len(raw) < 3 || raw[0] != '`' || raw[1] != '`' || raw[2] != '`') { line = PreformattedTextLine{raw: raw} } else { line = ParseLine(raw) } if line != nil && line.Type() == LineTypePreformatToggle { if inPFT { toggle := line.(PreformatToggleLine) (&toggle).clearAlt() line = toggle } inPFT = !inPFT } if line != nil { lines = append(lines, line) } if err == io.EOF { break } } return Document(lines), nil }