Pure_htmlUse this module for constructing HTML without any dependency on the Dream web framework.
These are the types of the final values which get rendered.
val to_string : node -> stringval to_xml : ?header:bool -> node -> stringSame as to_string but render void tags as XML-style self-closing tags.
val pp : Stdlib.Format.formatter -> node -> unitval pp_xml : Stdlib.Format.formatter -> ?header:bool -> node -> unitSame as pp but render void tags as XML-style self-closing tags.
type 'a to_attr = 'a -> attrAttributes can be created from typed values.
type 'a string_attr = ('a, unit, string, attr) Stdlib.format4 -> 'aSpecial handling for string-value attributes so they can use format strings i.e. string interpolation.
A 'void element': https://developer.mozilla.org/en-US/docs/Glossary/Void_element with no children.
Tags which can have attributes but can contain only text. The text can be formatted.
val attr : string -> attrattr name is a new attribute which does not carry any payload. E.g.
let required = attr "required"val string_attr : string -> ?raw:bool -> _ string_attrstring_attr name fmt is a new string-valued attribute which allows formatting i.e. string interpolation of the value. Note, the fmt argument is required due to the value restriction.
val uri_attr : string -> _ string_attrConvenience for attributes whose values should be URIs. Takes care of both URI-encoding and attribute escaping, as recommended in https://cheatsheetseries.owasp.org/cheatsheets/Cross_Site_Scripting_Prevention_Cheat_Sheet.html#common-mistake.
Examples
a [href "/blog?tags=iamsafe\"></a><script>alert('Pwned')</script>"] [txt "Tags: tag1 | tag2"]
==>
<a href="/blog?tags=iamsafe%22%3E%3C/a%3E%3Cscript%3Ealert('Pwned')%3C/script%3E">Tags: tag1 | tag2</a>
a [href "/foo?a=1&b=2 3&c=4<5&d=6>5"] [txt "Test"]
==>
<a href="/foo?a=1&b=2%203&c=4%3C5&d=6%3E5">Test</a>val bool_attr : string -> bool to_attrval float_attr : string -> float to_attrval int_attr : string -> int to_attrval std_tag : string -> std_tagval void_tag : string -> void_tagval text_tag : string -> ?raw:bool -> _ text_tagBuild a tag which can contain only text.
val uri_tag : string -> _ text_tagBuild a tag which can contain only a URI. The URI is escaped with the same rules as a uri_attr.
val txt : ?raw:bool -> ('a, unit, string, node) Stdlib.format4 -> 'aA text node inside the DOM e.g. the 'hi' in <b>hi</b>. Allows string interpolation using the same formatting features as Printf.sprintf:
b [] [txt "Hello, %s!" name]Or without interpolation:
b [] [txt "Bold of you."]HTML-escapes the text value. You can use the ~raw param to bypass escaping:
let user_input = "<script>alert('I like HTML injection')</script>" in
txt ~raw:true "%s" user_inputval comment : string -> nodeA comment that will be embedded in the rendered HTML, i.e. <!-- comment -->. The text is HTML-escaped.
concat node list is the list of nodes joined together into a single node, with each element separated by node.
Add an attribute to a tag.
let toast msg = p [id "toast"] [txt "%s" msg]
let toast_oob = toast "ok." +@ Hx.swap_oob "true"If adding the class attribute to a tag which already has a class attribute, join together the values of the CSS classes:
p [class_ "foo"] [] +@ class_ "bar"Result:
<p class="foo bar"></p>val (.@[]) : node -> string -> stringGet the value of an existing attribute.
let toast = p [id "toast"] [txt "OK."]
let toast_id = toast.@["id"]val is_null : node -> boolGet whether a node is null (empty) or not. Useful for conditional rendering of UIs when you are passed in a node and you don't know if it's empty or not.
val is_null_ : attr -> boolGet whether an attribute is null (empty) or not.
val fold :
tag:(string -> attr list -> 'a -> 'a) ->
txt:(string -> 'a -> 'a) ->
comment:(string -> 'a -> 'a) ->
'a ->
node ->
'afold ~tag ~txt ~comment value node is the value resulting from 'folding over' the node with an initial value and calling the following callbacks for each child in the node's tree:
Eg calculate a list of all the classes used by a node and its children:
let tag _name attrs classes =
match List.assoc_opt "class" attrs with
| Some c -> c :: classes
| None -> classes
and txt_or_comment _string classes = classes in
fold ~tag ~txt:txt_or_comment ~comment:txt_or_comment [] nodemodule HTML : sig ... endAll standard HTML attributes and tags. Some attributes and tags have the same name, e.g. style. To disambiguate them, attributes have a _ (underscore) suffix.
module SVG : sig ... endmodule MathML : sig ... endmodule Aria : sig ... endmodule Atom : sig ... end