diff options
Diffstat (limited to 'gemini/gemtext/parse_line.go')
-rw-r--r-- | gemini/gemtext/parse_line.go | 43 |
1 files changed, 41 insertions, 2 deletions
diff --git a/gemini/gemtext/parse_line.go b/gemini/gemtext/parse_line.go index 39187a8..e31e5b6 100644 --- a/gemini/gemtext/parse_line.go +++ b/gemini/gemtext/parse_line.go @@ -10,10 +10,16 @@ func ParseLine(line []byte) Line { switch line[0] { case '=': - if len(line) == 1 || line[1] != '>' { + if len(line) == 1 { break } - return parseLinkLine(line) + if line[1] == '>' { + return parseLinkLine(line) + } + if line[1] == ':' { + return parsePromptLine(line) + } + break case '`': if len(line) < 3 || line[1] != '`' || line[2] != '`' { break @@ -73,6 +79,39 @@ func parseLinkLine(raw []byte) LinkLine { return line } +func parsePromptLine(raw []byte) PromptLine { + line := PromptLine{raw: raw} + + // move past =:[<whitespace>] + raw = bytes.TrimLeft(raw[2:], " \t") + + // find the next space or tab + spIdx := bytes.IndexByte(raw, ' ') + tbIdx := bytes.IndexByte(raw, '\t') + idx := spIdx + if idx == -1 { + idx = tbIdx + } + if tbIdx >= 0 && tbIdx < idx { + idx = tbIdx + } + + if idx < 0 { + line.url = bytes.TrimRight(raw, "\r\n") + return line + } + + line.url = raw[:idx] + raw = raw[idx+1:] + + label := bytes.TrimRight(bytes.TrimLeft(raw, " \t"), "\r\n") + if len(label) > 0 { + line.label = label + } + + return line +} + func parsePreformatToggleLine(raw []byte) PreformatToggleLine { line := PreformatToggleLine{raw: raw} |