Packages

Generate OG images from Lustre elements

Current section

Files

Jump to
og_image src og_image.erl
Raw

src/og_image.erl

-module(og_image).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]).
-define(FILEPATH, "src/og_image.gleam").
-export([defaults/0, render/2]).
-export_type([format/0, font_style/0, font/0, config/0, render_error/0]).
-if(?OTP_RELEASE >= 27).
-define(MODULEDOC(Str), -moduledoc(Str)).
-define(DOC(Str), -doc(Str)).
-else.
-define(MODULEDOC(Str), -compile([])).
-define(DOC(Str), -compile([])).
-endif.
-type format() :: png | {jpeg, integer()} | {web_p, integer()}.
-type font_style() :: normal | italic.
-type font() :: {font, binary(), binary(), integer(), font_style()}.
-type config() :: {config, integer(), integer(), format(), list(font())}.
-type render_error() :: {invalid_element, binary()} |
{font_load_error, binary()} |
{image_load_error, binary()} |
{render_failed, binary()}.
-file("src/og_image.gleam", 40).
?DOC(" Default config: 1200x630 PNG, no custom fonts (uses bundled Geist)\n").
-spec defaults() -> config().
defaults() ->
{config, 1200, 630, png, []}.
-file("src/og_image.gleam", 45).
?DOC(" Render a Lustre element to an image\n").
-spec render(lustre@vdom@vnode:element(any()), config()) -> {ok, bitstring()} |
{error, render_error()}.
render(El, Config) ->
Urls = og_image@transform:collect_image_urls(El),
Resources = og_image@fetch:fetch_all(Urls),
Json_str = begin
_pipe = El,
_pipe@1 = og_image@transform:to_takumi_json_with_root(_pipe),
gleam@json:to_string(_pipe@1)
end,
{Format_str, Quality} = case erlang:element(4, Config) of
png ->
{<<"png"/utf8>>, -1};
{jpeg, Q} ->
{<<"jpeg"/utf8>>, Q};
{web_p, Q@1} ->
{<<"webp"/utf8>>, Q@1}
end,
_pipe@2 = og_image_native:render_image(
Json_str,
erlang:element(2, Config),
erlang:element(3, Config),
Format_str,
Quality,
Resources
),
gleam@result:map_error(
_pipe@2,
fun(Field@0) -> {render_failed, Field@0} end
).