Java DSL for HTML

HtmlFlow is a Java HTML builder to write typesafe HTML documents in a fluent style, in both Java or Kotlin.

The Java code on the left produces the HTML on the right. Use the utility Flowifier.fromHtml(html) to get the HtmlFlow definition from the corresponding HTML source code.

 

HtmlFlow
  .doc(System.out)
    .html() // HtmlPage
      .head()
        .title().text("HtmlFlow").__()
      .__() // head
      .body()
        .div().attrClass("container")
          .h1().text("My first HtmlFlow page").__()
          .img().attrSrc("http://bit.ly/2MoHwrU").__()
          .p().text("Typesafe is awesome! :-)").__()
        .__() // div
      .__() // body
    .__(); // html
output  ↴
<html>
  <head>
    <title>HtmlFlow</title>
  </head>
  <body>
    <div class="container">
      <h1>My first HtmlFlow page</h1>
      <img src="http://bit.ly/2MoHwrU">
      <p>Typesafe is awesome! :-)</p>
    </div>
  </body>
</html>
↖  Flowifier.fromHtml("...")

 

import htmlflow.*

System.out.doc {
  html {
    head {
      title { text("HtmlFlow") }
    }
    body  {
      div {
        attrClass("container")
        h1 { text("My first HtmlFlow page") }
        img { attrSrc("http://bit.ly/2MoHwrU") }
        p { text("Typesafe is awesome! :-)") }
      }
    }// body
  } //html
} // doc
output  ↴
<html>
  <head>
    <title>HtmlFlow</title>
  </head>
  <body>
    <div class="container">
      <h1>My first HtmlFlow page</h1>
      <img src="http://bit.ly/2MoHwrU">
      <p>Typesafe is awesome! :-)</p>
    </div>
  </body>
</html>
↖  Flowifier.fromHtml("...")

 

HtmlFlow is the most performant engine among state of the art template engines like Velocity, Thymleaf, Mustache, etc and also other DSL libraries for HTML. Check out the performance results in our forks of the most popular benchmarks at xmlet/template-benchmark and xmlet/spring-comparing-template-engines.

The HTML resulting from HtmlFlow respects all HTML 5.2 rules (e.g. h1().div() gives a compilation error because it goes against the content allowed by h1 according to HTML5.2). So, whenever you type . after an element the intelissense will just suggest the set of allowed elements and attributes.

The HtmlFlow API is according to HTML5.2 and is generated with the support of an automated framework xmlet based on an XSD definition of the HTML5.2 syntax. Thus, all attributes are strongly typed with enumerated types which restrict the set of accepted values.

References