Simple and powerful HTML generation library
Find a file
2024-05-28 20:15:29 +09:00
src Improve 2024-05-28 20:15:29 +09:00
tests Change type of element-type, add deftag macro 2024-05-28 19:31:50 +09:00
.gitignore Add qlfile 2024-02-03 14:55:44 +09:00
hsx-test.asd Separate defhsx package from hsx package 2024-05-28 12:33:01 +09:00
hsx.asd Define hsx package 2024-05-27 16:54:46 +09:00
LICENSE Update license 2024-02-09 20:21:04 +09:00
qlfile Add hsx/hsx package 2024-05-26 01:26:26 +09:00
qlfile.lock Add hsx/hsx package 2024-05-26 01:26:26 +09:00
README.md Update README 2024-05-28 19:52:15 +09:00

HSX

⚠️ This project is a work in progress.

HSX (Hypertext S-expression) is a straightforward HTML5 generation library for Common Lisp.

This project is a fork of flute, originally created by Bo Yao.

Usage

With the hsx macro, you can construct HTML using S-expressions.

Inline property lists following the element name are interpreted as attributes, and the remaining elements are interpreted as child elements.

When a property is given a boolean value:

  • t results in the key being displayed without a value.
  • nil results in the property not being displayed at all.
  • Any other type of value results in the key-value pair being displayed.
(hsx
  (div :id "greeting" :class "flex"
    (h1 "Hello World")
    (p
      "This is"
      (strong "an example!"))))

This code generates the following HTML:

<div id="greeting" class="flex">
  <h1>Hello World</h1>
  <p>
    This is
    <strong>an example!</strong>
  </p>
</div>

HSX elements are essentially functions, allowing you to compose them freely and embed Common Lisp code within them.

(hsx
  (div
    (p :id (+ 1 1))
    (ul
      (loop
        :for i :from 1 :to 3
        :collect (li (format nil "item~a" i))))
    (if t
        (p "true")
        (p "false"))))

This generates:

<div>
  <p id="2"></p>
  <ul>
    <li>item1</li>
    <li>item2</li>
    <li>item3</li>
  </ul>
  <p>true</p>
</div>

You can create custom tags (intended for Web Components) using the deftag macro.

(deftag stack)

This can then be used as follows:

(hsx (stack :space "var(--s2)" :recursive t))

Which generates:

<stack space="var(--s2)" recursive></stack>

You can create HSX components using the defcomp macro. Components are essentially functions that accept keyword arguments, a property list, or both.

The children property accepts the children of a component.

(defcomp card (&key title children)
  (hsx
    (div
      (h1 title)
      children)))

or

(defcomp card (&rest props)
  (hsx
    (div
      (h1 (getf props :title))
      (getf props :children))))

This can then be used as follows:

(hsx
  (card :title "card1"
    (p "Lorem ipsum...")))

Which generates:

<div>
  <h1>card1</h1>
  <p>Lorem ipsum...</p>
</div>

License

This project is licensed under the terms of the MIT license.

© 2024 skyizwhite

© 2018 Bo Yao