Browse Source

- fixed templo array support

Laurent Bedubourg 18 years ago
parent
commit
b4058a76d7

+ 1 - 0
std/mtwin/templo/Generator.hx

@@ -44,6 +44,7 @@ class Generator {
 		var result = new StringBuf();
 		var result = new StringBuf();
 		result.add('
 		result.add('
 			String = $loader.String;
 			String = $loader.String;
+			Array = $loader.Array;
 			iter = $loader.iter;
 			iter = $loader.iter;
 			buffer_new = $loader.loadprim("std@buffer_new", 0);
 			buffer_new = $loader.loadprim("std@buffer_new", 0);
 			buffer_add = $loader.loadprim("std@buffer_add", 2);
 			buffer_add = $loader.loadprim("std@buffer_add", 2);

+ 1 - 0
std/mtwin/templo/Loader.hx

@@ -81,6 +81,7 @@ class Loader {
 			var oldCache = loader.cache;
 			var oldCache = loader.cache;
 			loader.cache = __dollar__new(oldCache);
 			loader.cache = __dollar__new(oldCache);
 			loader.String = String;
 			loader.String = String;
+			loader.Array = Array;
 			loader.iter = function(loop, fnc){
 			loader.iter = function(loop, fnc){
 				if (loop == null){
 				if (loop == null){
 					throw "repeat or foreach called on null value";
 					throw "repeat or foreach called on null value";

+ 42 - 2
std/mtwin/templo/Parser.hx

@@ -391,6 +391,32 @@ class Parser {
 		return res;
 		return res;
 	}
 	}
 
 
+	static function findEndOfArray( str:String, pos:Int ) : { end:Int, n:Int } {
+		var len = str.length;
+		var n = 0;
+		var ctopen = 0;
+		for (i in (pos+1)...(len)){
+			var c = str.charAt(i);
+			if (c == "," && ctopen == 0){
+				n++;
+			}
+			if (c == "["){ 
+				ctopen++; 
+			}
+			else if (c == "]"){
+				if (ctopen == 0){
+					if (StringTools.trim(str.substr(pos+1, i-pos-1)) != "")
+						n++;
+					return { end:i-1, n:n };
+				}
+				else {
+					ctopen--;
+				}
+			}
+		}
+		return { end:-1, n:null };
+	}
+
 	static function findEndOfBracket( str:String, pos:Int ) : Int {
 	static function findEndOfBracket( str:String, pos:Int ) : Int {
 		var len = str.length;
 		var len = str.length;
 		var ctopen = 0;
 		var ctopen = 0;
@@ -446,7 +472,7 @@ class Parser {
 		var r_var = ~/[\$a-zA-Z0-9_]/;
 		var r_var = ~/[\$a-zA-Z0-9_]/;
 		var r_op = ~/[!+-\/*<>=&|%]+/;  //*/
 		var r_op = ~/[!+-\/*<>=&|%]+/;  //*/
 		var result = new StringBuf();
 		var result = new StringBuf();
-		var states = { none:0, string:1, dstring:2, variable:3, num:4, member:5 };
+		var states = { none:0, string:1, dstring:2, variable:3, num:4, member:5, array:6 };
 		var str = StringTools.trim(exp);
 		var str = StringTools.trim(exp);
 		var state = states.none;
 		var state = states.none;
 		var mark = 0;
 		var mark = 0;
@@ -499,11 +525,25 @@ class Parser {
 						i = end;
 						i = end;
 						skip = true;
 						skip = true;
 					}
 					}
+					else if (c == "["){
+						var def = findEndOfArray(str, i);
+						var sub = str.substr(i+1, def.end-i);
+						result.add("Array.new1($array(");
+						result.add(parseExpression(sub));
+						result.add("), ");
+						result.add(def.n);
+						i = def.end;
+						skip = true;
+					}
+					else if (c == "]"){
+						result.add(")");
+						skip = true;
+					}
 					else if (r_var.match(c)){
 					else if (r_var.match(c)){
 						state = states.variable;
 						state = states.variable;
 						mark = i;
 						mark = i;
 					}
 					}
-					
+
 				case states.string:
 				case states.string:
 					if (c == "\\" && n == "'"){ 
 					if (c == "\\" && n == "'"){ 
 						result.add("'");
 						result.add("'");

+ 1 - 0
std/mtwin/templo/Template.hx

@@ -124,6 +124,7 @@ class Template {
 			var oldCache = loader.cache;
 			var oldCache = loader.cache;
 			loader.cache = __dollar__new(oldCache);
 			loader.cache = __dollar__new(oldCache);
 			loader.String = String;
 			loader.String = String;
+			loader.Array = Array;
 			loader.iter = function(loop, fnc){
 			loader.iter = function(loop, fnc){
 				if (loop == null){
 				if (loop == null){
 					throw "repeat or foreach called on null value";
 					throw "repeat or foreach called on null value";