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 gleam/result
import gloss/parser import gloss/parser
import gloss/rendering/database as render_database import gloss/rendering/database as render_database
import gloss/writer
import gloss/config.{type Configuration} import gloss/config.{type Configuration}
import gloss/models/database.{type Database} import gloss/models/database.{type Database}
import gloss/compiler.{type CompileDatabase} import gloss/compiler.{type CompileDatabase}
pub type BuildError { pub type BuildError {
ParseError(err: parser.ParseError) ParseError(err: parser.ParseError)
WriteError(err: writer.WriteError) WriteError(err: config.WriteError)
} }
pub fn parse(config: Configuration) { 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) { pub fn write(posts: render_database.RenderDatabase, config: Configuration) {
config.writer(posts, config.paths) config.writer(posts, config)
|> result.map_error(WriteError) |> result.map_error(WriteError)
} }

View file

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

View file

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

View file

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