Make sure only .md files are parsed

This commit is contained in:
Mikko Ahlroth 2024-04-14 15:39:23 +03:00
parent fd2b7d15bd
commit f55e53ba59
4 changed files with 33 additions and 39 deletions

View file

@ -1,6 +1,7 @@
import gleam/result import gleam/result
import gleam/list import gleam/list
import gleam/regex import gleam/regex
import gleam/string
import gloss/utils/fs import gloss/utils/fs
import gloss/models/database.{type Database} import gloss/models/database.{type Database}
import gloss/parser/common import gloss/parser/common
@ -38,7 +39,10 @@ pub fn parse_posts(db: Database, path: String) -> Result(Database, ParseError) {
) )
let filenames = 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( use posts <- result.try(
result.all( 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) }), |> result.map_error(fn(err) { FileError(path, err) }),
) )
use pages <- result.try( use pages <- result.try(result.all(
result.all( filenames
list.map(filenames, fn(file) { |> list.filter(fn(filename) {
use contents <- result.try( string.ends_with(filename, common.filename_postfix)
fs.read_file(path <> "/" <> file) })
|> result.map_error(fn(err) { FileError(file, err) }), |> 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) page.parse(file, contents)
|> result.map_error(fn(err) { PostParseError(file, err) }) |> result.map_error(fn(err) { PostParseError(file, err) })
}), }),
), ))
)
Ok(list.fold(pages, db, database.add_page)) Ok(list.fold(pages, db, database.add_page))
} }

View file

@ -4,6 +4,8 @@ import gleam/list
import gleam/bool import gleam/bool
import gloss/models/header.{type Header} import gloss/models/header.{type Header}
pub const filename_postfix = ".md"
const header_separator = ":" const header_separator = ":"
pub type ParseError { pub type ParseError {

View file

@ -4,14 +4,17 @@ import gleam/list
import gloss/models/page.{type Page, Page} import gloss/models/page.{type Page, Page}
import gloss/parser/common.{type ParseError, EmptyFile, HeaderMissing, try} import gloss/parser/common.{type ParseError, EmptyFile, HeaderMissing, try}
const filename_postfix = ".md"
pub fn parse(filename: String, contents: String) -> Result(Page, ParseError) { pub fn parse(filename: String, contents: String) -> Result(Page, ParseError) {
let lines = string.split(contents, "\n") let lines = string.split(contents, "\n")
use title <- try(list.first(lines), EmptyFile) use title <- try(list.first(lines), EmptyFile)
use rest <- try(list.rest(lines), HeaderMissing) 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) = let #(headers, body) =
list.split_while(rest, fn(line) { !string.is_empty(line) }) 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)) 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
}
}

View file

@ -20,8 +20,6 @@ pub const filename_regex = "^\\d{4}-\\d\\d-\\d\\d-.*\\.md$"
const filename_separator = "-" const filename_separator = "-"
const filename_postfix = ".md"
const tag_separator = "," const tag_separator = ","
const split_re = "<!--\\s*SPLIT\\s*-->" const split_re = "<!--\\s*SPLIT\\s*-->"
@ -31,15 +29,12 @@ type FilenameMeta {
} }
pub fn parse(filename: String, contents: String) -> Result(Post, ParseError) { pub fn parse(filename: String, contents: String) -> Result(Post, ParseError) {
let filename = case string.ends_with(filename, filename_postfix) { let filename =
True -> string.slice(
string.slice( filename,
filename, 0,
0, string.length(filename) - string.length(common.filename_postfix),
string.length(filename) - string.length(filename_postfix), )
)
False -> filename
}
use meta <- result.try(parse_filename_meta(filename)) use meta <- result.try(parse_filename_meta(filename))
let lines = string.split(contents, "\n") let lines = string.split(contents, "\n")