Created
November 19, 2013 11:04
-
-
Save wangzaixiang/7543759 to your computer and use it in GitHub Desktop.
new Template based on Scala XML
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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