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/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))
}

View file

@ -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 {

View file

@ -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
}
}

View file

@ -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 = "<!--\\s*SPLIT\\s*-->"
@ -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")