diff --git a/Laminarize.scala b/Laminarize.scala index 4037dba..7cbb06a 100644 --- a/Laminarize.scala +++ b/Laminarize.scala @@ -20,27 +20,36 @@ object Laminarize extends ZIOAppDefault: class LaminarNodeVisitor() extends NodeVisitor: + private var written: Boolean = false private val code: java.lang.StringBuilder = new java.lang.StringBuilder private val attrMap: Map[String, String] = Map("class" -> "cls", "type" -> "tpe").withDefault(identity) override def head(node: Node, depth: Int): Unit = node match { - case el: Element => - if (depth > 0) code.append(",\n") - code.append("\t" * depth) - writeElement(el, depth) - case t: TextNode if !t.text.isBlank => - if (depth > 0) code.append(",\n") - code.append("\t" * depth) - writeTripleQuoted(t.text) - case _ => () - } + case el: Element => Some(() => writeElement(el, depth)) + case t: TextNode if !t.text.isBlank => Some(() => writeTripleQuoted(t.text.trim)) + case _ => None + } map (writeNext(depth)) override def tail(node: Node, depth: Int): Unit = node match { - case el: Element => code.append("\t" * depth).append("\n)") + case el: Element => + code.append("\n") + writeIndent(depth) + code.append(")") case _ => () } def getCode(): String = code.toString() + private def writeNext(depth: Int)(f: () => Unit): Unit = + if (depth != 0) { + if (written) { + code.append(",") + } + code.append("\n") + written = true + } + writeIndent(depth) + f() + private def writeIndent(size: Int): Unit = code.append("\t" * size) private def writeQuoted(t: String): Unit = code.append('"').append(t.replaceAll("\"", "\\\"")).append('"') private def writeTripleQuoted(t: String): Unit = @@ -56,6 +65,7 @@ .append(" := ") writeQuoted(attribute.getValue) } + if (attrs.isEmpty) written = false def elementToLaminar(el: Element): String = val visitor = LaminarNodeVisitor()