Allow customizing output path

This commit is contained in:
Mikko Ahlroth 2024-04-14 16:13:31 +03:00
parent f55e53ba59
commit f840c2c648
4 changed files with 24 additions and 24 deletions

View file

@ -1,14 +1,13 @@
import gleam/result
import gloss/parser
import gloss/rendering/database as render_database
import gloss/writer
import gloss/config.{type Configuration}
import gloss/models/database.{type Database}
import gloss/compiler.{type CompileDatabase}
pub type BuildError {
ParseError(err: parser.ParseError)
WriteError(err: writer.WriteError)
WriteError(err: config.WriteError)
}
pub fn parse(config: Configuration) {
@ -25,6 +24,6 @@ pub fn render(db: Database, compiled: CompileDatabase, config: Configuration) {
}
pub fn write(posts: render_database.RenderDatabase, config: Configuration) {
config.writer(posts, config.paths)
config.writer(posts, config)
|> result.map_error(WriteError)
}

View file

@ -6,10 +6,16 @@ import gloss/rendering/views.{
}
import gloss/compiler.{type CompileDatabase, type Compiler}
import gloss/parser.{type Parser}
import gloss/writer.{type Writer}
import gloss/models/database.{type Database}
import gloss/rendering/database.{type RenderDatabase} as _
pub type WriteError {
WriteError(err: String)
}
pub type Writer =
fn(RenderDatabase, Configuration) -> Result(Nil, WriteError)
pub type Views {
Views(
base: fn(Database, Configuration) -> BaseView,
@ -54,5 +60,6 @@ pub type Configuration {
paths: PathConfiguration,
parser: Parser,
writer: Writer,
output_path: String,
)
}

View file

@ -47,5 +47,6 @@ pub fn default_config(
paths: paths.defaults,
parser: parser.default_parse,
writer: writer.write,
output_path: "./output",
)
}

View file

@ -1,35 +1,27 @@
import gleam/list
import gleam/dict
import gleam/result
import gleam/string
import lustre/ssg
import lustre/ssg/xml
import lustre/element
import gloss/rendering/database.{type RenderDatabase} as _
import gloss/models/post.{type Post}
import gloss/paths/post.{type PostPath} as _
import gloss/paths.{type PathConfiguration}
const default_output = "./output"
import gloss/config.{type Configuration, WriteError}
pub type PostPathGenerator =
fn(Post) -> PostPath
pub type Writer =
fn(RenderDatabase, PathConfiguration) -> Result(Nil, WriteError)
pub type WriteError {
WriteError(err: ssg.BuildError)
}
pub fn write(db: RenderDatabase, path_conf: PathConfiguration) {
pub fn write(db: RenderDatabase, config: Configuration) {
let site =
ssg.new(default_output)
ssg.new(config.output_path)
|> ssg.add_static_dir("./build/dev/javascript/gloss/priv/assets")
let single_posts =
db.single_posts
|> list.map(fn(post) {
let path = path_conf.single_post(post.orig)
let path = config.paths.single_post(post.orig)
#(path, post.content)
})
@ -39,14 +31,14 @@ pub fn write(db: RenderDatabase, path_conf: PathConfiguration) {
let site =
list.fold(rest, site, fn(acc, page) {
let path = path_conf.list_page(path_conf.index, page.page)
let path = config.paths.list_page(config.paths.index, page.page)
ssg.add_static_route(acc, path, page.content)
})
let site =
dict.fold(db.tag_pages, site, fn(acc, tag, posts) {
list.fold(posts, acc, fn(acc2, page) {
let path = path_conf.list_page(path_conf.tag(tag), page.page)
let path = config.paths.list_page(config.paths.tag(tag), page.page)
ssg.add_static_route(acc2, path, page.content)
})
})
@ -54,7 +46,7 @@ pub fn write(db: RenderDatabase, path_conf: PathConfiguration) {
let site =
dict.fold(db.year_pages, site, fn(acc, year, posts) {
list.fold(posts, acc, fn(acc2, page) {
let path = path_conf.list_page(path_conf.year(year), page.page)
let path = config.paths.list_page(config.paths.year(year), page.page)
ssg.add_static_route(acc2, path, page.content)
})
})
@ -63,7 +55,8 @@ pub fn write(db: RenderDatabase, path_conf: PathConfiguration) {
dict.fold(db.month_pages, site, fn(acc, year_month, posts) {
let #(year, month) = year_month
list.fold(posts, acc, fn(acc2, page) {
let path = path_conf.list_page(path_conf.month(year, month), page.page)
let path =
config.paths.list_page(config.paths.month(year, month), page.page)
ssg.add_static_route(acc2, path, page.content)
})
})
@ -71,7 +64,7 @@ pub fn write(db: RenderDatabase, path_conf: PathConfiguration) {
let site =
ssg.add_static_asset(
site,
path_conf.feed_file,
config.paths.feed_file,
element.to_string(xml.declaration()) <> element.to_string(db.feed),
)
@ -83,10 +76,10 @@ pub fn write(db: RenderDatabase, path_conf: PathConfiguration) {
let site =
list.fold(db.pages, site, fn(acc, page) {
ssg.add_static_route(acc, path_conf.page(page.page), page.content)
ssg.add_static_route(acc, config.paths.page(page.page), page.content)
})
site
|> ssg.build()
|> result.map_error(WriteError)
|> result.map_error(fn(err) { WriteError(string.inspect(err)) })
}