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

Download history 442/week @ 2024-06-28 44/week @ 2024-07-05 91/week @ 2024-07-12 2/week @ 2024-07-19

每月下载量: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)
  • 添加更多支持的格式(例如,JSONJSTOML 等)。
  • 可能:整个 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