开发框架

beamai_render · Erlang 的模板与 Markdown 渲染引擎

模板在构建期由 rebar3 插件编译成 .erl 文件,运行期的渲染就是一次普通函数调用:没有进程,没有 ETS 表,不查任何表。静态模板文本进入模块的 literal pool,跨进程按引用共享。

Markdown 在运行期渲染,纪律相同:pipeline 是普通 map,什么都不缓存。库和测试套件都只依赖 OTP。

模板编译成模块,渲染就是函数调用

rebar.config 与 Markdown 渲染
%% rebar.config:两套模板引擎并列使用
{provider_hooks, [{pre, [{compile, mustache}, {compile, jinja}]}]}.
{mustache_opts, [{views, "views"}, {prefix, "view_"}]}.
{jinja_opts,    [{views, "views"}, {suffix, ".j2"}, {prefix, "j2_"}]}.

%% Markdown
beamai_markdown:to_html(~"Hello *world*!").
%% => <<"<p>Hello <em>world</em>!</p>\n">>

P = beamai_markdown:pipeline([pipe_tables, task_lists, footnotes]),
beamai_markdown:to_html(Text, P).

功能

能做什么

  • Mustache

    通过 mustache 官方 spec 六个必选模块的全部 136 个用例;.mustache 文件编译成 view_ 前缀的模块。

  • Jinja2

    支持 include、extends、macro、import 与 |safe;一致性基线是由 CPython jinja2 3.1 生成的 520 条 fixture。与 Mustache 共用一个 views 目录。

  • Markdown

    经 cl-markding 从 markdig 移植:通过 CommonMark 0.31.2 全部 652 个用例与 649 例逐字节 roundtrip;30 个扩展(管道表与网格表、任务列表、脚注、数学公式、emoji、SmartyPants、alert……)。

  • 四种输出

    HTML、纯文本、规范化 Markdown 与原样 roundtrip 四个渲染器。

  • 编译期折叠

    beamai_markdown_transform 在编译期把字面量的 Markdown 调用或 -markdown_document 文件直接折叠成 HTML,运行期零开销。

  • 零依赖

    库与测试套件都只依赖 OTP;生成的每个文件都标明出自哪个引擎,每个 provider 只回收自己的孤儿文件。

规格

技术规格

运行环境Erlang/OTP,rebar3 插件(rebar3 mustache / rebar3 jinja)
当前版本0.6.0
依赖只依赖 OTP
许可Apache License 2.0

常见问题

你可能想问

Mustache 和 Jinja2 选哪个?

两者是并列关系,同一个项目可以都用。Mustache 简单、无逻辑;Jinja2 有词法作用域、继承、宏与过滤器,适合复杂页面。注意两者在真假判断、转义写法上的差异,README 里有对照表。

运行期有什么开销?

模板在构建期编译成 Erlang 模块,渲染是一次普通函数调用,不起进程、不用 ETS;静态文本在 literal pool 里跨进程共享。

许可协议是什么?

Apache License 2.0,可用于商业项目。

开源

Apache 2.0 协议开源

引擎、测试、基准与设计文档都在仓库里,欢迎读、改、提 issue。

相关框架

aihtml · 用 Erlang 函数写网页

用 Erlang 函数拼装页面,服务端输出完整 HTML;点击由 Erlang 函数无状态响应,服务端推送走 SSE。112 个组件、四轴主题、对 SEO 友好。