diff --git a/mustang/Compiler.ooc b/mustang/Compiler.ooc new file mode 100644 index 0000000..7fabc51 --- /dev/null +++ b/mustang/Compiler.ooc @@ -0,0 +1,32 @@ +import mustang/[Node, Visitor] + + +Compiler: abstract class extends Visitor { + code: Writer + + getCompilerByName: static func -> This { + } + + onNode: func(node: TNode) { + if(node class == TextNode) onTextNode(node) + else if(node class == VariableNode) onVariableNode(node) + else if(node class == SectionNode) onSectionNode(node) + else if(node class == PartialNode) onPartialNode(node) + else onUnknownNode(node) + } + + onTextNode: abstract func(node: TextNode) + onVariableNode: abstract func(node: VariableNode) + onSectionNode: abstract func(node: SectionNode) + onPartialNode: abstract func(node: PartialNode) + onUnknownNode: abstract func(node: UnknownNode) + + setup: abstract func(templateName: String) + finalize: abstract func + + compile: func(templateName: String, root: TNode, code: Writer) { + this code = code + setup(templateName) + run(root, false) + } +} diff --git a/mustang/Renderer.ooc b/mustang/Renderer.ooc index 7f0ce6f..2e796cc 100644 --- a/mustang/Renderer.ooc +++ b/mustang/Renderer.ooc @@ -1,9 +1,9 @@ import io/Writer import text/Buffer -import mustang/[Node, Walker, Context] +import mustang/[Node, Visitor, Context] -Renderer: class extends NodeWalker { +Renderer: class extends Visitor { rootNode: TNode context: Context output: Writer @@ -17,7 +17,7 @@ Renderer: class extends NodeWalker { render: func(context: Context, output: Writer) { this context = context this output = output - walk(rootNode, false) + run(rootNode, false) } render: func ~toString(context: Context) -> String { buffer := Buffer new(1000) diff --git a/mustang/Walker.ooc b/mustang/Visitor.ooc similarity index 80% rename from mustang/Walker.ooc rename to mustang/Visitor.ooc index e108978..0382ae4 100644 --- a/mustang/Walker.ooc +++ b/mustang/Visitor.ooc @@ -1,13 +1,13 @@ import mustang/Node -NodeWalker: abstract class { +Visitor: abstract class { root: TNode level: Int visitChildren: Bool onNode: abstract func(node: TNode) - walk: func(root: TNode, visitChildren: Bool) { + run: func(root: TNode, visitChildren: Bool) { level = -1 this visitChildren = visitChildren @@ -28,13 +28,13 @@ NodeWalker: abstract class { } } -NodePrinter: class extends NodeWalker { +NodePrinter: class extends Visitor { rootNode: TNode init: func(=rootNode) {} print: func { - walk(rootNode, true) + run(rootNode, true) } onNode: func(node: TNode) { diff --git a/mustang/compilers/Javascript.ooc b/mustang/compilers/Javascript.ooc new file mode 100644 index 0000000..db7e8bb --- /dev/null +++ b/mustang/compilers/Javascript.ooc @@ -0,0 +1,32 @@ +import mustang/Compiler + + +JavascriptCompiler: class extends Compiler { + setup: func(templateName: String) { + code write("function render%s(context) {" format(templateName)). + write("var buffer = Array new();") + } + + finalize: func { + code write("};") + } + + onTextNode: func(node: TextNode) { + code write("buffer.push(%s);" format(node text)) + } + + onVariableNode: func(node: VariableNode) { + code write("var value = context.%s;" format(node variableName)). + write("escape(value);"). + write("buffer.push(value)") + } + + onSectionNode: func(node: SectionNode) { + } + + onPartialNode: func(node: PartialNode) { + } + + onUnknownNode: func(node: UnknownNode) { + } +}