Skip to content

Instantly share code, notes, and snippets.

@wangzaixiang
Created November 19, 2013 11:04
Show Gist options
  • Save wangzaixiang/7543759 to your computer and use it in GitHub Desktop.
Save wangzaixiang/7543759 to your computer and use it in GitHub Desktop.
new Template based on Scala XML
package demo
object CodeWriter {
def main(args: Array[String]) {
val code = new CodeWriter
code.println("package wangzx.javabean")
code.println
code.println("public class Student extends Object");
code.beginBlock("{");
code.println("String name;")
code.println("String age;")
code.endBlock("}")
println(code.toString)
}
}
class CodeWriter {
val buffer = new StringBuilder
var indent = 0
var row = 0
var column = 0
def println(text: String) {
indent(text)
indent("\n")
}
def println() {
indent("\n")
}
def indent(text: String) {
var p = 0
while (p < text.length) {
val ch = text charAt p
if (column == 0 && (ch == ' ' || ch == '\t')) {
// skip
} else if (column == 0) {
(0 until indent).foreach(_ => append('\t'))
append(ch)
} else append(ch)
p += 1
}
}
private def append(ch: Char) {
if (ch != '\r') {
buffer.append(ch)
if (ch == '\n') {
row += 1
column = 0
} else {
column += 1
}
}
}
def beginBlock(begin: String) {
println(begin)
indent += 1
}
def endBlock(end: String) {
assert(indent >= 1)
if (column != 0) println()
indent -= 1
println(end)
}
override def toString = buffer.toString
}
package demo
import scala.xml.{ Atom, Elem, Node, Text }
object XmlDemo extends App {
class FieldModel {
var typ: String = _
var name: String = _
}
class ClassModel {
var pkgName: String = _
var className: String = _
var superClassName: String = _
var fields: List[FieldModel] = Nil
}
class XmlCodeWriter(root: Elem) extends CodeWriter {
formatNode(root)
def formatNode(node: Node): Unit = node match {
case Text(text) => indent(text)
case x: Atom[String] =>
indent(x.data)
case b @ <div>{ _* }</div> =>
formatB(b.asInstanceOf[Elem])
case b @ <block>{ _* }</block> =>
formatBlock(b.asInstanceOf[Elem])
}
def formatB(elem: Elem) {
if (column != 0) println() // new line
elem.child.foreach { node => formatNode(node) }
if (column != 0) println()
}
def formatBlock(elem: Elem) {
beginBlock("{")
elem.child.foreach { node =>
formatNode(node)
}
endBlock("}")
}
}
val classModel = new ClassModel {
pkgName = "wangzx.javabean"
className = "Student"
superClassName = "Object"
fields = new FieldModel {
typ = "String"
name = "name"
} :: new FieldModel {
typ = "Int"
name = "age"
} :: Nil
}
import classModel._
val xml =
<div>
package { pkgName }
public class { className } extends { superClassName }
<block>
{ fields.map { f => <div>{ f.typ } { f.name };</div> } }
{ fields.flatMap { f => <div>public get{ f.name }() <block> return this.{ f.name }; </block></div>
<div>pulic void set{ f.name }({ f.typ } value) <block> this.{ f.name } = value; </block></div> } }
</block>
</div>
println(xml);
val code = new XmlCodeWriter(xml).toString;
println(code)
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment