diff options
| author | Fuwn <[email protected]> | 2024-06-23 06:57:07 +0000 |
|---|---|---|
| committer | Fuwn <[email protected]> | 2024-06-23 06:57:07 +0000 |
| commit | 74f1bfd0c1971ede4a8db3276f918dcbb0543acf (patch) | |
| tree | ccf713e5d698d612a1e26e0966bcf576f82f9a03 /src/gemtext/parse.gleam | |
| download | momoka-74f1bfd0c1971ede4a8db3276f918dcbb0543acf.tar.xz momoka-74f1bfd0c1971ede4a8db3276f918dcbb0543acf.zip | |
feat: initial releasev1.0.0
Diffstat (limited to 'src/gemtext/parse.gleam')
| -rw-r--r-- | src/gemtext/parse.gleam | 49 |
1 files changed, 49 insertions, 0 deletions
diff --git a/src/gemtext/parse.gleam b/src/gemtext/parse.gleam new file mode 100644 index 0000000..f26cf3d --- /dev/null +++ b/src/gemtext/parse.gleam @@ -0,0 +1,49 @@ +import gemtext/blockquote +import gemtext/gemtext.{type Gemtext} +import gemtext/heading +import gemtext/list as gemtext_list +import gemtext/preformatted_block +import gleam/list +import gleam/option.{None, Some} +import gleam/string + +pub fn parse_gemtext_line(line) -> Gemtext { + let trimmed_line = string.trim(line) + + case string.split(trimmed_line, " ") { + ["=>", to] -> gemtext.Link(to, None) + ["=>", to, ..title] -> gemtext.Link(to, Some(string.join(title, " "))) + [">", ..rest] -> + gemtext.BlockquoteLine(string.trim_left(string.join(rest, " "))) + ["*", ..rest] -> gemtext.ListLine(string.trim_left(string.join(rest, " "))) + [""] -> gemtext.Whitespace + _ -> { + case string.to_graphemes(trimmed_line) { + ["#", ..rest] -> + gemtext.Heading( + string.trim_left(string.replace(string.join(rest, ""), "#", "")), + heading.count_leading_hashes(line), + ) + ["`", "`", "`", ..rest] -> + gemtext.PreformattedLine(string.trim_left( + "```\n" <> string.join(rest, ""), + )) + _ -> gemtext.Text(line) + } + } + } +} + +pub fn parse_gemtext(text: String) -> List(Gemtext) { + string.split(text, "\n") + |> preformatted_block.group_adjacent_preformatted_block_lines + |> list.map(parse_gemtext_line) + |> gemtext_list.group_adjacent_list_items + |> blockquote.combine_adjacent_blockquote_lines +} + +pub fn parse_gemtext_raw(text: String) -> List(Gemtext) { + string.split(text, "\n") + |> preformatted_block.group_adjacent_preformatted_block_lines + |> list.map(parse_gemtext_line) +} |