# 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](https://github.com/ailisp/flute/), originally created by Bo Yao. ## Usage With the `hsx` macro, you can construct HTML using S-expressions. ```lisp (hsx (div :id "greeting" :class "flex" (h1 "Hello World") (p "This is" (strong "an example!")))) ``` This code generates the following HTML: ```html

Hello World

This is an example!

``` HSX elements are essentially functions, allowing you to compose them freely and embed Common Lisp code within them. ```lisp (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: ```html

true

``` To define a component, simply create a function that accepts keyword arguments, property lists, or both, and define the HSX element using the `defhsx` macro. The `children` property accepts the children of a component. ```lisp (defhsx card #'%card) (defun %card (&key title children) (hsx (div (h1 title) children))) ``` or ```lisp (defhsx card #'%card) (defun %card (&rest props) (hsx (div (h1 (getf props :title)) (getf props :children)))) ``` This can then be used as follows: ```lisp (hsx (card :title "card1" (p "Lorem ipsum..."))) ``` Which generates: ```html

card1

Lorem ipsum...

``` The previous definition can be simplified using the `defcomp` macro. ```lisp (defcomp card (&key title children) (hsx (div (h1 title) children))) ``` ## License This project is licensed under the terms of the MIT license. Copyright (c) 2024, skyizwhite. Copyright (c) 2018, Bo Yao.