# SEAM
> **S**ymbolic **E**xpressions **A**s **M**arkup.
## Why
Because all markup is terrible, especially XML/SGML and derivatives.
But mainly, for easier static markup code generation, such as with
macros, code includes and such.
## Try it out
Mainly this should be used as a library, such as from within a server,
generating HTML (or any other supported markup) before it is served to the
client.
### Current Formats
- XML
- HTML
- CSS
### Installation
You may clone the repo, then build and install
```sh
git clone git://git.knutsen.co/seam
cd seam
cargo build --release
cargo install --path .
```
Or install it from crates.io
```sh
cargo install seam
```
Either way, you'll need the Rust (nightly) compiler and along
with it, comes `cargo`.
### Using The Binary
You may use it by doing
```sh
seam test.sex --html > test.html
```
`test.sex` contains your symbolic-expressions, which is used to generate
HTML, saved in `test.html`.
Likewise, you may read from `STDIN`
```sh
seam --html < example.sex > example.html
# Which is the same as
You may also very well use here-strings and here-docs, if your shell
supports it.
```sh
seam --html <<< "(p Hello World)"
#stdout:
# <!DOCTYPE html>
# <html>
# <head></head>
# <body>
# <p>Hello World</p>
# <!-- Generated by SEAM, from symbolic-expressions into HTML. -->
# </body>
# </html>
```
```sh
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>
# <!-- Generated by SEAM, from symbolic-expressions into XML. -->
```
## TODO
- Caching or checking time-stamps as to not regenerate unmodified source files.
- HTML object `style="..."` object should handle s-expressions well, (e.g. `(p :style (:color red :border none) Hello World)`)
- HTML `<style>` tag should allow for *normal* CSS syntax if just given a string.
- Allow for, and handle special `@` syntax in CSS, such as `@import` and `@media`.
- Add more supported formats (`JSON`, `JS`, `TOML`, &c.).
- Add more helpful/generic macros (e.g. `(%include ...)`, which already exists).
- Add user defined macros system (e.g. `(%define (red-para txt) (p :style "color: red" %txt))`)
- Then add variadic macros.
- Allow for arbitrary embedding of code, that can be run by
a LISP interpreter (or any other langauge), for example. (e.g. `(%chez (+ 1 2))` executes
`(+ 1 2)` with Chez-Scheme LISP, and places the result in the source
(i.e. `3`).