Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- package cz.svitalsky.barclays.simplehtmlbuilder
- fun main(args: Array<String>) = println(createHtml())
- fun createHtml() =
- html {
- span {
- div {
- this + "Hello World"
- }
- }
- }
- interface Element {
- fun render(builder: StringBuilder, indent: String = "")
- }
- class TextElement(private val text: String) : Element {
- override fun render(builder: StringBuilder, indent: String) {
- builder.append(text)
- }
- }
- abstract class Tag(protected val name: String) : Element {
- val children = arrayListOf<Element>()
- protected fun <T: Element> initTag(tag: T, init: T.() -> Unit) = tag.apply {
- init()
- children.add(this)
- }
- override fun render(builder: StringBuilder, indent: String) {
- builder.append("$indent<$name>\n")
- children.forEach { it.render(builder, "$indent ") }
- builder.append("$indent</$name>\n")
- }
- override fun toString() = StringBuilder().also { render(it) }.toString()
- }
- class HTML : Tag("html") {
- fun span(init: SPAN.() -> Unit) = initTag(SPAN(), init)
- }
- class SPAN : Tag("span") {
- fun div(init: DIV.() -> Unit) = initTag(DIV(), init)
- }
- class DIV : Tag("div") {
- override fun render(builder: StringBuilder, indent: String) {
- builder.append("$indent<$name>")
- children.forEach { it.render(builder) }
- builder.append("</$name>\n")
- }
- }
- operator fun Tag.plus(s: String) {
- children.add(TextElement(s))
- }
- fun html(init: HTML.() -> Unit) = HTML().apply(init)
Add Comment
Please, Sign In to add comment