hsx/README.md

144 lines
2.9 KiB
Markdown
Raw Normal View History

2024-05-28 00:31:18 +00:00
# HSX
2018-06-24 17:08:30 +00:00
2024-08-24 22:50:50 +00:00
HSX (Hypertext S-expression) is a simple yet powerful HTML5 generation library for Common Lisp. It was forked from [flute](https://github.com/ailisp/flute/).
2024-05-25 12:48:35 +00:00
2024-06-08 04:43:57 +00:00
## Introduction
2024-02-03 09:56:09 +00:00
2024-06-08 04:43:57 +00:00
HSX allows you to generate HTML using S-expressions, providing a more Lisp-friendly way to create web content. By using the `hsx` macro, you can define HTML elements and their attributes in a concise and readable manner.
2024-05-27 09:08:25 +00:00
2024-06-08 04:43:57 +00:00
## Getting Started
2024-05-28 00:31:18 +00:00
2024-06-08 04:43:57 +00:00
### Basic Usage
2024-05-27 09:08:25 +00:00
2024-06-08 04:43:57 +00:00
Use the `hsx` macro to create HTML elements. Attributes are specified using a property list following the element name, and child elements are nested directly within.
2024-05-28 10:33:08 +00:00
2024-05-27 09:24:19 +00:00
```lisp
2024-05-27 09:08:25 +00:00
(hsx
2024-06-08 04:43:57 +00:00
(div :id "example" :class "container"
(h1 "Welcome to HSX")
(p "This is an example paragraph.")))
2024-05-28 00:31:18 +00:00
```
2024-05-27 09:08:25 +00:00
2024-06-08 04:43:57 +00:00
This generates:
2024-05-27 09:08:25 +00:00
2024-05-28 00:31:18 +00:00
```html
2024-06-08 04:43:57 +00:00
<div id="example" class="container">
<h1>Welcome to HSX</h1>
<p>This is an example paragraph.</p>
2024-05-27 09:08:25 +00:00
</div>
```
2024-06-08 04:43:57 +00:00
## Examples
### Dynamic Content
HSX allows embedding Common Lisp code directly within your HTML structure, making it easy to generate dynamic content.
2024-05-27 09:08:25 +00:00
2024-05-27 09:24:19 +00:00
```lisp
2024-05-27 09:08:25 +00:00
(hsx
(div
2024-06-08 04:43:57 +00:00
(p :id (format nil "id-~a" (random 100)))
2024-05-27 09:08:25 +00:00
(ul
2024-06-08 04:43:57 +00:00
(loop :for i :from 1 :to 5 :collect (li (format nil "Item ~a" i))))
(if (> (random 10) 5)
(p "Condition met!")
(p "Condition not met!"))))
2024-05-28 00:31:18 +00:00
```
2024-05-27 09:08:25 +00:00
2024-06-08 04:43:57 +00:00
This might generate:
2024-05-27 09:08:25 +00:00
2024-05-28 00:31:18 +00:00
```html
2024-05-27 09:08:25 +00:00
<div>
2024-06-08 04:43:57 +00:00
<p id="id-42"></p>
2024-05-27 09:08:25 +00:00
<ul>
2024-06-08 04:43:57 +00:00
<li>Item 1</li>
<li>Item 2</li>
<li>Item 3</li>
<li>Item 4</li>
<li>Item 5</li>
2024-05-27 09:08:25 +00:00
</ul>
2024-06-08 04:43:57 +00:00
<p>Condition not met!</p>
2024-05-27 09:08:25 +00:00
</div>
```
2024-06-08 04:43:57 +00:00
### Using Fragments
To group multiple elements without adding an extra wrapper, use the fragment `<>`.
2024-05-30 00:47:56 +00:00
```lisp
(hsx
(<>
2024-06-08 04:43:57 +00:00
(h1 "Grouped Elements")
(p "First paragraph.")
(p "Second paragraph.")))
2024-05-30 00:47:56 +00:00
```
This generates:
```html
2024-06-08 04:43:57 +00:00
<h1>Grouped Elements</h1>
<p>First paragraph.</p>
<p>Second paragraph.</p>
2024-05-30 00:47:56 +00:00
```
2024-06-08 04:43:57 +00:00
## Creating Components
2024-05-28 10:33:08 +00:00
2024-06-08 04:43:57 +00:00
You can define reusable components with the `defcomp` macro. Components are functions that can take keyword arguments and properties.
2024-05-28 10:33:08 +00:00
```lisp
(defcomp card (&key title children)
2024-05-27 09:08:25 +00:00
(hsx
2024-06-08 04:43:57 +00:00
(div :class "card"
2024-05-27 09:08:25 +00:00
(h1 title)
2024-05-27 09:40:50 +00:00
children)))
2024-05-28 00:31:18 +00:00
```
2024-05-27 09:08:25 +00:00
2024-06-08 04:43:57 +00:00
Or using a property list:
2024-05-27 09:24:19 +00:00
2024-05-28 00:31:18 +00:00
```lisp
2024-05-28 10:33:08 +00:00
(defcomp card (&rest props)
2024-05-27 09:24:19 +00:00
(hsx
2024-06-08 04:43:57 +00:00
(div :class "card"
2024-05-27 09:24:19 +00:00
(h1 (getf props :title))
2024-05-27 09:40:50 +00:00
(getf props :children))))
2024-05-28 00:31:18 +00:00
```
2024-06-08 04:43:57 +00:00
Usage example:
2024-05-27 09:24:19 +00:00
2024-05-28 00:31:18 +00:00
```lisp
2024-05-27 09:40:50 +00:00
(hsx
2024-06-08 04:43:57 +00:00
(card :title "Card Title"
(p "This is a card component.")))
2024-05-28 00:31:18 +00:00
```
2024-05-27 09:08:25 +00:00
2024-06-08 04:43:57 +00:00
Generates:
2024-05-27 09:08:25 +00:00
2024-05-28 00:31:18 +00:00
```html
2024-06-08 04:43:57 +00:00
<div class="card">
<h1>Card Title</h1>
<p>This is a card component.</p>
2024-05-27 09:08:25 +00:00
</div>
```
2024-06-08 04:43:57 +00:00
## Rendering HTML
To render HSX to an HTML string, use the `render-to-string` function.
2024-05-30 00:47:56 +00:00
```lisp
2024-06-08 04:43:57 +00:00
(render-to-string
(hsx
(div :class "content"
(h1 "Rendered to String")
(p "This HTML is generated as a string."))))
2024-05-30 00:47:56 +00:00
```
2024-05-28 00:31:18 +00:00
## License
2024-05-27 09:08:25 +00:00
2024-06-08 04:43:57 +00:00
This project is licensed under the MIT License.
2024-02-08 17:54:12 +00:00
2024-05-28 10:33:08 +00:00
© 2024 skyizwhite
2024-02-08 17:54:12 +00:00
2024-05-28 10:33:08 +00:00
© 2018 Bo Yao
2024-06-08 04:43:57 +00:00
Feel free to contribute to the project and report any issues or feature requests on the [GitHub repository](https://github.com/skyizwhite/hsx).