diff --git a/src/gloss/parser.gleam b/src/gloss/parser.gleam index 5ec1616..11776d0 100644 --- a/src/gloss/parser.gleam +++ b/src/gloss/parser.gleam @@ -1,6 +1,7 @@ import gleam/result import gleam/list import gleam/regex +import gleam/string import gloss/utils/fs import gloss/models/database.{type Database} import gloss/parser/common @@ -38,7 +39,10 @@ pub fn parse_posts(db: Database, path: String) -> Result(Database, ParseError) { ) let filenames = - list.filter(filenames, fn(file) { regex.check(filename_regex, file) }) + list.filter(filenames, fn(file) { + string.ends_with(file, common.filename_postfix) + && regex.check(filename_regex, file) + }) use posts <- result.try( result.all( @@ -63,19 +67,21 @@ pub fn parse_pages(db: Database, path: String) -> Result(Database, ParseError) { |> result.map_error(fn(err) { FileError(path, err) }), ) - use pages <- result.try( - result.all( - list.map(filenames, fn(file) { - use contents <- result.try( - fs.read_file(path <> "/" <> file) - |> result.map_error(fn(err) { FileError(file, err) }), - ) + use pages <- result.try(result.all( + filenames + |> list.filter(fn(filename) { + string.ends_with(filename, common.filename_postfix) + }) + |> list.map(fn(file) { + use contents <- result.try( + fs.read_file(path <> "/" <> file) + |> result.map_error(fn(err) { FileError(file, err) }), + ) - page.parse(file, contents) - |> result.map_error(fn(err) { PostParseError(file, err) }) - }), - ), - ) + page.parse(file, contents) + |> result.map_error(fn(err) { PostParseError(file, err) }) + }), + )) Ok(list.fold(pages, db, database.add_page)) } diff --git a/src/gloss/parser/common.gleam b/src/gloss/parser/common.gleam index 2f5ddeb..1e2acd6 100644 --- a/src/gloss/parser/common.gleam +++ b/src/gloss/parser/common.gleam @@ -4,6 +4,8 @@ import gleam/list import gleam/bool import gloss/models/header.{type Header} +pub const filename_postfix = ".md" + const header_separator = ":" pub type ParseError { diff --git a/src/gloss/parser/page.gleam b/src/gloss/parser/page.gleam index 6517106..2b9ad99 100644 --- a/src/gloss/parser/page.gleam +++ b/src/gloss/parser/page.gleam @@ -4,14 +4,17 @@ import gleam/list import gloss/models/page.{type Page, Page} import gloss/parser/common.{type ParseError, EmptyFile, HeaderMissing, try} -const filename_postfix = ".md" - pub fn parse(filename: String, contents: String) -> Result(Page, ParseError) { let lines = string.split(contents, "\n") use title <- try(list.first(lines), EmptyFile) use rest <- try(list.rest(lines), HeaderMissing) - let slug = parse_slug(filename) + let slug = + string.slice( + filename, + 0, + string.length(filename) - string.length(common.filename_postfix), + ) let #(headers, body) = list.split_while(rest, fn(line) { !string.is_empty(line) }) @@ -21,15 +24,3 @@ pub fn parse(filename: String, contents: String) -> Result(Page, ParseError) { Ok(Page(title: title, slug: slug, headers: headers, content: body)) } - -fn parse_slug(filename: String) -> String { - case string.ends_with(filename, filename_postfix) { - True -> - string.slice( - filename, - 0, - string.length(filename) - string.length(filename_postfix), - ) - False -> filename - } -} diff --git a/src/gloss/parser/post.gleam b/src/gloss/parser/post.gleam index df55058..4a50b63 100644 --- a/src/gloss/parser/post.gleam +++ b/src/gloss/parser/post.gleam @@ -20,8 +20,6 @@ pub const filename_regex = "^\\d{4}-\\d\\d-\\d\\d-.*\\.md$" const filename_separator = "-" -const filename_postfix = ".md" - const tag_separator = "," const split_re = "" @@ -31,15 +29,12 @@ type FilenameMeta { } pub fn parse(filename: String, contents: String) -> Result(Post, ParseError) { - let filename = case string.ends_with(filename, filename_postfix) { - True -> - string.slice( - filename, - 0, - string.length(filename) - string.length(filename_postfix), - ) - False -> filename - } + let filename = + string.slice( + filename, + 0, + string.length(filename) - string.length(common.filename_postfix), + ) use meta <- result.try(parse_filename_meta(filename)) let lines = string.split(contents, "\n")