From af38b88458a6e26f7a4a1434b11256752a64869c Mon Sep 17 00:00:00 2001 From: Mikko Ahlroth Date: Sun, 14 Apr 2024 00:34:52 +0300 Subject: [PATCH] Handle posts with no tags --- src/gloss/parser/common.gleam | 2 +- src/gloss/parser/post.gleam | 34 +++++++++++++++++++--------- src/gloss/rendering/views/base.gleam | 12 ++++++++-- 3 files changed, 34 insertions(+), 14 deletions(-) diff --git a/src/gloss/parser/common.gleam b/src/gloss/parser/common.gleam index 7196761..2f5ddeb 100644 --- a/src/gloss/parser/common.gleam +++ b/src/gloss/parser/common.gleam @@ -27,7 +27,7 @@ pub fn parse_headers(headers: List(String)) -> Result(List(Header), ParseError) |> result.all() } -fn parse_header(header: String) -> Result(Header, ParseError) { +pub fn parse_header(header: String) -> Result(Header, ParseError) { let header_parts = string.split(header, header_separator) let parts_amount = list.length(header_parts) diff --git a/src/gloss/parser/post.gleam b/src/gloss/parser/post.gleam index a84728d..1d678c4 100644 --- a/src/gloss/parser/post.gleam +++ b/src/gloss/parser/post.gleam @@ -31,14 +31,6 @@ type FilenameMeta { } pub fn parse(filename: String, contents: String) -> Result(Post, ParseError) { - let lines = string.split(contents, "\n") - - use title <- try(list.first(lines), EmptyFile) - use rest <- try(list.rest(lines), HeaderMissing) - - use tags <- try(list.first(rest), HeaderMissing) - use rest <- try(list.rest(rest), HeaderMissing) - let filename = case string.ends_with(filename, filename_postfix) { True -> string.slice( @@ -50,9 +42,23 @@ pub fn parse(filename: String, contents: String) -> Result(Post, ParseError) { } use meta <- result.try(parse_filename_meta(filename)) + let lines = string.split(contents, "\n") + + use title <- try(list.first(lines), EmptyFile) + use rest <- try(list.rest(lines), HeaderMissing) + let #(headers, body) = list.split_while(rest, fn(line) { !string.is_empty(line) }) + let #(tags, headers) = case headers { + [] -> #("", []) + [tags, ..headers] -> + case common.parse_header(tags) { + Ok(_) -> #("", [tags, ..headers]) + Error(_) -> #(tags, headers) + } + } + let tags = parse_tags(tags) use headers <- result.try(common.parse_headers(headers)) let body = string.join(body, "\n") @@ -134,9 +140,15 @@ fn parse_order_slug( } fn parse_tags(tags: String) -> List(Tag) { - tags - |> string.split(tag_separator) - |> list.map(string.trim) + let tags = + tags + |> string.split(tag_separator) + |> list.map(string.trim) + + case tags { + [""] -> [] + other -> other + } } fn parse_short_content(body: String) -> option.Option(String) { diff --git a/src/gloss/rendering/views/base.gleam b/src/gloss/rendering/views/base.gleam index 55d5340..d313d04 100644 --- a/src/gloss/rendering/views/base.gleam +++ b/src/gloss/rendering/views/base.gleam @@ -88,8 +88,16 @@ fn view( ]), main([], [inner]), section([id("sidebar")], [ - nav([id("tags")], [pre_rendered.tags]), - nav([id("archives")], [pre_rendered.archives]), + case dict.size(database.tags(db)) { + 0 -> element.none() + _ -> + nav([id("tags"), attribute("aria-label", "Tags")], [ + pre_rendered.tags, + ]) + }, + nav([id("archives"), attribute("aria-label", "Archives")], [ + pre_rendered.archives, + ]), ]), footer([], [ p([], [