Make sure only .md files are parsed
This commit is contained in:
parent
fd2b7d15bd
commit
f55e53ba59
4 changed files with 33 additions and 39 deletions
|
@ -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))
|
||||
}
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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")
|
||||
|
|
Loading…
Reference in a new issue