From f840c2c648fb5dddef46dfdd9059800be2cdf595 Mon Sep 17 00:00:00 2001 From: Mikko Ahlroth Date: Sun, 14 Apr 2024 16:13:31 +0300 Subject: [PATCH] Allow customizing output path --- src/gloss/builder.gleam | 5 ++--- src/gloss/config.gleam | 9 ++++++++- src/gloss/defaults.gleam | 1 + src/gloss/writer.gleam | 33 +++++++++++++-------------------- 4 files changed, 24 insertions(+), 24 deletions(-) diff --git a/src/gloss/builder.gleam b/src/gloss/builder.gleam index 0de9468..eff1af8 100644 --- a/src/gloss/builder.gleam +++ b/src/gloss/builder.gleam @@ -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) } diff --git a/src/gloss/config.gleam b/src/gloss/config.gleam index 26b5927..f93002a 100644 --- a/src/gloss/config.gleam +++ b/src/gloss/config.gleam @@ -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, ) } diff --git a/src/gloss/defaults.gleam b/src/gloss/defaults.gleam index 8dda366..f7a5ba2 100644 --- a/src/gloss/defaults.gleam +++ b/src/gloss/defaults.gleam @@ -47,5 +47,6 @@ pub fn default_config( paths: paths.defaults, parser: parser.default_parse, writer: writer.write, + output_path: "./output", ) } diff --git a/src/gloss/writer.gleam b/src/gloss/writer.gleam index aa46a60..a1ffc23 100644 --- a/src/gloss/writer.gleam +++ b/src/gloss/writer.gleam @@ -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)) }) }