Guest User

Untitled

a guest
Oct 18th, 2018
91
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.50 KB | None | 0 0
  1. package cz.svitalsky.barclays.simplehtmlbuilder
  2.  
  3. fun main(args: Array<String>) = println(createHtml())
  4.  
  5. fun createHtml() =
  6. html {
  7. span {
  8. div {
  9. this + "Hello World"
  10. }
  11. }
  12. }
  13.  
  14. interface Element {
  15. fun render(builder: StringBuilder, indent: String = "")
  16. }
  17.  
  18. class TextElement(private val text: String) : Element {
  19. override fun render(builder: StringBuilder, indent: String) {
  20. builder.append(text)
  21. }
  22. }
  23.  
  24. abstract class Tag(protected val name: String) : Element {
  25. val children = arrayListOf<Element>()
  26.  
  27. protected fun <T: Element> initTag(tag: T, init: T.() -> Unit) = tag.apply {
  28. init()
  29. children.add(this)
  30. }
  31.  
  32. override fun render(builder: StringBuilder, indent: String) {
  33. builder.append("$indent<$name>\n")
  34. children.forEach { it.render(builder, "$indent ") }
  35. builder.append("$indent</$name>\n")
  36. }
  37.  
  38. override fun toString() = StringBuilder().also { render(it) }.toString()
  39. }
  40.  
  41. class HTML : Tag("html") {
  42. fun span(init: SPAN.() -> Unit) = initTag(SPAN(), init)
  43. }
  44.  
  45. class SPAN : Tag("span") {
  46. fun div(init: DIV.() -> Unit) = initTag(DIV(), init)
  47. }
  48.  
  49. class DIV : Tag("div") {
  50. override fun render(builder: StringBuilder, indent: String) {
  51. builder.append("$indent<$name>")
  52. children.forEach { it.render(builder) }
  53. builder.append("</$name>\n")
  54. }
  55. }
  56.  
  57. operator fun Tag.plus(s: String) {
  58. children.add(TextElement(s))
  59. }
  60.  
  61. fun html(init: HTML.() -> Unit) = HTML().apply(init)
Add Comment
Please, Sign In to add comment