summaryrefslogtreecommitdiff
path: root/gemini/gemtext/parse.go
diff options
context:
space:
mode:
Diffstat (limited to 'gemini/gemtext/parse.go')
-rw-r--r--gemini/gemtext/parse.go49
1 files changed, 49 insertions, 0 deletions
diff --git a/gemini/gemtext/parse.go b/gemini/gemtext/parse.go
new file mode 100644
index 0000000..7041fde
--- /dev/null
+++ b/gemini/gemtext/parse.go
@@ -0,0 +1,49 @@
+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
+}