12 个版本
0.2.4 | 2024年7月12日 |
---|---|
0.2.3 | 2024年7月3日 |
0.2.2 | 2024年6月28日 |
0.1.8 | 2021年4月6日 |
0.1.3 | 2020年10月10日 |
在Web编程类别中排名第251
每月下载量:93
105KB
2K SLoC
SEAM
Symbolic Expressions Ass Markup.
原因
因为所有的标记都是糟糕的,尤其是XML/SGML及其衍生品。
但主要是为了更容易地生成静态标记代码,例如使用宏、代码包含等。
试试看
这可以作为一个库使用,例如从服务器内部生成HTML(或任何其他支持的标记),在它被发送到客户端之前。我个人目前只是使用seam
二进制文件来静态生成一些个人和项目网站。
阅读USAGE.md文件以获取代码示例和文档。
当前格式
- XML (
--xml
;包括:SVG、MathML) - HTML (
--html
;SGML) - CSS (
--css
) - SEXP (
--sexp
;S表达式,基本上是一个宏展开工具)
安装
您可以克隆仓库,然后构建和安装
git clone git://git.knutsen.co/seam
cd seam
cargo build --release
cargo install --path .
或者从crates.io安装它
cargo install seam
无论哪种方式,您都需要Rust(nightly)编译器和它附带的cargo
。
使用二进制文件
您可以通过以下方式使用它:
seam test.sex --html > test.html
test.sex
包含您的符号表达式,这些表达式用于生成HTML,并保存为test.html
。
同样,您也可以从STDIN
读取
seam --html < example.sex > example.html
# Which is the same as
cat example.sex | seam --html > example.html
如果您使用的shell支持,您还可以使用here-strings和here-docs。
seam --html <<< "(p Hello World)"
#stdout:
# <!DOCTYPE html>
# <html>
# <head></head>
# <body>
# <p>Hello World</p>
# </body>
# </html>
seam --html --nodocument <<< "(p Hello World)"
#stdout:
# <p>Hello World</p>
seam --xml <<< '(para Today is a day in (%date "%B, year %Y").)'
#stdout:
# <?xml version="1.0" encoding="UTF-8" ?>
# <para>Today is a day in November, year 2020.</para>
seam --sexp <<< '(hello (%define subject world) %subject)'
#stdout:
# (hello world)
待办事项
- 使用
\%
转义评估宏。 (%format "{}")
宏与Rust的format
语法。- 通过让宏存储它们定义时的作用域的副本(或引用?)来实现词法作用域。
- 类似于
%include
的宏%embed "/path"
,但它只返回文件内容作为字符串。 - 使用
&rest
语法传递可变参数。 - 通过
%(...)
语法延迟宏的评估。例如,%(f x y)
与(%f x y)
相同,因此您可以使用(%define uneval f x)
然后编写%(%uneval y)
。 - 宏
%list
从(p (%list a b c))
展开到(p a b c)
。定义为如下(%define (list &rest) rest)
- 循环宏
%for
,遍历%list
。 %glob
返回匹配 glob 的文件/目录列表。%markdown
将提供的 Markdown 转换为 HTML。%html
、%xml
、%css
等宏进入特定渲染模式。- 添加可变和关键字宏参数。
- 通过缓存或检查时间戳,避免重新生成未修改的源文件。
- HTML 对象
style="..."
应很好地处理 s-表达式(例如,(p :style (:color red :border none) Hello World)
) - 添加更多支持的格式(例如,
JSON
、JS
、TOML
等)。 - 可能:整个 JavaScript 前端,例如。
(let x 2) (let (y 1) (z 1)) (const f (=> (a b) (+ a b)) ((. console log) (== (f y z) x))
- 添加更多有用的通用宏(例如,已存在的
(%include ...)
)。 - 允许任意嵌入代码,这些代码可以由 LISP 解释器(或任何其他语言)执行,例如。例如,
(%chez (+ 1 2))
使用 Chez-Scheme LISP 执行(+ 1 2)
,并将结果放在源中(即3
)。
依赖关系
~1–11MB
~62K SLoC