https://github.com/teropa/hiccups.git
git clone 'https://github.com/teropa/hiccups.git'
(ql:quickload :teropa.hiccups)
Hiccups is a ClojureScript port of the Hiccup HTML generation library. It uses vectors to represent tags, and maps to represent a tag's attributes.
The goal is to provide similar performance to Closure Templates with a much more Clojure friendly syntax.
core.clj
contains the macros and compile-time only
functions, and runtime.cljs
contains functions that are also available at runtime. The contents
of runtime.cljs
are also used at compile-time, so the goal is to keep it portable between
ClojureScript and Clojure.Add the following dependency to your project.clj
file:
[hiccups "0.3.0"]
Require both the core macros and the runtime functions in your namespace declaration:
(ns myns
(:require-macros [hiccups.core :as hiccups :refer [html]])
(:require [hiccups.runtime :as hiccupsrt]))
(hiccups/defhtml my-template []
[:div
[:a {:href "https://github.com/weavejester/hiccup"}
"Hiccup"]])
Here is a basic example of Hiccups syntax:
(html [:span {:class "foo"} "bar"])
"<span class=\"foo\">bar</span>"
The first element of the vector is used as the tag name. The second attribute can optionally be a map, in which case it is used to supply the tag's attributes. Every other element is considered part of the tag's body.
Hiccups is intelligent enough to render different HTML tags in different ways, in order to accommodate browser quirks:
(html [:script])
"<script></script>"
(html [:p])
"<p />"
And provides a CSS-like shortcut for denoting id
and class
attributes:
(html [:div#foo.bar.baz "bang"])
"<div id=\"foo\" class=\"bar baz\">bang</div>"
If the body of the tag is a seq, its contents will be expanded out into
the tag body. This makes working with forms like map
and for
more
convenient:
(html [:ul
(for [x (range 1 4)]
[:li x])])
"<ul><li>1</li><li>2</li><li>3</li></ul>"
Note that while lists are considered to be seqs in Clojure(Script), vectors and sets are not. As a consequence, Hiccups will bail out if a vector is passed in without a tag: [[:div] [:div]]
.
See the Hiccup wiki for more information.