瀏覽代碼

moved mtwin library to https://svn.motion-twin.com/haxe-mtwin

Nicolas Cannasse 13 年之前
父節點
當前提交
7db2c6b408

+ 0 - 125
std/mtwin/DateFormat.hx

@@ -1,125 +0,0 @@
-package mtwin;
-
-class DateFormat {
-	static var REG_STD = ~/([0-9]{4})-([0-9]{2})-([0-9]{2})/;
-	static var REG_A = ~/(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec) ([0-9]{1,2}), ([0-9]{2,4})/;
-	static var REG_B = ~/([0-9]{1,2}) (Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec) ([0-9]{2,4})/;
-	static var REG_A2 = ~/(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec) ([0-9]{1,2}) .*? ([0-9]{4})$/;
-	static var REG_B2 = ~/([0-9]{1,2}) (Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec) .*? ([0-9]{4})$/;
-	static var REG_HOUR = ~/([0-9]{2}):([0-9]{2}):([0-9]{2})/;
-	static var REG_TZ = ~/(ADT|BST|NZT|NZST|IDLE|GST|EAST|JST|CCT|WAST|BT|EET|SWT|MEWT|MET|FWT|CET|IDLW|NT|HST|CAT|AHST|YST|AST|AT|WAT|WET|UTC|UT|GMT|EST|EDT|CST|CDT|MST|MDT|PST|PDT|YDT|HDT|MEST|MESZ|SST|FST|WADT|EADT|NZDT|[+-][0-9]{3,4}|[A-Z])$/;
-	static var REG_SIMPLE_TZ = ~/[+-][0-9]{3,4}/;
-	static var MONTH = ["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"];
-	static var DAY = ["Sun","Mon","Tue","Wed","Thu","Fri","Sat"];
-
-	static function month( s : String ) : Int{
-		for( i in 0...12 ){
-			if( MONTH[i].toLowerCase() == s.toLowerCase() ) return i+1;
-		}
-		throw "Unknown month: "+s;
-	}
-
-	static function timezone( str : String ) : {h: Int,m: Int}{
-		if( REG_SIMPLE_TZ.match(str) ){
-			var h = Std.parseInt(str.substr(0,-2));
-			var m = Std.parseInt(str.substr(-2,2));
-			return {h: h,m:m};
-		}
-
-		return switch( str ){	
-			case "GMT","UT","UTC","WET","Z","BST": {h:0,m:0};
-			case "A","WAT": {h:-1,m:0};
-			case "B","AT": {h:-2,m:0};
-			case "C","ADT": {h:-3,m:0};
-			case "D","AST","EDT": {h:-4,m:0};
-			case "E","EST","CDT": {h:5,m:0};
-			case "F","CST","MDT":  {h:-6,m:0};
-			case "G","MST","PDT":  {h:-7,m:0};
-			case "H","PST","YDT":  {h:-8,m:0};
-			case "I","YST","HDT":  {h:-9,m:0};
-			case "K","AHST","CAT","HST":  {h:-10,m:0};
-			case "L","NT":  {h:-11,m:0};
-			case "M","IDLW":  {h:-12,m:0};
-			case "N","CET","FWT","MET","MEWT","SWT":  {h:1,m:0};
-			case "O","EET","ZP2","MEST","MESZ","SST","FST":  {h:2,m:0};
-			case "P","BT","ZP3":  {h:3,m:0};
-			case "Q","ZP4":  {h:4,m:0};
-			case "R","ZP5":  {h:5,m:0};
-			case "S","ZP6":  {h:6,m:0};
-			case "T","WAST","ZP7":  {h:7,m:0};
-			case "U","CCT","ZP8":  {h:8,m:0};
-			case "V","JST","ZP9":  {h:9,m:0};
-			case "W","EAST","GST":  {h:10,m:0}; 
-			case "X":  {h:11,m:0};
-			case "Y","IDLE","NZST","NST":  {h:12,m:0};	
-			default: {h:0,m:0};
-		}
-	}
-
-	public static function timezoneConvert( d : Date, tz : String, ?ltz: String ) : Date {
-		if( ltz == null )
-			ltz = DateTools.format(Date.now(),"%z");
-
-		var localtz = timezone( ltz );
-		var otz = timezone( tz );
-
-		var diff = (localtz.h-otz.h)*3600 + (localtz.m-otz.m)*60;
-		return DateTools.delta(d,diff*1000.0);
-	}
-	
-	public static function parse( str : String ) : Date {
-		var h = 0;
-		var i = 0;
-		var s = 0;
-
-		var y = 1970;
-		var m = 1;
-		var d = 1;
-
-		if( REG_STD.match(str) ){
-			y = Std.parseInt(REG_STD.matched(1));
-			m = Std.parseInt(REG_STD.matched(2));
-			d = Std.parseInt(REG_STD.matched(3));
-		}else if( REG_A.match(str) ){
-			y = Std.parseInt(REG_A.matched(3));
-			d = Std.parseInt(REG_A.matched(2));
-			m = month(REG_A.matched(1));
-		}else if( REG_B.match(str) ){
-			y = Std.parseInt(REG_B.matched(3));
-			d = Std.parseInt(REG_B.matched(1));
-			m = month(REG_B.matched(2));
-		}else if( REG_A2.match(str) ){
-			y = Std.parseInt(REG_A2.matched(3));
-			d = Std.parseInt(REG_A2.matched(2));
-			m = month(REG_A2.matched(1));
-		}else if( REG_B2.match(str) ){
-			y = Std.parseInt(REG_B2.matched(3));
-			d = Std.parseInt(REG_B2.matched(1));
-			m = month(REG_B2.matched(2));
-		}else{
-			return null;
-		}
-
-		if( y < 50 )
-			y += 2000;
-		else if( y < 100 )
-			y += 1900;
-
-		if( REG_HOUR.match(str) ){
-			h = Std.parseInt(REG_HOUR.matched(1));
-			i = Std.parseInt(REG_HOUR.matched(2));
-			s = Std.parseInt(REG_HOUR.matched(3));
-		}
-
-		var ret = new Date(y,m-1,d,h,i,s);
-		if( REG_TZ.match(str) )
-			ret = timezoneConvert(ret,REG_TZ.matched(1));
-		return ret;
-	}
-
-	public static function formatRfc822( d : Date ) : String {
-		var month = MONTH[d.getMonth()];
-		var day = DAY[d.getDay()];
-		return DateTools.format(d,day+", %d "+month+" %Y %H:%M:%S %z");
-	}
-}

+ 0 - 294
std/mtwin/mail/Browser.hx

@@ -1,294 +0,0 @@
-/*
- * Copyright (c) 2006, Motion-Twin
- * All rights reserved.
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- *   - Redistributions of source code must retain the above copyright
- *     notice, this list of conditions and the following disclaimer.
- *   - Redistributions in binary form must reproduce the above copyright
- *     notice, this list of conditions and the following disclaimer in the
- *     documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY MOTION-TWIN "AS IS" AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL THE HAXE PROJECT CONTRIBUTORS BE LIABLE FOR
- * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
- * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
- * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
- * DAMAGE.
- */
-package mtwin.mail;
-
-typedef MainPart = {
-	ctype_primary: String,
-	ctype_secondary: String,
-	charset: String,
-	content: String
-}
-
-import neko.Utf8;
-import mtwin.mail.Part;
-
-class Browser extends MetaPart<Browser> {
-
-	public static function parseString( str : String ) : Browser {
-		var o = new Browser();
-		o.parse( str );
-		return o;
-	}
-
-	//////////
-
-	public function new(?ctype : String, ?sp : Bool, ?charset : String){
-		if( ctype == null ) ctype = "text/plain";
-		if( sp == null ) sp = false;
-		if( charset == null ) charset = "iso-8859-15";
-		super( ctype, sp, charset );
-	}
-
-	public override function newPart( ctype : String ) : Browser {
-		var o = new Browser( ctype, true, charset );
-		this.addPart( o );
-		return o;
-	} 
-
-	public function getMainPartCharset( cs : String, ?preferHtml : Bool ){
-		var r = getMainPart(preferHtml);
-		if( cs != r.charset ){
-			var cslc = cs.toLowerCase();
-			var charsetlc = r.charset.toLowerCase();
-
-			if( cslc != "utf-8" && charsetlc == "utf-8" ){
-				r.content =  try Utf8.decode( r.content ) catch( e : Dynamic ) r.content;
-			}else if( charsetlc != "utf-8" && cslc == "utf-8" ){
-				r.content =  try Utf8.encode( r.content ) catch( e : Dynamic ) r.content;
-			}
-			r.charset = cs;
-		}
-		return r;
-	}
-
-	public function getMainPart( ?preferHtml : Bool, ?level : Int, ?priority : Int, ?cpriority : Int ) : MainPart {
-		if( level == null ) level = 0;
-		if( priority == null ) priority = 0;
-		if( cpriority == null ) cpriority = 0;
-		if( preferHtml == null ) preferHtml = true;
-
-		var ctype = contentType.split("/");
-		var ctype0 = ctype[0];
-		var ctype1 = ctype[1];
-
-		if( ctype0 != "multipart" || (level == 0 && parts.length == 0) ){
-			if( level == 0 ) return mkBody();
-			if( preferHtml ){
-				if( ctype1 == "html" ) return mkBody();
-				if( ctype1 == "plain" && cpriority > 0 ) return mkBody();
-			}else{
-				if( ctype1 == "plain" ) return mkBody();
-				if( ctype1 == "html" && cpriority > 0 ) return mkBody();
-			}
-		}else{
-			if( level == 0 ){
-				// multipart !
-				// si c'est au premier niveau, c'est une boucle principale, avec priorité qui augmente
-				do {
-					do {
-						var r = null;
-						for( part in parts ){
-							r = part.getMainPart( preferHtml, level + 1, priority, cpriority );
-							if( r != null ) break;
-						}
-						if( r != null ) return r;
-						priority++;
-					}while( priority <= 1 );
-					cpriority++;
-				}while( cpriority <= 1 );
-			}else{
-				// là c'est des boucles qui se déclanche si c'est ok
-				if( ctype1 == "alternative" || priority > 0 ){
-					var r = null;
-					for( part in parts ){
-						r = part.getMainPart( preferHtml, level + 1, priority, cpriority );
-						if( r != null ) return r;
-					}
-				}
-			}
-		}
-		return null;
-	}
-
-	public function listAttachment( ?level : Int, ?cs : String ){
-		if( cs == null )
-			cs = charset;
-		cs = cs.toLowerCase();
-		if( level == null ) level = 0;
-		var l = listAttachmentObjects( level );
-		var r = new List();
-		for( v in l ){
-			var name = v.name;
-			if( cs != "utf-8" && v.charset.toLowerCase() == "utf-8" ){
-				name =  try Utf8.decode( name ) catch( e : Dynamic ) name;
-			}else if( v.charset.toLowerCase() != "utf-8" && cs == "utf-8" ){
-				name =  try Utf8.encode( name ) catch( e : Dynamic ) name;
-			}
-			r.add({
-				name: name, 
-				id: v.id, 
-				type: v.contentType
-			});
-		}
-		return r;
-	}
-
-	function listAttachmentObjects( level : Int ) : List<Browser> {
-		var ctype = contentType.split("/");
-		var ctype0 = ctype[0];
-		var ctype1 = ctype[1];
-
-		var ret = new List();
-		if( ctype0 != "multipart" ){
-			if( level != 0 && headers.exists("Content-Disposition") ){
-				ret.add( this );
-			}
-		}else if( ctype1 != "alternative" ){
-			for( part in parts ){
-				for( v in part.listAttachmentObjects( level + 1 ) ){
-					ret.add( v );
-				}
-			}
-		}
-		return ret;
-	}
-
-	public function getAttachment( i : String ) : {name: String,ctype: String,content: String }{
-		if( id == i ){
-			return {
-				name: name,
-				ctype: contentType,
-				content: content
-			};
-		}
-		for( part in parts ){
-			var t = part.getAttachment( i );
-			if( t != null ) return t;
-		}
-		return null;
-	}
-
-	public function getAttachmentByCid( wid : String ) : {name: String,ctype: String,content: String }{
-		var cid = getHeader("Content-Id");
-		if( cid != null && StringTools.trim(cid) == "<"+wid+">" ){
-			return {
-				name: name,
-				ctype: contentType,
-				content: content
-			};
-		}
-		for( part in parts ){
-			var t = part.getAttachmentByCid( wid );
-			if( t != null ) return t;
-		}
-		return null;
-	}
-	
-	public function hasHeader( name ){
-		name = Tools.formatHeaderTitle( name );
-		return headers.exists( name );
-	}
-
-	public override function getHeader( name, ?charset ){
-		return super.getHeader( Tools.formatHeaderTitle(name),charset );
-	}
-
-	public function getAddress( name, ?charset ){
-		var e = getHeader(name,charset);
-		if( e == null )
-			return null;
-		return Tools.parseAddress(e,false);
-	}
-
-	function mkBody() : {ctype_primary: String,ctype_secondary: String,charset: String,content: String} {
-		var ctype = contentType.split("/");
-
-		return {
-			ctype_primary: ctype[0],
-			ctype_secondary: ctype[1],
-			charset: charset,
-			content: content
-		};
-	}
-
-	public function toString( ?level : Int ) : String {
-		if( level == null ) level = 0;
-
-		var s = StringTools.lpad("","\t",level);
-		var s2 = StringTools.lpad("","\t",level+1);
-		var sb = new StringBuf();
-		
-		sb.add( s );
-		sb.add("mail.Browser#");
-		sb.add(id);
-		sb.add("<");
-		sb.add(contentType);
-		sb.add(">");
-
-		var sb2 = new StringBuf();
-
-		if( hasHeader("From") ){
-			sb2.add(s2);
-			sb2.add("From: ");
-			sb2.add(getHeader("From","utf-8"));
-			sb2.add("\n");
-		}
-
-		if( hasHeader("To") ){
-			sb2.add(s2);
-			sb2.add("To: ");
-			sb2.add(getHeader("To","utf-8"));
-			sb2.add("\n");
-		}
-
-		if( hasHeader("Subject") ){
-			sb2.add(s2);
-			sb2.add("Subject: ");
-			sb2.add(getHeader("Subject","utf-8"));
-			sb2.add("\n");
-		}
-
-		if( hasHeader("Date") ){
-			sb2.add(s2);
-			sb2.add("Date: ");
-			sb2.add(getHeader("Date","utf-8"));
-			sb2.add("\n");
-		}		
-
-		if( name != null ){
-			sb2.add(s2);
-			sb2.add("Name: ");
-			sb2.add(name);
-			sb2.add("\n");
-		}
-
-		for( part in parts ){
-			sb2.add( part.toString( level + 1 ) );
-		}
-
-		var t = sb2.toString();
-
-		if( t.length > 0 ){
-			sb.add(" [\n");
-			sb.add(t);
-			sb.add(s);
-			sb.add("]");
-		}
-		
-		sb.add("\n");
-		return sb.toString();
-	}
-
-}

+ 0 - 43
std/mtwin/mail/Exception.hx

@@ -1,43 +0,0 @@
-/*
- * Copyright (c) 2006, Motion-Twin
- * All rights reserved.
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- *   - Redistributions of source code must retain the above copyright
- *     notice, this list of conditions and the following disclaimer.
- *   - Redistributions in binary form must reproduce the above copyright
- *     notice, this list of conditions and the following disclaimer in the
- *     documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY MOTION-TWIN "AS IS" AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL THE HAXE PROJECT CONTRIBUTORS BE LIABLE FOR
- * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
- * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
- * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
- * DAMAGE.
- */
-package mtwin.mail;
-
-enum Exception {
-	AlreadyConnected;
-	NotConnected;
-	ConnectionError(host:String,port:Int);
-	SmtpMailFromError(e:String);
-	SmtpRcptToError(e:String);
-	SmtpDataError(e:String);
-	SmtpAuthError(e:String);
-	SmtpSendDataError;
-
-	UnknowResponse(r:String);
-	BadResponse(r:String);
-	ImapFetchError;
-
-	ParseError(s:String);
-	NoSelect;
-}

+ 0 - 443
std/mtwin/mail/Part.hx

@@ -1,443 +0,0 @@
-/*
- * Copyright (c) 2006, Motion-Twin
- * All rights reserved.
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- *   - Redistributions of source code must retain the above copyright
- *     notice, this list of conditions and the following disclaimer.
- *   - Redistributions in binary form must reproduce the above copyright
- *     notice, this list of conditions and the following disclaimer in the
- *     documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY MOTION-TWIN "AS IS" AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL THE HAXE PROJECT CONTRIBUTORS BE LIABLE FOR
- * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
- * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
- * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
- * DAMAGE.
- */
-package mtwin.mail;
-
-import neko.Utf8;
-
-class Part extends MetaPart<Part> {
-	public static function parseString( str : String ) : Part {
-		var o = new Part();
-		o.parse( str );
-		return o;
-	}
-
-	public function new(?a,?b,?c){
-		super(a,b,c);
-	}
-
-	public override function newPart( ctype : String ) : Part {
-		var o = new Part( ctype, true, charset );
-		this.addPart( o );
-		return o;
-	}
-}
-
-class MetaPart<T> {
-	static var headerOrder = [
-		"Return-Path","Received","Date","From","Subject","Sender","To",
-		"Cc","Bcc","Content-Type","X-Mailer","X-Originating-IP","X-Originating-User"
-	];
-
-	static var REG_HEADER = ~/^([a-zA-Z0-9_\-]+):(.*)$/;
-	static var REG_CRLF_END = ~/(\r?\n)$/;
-	
-	//////////////////
-	
-	public var content : String;
-	public var parts : List<T>;
-	var headers : Hash<Array<String>>;
-	var contentType : String;
-	var charset : String;
-	var boundary : String;
-
-	var name : String;
-
-	var id : String;
-	var subPart : Bool;
-
-	public function new( ?ctype : String, ?sp : Bool, ?charset : String ){
-		this.contentType = if( ctype == null ) "text/plain" else ctype;
-		this.subPart = sp == true;
-		this.charset = if( charset == null ) "iso-8859-1" else charset;
-
-		content = "";
-		
-		parts = new List();
-		headers = new Hash();
-	}
-
-	public function getContentType(){
-		return contentType;
-	}
-
-	public function getName( ?charsetOut : String ){
-		var r = name;
-		if( charsetOut != null && charsetOut != charset ){
-			var cslc = charsetOut.toLowerCase();
-			var charsetlc = charset.toLowerCase();
-			if( cslc != "utf-8" && charsetlc == "utf-8" ){
-				r =  Utf8.decode( r );
-			}else if( charsetlc != "utf-8" && cslc == "utf-8" ){
-				r =  Utf8.encode( r );
-			}
-		}
-
-		return r;
-	}
-
-	public function setName( n : String, ?cs : String ){
-		name = n;
-		if( cs != null && cs != charset ){
-			var cslc = cs.toLowerCase();
-			var charsetlc = charset.toLowerCase();
-			if( cslc != "utf-8" && charsetlc == "utf-8" ){
-				name =  Utf8.encode( name );
-			}else if( charsetlc != "utf-8" && cslc == "utf-8" ){
-				name =  Utf8.decode( name );
-			}
-		}
-	}
-
-	public function addPart( part : T ){
-		parts.add( part );
-	}
-
-	public function setContent( c : String ){
-		setHeader( "Content-Transfer-Encoding", "quoted-printable" );
-		content = c;
-	}
-
-	public function setContentFromFile(filename:String,type:String){
-		var a = filename.split("/");
-		name = a.pop();
-		content = neko.io.File.getContent(filename);
-		contentType = type;
-		setHeader("Content-Type",type+"; name=\""+name+"\"");
-		setHeader("Content-Disposition","attachment; filename=\""+name+"\"");
-		setHeader("Content-Transfer-Encoding","base64");
-	}
-	
-	public function setHeader( name : String, content : String ){
-		if( headers.exists(name) ){
-			var l = headers.get(name);
-			if( l.length > 1 )
-				throw "Unable to setHeader, multiple header.";
-
-			l[0] = content;
-		}else{
-			headers.set(name,[content]);
-		}
-	}
-
-	public function getHeader( name: String, ?cs : String ){
-		if( !headers.exists(name) ){
-			return null;
-		}
-		var r = headers.get(name)[0];
-
-		if( cs != null && cs != charset ){
-			var cslc = cs.toLowerCase();
-			var charsetlc = charset.toLowerCase();
-			if( cslc != "utf-8" && charsetlc == "utf-8" ){
-				r =  Utf8.decode( r );
-			}else if( charsetlc != "utf-8" && cslc == "utf-8" ){
-				r =  Utf8.encode( r );
-			}
-		}
-
-		return r;
-	}
-
-	public function addHeader( name : String, content : String ){
-		if( headers.exists(name) ){
-			headers.get(name).push(content);
-		}else{
-			headers.set(name,[content]);
-		}		
-	}
-
-	public function setDate( ?d : Date ){
-		if( d == null ) d = Date.now();
-		setHeader("Date",mtwin.DateFormat.formatRfc822(d));
-	}
-
-	public function getDate(){
-		var d = getHeader("Date");
-		if( d == null )
-			return null;
-		return mtwin.DateFormat.parse(d);
-	}
-
-	public function setContentId( ?cid : String ) : String {
-		if( cid == null ){
-			var t = getHeader("Content-Id");
-			if( t != null ){
-				return t.substr(1,t.length-2);
-			}
-
-			cid = Tools.randomEight()+"."+Tools.randomEight();
-
-			setHeader("Content-Id","<"+cid+">");
-		}else{
-			setHeader("Content-Id","<"+cid+">");
-		}
-
-		return cid;
-	}
-
-	public function htmlUseContentId( p : Hash<String> ){
-		for( filename in p.keys() ){
-			content = StringTools.replace( content, filename, "cid:"+p.get(filename) );
-		}
-	}
-
-	static var REG_START_TAB = ~/^(\t| )+/;
-	function htmlRemoveTab(){
-		content = REG_START_TAB.replace(content,"");
-	}
-
-	public function get() : String {
-		var boundary = "";
-
-		if( parts.length > 0 ){
-			if( contentType.substr(0,10).toLowerCase() != "multipart/" ){
-				contentType = "multipart/mixed";
-			}
-
-			if( boundary == null || boundary.length == 0 ){
-				boundary = "----=" + Tools.randomEight() + "_" + Tools.randomEight() + "." + Tools.randomEight();
-			}
-
-			setHeader("Content-Type",contentType+"; charset=\""+charset+"\"; boundary=\""+boundary+"\"");
-		}else{
-			if( name != null )
-				setHeader("Content-Type",contentType+"; name=\""+name.split("\"").join("\\\"")+"\"");
-			else
-			setHeader("Content-Type",contentType+"; charset=\""+charset+"\"");
-		}
-
-		if( !subPart ){
-			setHeader("MIME-Version","1.0");
-			setHeader("X-Mailer","haXe mailer");
-		}
-
-		var ret = new StringBuf();
-		
-		// copy headers
-		var myHeaders = new Hash();
-		for( k in headers.keys() ){
-			myHeaders.set(k,headers.get(k));
-		}
-		
-		// Put standard headers
-		for( p in headerOrder ){
-			if( myHeaders.exists(p) ){
-				for( s in myHeaders.get(p) )
-					ret.add(Tools.formatHeader(p,s,charset));
-				myHeaders.remove(p);
-			}
-		}
-		
-		// Put other headers
-		for( k in myHeaders.keys() ){
-			for( s in myHeaders.get(k) )
-				ret.add(Tools.formatHeader(k,s,charset));
-		}
-
-		ret.add("\r\n");
-
-		// Add content
-		if( content.length > 0 ){
-			switch( getHeader("Content-Transfer-Encoding") ){
-				case "base64":
-					ret.add( Tools.encodeBase64(content) + "\r\n" );
-				case "quoted-printable":
-					ret.add( Tools.encodeQuotedPrintable(content) + "\r\n" );
-				default:
-					ret.add( content + "\r\n" );
-			}
-		}
-		
-		// Add parts
-		if( parts.length > 0 ){
-			var pcp = new List<MetaPart<T>>();
-			for( p in parts ){
-				pcp.add(cast p);
-			}
-			
-			if( contentType == "multipart/alternative" ){
-				// text/plain first
-				for( v in pcp ){
-					if( v.contentType == "text/plain" ){
-						ret.add( "--" + boundary + "\r\n" + v.get() );
-						pcp.remove(v);
-					}
-				}
-				
-				// then text/html
-				for( v in pcp ){
-					if( v.contentType == "text/html" ){
-						ret.add( "--" + boundary + "\r\n" + v.get() );
-						pcp.remove(v);
-					}
-				}
-			}
-
-			for( v in pcp ){
-				ret.add( "--" + boundary + "\r\n" + v.get() );
-			}
-			ret.add("--" + boundary + "--\r\n");
-			
-		}
-
-		return ret.toString();
-	}
-
-
-	function parse( str:String, ?id : String ){
-		if( str == null )
-			throw "unable to parse null";
-			
-		if( id == null ) subPart = false;
-		this.id = id;
-
-		var head : List<String> = new List();
-		var buf = new StringBuf();
-
-		var i = 0;
-		var oi = 0;
-		while( (i=str.indexOf("\n",oi)) >= 0 ){
-			var ln = str.substr(oi,i-oi);
-			if( ln.length == 0 || ln == "\r" ){
-				head.add( buf.toString() );
-				break;
-			}else{
-				if( ~/^\s/.match( ln )  ){
-					buf.add( Tools.removeCRLF(ln) );
-				}else{
-					head.add( buf.toString() );
-					buf = new StringBuf();
-					buf.add( Tools.removeCRLF(ln) );
-				}
-			}
-			oi = ++i;
-		}
-		content = str.substr(i);
-		
-		for( ln in head ){
-			if( REG_HEADER.match(ln) ){
-				var name = Tools.formatHeaderTitle(REG_HEADER.matched(1));
-				var value = StringTools.trim(REG_HEADER.matched(2));
-				if( headers.exists(name) ){
-					headers.get(name).push( value );
-				}else{
-					headers.set(name,[value]);
-				}				
-			}
-		}
-
-		var ctype0 = "text";
-		var ctype1 = "plain";
-
-		// parse contentType
-		var hctype = Tools.parseComplexHeader(getHeader("Content-Type"));
-		if( hctype != null ){
-			var t = hctype.value.split("/");
-			ctype0 = StringTools.trim(t[0]).toLowerCase();
-			if( t.length > 1 )
-				ctype1 = StringTools.trim(t[1]).toLowerCase();
-			else
-				ctype1 = "";
-
-			if( hctype.params.exists("charset") ){
-				charset = hctype.params.get("charset");
-			}
-
-			if( hctype.params.exists("boundary") ){
-				boundary = hctype.params.get("boundary");
-			}
-		}
-		
-		contentType = ctype0+"/"+ctype1;
-
-		for( k in headers.keys() ){
-			var a = headers.get(k);
-			for( i in 0...a.length ){
-				a[i] = Tools.headerDecode(a[i],charset);
-			}
-		}
-
-		if( ctype0 == "multipart" ){
-			if( boundary == null || boundary.length == 0 ){
-				contentType = "text/plain";
-				ctype0 = "text";
-				ctype1 = "plain";
-			}else{
-				splitContent();
-			}
-		}
-
-		if( headers.exists("Content-Transfer-Encoding") ){
-			var cte = getHeader("Content-Transfer-Encoding").toLowerCase();
-			if( cte == "quoted-printable" ){
-				content = Tools.decodeQuotedPrintable( content );
-			}else if( cte == "base64" ){
-				content = Tools.decodeBase64( content );
-			}
-		}
-
-		hctype = Tools.parseComplexHeader(getHeader("Content-Type"));
-		if( hctype != null && hctype.params.exists("name") )
-			name = hctype.params.get("name");
-
-		var cdispo = Tools.parseComplexHeader(getHeader("Content-Disposition"));
-		if( cdispo != null && cdispo.params.exists("filename") )
-			name = cdispo.params.get("filename");
-	}
-
-	function splitContent(){
-		var bound = Tools.pregQuote(boundary);
-		var regStr = "(.*?)--"+bound+"(.*)--"+bound+"--";
-		var reg = new EReg(regStr,"s");
-
-		if( reg.match( content ) ){
-			content = reg.matched(1);
-			var b = "--"+boundary;
-			var ts = reg.matched(2);
-			var tmp = new Array();
-			var i = 0;
-			var oi = 0;
-			while( (i=ts.indexOf(b,oi)) >= 0 ){
-				tmp.push(ts.substr(oi,i-oi));
-				i+=b.length;
-				oi = i;
-			}
-			tmp.push(ts.substr(oi));
-
-			var myId = if(id == null || id.length == 0) "" else id + ".";
-			var i = 0;
-			for( str in tmp ){
-				i++;
-				var p = cast newPart("text/plain");
-				p.parse( StringTools.trim(str)+"\r\n", myId+i );
-			}
-		}
-	}
-
-	public function newPart(ctype:String) : T {
-		throw "Part cannot be used directly : newPart need to be overrided";
-		return null;
-	}
-}

+ 0 - 95
std/mtwin/mail/Pop.hx

@@ -1,95 +0,0 @@
-package mtwin.mail;
-
-class Pop {
-	var host : String;
-	var user : String;
-	var pass : String;
-	var port : Int;
-
-	var sock : neko.net.Socket;
-
-	public function new( host : String, user : String, pass : String, ?port : Int ){
-		this.host = host;
-		this.user = user;
-		this.pass = pass;
-		this.port = port == null ? 110 : port;
-	}
-
-	private function connect(){
-		if( sock == null ){
-			var s = new neko.net.Socket();
-			s.setTimeout(1);
-			s.connect(new neko.net.Host(host),port);
-
-			// get server init line
-			s.input.readLine();
-
-			s.output.writeString("USER "+user+"\n");
-			var ret = s.input.readLine();
-			if( ret.substr(0,3) != "+OK" ) throw "Pop USER failed: "+ret;
-
-			s.output.writeString("PASS "+pass+"\n");
-			var ret = s.input.readLine();
-			if( ret.substr(0,3) != "+OK" ) throw "Pop PASS failed: "+ret;
-
-			sock = s;
-		}
-		return sock;
-	}
-
-	public function close(){
-		if( sock != null ){
-			sock.output.writeString("QUIT\n");
-			var ret = sock.input.readLine();
-			if( ret.substr(0,3) != "+OK" ) throw "Pop QUIT failed: "+ret;
-			sock.close();
-			sock = null;
-		}
-	}
-
-	static var REG_SCAN_LIST = ~/([0-9]+) ([0-9]+)/;
-	public function list() : List<{id: Int,size: Int}> {
-		var cnx = connect();
-
-		cnx.output.writeString("LIST\n");
-		var ret = new List();
-		var t : String;
-		do {
-			t = StringTools.trim(cnx.input.readLine());
-			if( REG_SCAN_LIST.match(t) )
-				ret.add({
-					id: Std.parseInt(REG_SCAN_LIST.matched(1)),
-					size: Std.parseInt(REG_SCAN_LIST.matched(2))
-				});
-		}while( t != null && t != ".");
-		return ret;
-	}
-
-	public function getMessage( id : Int ){
-		var cnx = connect();
-
-		cnx.output.writeString("RETR "+id+"\n");
-		var r = cnx.input.readLine();
-		if( r.substr(0,3) != "+OK" ) throw "Pop RETR failed: "+r;
-
-		var ret = new StringBuf();
-		do {
-			var l = StringTools.rtrim(cnx.input.readLine());
-			if( l == "." )
-				break;
-			if( l.substr(0,2) == ".." )
-				l = l.substr(1);
-			ret.add(l);
-			ret.add("\r\n");
-		}while( true );
-		return ret.toString().substr(0,-2);
-	}
-
-	public function delete( id : Int ){
-		var cnx = connect();
-
-		cnx.output.writeString("DELE "+id+"\n");
-		var r = cnx.input.readLine();
-		if( r.substr(0,3) != "+OK" ) throw "Pop DELE failed: "+r;
-	}
-}

+ 0 - 149
std/mtwin/mail/Smtp.hx

@@ -1,149 +0,0 @@
-/*
- * Copyright (c) 2006, Motion-Twin
- * All rights reserved.
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- *   - Redistributions of source code must retain the above copyright
- *     notice, this list of conditions and the following disclaimer.
- *   - Redistributions in binary form must reproduce the above copyright
- *     notice, this list of conditions and the following disclaimer in the
- *     documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY MOTION-TWIN "AS IS" AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL THE HAXE PROJECT CONTRIBUTORS BE LIABLE FOR
- * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
- * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
- * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
- * DAMAGE.
- */
-package mtwin.mail;
-
-import neko.net.Socket;
-import neko.net.Host;
-import mtwin.mail.Exception;
-
-class Smtp {
-
-	public static function send( host : String, from : String, to : String, data : String, ?port: Int, ?user: String, ?password: String ){
-		if( port == null ) port = 25;
-
-		var cnx = new Socket();
-		
-		try {
-			cnx.connect(new Host(host),port);
-		}catch( e : Dynamic ){
-			cnx.close();
-			throw ConnectionError(host,port);
-		}
-		
-		var supportLoginAuth = false;
-
-		// get server init line
-		var ret = StringTools.trim(cnx.input.readLine());
-		var esmtp = ret.indexOf("ESMTP") >= 0;
-		
-		
-		while (StringTools.startsWith(ret, "220-")) {
-			ret = StringTools.trim(cnx.input.readLine());
-		}
-		
-		if ( esmtp ) { //if server support extensions
-			//EHLO
-			cnx.write( "EHLO " + Host.localhost() + "\r\n");
-			ret = "";
-			
-			do {
-				ret = StringTools.trim(cnx.input.readLine());
-				if( ret.substr(0,3) != "250" ){
-					cnx.close();
-					throw BadResponse(ret);
-				} else if ( ret.substr(4, 4) == "AUTH" && ret.indexOf("LOGIN") != -1) {
-					supportLoginAuth = true;
-				}
-			} while(ret.substr(0,4) != "250 ");
-		} else {
-			//HELO
-			cnx.write( "HELO " + Host.localhost() + "\r\n");
-			ret = StringTools.trim(cnx.input.readLine());
-			if( ret.substr(0,3) != "250" ){
-				cnx.close();
-				throw BadResponse(ret);
-			}
-		}
-
-		if ( user != null ) { //if we were asked to login
-			if ( supportLoginAuth ) { //if server support AUTH LOGIN
-				cnx.write( "AUTH LOGIN\r\n" );
-				ret = StringTools.trim(cnx.input.readLine());
-				if( ret.substr(0,3) != "334" ){
-					cnx.close();
-					throw SmtpAuthError(ret);
-				}
-				
-				cnx.write( Tools.encodeBase64(user) + "\r\n" );
-				ret = StringTools.trim(cnx.input.readLine());
-				if( ret.substr(0,3) != "334" ){
-					cnx.close();
-					throw SmtpAuthError(ret);
-				}
-				cnx.write( Tools.encodeBase64(password) + "\r\n" );
-				ret = StringTools.trim(cnx.input.readLine());
-				if( ret.substr(0,3) != "235" ){
-					cnx.close();
-					throw SmtpAuthError(ret);
-				}
-			} else {
-				throw SmtpAuthError("Authorization with 'login' method not supported by server");
-			}
-		}
-
-		cnx.write( "MAIL FROM:<" + from + ">\r\n" );
-		ret = StringTools.trim(cnx.input.readLine());
-		if( ret.substr(0,3) != "250" ){
-			cnx.close();
-			throw SmtpMailFromError(ret);
-		}
-
-		cnx.write( "RCPT TO:<" + to + ">\r\n" );
-		ret = StringTools.trim(cnx.input.readLine());
-		if( ret.substr(0,3) != "250" ){
-			cnx.close();
-			throw SmtpRcptToError(ret);
-		}
-
-		cnx.write( "DATA\r\n" );
-		ret = StringTools.trim(cnx.input.readLine());
-		if( ret.substr(0,3) != "354" ){
-			cnx.close();
-			throw SmtpDataError(ret);
-		}
-
-		var a = ~/\r?\n/g.split(data);
-		var lastEmpty = false;
-		for( l in a ){
-			if( l.substr(0,1) == "." )
-				l = "."+l;
-			cnx.write(l);
-			cnx.write("\r\n");
-		}
-		if( a[a.length-1] != "" ) 
-			cnx.write("\r\n");
-		cnx.write( ".\r\n" );
-
-		ret = StringTools.trim(cnx.input.readLine());
-		if( ret.substr(0,3) != "250" ){
-			cnx.close();
-			throw SmtpSendDataError;
-		}
-
-		cnx.write( "QUIT\r\n" );
-		cnx.close();
-	}
-	
-}

+ 0 - 565
std/mtwin/mail/Tools.hx

@@ -1,565 +0,0 @@
-/*
- * Copyright (c) 2006, Motion-Twin
- * All rights reserved.
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- *   - Redistributions of source code must retain the above copyright
- *     notice, this list of conditions and the following disclaimer.
- *   - Redistributions in binary form must reproduce the above copyright
- *     notice, this list of conditions and the following disclaimer in the
- *     documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY MOTION-TWIN "AS IS" AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL THE HAXE PROJECT CONTRIBUTORS BE LIABLE FOR
- * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
- * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
- * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
- * DAMAGE.
- */
-package mtwin.mail;
-
-typedef Address = {
-	name: String,
-	address: String
-}
-
-class Tools {
-
-	static var BASE64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
-	static var HEXA = "0123456789ABCDEF";
-
-
-	static var REG_HEADER_DECODE = ~/^(.*?)=\?([^\?]+)\?(Q|B)\?([^?]*)\?=\s*(.*?)$/i;
-	static var REG_QP_LB = ~/=\\r?\\n/;
-	static var REG_QP = ~/=([A-Fa-f0-9]{1,2})/;
-	static var REG_SPACES_EQUAL = ~/[\s=]+/g;
-
-	public static function chunkSplit( str:String, length:Int, sep:String ){
-		var ret = "";
-		while( str.length > length ){
-			ret += str.substr(0,length) + sep;
-			str = str.substr(length,str.length - length);
-		}
-		return ret + str;
-	}
-
-	public static function splitLines( str : String ) : Array<String> {
-		var ret = str.split("\n");
-		for( i in 0...ret.length ){
-			var l = ret[i];
-			if( l.substr(-1,1) == "\r" ){
-				ret[i] = l.substr(0,-1);
-			}
-		}
-		return ret;
-	}
-
-	public static function encodeBase64( content : String ){
-		var suffix = switch (content.length % 3) {
-			case 2: "=";
-			case 1: "==";
-			default: "";
-		}
-		return StringTools.rtrim(chunkSplit(haxe.BaseCode.encode( content, BASE64 ), 76, "\r\n")) + suffix;
-	}
-
-	#if neko
-	static var regexp_match = neko.Lib.load("regexp","regexp_match",4);
-	static var regexp_matched_pos : Dynamic -> Int -> { pos : Int, len : Int } = neko.Lib.load("regexp","regexp_matched_pos",2);
-	#end
-
-	public static function decodeBase64( content : String ){
-		#if neko
-		var r = untyped ~/[\s=]+/.r;
-		var b = new StringBuf();
-		var pos = 0;
-		var len = content.length;
-		var first = true;
-		do {
-			if( !regexp_match(r,untyped content.__s,pos,len) )
-				break;
-			var p = regexp_matched_pos(r,0);
-			if( p.len == 0 && !first ) {
-				if( p.pos == content.length )
-					break;
-				p.pos += 1;
-			}
-			b.addSub(content,pos,p.pos-pos);
-			var tot = p.pos + p.len - pos;
-			pos += tot;
-			len -= tot;
-			first = false;
-		} while( true );
-		b.addSub(content,pos,len);
-		content = b.toString();
-		#else
-		content = REG_SPACES_EQUAL.replace(content,"");
-		#end
-		return try haxe.BaseCode.decode( content, BASE64 ) catch( e : Dynamic ) content;
-	}
-
-	public static function encodeQuotedPrintable( content : String ) : String{
-		var rs = new List();
-		var lines = splitLines( content );
-
-		for( ln in lines ){
-			var len = ln.length;
-			var line = "";
-			for( i in 0...len ){
-				var c = ln.charAt(i);
-				var o = c.charCodeAt(0);
-				if( o == 9 ){
-				}else if( o < 16 ){
-					c = "=0" + haxe.BaseCode.encode(c,HEXA);
-				}else if( o == 61 || o < 32 || o > 126 ){
-					c = "=" + haxe.BaseCode.encode(c,HEXA);
-				}
-
-				// space at the end of line
-				if( i == len - 1 ){
-					if( o == 32 ){
-						c = "=20";
-					}else if( o == 9 ){
-						c = "=09";
-					}
-				}
-
-				// soft line breaks
-				var ll = line.length;
-				var cl = c.length;
-				if( ll + cl >= 76 && (i != len -1 || ll + cl != 76) ){
-					rs.add(line + "=");
-					line = "";
-				}
-				line += c;
-			}
-			rs.add(line);
-		}
-
-		return rs.join("\r\n");
-	}
-
-	static var REG_HEXA = ~/^[0-9A-F]{2}$/;
-	public static function decodeQuotedPrintable( str : String ){
-		str = ~/=\r?\n/g.replace(str,"");
-		var a = str.split("=");
-		var first = true;
-		var ret = new StringBuf();
-		for( t in a ){
-			if( first ){
-				first = false;
-				ret.add(t);
-			}else{
-				var h = t.substr(0,2).toUpperCase();
-				if( REG_HEXA.match(h) ){
-					ret.add(haxe.BaseCode.decode(h,HEXA));
-					ret.addSub(t,2,t.length - 2);
-				}else{
-					ret.add("=");
-					ret.add(t);
-				}
-
-			}
-		}
-		return ret.toString();
-	}
-
-	public static function headerQpEncode( ostr : String, initSize : Int, charset : String, ?cleanQuote : Bool ){
-		var str = ~/\r?\n\s*/.replace(ostr," ");
-		if( cleanQuote ){
-			if( str.substr(0,1) == "\"" )
-				str = str.substr(1,str.length-1);
-			if( str.substr(str.length-1,1) == "\"" )
-				str = str.substr(0,str.length-1);
-		}
-
-		var csl = charset.length;
-		var len = str.length;
-		var quotedStr : List<String> = new List();
-		var line = new StringBuf();
-		var llen = 0;
-		var useQuoted = false;
-		for( i in 0...len ){
-			var c = str.charAt(i);
-			var o = c.charCodeAt(0);
-
-			if( o == 9 ){
-			}else if( o < 16 ){
-				useQuoted = true;
-				c = "=0" + haxe.BaseCode.encode(c,HEXA);
-			}else if( o == 61 || o == 58 || o == 63 || o == 95 || o == 34 ){
-				c = "=" + haxe.BaseCode.encode(c,HEXA);
-			}else if( o < 32 || o > 126 ){
-				useQuoted = true;
-				c = "=" + haxe.BaseCode.encode(c,HEXA);
-			}else if( o == 32 ){
-				c = "_";
-			}
-
-			// max line length = 76 - 17 ( =?iso-8859-1?Q?...?= ) => 59 - initSize
-			var max : Int;
-			if( quotedStr.length == 0 ){
-				max = 69 - csl - initSize;
-			}else{
-				max = 69 - csl;
-			}
-			var clen = c.length;
-			if( llen + clen >= max ){
-				quotedStr.add(line.toString());
-				line = new StringBuf();
-				llen = 0;
-			}
-			line.add(c);
-			llen += clen;
-		}
-		quotedStr.add(line.toString());
-
-		if( !useQuoted ){
-			return wordWrap(ostr,75,"\r\n",initSize,true);
-		}else{
-			return "=?"+charset+"?Q?"+quotedStr.join("?=\r\n =?"+charset+"?Q?")+"?=";
-		}
-	}
-
-	public static function headerAddressEncode( ostr : String, initSize : Int, charset : String ){
-		var list = parseAddress(ostr);
-		var lret = new List();
-		for( a in list ){
-			var ret = new StringBuf();
-			var addr = a.address;
-			if( a.name != null ){
-				var name = a.name;
-				if( ~/[\s,"']/.match( name ) )
-					name = "\""+name.split("\\").join("\\\\").split("\"").join("\\\"")+"\"";
-				var t = headerQpEncode(name,initSize,charset,true);
-				ret.add( t );
-				var p = t.lastIndexOf("\n");
-				if( p == -1 )
-					initSize += t.length;
-				else
-					initSize = t.length - p;
-				addr = " <"+a.address+">";
-			}
-
-			if( initSize + addr.length > 75 ){
-				ret.add("\r\n ");
-				initSize = 1;
-			}
-			ret.add( addr );
-			initSize += addr.length;
-			lret.add( ret.toString() );
-		}
-		return lret.join(", ");
-	}
-
-	public static function headerComplexEncode( ostr : String, initSize : Int, charset : String ){
-		var e = parseComplexHeader(ostr);
-		var ret = new StringBuf();
-
-		var b = headerQpEncode(e.value,initSize,charset);
-		ret.add(b);
-
-		for( k in e.params.keys() ){
-			ret.add(";");
-			initSize += 1;
-			var p = b.lastIndexOf("\n");
-			if( p == -1 )
-				initSize += b.length;
-			else
-				initSize = b.length - p;
-
-			if( initSize + k.length + 3 > 75 ){
-				ret.add("\r\n ");
-				initSize = 1;
-			}else{
-				ret.add(" ");
-				initSize++;
-			}
-			ret.add(k);
-			ret.add("=\"");
-			initSize += k.length + 2;
-			b = headerQpEncode(e.params.get(k),initSize,charset);
-			ret.add(b);
-			ret.add("\"");
-		}
-
-		return ret.toString();
-	}
-
-	public static function headerDecode( str : String, charsetOut : String ){
-		str = ~/\r?\n\s?/.replace(str," ");
-		while( REG_HEADER_DECODE.match(str) ){
-			var charset = StringTools.trim(REG_HEADER_DECODE.matched(2).toLowerCase());
-			var encoding = StringTools.trim(REG_HEADER_DECODE.matched(3).toLowerCase());
-			var encoded = StringTools.trim(REG_HEADER_DECODE.matched(4));
-
-			var start = REG_HEADER_DECODE.matched(1);
-			var end = REG_HEADER_DECODE.matched(5);
-
-			if( encoding == "q" ){
-				encoded = decodeQuotedPrintable(StringTools.replace(encoded,"_"," "));
-			}else if( encoding == "b" ){
-				encoded = decodeBase64(encoded);
-			}else{
-				throw "Unknow transfer-encoding: "+encoding;
-			}
-
-			charsetOut = charsetOut.toLowerCase();
-			if( charsetOut != "utf-8" && charset == "utf-8" ){
-				encoded =  try neko.Utf8.decode( encoded ) catch( e : Dynamic ) encoded;
-			}else if( charset != "utf-8" && charsetOut == "utf-8" ){
-				encoded =  try neko.Utf8.encode( encoded ) catch( e : Dynamic ) encoded;
-			}
-
-			str = start + encoded + end;
-		}
-
-		return str;
-	}
-
-	public static function removeCRLF( str ){
-		return StringTools.replace(StringTools.replace(str,"\n",""),"\r","");
-	}
-
-	public static function formatHeaderTitle( str : String ) : String {
-		str = StringTools.trim( str );
-		if( str.toLowerCase() == "mime-version" ) return "MIME-Version";
-
-		var arr = str.split("-");
-		for( i in 0...arr.length ){
-			var t = arr[i];
-			arr[i] = t.substr(0,1).toUpperCase()+t.substr(1,t.length-1).toLowerCase();
-		}
-		return arr.join("-");
-	}
-
-	public static function randomEight(){
-		var s = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
-
-		var ret = "";
-		for( i in 0...8 ){
-			ret += s.charAt(Std.random(s.length));
-		}
-		return ret;
-	}
-
-	public static function pregQuote( str : String ){
-		str = StringTools.replace(str,"\\","\\\\");
-		str = StringTools.replace(str,".","\\.");
-		str = StringTools.replace(str,"+","\\+");
-		str = StringTools.replace(str,"*","\\*");
-		str = StringTools.replace(str,"?","\\?");
-		str = StringTools.replace(str,"^","\\^");
-		str = StringTools.replace(str,")","\\)");
-		str = StringTools.replace(str,"(","\\(");
-		str = StringTools.replace(str,"[","\\[");
-		str = StringTools.replace(str,"]","\\]");
-		str = StringTools.replace(str,"{","\\{");
-		str = StringTools.replace(str,"}","\\}");
-		str = StringTools.replace(str,"=","\\=");
-		str = StringTools.replace(str,"!","\\!");
-		str = StringTools.replace(str,"<","\\<");
-		str = StringTools.replace(str,">","\\>");
-		str = StringTools.replace(str,"|","\\|");
-		str = StringTools.replace(str,":","\\:");
-		str = StringTools.replace(str,"$","\\$");
-		str = StringTools.replace(str,"/","\\/");
-
-		return str;
-	}
-
-	public static function formatHeader( name : String, content : String, charset : String ){
-		var lname = name.toLowerCase();
-		if( lname == "to" || lname == "from" || lname == "cc" || lname == "bcc" ){
-			return name+": "+headerAddressEncode(content,name.length+2,charset)+"\r\n";
-		}else if( lname.substr(0,8) == "content-" ){
-			return name+": "+headerComplexEncode(content,name.length+2,charset)+"\r\n";
-		}else{
-			return name+": "+headerQpEncode(content,name.length+2,charset)+"\r\n";
-		}
-
-	}
-
-	static var REG_MHEADER = ~/^([^;]+)(.*?)$/;
-	static var REG_PARAM1 = ~/^;\s*([a-zA-Z]+)="(([^"]|\\")+)"/;
-	static var REG_PARAM2 = ~/^;\s*([a-zA-Z]+)=([^;]+)/;
-	public static function parseComplexHeader( h : String ){
-		if( h == null ) return null;
-
-		var ret = {value: null, params: new Hash()};
-		if( REG_MHEADER.match(h) ){
-			ret.value = StringTools.trim( REG_MHEADER.matched(1) );
-
-			var params = REG_MHEADER.matched(2);
-			while( params.length > 0 ){
-				params = StringTools.ltrim( params );
-
-				if( REG_PARAM1.match( params ) ){
-					var k = StringTools.trim(REG_PARAM1.matched(1)).toLowerCase();
-					var v = REG_PARAM1.matched(2);
-					ret.params.set( k, v );
-					params = REG_PARAM1.matchedRight();
-				}else if( REG_PARAM2.match( params ) ){
-					var k = StringTools.trim(REG_PARAM2.matched(1)).toLowerCase();
-					var v = StringTools.trim(REG_PARAM2.matched(2));
-					ret.params.set( k, v );
-					params = REG_PARAM2.matchedRight();
-				}else{
-					break;
-				}
-			}
-		}else{
-			ret.value = h;
-		}
-		return ret;
-
-	}
-
-	public static function wordWrap( str : String, ?length : Int, ?sep : String, ?initCur : Int, ?keepSpace : Bool ){
-		if( length == null ) length = 75;
-		if( sep == null ) sep = "\n";
-		if( initCur == null ) initCur = 0;
-		if( keepSpace == null ) keepSpace = false;
-
-
-		var reg = ~/(.*?)(\s+)/;
-		var a = new Array();
-		while( reg.match(str) ){
-			var c = reg.matched(1);
-			var s = reg.matched(2);
-			var l = c.length+s.length;
-			a.push( c );
-			a.push( s );
-			str = str.substr(l,str.length-l);
-		}
-		a.push( str );
-
-		var sb = new StringBuf();
-		var cur = initCur;
-		var n = a[0];
-		for( i in 0...a.length ){
-			var e = n;
-			n = a[i+1];
-
-			var cut = false;
-			if( i%2 == 1 && cur + e.length + n.length > length ){
-				cut = true;
-				if( keepSpace ){
-					for( is in 0...e.length-1 ){
-						if( cur >= length ){
-							sb.add( sep );
-							cur = 0;
-						}
-						sb.addSub(e,is,1);
-						cur++;
-					}
-					if( cur + 1 + n.length > length ){
-						sb.add(sep);
-						cur = 0;
-					}
-					sb.add(e.substr(-1,1));
-					cur++;
-				}else{
-					sb.add( sep );
-					cur = 0;
-				}
-			}
-			if( i % 2 != 1 || !cut ){
-				sb.add( e );
-				cur += e.length;
-			}
-		}
-
-		return sb.toString();
-	}
-
-	// TODO routes & groups ?
-	static var REG_ADDRESS = ~/^(([^()<>@,;:\\"\[\]\s[:cntrl:]]+|"(\\"|[^"])*")@[A-Z0-9][A-Z0-9-.]*)/i;
-	static var REG_ROUTE_ADDR = ~/^<(([^()<>@,;:\\"\[\]\s[:cntrl:]]+|"(\\"|[^"])*")@[A-Z0-9][A-Z0-9-.]*)>/i;
-	static var REG_ATOM = ~/^([^()<>@,;:"\[\]\s[:cntrl:]]+)/i;
-	static var REG_QSTRING = ~/^"((\\"|[^"])*)"/;
-	static var REG_COMMENT = ~/^\(((\\\)|[^)])*)\)/;
-	static var REG_SEPARATOR = ~/,\s*/;
-	public static function parseAddress( str : String, ?vrfy : Bool ) : Array<Address> {
-		if( vrfy == null )
-			vrfy = true;
-		var a = new Array();
-		var name = null;
-		var address = null;
-
-		str = StringTools.trim(str);
-		var s = str;
-
-		while( s.length > 0 ){
-			s = StringTools.ltrim(s);
-			if( REG_QSTRING.match(s) ){
-				var t = REG_QSTRING.matched(1);
-				t = ~/\\(.)/g.replace(t,"$1");
-				if( name != null ) name += " ";
-				else name = "";
-				name += t;
-				s = REG_QSTRING.matchedRight();
-			}else if( REG_ADDRESS.match(s) ){
-				if( address != null && vrfy ) throw Exception.ParseError(str+", near: "+s.substr(0,15));
-				address = REG_ADDRESS.matched(1);
-				s = REG_ADDRESS.matchedRight();
-			}else if( REG_ROUTE_ADDR.match(s) ){
-				if( address != null )
-					name = (name!=null)?name+" "+address : address;
-				address = REG_ROUTE_ADDR.matched(1);
-				s = REG_ROUTE_ADDR.matchedRight();
-			}else if( REG_ATOM.match(s) ){
-				if( name != null ) name += " ";
-				else name = "";
-				name += REG_ATOM.matched(1);
-				s = REG_ATOM.matchedRight();
-			}else if( REG_COMMENT.match(s) ){
-				if( name != null ) name += " ";
-				else name = "";
-				name += REG_COMMENT.matched(1);
-				s = REG_COMMENT.matchedRight();
-			}else if( REG_SEPARATOR.match(s) ){
-				if( address != null ){
-					a.push({name: if( name != null && name.length > 0 ) name else null, address: address});
-					address = null;
-					name = null;
-				}
-				s = REG_SEPARATOR.matchedRight();
-			}else if( vrfy ){
-				throw Exception.ParseError(str+", near: "+s.substr(0,15));
-			}else{
-				break;
-			}
-		}
-		if( address != null ){
-			a.push({name: if( name != null && name.length > 0 ) name else null, address: address});
-		}
-		if( a.length == 0 ){
-			if( vrfy )
-				throw Exception.ParseError(str+", no address found");
-			else
-				a.push({name: null,address: null});
-		}
-		return a;
-	}
-
-	public static function formatAddress( a : Array<Address> ){
-		var r = new List();
-		for( c in a ){
-			if( c.name == null || c.name == "" ) r.add(c.address);
-			else if( ~/^[A-Z0-9 ]*$/i.match(c.name) ) r.add(c.name+" <"+c.address+">");
-			else{
-				var quoted = c.name.split("\\").join("\\\\").split("\"").join("\\\"");
-				r.add("\""+quoted+"\" <"+c.address+">");
-			}
-		}
-		return r.join(",");
-	}
-
-}

+ 0 - 246
std/mtwin/mail/imap/BodyStructure.hx

@@ -1,246 +0,0 @@
-/*
- * Copyright (c) 2006, Motion-Twin
- * All rights reserved.
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- *   - Redistributions of source code must retain the above copyright
- *     notice, this list of conditions and the following disclaimer.
- *   - Redistributions in binary form must reproduce the above copyright
- *     notice, this list of conditions and the following disclaimer in the
- *     documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY MOTION-TWIN "AS IS" AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL THE HAXE PROJECT CONTRIBUTORS BE LIABLE FOR
- * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
- * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
- * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
- * DAMAGE.
- */
-package mtwin.mail.imap;
-
-class BodyStructure {
-	public var ctype0(default,null): String;
-	public var ctype1(default,null): String;
-	public var params(default,null) : Hash<String>;
-	public var parts(default,null): List<BodyStructure>;
-
-	// single-part specific
-	public var id(default,null) : String;
-	public var contentId(default,null): String;
-	public var description(default,null) : String;
-	public var encoding(default,null) : String;
-	public var size(default,null) : Int;
-	public var disposition(default,null) : String;
-	public var dispositionParams(default,null) : Hash<String>;
-
-	//
-	public var __length : Int;
-
-	public function new(){
-		parts = new List();
-		params = new Hash();
-	}
-
-	public function getMainPart( ?preferHtml : Bool, ?level : Int, ?priority : Int, ?cpriority : Int ) : BodyStructure {
-		if( level == null ) level = 0;
-		if( priority == null ) priority = 0;
-		if( cpriority == null ) cpriority = 0;
-		if( preferHtml == null ) preferHtml = true;
-
-		if( ctype0 != "multipart" || (level == 0 && parts.length == 0) ){
-			if( level == 0 ) return this;
-			if( preferHtml ){
-				if( ctype1 == "html" ) return this;
-				if( ctype1 == "plain" && cpriority > 0 ) return this;
-			}else{
-				if( ctype1 == "plain" ) return this;
-				if( ctype1 == "html" && cpriority > 0 ) return this;
-			}
-		}else{
-			if( level == 0 ){
-				// multipart !
-				// si c'est au premier niveau, c'est une boucle principale, avec priorité qui augmente
-				do {
-					do {
-						var r = null;
-						for( part in parts ){
-							r = part.getMainPart( preferHtml, level + 1, priority, cpriority );
-							if( r != null ) break;
-						}
-						if( r != null ) return r;
-						priority++;
-					}while( priority <= 1 );
-					cpriority++;
-				}while( cpriority <= 1 );
-			}else{
-				// là c'est des boucles qui se déclanche si c'est ok
-				if( ctype1 == "alternative" || priority > 0 ){
-					var r = null;
-					for( part in parts ){
-						r = part.getMainPart( preferHtml, level + 1, priority, cpriority );
-						if( r != null ) return r;
-					}
-				}
-			}
-		}
-		return null;
-	}
-
-	public function listAttachment( ?level : Int ) : List<BodyStructure> {
-		if( level == null ) level = 0;
-		var ret = new List();
-		if( ctype0 != "multipart" ){
-			if( level != 0 && disposition != null ){
-				ret.add( this );
-			}
-		}else if( ctype1 != "alternative" ){
-			for( part in parts ){
-				for( v in part.listAttachment( level + 1 ) ){
-					ret.add( v );
-				}
-			}
-		}
-		return ret;
-	}
-
-	public function hasAttachment(){
-		return listAttachment().length > 0;
-	}
-
-	public function findById( contentId : String ) : BodyStructure {
-		if( this.contentId == contentId ) return this;
-		for( part in parts ){
-			var r = part.findById( contentId );
-			if( r != null ) return r;
-		}
-		return null;
-	}
-
-	public static function parse( s : String, ?id : String ) : BodyStructure{
-		if( id == null ) id = "";
-		var len = s.length;
-		var parCount = 0;
-		var p = 0;
-		var ret = new BodyStructure();
-		ret.id = id;
-		var addPart = function( p ){
-			ret.parts.add( p );
-		};
-		var tmp = {pName: null,argPos: 0};
-		var addElement = function( e : String ){
-			if( ret.ctype0 == null ){
-				ret.ctype0 = e;
-			}else if( ret.ctype1 == null ){
-				ret.ctype1 = e;
-				tmp.argPos = 0;
-			}else{
-				if( e == "NIL" ) return;
-				if( ret.ctype0 == "multipart" ){
-					switch( tmp.argPos ){
-						case 1:
-							if( tmp.pName == null ) 
-								tmp.pName = e;
-							else{
-								ret.params.set(tmp.pName.toLowerCase(),e);
-								tmp.pName = null;
-							}
-						case 4:
-						case 5:
-					}
-				}else{
-					switch( tmp.argPos ){
-						case 1:
-							if( tmp.pName == null ) 
-								tmp.pName = e;
-							else{
-								ret.params.set(tmp.pName.toLowerCase(),e);
-								tmp.pName = null;
-							}
-						case 2:
-							ret.contentId = e;
-						case 3:
-							ret.description = e;
-						case 4:
-							ret.encoding = e;
-						case 5:
-							ret.size = Std.parseInt(e);
-						default:
-							var dispoPos = if( ret.ctype0 == "text" ) 8 else if( ret.ctype0 == "message" ) 10 else 7;
-							if( tmp.argPos == dispoPos ){
-								if( parCount == 1 ){
-									ret.disposition = e;
-									ret.dispositionParams = new Hash();
-								}else{
-									if( tmp.pName == null ) 
-										tmp.pName = e;
-									else{
-										ret.dispositionParams.set(tmp.pName,e);
-										tmp.pName = null;
-									}
-								}
-							}
-					}
-				}
-				
-			}
-		};
-		while( p < len ){
-			var c = s.charAt(p);
-			p++;
-			switch( c ){
-				case "(":
-					if( ret.ctype1 == null ){
-						var newPart = parse( s.substr(p,s.length-p), (if( id == "" ) "" else id + "." )+ (ret.parts.length+1) );
-						addPart( newPart );
-						ret.ctype0 = "multipart";
-						p += newPart.__length;
-					}else
-						parCount++;
-				case ")":
-					parCount--;
-					if( parCount < 0 ){
-						ret.__length = p;
-						return ret;
-					}
-				case "\"":
-					var b = new StringBuf();
-					var prev = null;
-					while( p < len ){
-						var c2 = s.charAt(p);
-						p++;
-						if( c2 == "\"" && prev != "\\" )
-							break;
-						b.add( c2 );
-						prev = c2;
-					}
-					addElement( b.toString().split("\\\"").join("\"").split("\\\\").join("\\") );
-				case " ":
-					if( parCount == 0 ){
-						tmp.argPos++;
-					}
-				default:
-					var b = new StringBuf();
-					p--;
-					while( p < len ){
-						var c2 = s.charAt(p);
-						p++;
-						if( c2 == ")" || c2 == " " ){
-							p--;
-							break;
-						}
-						b.add( c2 );
-					}
-					addElement( b.toString() );
-			}
-		}
-		ret.__length = p;
-		return ret;
-	}
-
-}

+ 0 - 529
std/mtwin/mail/imap/Connection.hx

@@ -1,529 +0,0 @@
-/*
- * Copyright (c) 2006, Motion-Twin
- * All rights reserved.
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- *   - Redistributions of source code must retain the above copyright
- *     notice, this list of conditions and the following disclaimer.
- *   - Redistributions in binary form must reproduce the above copyright
- *     notice, this list of conditions and the following disclaimer in the
- *     documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY MOTION-TWIN "AS IS" AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL THE HAXE PROJECT CONTRIBUTORS BE LIABLE FOR
- * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
- * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
- * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
- * DAMAGE.
- */
-package mtwin.mail.imap;
-
-import neko.net.Socket;
-import mtwin.mail.Exception;
-import mtwin.mail.imap.Tools;
-
-enum FlagMode {
-	Add;
-	Remove;
-	Replace;
-}
-
-typedef FetchResponse = {
-	id: Int,
-	uid: Int,
-	bodyType: String,
-	body: String,
-	flags: Flags,
-	structure: BodyStructure,
-	internalDate: String,
-	envelope: Envelope
-}
-
-class Connection {
-	public static var DEBUG = false;
-	public static var TIMEOUT = 25;
-
-	var cnx : Socket;
-	var count : Int;
-	var selected : String;
-	var logged : Bool;
-
-	static var REG_RESP = ~/(OK|NO|BAD) (\[([^\]]+)\] )?(([A-Z]{2,}) )? ?(.*)/;
-	static var REG_EXISTS = ~/^([0-9]+) EXISTS$/;
-	static var REG_RECENT = ~/^([0-9]+) RECENT$/;
-	static var REG_UNSEEN = ~/^OK \[UNSEEN ([0-9]+)\]/;
-	static var REG_FETCH_MAIN = ~/([0-9]+) FETCH \(/;
-	static var REG_FETCH_PART = ~/^(BODY\[[A-Za-z0-9.]*\]|RFC822\.?[A-Z]*) \{([0-9]+)\}/;
-	static var REG_FETCH_FLAGS = ~/^FLAGS \(([ \\A-Za-z0-9$]*)\) */;
-	static var REG_FETCH_UID = ~/^UID ([0-9]+) */;
-	static var REG_FETCH_BODYSTRUCTURE = ~/^BODY(STRUCTURE)? \(/;
-	static var REG_FETCH_ENVELOPE = ~/^ENVELOPE \(/;
-	static var REG_FETCH_INTERNALDATE = ~/^INTERNALDATE "([^"]+)" */;
-	static var REG_FETCH_END = ~/^([A0-9]{4}) (OK|BAD|NO)/;
-	static var REG_STATUS = ~/STATUS .*? \(([^)]+)\)/;
-	static var REG_STATUS_VAL = ~/^ ?([A-Z]+) (-?[0-9]+)/;
-	static var REG_LIST_RESP = ~/LIST \(([ \\A-Za-z0-9]*)\) [A-z0-9".]* "?([^"]+)"?/;
-	static var REG_CRLF = ~/\r?\n/g;
-
-	static function rmCRLF(s){
-		return REG_CRLF.replace(s, "");
-	}
-
-	static function debug(s:String){
-		if( DEBUG ) neko.Lib.print(Std.string(s)+"\n");
-	}
-
-	//////
-
-	public function new(){
-		count = 0;
-		logged = false;
-	}
-
-	/**
-		Connect to Imap Server
-	**/
-	public function connect( host : String, ?port : Int ){
-		if( cnx != null ) throw AlreadyConnected;
-
-		if( port == null ) port = 143;
-		cnx = new Socket();
-		try{
-			cnx.connect( new neko.net.Host(host), port );
-		}catch( e : Dynamic ){
-			cnx.close();
-			throw ConnectionError(host,port);
-		}
-		debug("socket connected");
-		cnx.setTimeout( TIMEOUT );
-		cnx.input.readLine();
-		logged = false;
-	}
-
-	/**
-		Login to server
-	**/
-	public function login( user : String, pass : String ){
-		var r = command("LOGIN",Tools.quote(user)+" "+Tools.quote(pass));
-		if( !r.success ){
-			throw BadResponse(r.response);
-		}
-		logged = true;
-	}
-
-	/**
-		Logout
-	**/
-	function logout(){
-		if( !logged ) return;
-		var r = command("LOGOUT");
-		if( !r.success ) throw BadResponse(r.response);
-		logged = false;
-	}
-
-	/**
-		Close connection to server
-	**/
-	public function close(){
-		logout();
-		cnx.close();
-		cnx = null;
-	}
-
-	/**
-		List mailboxes that match pattern (all mailboxes if pattern is null)
-	**/
-	public function mailboxes( ?pattern : String, ?flat : Bool ) : Array<Mailbox> {
-		if( pattern == null ) pattern = "*";
-		if( flat == null ) flat = false;
-
-		var r = command("LIST",Tools.quote("")+" "+Tools.quote(pattern));
-		if( !r.success ){
-			throw BadResponse(r.response);
-		}
-
-		var hash = new Hash();
-		for( v in r.result ){
-			if( REG_LIST_RESP.match(v) ){
-				var name = REG_LIST_RESP.matched(2);
-				var flags = REG_LIST_RESP.matched(1).split(" ");
-
-				var t = Mailbox.init( this, name, flags );
-				hash.set(name,t);
-			}
-		}
-
-		var ret = new Array();
-		for( t in hash ){
-			var a = t.name.split(".");
-			a.pop();
-			var p = a.join(".");
-			if( p.length > 0 && hash.exists(p) ){
-				var par = hash.get(p);
-				par.children.push( t );
-				untyped t.parent = par;
-				if( flat ) ret.push( t );
-			}else{
-				ret.push( t );
-			}
-
-		}
-
-		return ret;
-	}
-
-	public function getMailbox( name : String ){
-		var m = mailboxes(name)[0];
-		if( m == null )
-			throw "No such mailbox "+name;
-		return m;
-	}
-
-	/**
-		Select a mailbox
-	**/
-	public function select( mailbox : String ){
-		if( selected == mailbox ) return null;
-
-		var r = command("SELECT",Tools.quote(mailbox));
-		if( !r.success )
-			throw BadResponse(r.response);
-
-		selected = mailbox;
-
-		var ret = {recent: 0,exists: 0,firstUnseen: null};
-		for( v in r.result ){
-			if( REG_EXISTS.match(v) ){
-				ret.exists = Std.parseInt(REG_EXISTS.matched(1));
-			}else if( REG_UNSEEN.match(v) ){
-				ret.firstUnseen = Std.parseInt(REG_UNSEEN.matched(1));
-			}else if( REG_RECENT.match(v) ){
-				ret.recent = Std.parseInt(REG_RECENT.matched(1));
-			}
-		}
-
-		return ret;
-	}
-
-	public function status( mailbox : String ){
-		var r = command("STATUS",Tools.quote(mailbox)+" (MESSAGES RECENT UNSEEN)");
-		if( !r.success ) throw BadResponse( r.response );
-
-		var ret = new Hash<Int>();
-		if( REG_STATUS.match( r.result.first() ) ){
-			var t = REG_STATUS.matched(1);
-			while( REG_STATUS_VAL.match(t) ){
-				ret.set(REG_STATUS_VAL.matched(1),Std.parseInt(REG_STATUS_VAL.matched(2)));
-				t = REG_STATUS_VAL.matchedRight();
-			}
-		}else{
-			throw UnknowResponse(r.result.first());
-		}
-		return ret;
-	}
-
-	/**
-		Search for messages. Pattern syntax described in RFC 3501, section 6.4.4
-	**/
-	public function search( ?pattern : String, ?useUid : Bool ) : List<Int> {
-		if( pattern == null ) pattern = "ALL";
-		if( useUid == null ) useUid = false;
-
-		var r = command(if( useUid) "UID SEARCH" else "SEARCH",pattern);
-		if( !r.success ){
-			throw BadResponse(r.response);
-		}
-
-		var l = new List();
-
-		for( v in r.result ){
-			if( StringTools.startsWith(v,"SEARCH ") ){
-				var t = v.substr(7,v.length-7).split(" ");
-				for( i in t ){
-					l.add( Std.parseInt(i) );
-				}
-			}
-		}
-
-		return l;
-	}
-
-	public function sort( criteria : String, ?pattern : String, ?charset : String, ?useUid : Bool ){
-		if( pattern == null ) pattern = "ALL";
-		if( useUid == null ) useUid = false;
-		if( charset == null ) charset = "US-ASCII";
-
-		var r = command(if( useUid) "UID SORT" else "SORT","("+criteria+") "+charset+" "+pattern);
-		if( !r.success ){
-			throw BadResponse(r.response);
-		}
-
-		var l = new List();
-
-		for( v in r.result ){
-			if( StringTools.startsWith(v,"SORT ") ){
-				var t = v.substr(5,v.length-5).split(" ");
-				for( i in t ){
-					l.add( Std.parseInt(i) );
-				}
-			}
-		}
-
-		return l;
-	}
-
-	/**
-		Fetch messages from the currently selected mailbox.
-	**/
-	public function fetchRange( iRange: Collection, ?iSection : Array<Section>, ?useUid : Bool ) : List<FetchResponse>{
-		if( iRange == null ) return null;
-		if( iSection == null ) iSection = [Body(null)];
-		if( useUid == null ) useUid = false;
-
-		var range = Tools.collString(iRange);
-		var section = Tools.sectionString(iSection);
-
-		if( useUid )
-			command("UID FETCH",range+" "+section,false);
-		else
-			command("FETCH",range+" "+section,false);
-
-		var tmp = new IntHash();
-		var ret = new List();
-		while( true ){
-			var l = cnx.input.readLine();
-			if( REG_FETCH_MAIN.match(l) ){
-				var id = Std.parseInt(REG_FETCH_MAIN.matched(1));
-
-				var o = if( tmp.exists(id) ){
-					tmp.get(id);
-				}else {
-					var o = {bodyType: null,body: null,flags: null,uid: null,structure: null,internalDate: null,envelope: null,id: id};
-					tmp.set(id,o);
-					ret.add(o);
-					o;
-				}
-
-				var s = REG_FETCH_MAIN.matchedRight();
-				while( s.length > 0 ){
-					if( REG_FETCH_FLAGS.match( s ) ){
-						o.flags = REG_FETCH_FLAGS.matched(1).split(" ");
-						s = REG_FETCH_FLAGS.matchedRight();
-					}else if( REG_FETCH_UID.match( s ) ){
-						o.uid = Std.parseInt(REG_FETCH_UID.matched(1));
-						s = REG_FETCH_UID.matchedRight();
-					}else if( REG_FETCH_INTERNALDATE.match( s ) ){
-						o.internalDate = REG_FETCH_INTERNALDATE.matched(1);
-						s = REG_FETCH_INTERNALDATE.matchedRight();
-					}else if( REG_FETCH_ENVELOPE.match( s ) ){
-						var t = REG_FETCH_ENVELOPE.matchedRight();
-						t = completeString(t);
-						o.envelope = mtwin.mail.imap.Envelope.parse( t );
-						s = StringTools.ltrim(t.substr(o.envelope.__length,t.length));
-					}else if( REG_FETCH_BODYSTRUCTURE.match( s ) ){
-						var t = REG_FETCH_BODYSTRUCTURE.matchedRight();
-						t = completeString(t);
-						o.structure = mtwin.mail.imap.BodyStructure.parse( t );
-						s = StringTools.ltrim(t.substr(o.structure.__length,t.length));
-					}else if( REG_FETCH_PART.match( s ) ){
-						var len = Std.parseInt(REG_FETCH_PART.matched(2));
-
-						o.body = cnx.input.readString( len );
-						o.bodyType = REG_FETCH_PART.matched(1);
-
-						cnx.input.readLine();
-						break;
-					}else{
-						break;
-					}
-				}
-
-			}else if( REG_FETCH_END.match(l) ){
-				var resp = REG_FETCH_END.matched(2);
-				if( resp == "OK" ){
-					break;
-				}else{
-					throw BadResponse(l);
-				}
-			}else{
-				throw UnknowResponse(l);
-			}
-		}
-
-		return ret;
-	}
-
-	/**
-		Append content as a new message at the end of mailbox.
-	**/
-	public function append( mailbox : String, content : String, ?flags : Flags ){
-		var f = if( flags != null ) "("+flags.join(" ")+") " else "";
-		command("APPEND",Tools.quote(mailbox)+" "+f+"{"+content.length+"}",false);
-		cnx.write( content );
-		cnx.write( "\r\n" );
-		var r = read( StringTools.lpad(Std.string(count),"A000",4) );
-		if( !r.success )
-			throw BadResponse(r.response);
-	}
-
-	/**
-		Remove permanently all messages flagged as \Deleted in the currently selected mailbox.
-	**/
-	public function expunge(){
-		var r = command("EXPUNGE");
-		if( !r.success )
-			throw BadResponse(r.response);
-	}
-
-	/**
-		Add, remove or replace flags on message(s) of the currently selected mailbox.
-	**/
-	public function storeFlags( iRange : Collection, flags : Flags, ?mode : FlagMode, ?useUid : Bool, ?fetchResult : Bool ) : IntHash<Array<String>> {
-		if( mode == null ) mode = Add;
-		if( fetchResult == null ) fetchResult = false;
-		if( useUid == null ) useUid = false;
-
-		var range = Tools.collString(iRange);
-		var elem = switch( mode ){
-			case Add: "+FLAGS";
-			case Remove: "-FLAGS";
-			case Replace: "FLAGS";
-		}
-		if( !fetchResult ){
-			elem += ".SILENT";
-		}
-
-		var r = command( if( useUid ) "UID STORE" else "STORE", range + " " + elem + " ("+flags.join(" ")+")");
-		if( !r.success ) throw BadResponse( r.response );
-		if( !fetchResult ) return null;
-
-		var ret = new IntHash();
-		for( line in r.result ){
-			if( REG_FETCH_MAIN.match(line) ){
-				var id = Std.parseInt(REG_FETCH_MAIN.matched(1));
-				if( REG_FETCH_FLAGS.match( REG_FETCH_MAIN.matchedRight() ) ){
-					ret.set(id,REG_FETCH_FLAGS.matched(1).split(" "));
-				}
-			}
-		}
-		return ret;
-	}
-
-	/**
-		Create a new mailbox.
-	**/
-	public function create( mailbox : String ){
-		var r = command( "CREATE", Tools.quote(mailbox) );
-		if( !r.success ) throw BadResponse( r.response );
-	}
-
-	/**
-		Delete a mailbox.
-	**/
-	public function delete( mailbox : String ){
-		var r = command( "DELETE", Tools.quote(mailbox) );
-		if( !r.success ) throw BadResponse( r.response );
-	}
-
-	/**
-		Rename a mailbox.
-	**/
-	public function rename( mailbox : String, newName : String ){
-		var r = command( "RENAME", Tools.quote(mailbox)+" "+Tools.quote(newName) );
-		if( !r.success ) throw BadResponse( r.response );
-	}
-
-	/**
-		Copy message(s) from the currently selected mailbox to the end of an other mailbox.
-	**/
-	public function copy( iRange : Collection, toMailbox : String, ?useUid : Bool ){
-		if( useUid == null ) useUid = false;
-
-		var range = Tools.collString(iRange);
-		var r = command(if(useUid) "UID COPY" else "COPY",range+" "+Tools.quote(toMailbox));
-		if( !r.success ) throw BadResponse( r.response );
-	}
-
-
-
-	/////
-
-	function completeString( s ){
-		var reg = ~/(?<!\] )\{([0-9]+)\}$/;
-		while( reg.match( s ) ){
-			var len = Std.parseInt( reg.matched(1) );
-			var t = cnx.input.readString( len );
-			var e = cnx.input.readLine();
-			s = s.substr(0,-reg.matchedPos().len)+"\""+t.split("\"").join("\\\"")+"\"" +e;
-		}
-		return s;
-	}
-
-	function command( command : String, ?args : String , ?r : Bool ){
-		if( cnx == null )
-			throw NotConnected;
-		if( r == null ) r = true;
-		if( args == null ) args = "" else args = " "+args;
-
-		count++;
-		var c = Std.string(count);
-		c = StringTools.lpad(c,"A000",4);
-		cnx.write( c+" "+command+args+"\r\n" );
-		debug( "S: "+c+" "+command+args );
-
-		if( !r ){
-			return null;
-		}
-		return read(c);
-	}
-
-
-	function read( c ){
-		var resp = new List();
-		var sb : StringBuf = null;
-		while( true ){
-			var line = cnx.input.readLine();
-			debug("R: "+line);
-			line = rmCRLF(line);
-
-			if( c != null && line.substr(0,4) == c ){
-				if( REG_RESP.match(line.substr(5,line.length-5)) ){
-					if( sb != null ){
-						resp.add( sb.toString() );
-					}
-					return {
-						result: resp,
-						success: REG_RESP.matched(1) == "OK",
-						error: REG_RESP.matched(1),
-						command: REG_RESP.matched(4),
-						response: REG_RESP.matched(6),
-						comment: REG_RESP.matched(3)
-					};
-				}else{
-					throw UnknowResponse(line);
-				}
-			}else{
-				if( StringTools.startsWith(line,"* ") ){
-					if( sb != null ){
-						resp.add( sb.toString() );
-					}
-					sb = new StringBuf();
-					sb.add( line.substr(2,line.length - 2) );
-				}else{
-					if( sb != null ){
-						sb.add( line+"\r\n" );
-					}else{
-						resp.add( line );
-					}
-				}
-			}
-		}
-		return null;
-	}
-}

+ 0 - 150
std/mtwin/mail/imap/Envelope.hx

@@ -1,150 +0,0 @@
-/*
- * Copyright (c) 2006, Motion-Twin
- * All rights reserved.
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- *   - Redistributions of source code must retain the above copyright
- *     notice, this list of conditions and the following disclaimer.
- *   - Redistributions in binary form must reproduce the above copyright
- *     notice, this list of conditions and the following disclaimer in the
- *     documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY MOTION-TWIN "AS IS" AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL THE HAXE PROJECT CONTRIBUTORS BE LIABLE FOR
- * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
- * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
- * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
- * DAMAGE.
- */
-package mtwin.mail.imap;
-
-import mtwin.mail.Exception;
-
-typedef Address = {
-	name: String,
-	address: String
-}
-
-class Envelope {
-	public var __length : Int;
-	public var date(default,null) : String;
-	public var subject(default,null) : String;
-	public var from(default,null) : List<Address>;
-	public var sender(default,null) : List<Address>;
-	public var replyTo(default,null) : List<Address>;
-	public var to(default,null) : List<Address>;
-	public var cc(default,null) : List<Address>;
-	public var bcc(default,null) : List<Address>;
-	public var inReplyTo(default,null) : String;
-	public var messageId(default,null) : String;
-
-	function new(){
-	}
-		
-	public function getDate(){
-		if( date == null )
-			return null;
-		return mtwin.DateFormat.parse(date);
-	}
-
-	public static function parse( s : String ){
-		var len = s.length;
-		var parCount = 0;
-		var p = 0;
-		var argPos = 0;
-		var ret = new Envelope();
-		var tmp = {
-			alist: new List<Address>(),
-			buf: new Array<String>()
-		};
-
-		var closeParenthesis = function(){
-			if( parCount == 1 ){
-				tmp.alist.add({name: tmp.buf[0],address: tmp.buf[2]+"@"+tmp.buf[3]});
-				tmp.buf = new Array();
-			}else if( parCount == 0 ){
-				switch( argPos ){
-					case 2: ret.from = tmp.alist;
-					case 3: ret.sender = tmp.alist;
-					case 4: ret.replyTo = tmp.alist;
-					case 5: ret.to = tmp.alist;
-					case 6: ret.cc = tmp.alist;
-					case 7: ret.bcc = tmp.alist;
-				}
-				tmp.alist = new List();
-			}
-		};
-		
-		var addElement = function( e : String ){
-			if( parCount >= 2 ){
-				tmp.buf.push( e );
-			}else{
-				if( e != null ){
-					switch( argPos ){
-						case 0: ret.date = e;
-						case 1: ret.subject = e;
-						case 8: ret.inReplyTo = e;
-						case 9: ret.messageId = e;
-					}
-				}
-			}
-		};
-
-		while( p < len ){
-			var c = s.charAt(p);
-			p++;
-			switch( c ){
-				case "(":
-					parCount++;
-				case ")":
-					parCount--;
-					if( parCount < 0 ){
-						ret.__length = p;
-						return ret;
-					}
-					closeParenthesis();
-				case "\"":
-					var b = new StringBuf();
-					var escape = false;
-					while( p < len ){
-						var c2 = s.charAt(p);
-						p++;
-						if( c2 == "\"" && !escape )
-							break;
-						escape = (c2 == "\\" && !escape );
-						if( !escape )
-						b.add( c2 );
-					}
-					addElement( b.toString() );
-				case " ":
-					if( parCount == 0 )
-						argPos++;
-				default:
-					var b = new StringBuf();
-					p--;
-					while( p < len ){
-						var c2 = s.charAt(p);
-						p++;
-						if( c2 == ")" || c2 == " " ){
-							p--;
-							break;
-						}
-						b.add( c2 );
-					}
-					var bs = b.toString();
-					if( bs == "NIL" )
-						addElement( null );
-					else
-						throw ParseError(bs);
-			}
-		}
-		ret.__length = p;
-		return ret;
-	}
-}

+ 0 - 180
std/mtwin/mail/imap/Mailbox.hx

@@ -1,180 +0,0 @@
-/*
- * Copyright (c) 2006, Motion-Twin
- * All rights reserved.
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- *   - Redistributions of source code must retain the above copyright
- *     notice, this list of conditions and the following disclaimer.
- *   - Redistributions in binary form must reproduce the above copyright
- *     notice, this list of conditions and the following disclaimer in the
- *     documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY MOTION-TWIN "AS IS" AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL THE HAXE PROJECT CONTRIBUTORS BE LIABLE FOR
- * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
- * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
- * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
- * DAMAGE.
- */
-/*
-signature ImapMailbox = {
-	name: String,
-	flags: ImapFlags,
-	hasChildren: Bool
-}
-*/
-package mtwin.mail.imap;
-
-import mtwin.mail.imap.Tools;
-import mtwin.mail.Exception;
-
-class Mailbox {
-	static var PREFETCH_SECTION = [Section.Uid,Section.InternalDate,Section.Envelope,Section.BodyStructure,Section.Flags];
-
-	var cnx : Connection;
-	public var name(default,null) : String;
-	var flags : Flags;
-	public var children : Array<Mailbox>;
-	public var parent(default,null) : Mailbox;
-
-	public var length(default,null) : Int;
-	public var firstUnseen(default,null) : Int;
-	public var recent(default,null) : Int;
-	public var unseen(default,null) : Int;
-
-	public static function init( c : Connection, n : String, f : Flags ){
-		return new Mailbox( c,n,f );
-	}
-
-	function new( c, n, f ){
-		cnx = c;
-		name = n;
-		flags = f;
-		children = new Array();
-	}
-
-	public function select(){
-		if( hasFlag("\\Noselect") ) throw NoSelect;
-
-		var r = cnx.select( name );
-		if( r != null ){
-			length = r.exists;
-			firstUnseen = r.firstUnseen;
-			recent = r.recent;
-		}
-		return cnx;
-	}
-
-	public function hasFlag( f : String ){
-		for( e in flags ){
-			if( e == f ) return true;
-		}
-		return false;
-	}
-
-	public function list( ?start : Int, ?end : Int, ?fPrefetch : Bool ){
-		select();
-
-		if( start == null ) start = 1;
-		if( end == null ) end = length;
-		if( fPrefetch == null ) fPrefetch = true;
-		
-		start = Std.int(Math.max(1,Math.min(length,start)));
-		end = Std.int(Math.max(1,Math.min(length,end)));
-		
-		var r = cnx.fetchRange( Range(start,end), if( fPrefetch ) PREFETCH_SECTION else [Uid] );
-		var ret = new List();
-		for( m in r ){
-			var t = Message.initUid(this,m.uid);
-			t.usePrefetch(m);
-			ret.add( t );
-		}
-		return ret;
-	}
-
-	public function syncStatus(){
-		if( hasFlag("\\Noselect") ) throw NoSelect;
-
-		var r = cnx.status( name );
-		length = r.get("MESSAGES");
-		unseen = r.get("UNSEEN");
-		recent = r.get("RECENT");
-	}
-
-	public function get( uid : Int, ?fPrefetch : Bool ){
-		select();
-
-		if( fPrefetch == null ) fPrefetch = true;
-		
-		var ret = Message.initUid( this, uid );
-		if( fPrefetch ) prefetchOne( ret );
-		return ret;
-	}
-
-	public function prefetchOne( m : Message ){
-		var l = new List();
-		l.add( m );
-		prefetch(l);
-	}
-
-	public function prefetch( l : List<Message> ){
-		if( l.length == 0 )
-			return;
-		select();
-
-		var a = new Array();
-		var h = new IntHash();
-		for( m in l ){
-			a.push( Single(m.uid) );
-			h.set(m.uid,m);
-		}
-		var r = cnx.fetchRange( Composite(a), PREFETCH_SECTION, true );
-		for( e in r ){
-			h.get(e.uid).usePrefetch( e );
-		}
-	}
-
-	public function search( pattern : String, ?fPrefetch : Bool ){
-		select();
-
-		if( fPrefetch == null ) fPrefetch = true;
-		var r = cnx.search( pattern, true );
-		var ret = new List();
-		for( uid in r ){
-			ret.add( Message.initUid(this,uid) );
-		}
-		if( fPrefetch ) prefetch( ret );
-		return ret;
-	}
-
-	public function sort( criteria : String, ?pattern : String, ?charset : String, ?fPrefetch : Bool ){
-		select();
-
-		if( pattern == null ) pattern = "ALL";
-		if( charset == null ) charset = "US-ASCII";
-		if( fPrefetch == null ) fPrefetch = true;
-
-		var r = cnx.sort( criteria, pattern, charset, true );
-		var ret = new List();
-		for( uid in r ){
-			ret.add( Message.initUid(this,uid) );
-		}
-		if( fPrefetch ) prefetch( ret );
-		return ret;
-	}
-
-	public function expunge(){
-		select();
-		cnx.expunge();
-	}
-
-	public function add( content : String, ?flags : Flags ){
-		cnx.append( name, content, flags );
-	}
-}

+ 0 - 105
std/mtwin/mail/imap/Message.hx

@@ -1,105 +0,0 @@
-/*
- * Copyright (c) 2006, Motion-Twin
- * All rights reserved.
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- *   - Redistributions of source code must retain the above copyright
- *     notice, this list of conditions and the following disclaimer.
- *   - Redistributions in binary form must reproduce the above copyright
- *     notice, this list of conditions and the following disclaimer in the
- *     documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY MOTION-TWIN "AS IS" AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL THE HAXE PROJECT CONTRIBUTORS BE LIABLE FOR
- * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
- * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
- * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
- * DAMAGE.
- */
-package mtwin.mail.imap;
-
-import mtwin.mail.Exception;
-import mtwin.mail.imap.Tools;
-import mtwin.mail.imap.Connection;
-
-class Message {
-	
-	var mailbox : Mailbox;
-	var id : Int;
-	public var uid(default,null) : Int;
-	var flags : Flags;
-	public var structure(default,null) : BodyStructure;
-	public var envelope(default,null) : Envelope;
-	public var internalDate(default,null) : String;
-
-	public static function initUid( mailbox : Mailbox, uid : Int ){
-		var m = new Message();
-		m.mailbox = mailbox;
-		m.uid = uid;
-		return m;
-	}
-
-	public function new(){
-	}
-
-	function select(){
-	}
-
-	public function usePrefetch( f : FetchResponse ){
-		id = f.id;
-		uid = f.uid;
-		flags = f.flags;
-		structure = f.structure;
-		envelope = f.envelope;
-		internalDate = f.internalDate;
-	}
-
-	public function getSection( ?subId : String, ?el : BodySection , ?markAsReed : Bool ){
-		var cnx = mailbox.select();
-		if( markAsReed == null ) markAsReed = false;
-		
-		var r = cnx.fetchRange( Single(uid), [if( markAsReed ) Body(SubSection(subId,el)) else BodyPeek(SubSection(subId,el))], true );
-		if( r.length != 1 )
-			throw ImapFetchError;
-		return r.first().body;
-	}
-
-	public function markAsDeleted(){
-		addFlag("\\Deleted");
-	}
-
-	public function delete(){
-		markAsDeleted();
-		mailbox.expunge();
-	}
-
-	public function addFlag( flag : String ){
-		var cnx = mailbox.select();
-		cnx.storeFlags(Single(uid), [flag], Add, true, false );
-	}
-
-	public function removeFlag( flag : String ){
-		var cnx = mailbox.select();
-		cnx.storeFlags(Single(uid), [flag], Remove, true, false );
-	}
-
-	public function copyTo( mb : Mailbox ){
-		var cnx = mailbox.select();
-		cnx.copy( Single(uid), mb.name, true );
-	}
-
-	public function hasFlag( f : String ){
-		for( e in flags ){
-			if( e == f ) return true;
-		}
-		return false;
-	}
-
-
-}

+ 0 - 171
std/mtwin/mail/imap/Tools.hx

@@ -1,171 +0,0 @@
-/*
- * Copyright (c) 2006, Motion-Twin
- * All rights reserved.
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- *   - Redistributions of source code must retain the above copyright
- *     notice, this list of conditions and the following disclaimer.
- *   - Redistributions in binary form must reproduce the above copyright
- *     notice, this list of conditions and the following disclaimer in the
- *     documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY MOTION-TWIN "AS IS" AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL THE HAXE PROJECT CONTRIBUTORS BE LIABLE FOR
- * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
- * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
- * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
- * DAMAGE.
- */
-package mtwin.mail.imap;
-
-import mtwin.mail.imap.Envelope;
-
-typedef Flags = Array<String>
-
-enum Section {
-	Flags;
-	Uid;
-	BodyStructure;
-	Envelope;
-	InternalDate;
-	Body(ss:BodySection);
-	BodyPeek(ss:BodySection);
-}
-
-enum BodySection {
-	Header;
-	Mime;
-	Text;
-	SubSection(id:String,ss:BodySection);
-}
-
-enum Collection {
-	Single(i:Int);
-	Range(s:Int,e:Int);
-	Composite(l:Array<Collection>);
-}
-
-/*
-enum Pattern {
-	All;
-	Answered;
-	Bcc(s:String);
-	Before(d:Date);
-	Body(s:String);
-	Cc(s:String);
-	Deleted;
-	Draft;
-	Flagged;
-	From(s:String);
-	Header(f:String,s:String);
-	Keyword(s:String);
-	Larger(s:Int);
-	New;
-	Not(p:Pattern);
-	Old;
-	On(d:Date);
-	Or(p1:Pattern,p2:Pattern);
-	Recent;
-	Seen;
-	SentBefore(d:Date);
-	SentOn(d:Date);
-	SentSince(d:Date);
-	Since(d:Date);
-	Smaller(s:Int);
-	Subject(s:String);
-	Text(s:String);
-	To(s:String);
-	Uid(c:Collection);
-	Unanswered;
-	Undeleted;
-	Undraft;
-	Unkeyword(s:String);
-	Unseen;
-}
-*/
-
-class Tools {
-	public static function quote( s : String ) : String {
-		return "\""+s.split("\"").join("\\\"")+"\"";
-	}
-
-	public static function listToColl( l : List<Int> ) : Collection {
-		var a = new Array();
-		for( e in l )
-			a.push( Single(e) );
-		return Composite(a);
-	}
-
-	public static function collString( r : Collection ) : String {
-		return switch( r ){
-			case Single(i): Std.string(i);
-			case Range(s,e): Std.string(s)+":"+Std.string(e);
-			case Composite(l):
-				var t = new List<String>();
-				for( e in l )
-					t.add(collString(e));
-				t.join(",");
-		}
-	}
-
-	public static function sectionString( a : Array<Section> ) : String{
-		var r = new List();
-		
-		if( a == null || a.length < 1 )
-			return "";
-		
-		for( s in a ){
-			r.add( switch( s ){
-				case Flags: "FLAGS";
-				case Uid: "UID";
-				case BodyStructure: "BODYSTRUCTURE";
-				case Envelope: "ENVELOPE";
-				case InternalDate: "INTERNALDATE";
-				case Body(ss): "BODY["+bodySectionString(ss)+"]";
-				case BodyPeek(ss): "BODY.PEEK["+bodySectionString(ss)+"]";
-					
-			});
-		}
-		return "("+r.join(" ")+")";
-	}
-
-	static function bodySectionString( ss : BodySection ){
-		if( ss == null )
-			return "";
-
-		return switch( ss ){
-			case Text: "TEXT";
-			case Header: "HEADER";
-			case Mime: "MIME";
-			case SubSection(id,nss):
-				var t = bodySectionString(nss);
-				if( id == null || id == "" ) 
-					t;
-				else if( t == "" )
-					id;
-				else
-					id+"."+t;
-		}
-	}
-
-	public static function addressListToString( l : List<Address>, ?charset : String ){
-		if( charset == null ) charset = "utf-8";
-		if( l == null ) return "";
-		var r = new List();
-		for( a in l ){
-			if( a.name != null ){
-				r.add("\""+mtwin.mail.Tools.headerDecode(a.name,charset).split("\"").join("\\\"")+"\" <"+a.address+">");
-			}else{
-				r.add(a.address);
-			}
-		}
-		return r.join(", ");
-	}
-
-}

+ 0 - 429
std/mtwin/net/Ftp.hx

@@ -1,429 +0,0 @@
-/*
- * Copyright (c) 2006, Motion-Twin
- * All rights reserved.
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- *   - Redistributions of source code must retain the above copyright
- *     notice, this list of conditions and the following disclaimer.
- *   - Redistributions in binary form must reproduce the above copyright
- *     notice, this list of conditions and the following disclaimer in the
- *     documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY MOTION-TWIN "AS IS" AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL THE HAXE PROJECT CONTRIBUTORS BE LIABLE FOR
- * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
- * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
- * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
- * DAMAGE.
- */
-package mtwin.net;
-
-import neko.net.Socket;
-import neko.net.Host;
-
-/**
-	Handles FTP protocol.
-
-	Example: [
-
-		var ftp = new Ftp("my.ftp.com", 21);
-		ftp.login("myuser", "mypass");
-		ftp.cwd("uploads");
-		neko.Lib.println(ftp.list());
-
-		var fp = neko.io.File.read("localFile.dat", true);
-		ftp.put(fp, "remoteName.dat");
-		fp.close();
-
-		fp = neko.io.File.write("copyFile.dat", true);
-		ftp.get(fp, "remoteName2.dat");
-		fp.close();
-
-		ftp.close();
-	]
-**/
-class Ftp {
-
-	static var CRLF = "\r\n";
-
-	public var debug : Bool;
-	var host : Host;
-	var port : Int;
-	var user : String;
-	var pass : String;
-	var acct : String;
-	var socket : Socket;
-	var srv : Socket;
-	var passiveMode : Bool;
-
-	/**
-		Creates a connection to an FTP server.
-	**/
-	public function new( host:String, ?port:Int ){
-		debug = false;
-		passiveMode = true;
-		this.host = new Host(host);
-		this.port = if (port != null) port else 21;
-		socket = new Socket();
-		socket.connect(this.host, this.port);
-		var welcome = getLines();
-	}
-
-	/**
-		Log into FTP server.
-	**/
-	public function login( ?login:String, ?pass:String, ?acct:String ){
-		if (login == null) login = "anonymous";
-		if (pass == null) pass = "";
-		if (acct == null) acct = "";
-		this.user = login;
-		this.pass = pass;
-		this.acct = acct;
-		var res = command("USER "+login);
-		if (res.charAt(0) == "3") res = command("PASS "+pass);
-		if (res.charAt(0) == "3") res = command("ACCT "+acct);
-		if (res.charAt(0) != "2")
-			throw res;
-	}
-
-	/**
-		Enable/Disable passive mode (default is on).
-	**/
-	public function setPassiveMode( b:Bool ){
-		passiveMode = b;
-	}
-
-	/**
-		Returns remote current working directory.
-	**/
-	public function pwd() : String {
-		var res = command("PWD");
-		var re = ~/257 "(.*?)"/;
-		if (re.match(res))
-			return re.matched(1);
-		throw res;
-	}
-
-	/**
-		Change remote current working directory.
-	**/
-	public function cwd( path:String ){
-		if (path == ".."){
-			voidCommand("CDUP");
-			return;
-		}
-		if (path == "")
-			path = ".";
-		voidCommand("CWD "+path);
-	}
-
-	/**
-		Create a remote directory.
-	**/
-	public function createDirectory( path: String ){
-		var res = command("MKD "+path);
-		var re = ~/257 "(.*?)"/;
-		if (re.match(res))
-			return true;
-		throw res;
-	}
-
-	/**
-		Delete remove directory.
-	**/
-	public function removeDirectory( path:String ){
-		voidCommand("RMD "+path);
-	}
-
-	/**
-		Retrieve remote file size.
-	**/
-	public function fileSize( path:String ) : Int {
-		voidCommand("TYPE I");
-		var res = command("SIZE "+path);
-		voidCommand("TYPE A");
-		if (res.substr(0,3) != "213")
-			throw res;
-		res = StringTools.trim(res.substr(3,res.length));
-		return Std.parseInt(res);
-	}
-
-	/**
-		Rename remote file or directory.
-	**/
-	public function rename( from:String, to:String ) {
-		var res = command("RNFR "+from);
-		if (res.charAt(0) != "3")
-			throw res;
-		voidCommand("RNTO "+to);
-	}
-
-	/**
-		Delete specified file from FTP server.
-	**/
-	public function deleteFile( path:String ) {
-		var res = command("DELE "+path);
-		if (res.substr(0,3) != "200" && res.substr(0,3) != "250")
-			throw res;
-	}
-
-	/**
-		Returns a quick listing of specified directory (or current directory if args omited).
-	**/
-	public function list( ?args:String ) : Array<String> {
-		var cmd = "NLST "+if (args != null) args else "";
-		return retrieveLines(cmd);
-	}
-
-	/**
-		Returns a detailed listing of specified directory (or current directory if args omited).
-	**/
-	public function detailedList( ?args:String ) : Array<String> {
-		var cmd = "LIST "+if (args != null) args else "";
-		return retrieveLines(cmd);
-	}
-
-	/**
-		Reads input and upload its content to remoteName.
-	**/
-	public function put( input:haxe.io.Input, remoteName:String, ?bufSize:Int ){
-		if (bufSize == null)
-			bufSize = 8192;
-		voidCommand("TYPE I");
-		var cnx = transferConnection("STOR "+remoteName);
-		cnx.output.writeInput(input, bufSize);
-		cnx.close();
-		voidResponse();
-	}
-
-	/**
-		Downloads remote file and write its content in output using neko.io.Output.writeBytes()
-	**/
-	public function get( output:haxe.io.Output, remoteFileName:String, ?bufSize:Int ){
-		if (bufSize == null)
-			bufSize = 8192;
-		retrieveBytes("RETR "+remoteFileName, function(s:haxe.io.Bytes, n:Int){ output.writeBytes(s,0,n); }, bufSize);
-	}
-
-	/**
-		Close connection.
-	**/
-	public function close(){
-		command("QUIT");
-		socket.close();
-		if (srv != null)
-			srv.close();
-	}
-
-	/**
-		Creates a new FTP connection dedicated to write to specified file.
-
-		Don't forget to close the neko.io.Output when done.
-	**/
-	public function write( remoteName:String ) : haxe.io.Output {
-		var pwd = pwd();
-		var ftp = new Ftp(host.toString(), port);
-		ftp.login(user, pass, acct);
-		ftp.cwd(pwd);
-		ftp.voidCommand("TYPE I");
-		var cnx = ftp.transferConnection("STOR "+remoteName);
-		var out = cnx.output;
-		var old = out.close;
-		(cast out).close = function(){
-			old();
-			ftp.voidResponse();
-			ftp.close();
-		}
-		return out;
-	}
-
-	/**
-		Creates a new FTP connection dedicated to read specified file.
-
-		Don't forget to close the neko.io.Output when done.
-	**/
-	public function read( remoteFileName:String ) : haxe.io.Input {
-		var pwd = pwd();
-		var ftp = new Ftp(host.toString(), port);
-		ftp.login(user, pass, acct);
-		ftp.cwd(pwd);
-		ftp.voidCommand("TYPE I");
-		var cnx = ftp.transferConnection("RETR "+remoteFileName);
-		var inp = cnx.input;
-		var old = inp.close;
-		(cast inp).close = function(){
-			old();
-			ftp.voidResponse();
-			ftp.close();
-		}
-		return inp;
-	}
-
-	function voidResponse() : String {
-		var res = getLines().join("\n");
-		if (debug) trace("VR< "+res);
-		if (res.charAt(0) != "2")
-			throw res;
-		return res;
-	}
-
-	function voidCommand( command:String ) : String {
-		if (debug) trace("VC> "+command);
-		socket.write(command + CRLF);
-		return voidResponse();
-	}
-
-	function command( command:String ) : String {
-		if (debug) trace("C> "+command);
-		socket.write(command + CRLF);
-		return getLines().pop();
-		//return getLine();
-	}
-
-	function getLine() : String {
-		var r = socket.input.readLine();
-		if (debug) trace(r);
-		return r;
-	}
-
-	function getLines() : Array<String> {
-		var lines = new Array();
-		var line = getLine();
-		lines.push(line);
-		if (line.charAt(3) != '-'){
-			return lines;
-		}
-		while (true){
-			line = getLine();
-			if (line.charAt(3) != "-"){
-				var code = line.substr(0, 3);
-				break;
-			}
-			else {
-				lines.push(line);
-			}
-		}
-		return lines;
-	}
-
-	function getPassivePort() : Int {
-		var res = command("PASV");
-		if (res.substr(0,3) != "227")
-			throw "Not PASV response : "+res;
-		var reg = ~/(\d+),(\d+),(\d+),(\d+),(\d+),(\d+)/;
-		if (reg.match(res)){
-			var port = (Std.parseInt(reg.matched(5)) << 8) + Std.parseInt(reg.matched(6));
-			return port;
-		}
-		throw "Unable to activate PASV : "+res;
-	}
-
-	function transferConnection( cmd:String, ?rest:String ) : Socket {
-		var cnx = null;
-		if (passiveMode){
-			var tport = getPassivePort();
-			cnx = new Socket();
-			cnx.connect(host, tport);
-			if (rest != null) command("REST "+rest);
-			var res = command(cmd);
-			// transfer complete there means nothing do do
-			if (res.substr(0,3) == "226"){
-				cnx.close();
-				return null;
-			}
-			else if (res.charAt(0) != "1")
-				throw res;
-		}
-		else {
-			if (srv != null)
-				srv.close();
-			srv = createTransferServer();
-			if (rest != null)
-				command("REST "+rest);
-			var res = command(cmd);
-			if (res.charAt(0) != "1")
-				throw res;
-			cnx = srv.accept();
-		}
-		return cnx;
-	}
-
-	function retrieveLines( cmd:String, ?rest:String ) : Array<String> {
-		var res = command("TYPE A");
-		var cnx = transferConnection(cmd, rest);
-		// nothing to retrieve
-		if (cnx == null)
-			return [];
-		var lines = new Array();
-		while (true){
-			try {
-				var line = cnx.input.readLine();
-				lines.push(line);
-			}
-			catch (eof:haxe.io.Eof){
-				cnx.close();
-				voidResponse();
-				return lines;
-			}
-		}
-		cnx.close();
-		throw voidResponse();
-		return null;
-	}
-
-	function retrieveBytes( cmd:String, cb:haxe.io.Bytes->Int->Void, ?bufSize:Int, ?rest:String ) {
-		if (bufSize == null)
-			bufSize = 8192;
-		var res = voidCommand("TYPE I");
-		var cnx = transferConnection(cmd, rest);
-		var buf = haxe.io.Bytes.alloc(bufSize);
-		while (cnx != null){
-			var rdd = try cnx.input.readBytes(buf, 0, bufSize) catch(eof:haxe.io.Eof) break;
-			cb(buf, rdd);
-			/*
-			var rdd = 0;
-			try {
-				var buf = neko.Lib.makeString(bufSize);
-				rdd = cnx.input.readBytes(buf, 0, bufSize);
-				cb(buf, rdd);
-			}
-			catch (eof:Eof){
-				rdd = 0;
-			}
-			if (rdd < bufSize)
-				break;
-			*/
-		}
-		if (cnx != null)
-			cnx.close();
-		voidResponse();
-	}
-
-	function createTransferServer(){
-		var sock = null;
-		var port = 0;
-		while (true){
-			try {
-				port = 1025 + Std.random(9999);
-				sock = new Socket();
-				sock.bind(socket.host().host, port);
-			}
-			catch (e:Dynamic){
-				sock.close();
-				sock = null;
-			}
-			if (sock != null)
-				break;
-		}
-		sock.listen(1);
-		var hostIp = StringTools.replace(socket.host().host.toString(), ".", ",");
-		voidCommand("PORT "+hostIp+","+Std.int(port/256)+","+(port%256));
-		return sock;
-	}
-}

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

@@ -1,218 +0,0 @@
-/*
- * Copyright (c) 2006, Motion-Twin
- * All rights reserved.
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- *   - Redistributions of source code must retain the above copyright
- *     notice, this list of conditions and the following disclaimer.
- *   - Redistributions in binary form must reproduce the above copyright
- *     notice, this list of conditions and the following disclaimer in the
- *     documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY MOTION-TWIN "AS IS" AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL THE HAXE PROJECT CONTRIBUTORS BE LIABLE FOR
- * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
- * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
- * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
- * DAMAGE.
- */
-
-package mtwin.templo;
-
-/**
-	Generates template .neko file.
-**/
-class Generator {
-
-	var out : StringBuf;
-	var htmlBuf : StringBuf;
-
-	public function new(){
-		out = new StringBuf();
-		htmlBuf = null;
-	}
-
-	public function toString() : String {
-		flushHtml();
-
-		var result = new StringBuf();
-		var headercode = '
-			String = $loader.String;
-			Array = $loader.Array;
-			iter = $loader.iter;
-			buffer_new = $loader.loadprim("std@buffer_new", 0);
-			buffer_add = $loader.loadprim("std@buffer_add", 2);
-			buffer_string = $loader.loadprim("std@buffer_string", 1);
-			string_split = $loader.loadprim("std@string_split", 2);
-
-			replace = function( h, n, r ){
-				var l = string_split(h, n);
-				if (l[1] == null)
-					return h;
-				var res = buffer_new();
-				buffer_add(res, l[0]);
-				l = l[1];
-				while (l != null){
-					buffer_add(res, r);
-					buffer_add(res, l[0]);
-					l = l[1];
-				}
-				return buffer_string(res);
-			}
-
-			html_escape = function( data ){
-				var t = $typeof(data);
-				if (t == $tint)
-					return data;
-				if (t != $tstring)
-					data = $string(data);
-				if (data == "")
-					return data;
-				data = replace(data, "&", "&amp;");
-				data = replace(data, "<", "&lt;");
-				data = replace(data, ">", "&gt;");
-				data = replace(data, "\\\"", "&quot;");
-				return data;
-			}
-
-			is_true = function( data ){
-				if (data == "") return false;
-				return $istrue(data);
-			}
-
-			new_repeat = function( data ){
-				var result = $new(null);
-				result.data = data;
-				result.index = 0-1;
-				result.number = 0;
-				result.first = true;
-				result.last = false;
-				result.odd = true;
-				result.even = false;
-				if (data.get_length != null) result.size = data.get_length();
-				else if (data.length != null) result.size = data.length;
-				else if (data.size != null) result.size = data.size();
-				else result.size = null;
-				result.next = function(v){
-					this.current = v;
-					this.index = this.index + 1;
-					this.first = this.index == 0;
-					this.number = this.number + 1;
-					this.last = (this.number == this.size);
-					this.even = (this.number % 2) == 0;
-					this.odd = (this.even == false);
-				}
-				return result;
-			}
-
-			new_output_buffer = function( parent ){
-				var result = $new(null);
-				result.parent = parent;
-				result.buf = buffer_new();
-				result.add = function(str){ return buffer_add(this.buf, str); }
-				result.str = function(){ return buffer_string(this.buf); }
-				return result;
-			}
-
-			new_context = function( parent, vars ){
-				var result = $new(null);
-				result.parent = parent;
-				result.__isTemplateContext = true;
-				if (vars == null){
-					result.vars = $new(null);
-				}
-				else {
-					result.vars = vars;
-				}
-				result.get = function( field ){
-					if ($objfield(this.vars, field)) return $objget(this.vars, field);
-					if (this.parent == null) return null;
-					return this.parent.get(field);
-				}
-				result.set = function( field, v ){
-					$objset(this.vars, field, v);
-				}
-				return result;
-			}
-
-			template = function( macro, params ){
-				var __ctx = null;
-				if (params.__isTemplateContext) {
-					__ctx = new_context(params, null);
-				}
-				else {
-					__ctx = new_context(null, params);
-				}
-				var __glb = __ctx;
-				var __out = new_output_buffer(null);
-
-//--- HERE COMES THE TEMPLATE CODE ---
-';
-		result.add(~/[\r\n]+/g.split(headercode).join("\n"));
-		result.add(out.toString());
-		result.add('//--- END OF TEMPLATE CODE ---
-				return __out.str();
-			}
-
-			$exports.template = template;
-		'); //'
-		return result.toString();
-	}
-
-	public function writeHtml( str:String ){
-		if (htmlBuf == null){
-			htmlBuf = new StringBuf();
-		}
-		htmlBuf.add(str);
-	}
-
-	public function writeCode( str:String ){
-		if (htmlBuf != null){
-			flushHtml();
-		}
-		out.add("__out.add("+str+");\n");
-	}
-
-	public function writeEscapedCode( str:String ){
-		if (htmlBuf != null){
-			flushHtml();
-		}
-		out.add("__out.add(html_escape("+str+"));\n");
-	}
-
-	public function add( code:String ){
-		if (htmlBuf != null){
-			flushHtml();
-		}
-		out.add(code);
-	}
-
-	public static function hash( name:String ) : Int {
-		return untyped __dollar__hash(name.__s);
-	}
-
-	public function getVar( name:String ) : String {
-		return "__ctx.get("+hash(name)+")";
-	}
-
-	public function setVar( name:String, exp:String ){
-		add("__ctx.set("+hash(name)+", "+exp+");\n");
-	}
-
-	public function flushHtml(){
-		if (htmlBuf == null) return;
-		var html = htmlBuf.toString();
-		html = StringTools.replace(html, "\\", "\\\\");
-		html = StringTools.replace(html, "\\'", "\\'");
-		html = StringTools.replace(html, "\"", "\\\"");
-		html = StringTools.replace(html, "\n", "\\n");
-		out.add("__out.add(\"" + html + "\");\n");
-		htmlBuf = null;
-	}
-}

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

@@ -1,118 +0,0 @@
-/*
- * Copyright (c) 2006, Motion-Twin
- * All rights reserved.
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- *   - Redistributions of source code must retain the above copyright
- *     notice, this list of conditions and the following disclaimer.
- *   - Redistributions in binary form must reproduce the above copyright
- *     notice, this list of conditions and the following disclaimer in the
- *     documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY MOTION-TWIN "AS IS" AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL THE HAXE PROJECT CONTRIBUTORS BE LIABLE FOR
- * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
- * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
- * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
- * DAMAGE.
- */
-
-package mtwin.templo;
-
-import neko.Sys;
-import neko.io.File;
-import neko.FileSystem;
-
-class Loader {
-
-	public static var BASE_DIR = "";
-	public static var TMP_DIR = "/tmp/";
-	public static var MACROS = "macros.mtt";
-	public static var OPTIMIZED = false;
-
-	public var execute : Dynamic -> String;
-
-	public function new( file:String ) {
-		if( !OPTIMIZED )
-			compileTemplate(file);
-		execute = loadTemplate(tmpFileId(file));
-	}
-
-	static function tmpFileId( path:String ) : String {
-		var rpath = path;
-		var temp = path;
-		if( temp.charAt(0) == "/" ) temp = temp.substr(1, temp.length-1);
-		temp = temp.split("/").join("__");
-		temp = temp.split("\\").join("__");
-		temp = temp.split(":").join("__");
-		temp = temp.split("____").join("__");
-		return TMP_DIR + temp + ".n";
-	}
-
-	static function compileTemplate( path:String ) : Void {
-		if( FileSystem.exists(tmpFileId(path)) ) {
-			var macroStamp = if( FileSystem.exists(BASE_DIR+MACROS) ) FileSystem.stat(BASE_DIR+MACROS).mtime.getTime() else null;
-			var sourceStamp = FileSystem.stat(BASE_DIR+path).mtime.getTime();
-			var stamp = FileSystem.stat(tmpFileId(path)).mtime.getTime();
-			if( stamp >= sourceStamp && (macroStamp == null || macroStamp < stamp) )
-				return;
-		}
-		var result = 0;
-
-		var macroArg = if (MACROS == null) "" else "-m \""+BASE_DIR+MACROS+"\"";
-
-		if (BASE_DIR == "")
-			result = Sys.command("temploc -s "+macroArg+" -o \""+TMP_DIR+"\" \""+path+"\" 2> \""+TMP_DIR+"temploc.out\"");
-		else
-			result = Sys.command("temploc -s "+macroArg+" -o \""+TMP_DIR+"\" -r \""+BASE_DIR+"\" \""+path+"\" 2> \""+TMP_DIR+"temploc.out\"");
-		if( result != 0 )
-			throw "temploc compilation or "+path+" failed : "+neko.io.File.getContent(Loader.TMP_DIR+"temploc.out");
-	}
-
-	static function loadTemplate( nPath:String ) : Dynamic -> String {
-		return untyped {
-			var loader = __dollar__loader;
-			var oldCache = loader.cache;
-			loader.cache = __dollar__new(oldCache);
-			loader.String = String;
-			loader.Array = Array;
-			loader.iter = function(loop : Dynamic, fnc){
-				if (loop == null){
-					throw "repeat or foreach called on null value";
-				}
-				if (loop.iterator != null){
-					var it : Iterable<Dynamic> = loop;
-					for (v in it.iterator() ) fnc(v);
-				}
-				else if (loop.hasNext != null && loop.next != null){
-					var it : Iterator<Dynamic> = loop;
-					for (v in it) fnc(v);
-				}
-				else {
-					throw "repeat or foreach called on non iterable object";
-				}
-			};
-			var code = loader.loadmodule(nPath.__s, loader);
-			loader.cache = oldCache;
-			function(context){
-				var wrapCache = loader.cache;
-				loader.cache = __dollar__new(wrapCache);
-				var macro = function(path){
-					if (mtwin.templo.Loader.OPTIMIZED == false){
-						mtwin.templo.Loader.compileTemplate(new String(path));
-					}
-					return loader.loadmodule(mtwin.templo.Loader.tmpFileId(new String(path)).__s, loader);
-				}
-				var result = new String(code.template(macro, context));
-				loader.cache = wrapCache;
-				return result;
-			}
-		}
-	}
-}

+ 0 - 170
std/mtwin/templo/Macro.hx

@@ -1,170 +0,0 @@
-/*
- * Copyright (c) 2006, Motion-Twin
- * All rights reserved.
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- *   - Redistributions of source code must retain the above copyright
- *     notice, this list of conditions and the following disclaimer.
- *   - Redistributions in binary form must reproduce the above copyright
- *     notice, this list of conditions and the following disclaimer in the
- *     documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY MOTION-TWIN "AS IS" AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL THE HAXE PROJECT CONTRIBUTORS BE LIABLE FOR
- * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
- * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
- * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
- * DAMAGE.
- */
-
-package mtwin.templo;
-
-class Macro {
-
-	static var R_PARAMS = ~/^([a-zA-Z0-9_]+)\((.*?)\)$/g;
-	static var R_NOTVAR = ~/[^a-zA-Z0-9_.]/;
-	static var R_NUM    = ~/^[0-9.]+$/;
-	static var R_VAR    = ~/^::(.*?)::$/;
-
-	public var name : String;
-	var params : Array<String>;
-	var source : String;
-
-	public function new( n:String, c:String ){
-		params = new Array();
-		name = n;
-		if (R_PARAMS.match(name)){
-			name = R_PARAMS.matched(1);	
-			if (StringTools.trim(R_PARAMS.matched(2)) != ""){
-				var i = 0;
-				for (param in R_PARAMS.matched(2).split(","))
-					params[i++] = StringTools.trim(param);
-			}
-		}
-		source = c;
-	}
-
-	dynamic public static function debug(x:String){}
-
-	public function expand( p:Array<String> ) : String {
-		if (params.length != p.length){
-			throw "macro "+name+" takes "+params.length+" arguments"+params.toString()+"\ngot: "+p.toString();
-		}
-
-		var hashReplace = new Hash();
-		
-		var res = source;
-		for (i in 0...params.length){
-			// Extract raw parameters ::myparam:: for later replacement,
-			// this is faster than trying to parse simple raw replacement like ::myparam::,
-			// an additional benefit is that this little replacement prevent the macro system from 
-			// becoming mad when a call parameter references a variable with the same name as one 
-			// of the macro arguments name (ex: macro(content) $$macro(::content::foo bar baz))
-			var replace = new EReg("::\\s*?"+params[i]+"\\s*?::", "g");
-			var key = "##__MP__"+i+"__##";
-			hashReplace.set(key, p[i]);	
-			res = replace.replace(res, key);
-			// old
-			// res = replace.replace(res, StringTools.replace(p[i], "$", "$$"));
-
-			// work on complex expressions ::myparam + 10 + 'foo bar baz'::
-			var isNum = R_NUM.match(p[i]);
-			var isVar = (R_VAR.match(p[i]) && R_VAR.matched(1).indexOf("::") == -1);
-			var pos = res.indexOf("::", 0);
-			while (pos != -1){
-				var end = res.indexOf("::", pos+2);
-				if (end == null){
-					neko.Lib.print(res);
-					throw "Unable to find matching ::";
-				}
-				var exp = res.substr(pos+2, end-pos-2);
-				var rep = replaceArgumentInExpression(exp, params[i], p[i], isVar, isNum);
-				res = res.substr(0, pos+2) + rep + res.substr(end, res.length - end);
-				pos = end - exp.length + rep.length + 2;
-				pos = res.indexOf("::", pos);
-			}
-			// work on mt:*="" attributes
-			var param = params[i];
-			var paramValue = p[i];
-			var reg = ~/(mt:[a-z-]+=)(["'])(.*?)(\2)/sm;
-			res = reg.customReplace(res, function(r){
-				return r.matched(1) + r.matched(2) + replaceArgumentInExpression(r.matched(3), param, paramValue, isVar, isNum) + r.matched(4);
-			});
-		}
-
-		// Replace raw parameters
-		for (k in hashReplace.keys())
-			res = StringTools.replace(res, k, hashReplace.get(k));
-		return res;
-	}
-
-	static function replaceArgumentInExpression( exp:String, paramName:String, value:String, isVar:Bool, isNum:Bool ) : String {	
-		var repl = if (isNum) value 
-			else if (isVar) "(" + value.substr(2, value.length-4) + ")" 
-			else stringArgumentToExpressionCompound(value);
-		var res = exp;
-		var pos = res.indexOf(paramName, 0);
-		while (pos != -1){
-			var end = pos + paramName.length;
-			var before = if (pos > 0) res.charAt(pos-1) else " ";
-			var after = if (end < res.length) res.charAt(end) else " ";
-			if (R_NOTVAR.match(before) && (after == "." || R_NOTVAR.match(after))){
-				res = res.substr(0, pos) + repl + res.substr(end, res.length-end);
-				end = end - paramName.length + repl.length;
-			}
-			pos = res.indexOf(paramName, end+1);
-		}
-		return res;
-	}
-
-	static function xmlToString( xml:Xml ) : String {
-		if (xml.nodeType != Xml.Element){
-			return xml.nodeValue;
-		}
-		var res = new StringBuf();
-		res.add("<");
-		res.add(xml.nodeName);
-		for (i in xml.attributes()){
-			res.add(" ");
-			res.add(i);
-			res.add("=\"");
-			res.add(StringTools.htmlEscape(xml.get(i)));
-			res.add("\"");
-		}
-		if (xml.firstChild() != null){
-			res.add(">");
-			for (x in xml)
-				res.add(xmlToString(x));
-			res.add("</");
-			res.add(xml.nodeName);
-			res.add(">");
-		}
-		else {
-			res.add("/>");
-		}
-		return res.toString();
-	}
-
-	static function stringArgumentToExpressionCompound( str:String ) : String {
-		var res = StringTools.replace(str,"'","\\'");
-		var pos = res.indexOf("::",0);
-		while ( pos != -1 ){
-			var end = res.indexOf("::", pos+2);
-			if (end == -1)
-				throw "Malformed expression '"+str+"'";
-			var left = res.substr(0, pos);
-			var data = res.substr(pos+2, end-pos-2);
-			var right = res.substr(end+2, res.length-end-2);
-			res = left + "\'+" + data + "+\'" + right;
-			pos = end + 2;
-			pos = res.indexOf("::",pos);
-		}
-		return "(\'" + res + "\')";
-	}
-}

+ 0 - 112
std/mtwin/templo/Main.hx

@@ -1,112 +0,0 @@
-/*
- * Copyright (c) 2006, Motion-Twin
- * All rights reserved.
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- *   - Redistributions of source code must retain the above copyright
- *     notice, this list of conditions and the following disclaimer.
- *   - Redistributions in binary form must reproduce the above copyright
- *     notice, this list of conditions and the following disclaimer in the
- *     documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY MOTION-TWIN "AS IS" AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL THE HAXE PROJECT CONTRIBUTORS BE LIABLE FOR
- * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
- * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
- * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
- * DAMAGE.
- */
-package mtwin.templo;
-
-class Main {
-
-	static var VERSION = "0.2 -- haxe flavoured";
-	static var USAGE = "Usage: temploc -o </destination/dir> -m <macrofile.xml> -r </templates/repository> <files...>\n";
-	static var args : Array<String>;
-	static var files : List<String>;
-	static var silence : Bool = false;
-
-	static function parseArgs(){
-		files = new List();
-		args = neko.Sys.args();
-		var i = 0;
-		var macros = null;
-		while (i < args.length){
-			var arg = args[i];
-			switch (arg){
-				case "-h":
-					throw USAGE;
-
-				case "-s":
-					silence = true;
-
-				case "-r":
-					var value = args[i+1];
-					if (value.charAt(value.length-1) == "/"){
-						value = value.substr(0, value.length-1);
-					}
-					Loader.BASE_DIR = value;
-					++i;
-
-				case "-o":
-					var value = args[i+1];
-					if (value.charAt(value.length-1) != "/"){
-						value = value + "/";
-					}
-					Loader.TMP_DIR = value;
-					++i;
-
-				case "-m":
-					i++;
-					macros = args[i];
-					mtwin.templo.Preprocessor.registerMacroFile(macros);
-
-				default:
-					files.push(arg);
-			}
-			++i;
-		}
-		if( macros != null )
-			files.remove(macros);
-		if (args.length == 0){
-			neko.Lib.print("temploc - v"+VERSION+"\n");
-			neko.Lib.print(USAGE);
-		}
-		else if (files.length == 0){
-			neko.Lib.print("temploc - v"+VERSION+"\n");
-			neko.Lib.print(USAGE);
-		}
-		else if (Loader.BASE_DIR == null){
-			var sampleFile = Lambda.array(files)[0];
-			var pslah = sampleFile.lastIndexOf("/",sampleFile.length);
-			var aslah = sampleFile.lastIndexOf("/",sampleFile.length);
-			var pos = Std.int(Math.max(pslah, aslah));
-			if (pos == -1){
-				neko.Lib.print("missing template BASE_DIR\n");
-				throw USAGE;
-			}
-			Loader.BASE_DIR = sampleFile.substr(0,pos);
-		}
-	}
-
-	static function mtime(file:String) : Float {
-		return neko.FileSystem.stat(file).mtime.getTime();
-	}
-
-	static function main(){
-		Loader.MACROS = null;
-		parseArgs();
-		for (file in files){
-			file = StringTools.replace(file, Loader.BASE_DIR+"/", "");
-			if (!silence) neko.Lib.print("* "+file+"...");
-			mtwin.templo.Template.fromFile(file);
-			if (!silence) neko.Lib.print(" done\n");
-		}
-	}
-}

+ 0 - 731
std/mtwin/templo/Parser.hx

@@ -1,731 +0,0 @@
-/*
- * Copyright (c) 2006, Motion-Twin
- * All rights reserved.
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- *   - Redistributions of source code must retain the above copyright
- *     notice, this list of conditions and the following disclaimer.
- *   - Redistributions in binary form must reproduce the above copyright
- *     notice, this list of conditions and the following disclaimer in the
- *     documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY MOTION-TWIN "AS IS" AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL THE HAXE PROJECT CONTRIBUTORS BE LIABLE FOR
- * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
- * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
- * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
- * DAMAGE.
- */
-
-package mtwin.templo;
-
-class Parser {
-
-	static var REGEX_EXP = ~/^([a-zA-Z][A-Za-z0-9_]{0,})[ \n\r\t]+(.*?)$/gsm;
-	static var REGEX_DXP = ~/::([^:].*?)::/gsm;
-
-	static var MT = "mt";
-	static var MT_IF = "mt:if";
-	static var MT_ELSEIF = "mt:elseif";
-	static var MT_ELSE = "mt:else";
-	static var MT_CONTENT = "mt:content";
-	static var MT_REPLACE = "mt:replace";
-	static var MT_FOREACH = "mt:foreach";
-	static var MT_ATTRIBUTES = "mt:attr";
-	static var MT_SET = "mt:set";
-	static var MT_FILL = "mt:fill";
-	static var MT_OMIT_TAG = "mt:omit-tag";
-	static var MT_MACRO = "mt:macro";
-	static var MT_USE = "mt:use";
-
-	static var XHTML_EMPTY = ["area","base","basefont","br","col","frame","hr","img","input","isindex","link","meta","param"];
-	static var XHTML_ATTRS = ["compact","nowrap","ismap","declare","noshade","checked","disabled","readonly","multiple","selected","noresize","defer"];
-
-	var out : mtwin.templo.Generator;
-	var xhtmlMode : Bool;
-
-	public function new( ?isXhtml:Bool ){
-		xhtmlMode = (isXhtml == true);
-		out = new mtwin.templo.Generator();
-	}
-
-	public function parse( xml:Xml ) : String {
-		parseNode(xml);
-		return out.toString();
-	}
-
-	function parseNode( xml:Xml ){
-		switch (untyped xml.nodeType){
-			case Xml.Document:
-				for (child in xml) parseNode(child);
-			case Xml.CData:
-				parseCDATA(xml);
-			case Xml.Comment:
-				parseComment(xml);
-			case Xml.Element:
-				parseElement(xml);
-			default:
-				echoString(xml.toString());
-		}
-	}
-
-	function parseElement( xml:Xml ){
-		var mtSet = extractAttribute(xml, MT_SET);
-		if (mtSet != null){
-			var incExp = ~/^([a-zA-Z_][a-zA-Z0-9_]*?)\s*?([\+\-\/*%])=\s*?(.*?)$/;  // */
-			if (incExp.match(mtSet)){
-				var dest = StringTools.trim(incExp.matched(1));
-				var op = incExp.matched(2);
-				var exp = parseExpression(StringTools.trim(incExp.matched(3)));
-				out.setVar(dest, out.getVar(dest)+" "+op+" ("+exp+")");
-			}
-			else {
-				var parts = Lambda.array(mtSet.split("="));
-				var dest = StringTools.trim(parts.shift());
-				var exp = parseExpression(StringTools.trim(parts.join("=")));
-				out.setVar(dest, "("+exp+")");
-			}
-			return;
-		}
-
-		var mtUse = extractAttribute(xml, MT_USE);
-		if (mtUse != null){
-			// ensure template is parsed (beware of cycle)
-			/*
-			if (!mtwin.templo.Template.compiledFiles.exists(mtUse)){
-				mtwin.templo.Template.compiledFiles.set(mtUse, true);
-				var f = mtwin.templo.Template.fromFile(mtUse);
-			}
-			*/
-			out.add("tmp = "+out.getVar("__content__")+";\n");
-			out.add("__out = new_output_buffer(__out);\n");
-			parseNode(xml);
-			out.setVar("__content__", "__out.str()");
-			out.add("__out = __out.parent;\n");
-
-			if (StringTools.endsWith(mtUse, ".mtt"))
-				neko.Lib.println("WARNING: templo ::use:: changed the following use may be incorrect : '"+mtUse+"'");
-			//throw parseExpression(mtUse);
-			out.add("mcr = macro("+parseExpression(mtUse)+");\n");
-			out.add("__out.add(mcr.template(macro, __ctx));\n");
-			out.setVar("__content__", "tmp");
-			return;
-		}
-
-		var mtFill = extractAttribute(xml, MT_FILL);
-		if (mtFill != null){
-			out.add("__out = new_output_buffer(__out);\n");
-			parseNode(xml);
-			out.setVar(StringTools.trim(mtFill), "String.new(__out.str())");
-			out.add("__out = __out.parent;\n");
-			return;
-		}
-
-		var mtIf = extractAttribute(xml, MT_IF);
-		if (mtIf != null){
-			out.add("if (is_true("+parseExpression(mtIf)+")){\n");
-			parseNode(xml);
-			out.add("}\n");
-			return;
-		}
-
-		var mtElseIf = extractAttribute(xml, MT_ELSEIF);
-		if (mtElseIf != null){
-			out.add("else if (is_true("+parseExpression(mtElseIf)+")){\n");
-			parseNode(xml);
-			out.add("}\n");
-			return;
-		}
-
-		var mtElse = extractAttribute(xml, MT_ELSE);
-		if (mtElse != null){
-			out.add("else {\n");
-			parseNode(xml);
-			out.add("}\n");
-			return;
-		}
-
-		var mtForeach = extractAttribute(xml, MT_FOREACH);
-		if (mtForeach != null){
-			var o = extractExpressionTarget(mtForeach);
-			if (o.target == null)
-				throw "repeat/foreach requires two parameters (expression was '"+mtForeach+"')";
-			out.add("var loop = "+parseExpression(o.exp)+";\n");
-			out.add("__ctx.vars.repeat_"+o.target+" = new_repeat(loop);\n");
-			out.add("iter(loop, function(__item){\n");
-			out.add("__ctx.vars.repeat_"+o.target+".next(__item);\n");
-			out.setVar(o.target, "__item");
-			parseNode(xml);
-			out.add("});\n");
-			return;
-		}
-
-		var mtReplace = extractAttribute(xml, MT_REPLACE);
-		if (mtReplace != null){
-			echoExpression(mtReplace);
-			return;
-		}
-
-		var mtOmitTag = extractAttribute(xml, MT_OMIT_TAG);
-		if (mtOmitTag == null && xml.nodeName == MT){
-			mtOmitTag = "true";
-		}
-
-		var mtAttributes = extractAttribute(xml, MT_ATTRIBUTES);
-		var mtContent = extractAttribute(xml, MT_CONTENT);
-
-		var hasContent = (mtContent != null || xml.firstChild() != null);
-
-		var xhtmlEmpty = isXHTMLEmptyTag(xml.nodeName);
-		if (xhtmlMode && hasContent && xhtmlEmpty){
-			hasContent = false;
-		}
-		if (xhtmlMode && !hasContent && !xhtmlEmpty){
-			hasContent = true;
-		}
-
-		if (mtOmitTag == null){
-			out.writeHtml("<"+xml.nodeName);
-			if (mtAttributes != null){
-				doMtAttributes(mtAttributes, xml);
-			}
-			else {
-				echoAttributes(xml);
-			}
-			if (hasContent){
-				out.writeHtml(">");
-			}
-			else {
-				out.writeHtml("/>");
-				return;
-			}
-		}
-
-		if (mtContent != null){
-			echoExpression(mtContent);
-		}
-		else {
-			for (child in xml)
-				parseNode(child);
-		}
-
-		if (mtOmitTag == null && hasContent){
-			out.writeHtml("</" + xml.nodeName + ">");
-		}
-	}
-
-	function doMtAttributes( att:String, xml:Xml ){
-		var overwritten = new Hash();
-		var parts = Lambda.array(splitExpression(att));
-		for (i in 0...parts.length){
-			var x = StringTools.trim(parts[i]);
-			var o = extractExpressionTarget(x);
-			var exp = parseExpression(o.exp);
-			if (isBooleanAttribute(o.target)){
-				out.add("if ("+exp+"){\n");
-				out.add("__out.add(\" "+o.target+"=\\\""+o.target+"\\\"\");\n");
-				out.add("}");
-			}
-			else {
-				out.add("var value = "+exp+";\n");
-				out.add("if (value != false && value != null){\n");
-				out.add("__out.add(\" "+o.target+"=\\\"\");\n");
-				out.add("__out.add(html_escape(value));\n");
-				out.add("__out.add(\"\\\"\");\n");
-				out.add("}");
-			}
-			overwritten.set(o.target, true);
-		}
-
-		for (field in xml.attributes()){
-			var attName = field;
-			if (!overwritten.exists(attName)){
-				var attVal = xml.get(field);
-				if (attVal != null){ // mt attributes
-					out.add("__out.add(\" "+attName+"=\\\"\");\n");
-					echoString(attVal);
-					out.add("__out.add(\"\\\"\");\n");
-				}
-			}
-		}
-	}
-
-	function splitExpression( exp:String ) : List<String> {
-		var result = new List();
-		var start = 0;
-		var len = exp.length;
-		var i = 0;
-		var inString = false;
-		var inDString = false;
-		while( i < len ){
-			var c = exp.charAt(i);
-			if (inString || inDString){
-				if ( c == "\\" && ( (inString && exp.charAt(i+1) == "'") || (inDString && exp.charAt(i+1) == "\"") ) )
-					i = i + 1;
-				else if (inString && c == "'")
-					inString = false;
-				else if (inDString && c == "\"")
-					inDString = false;
-			}
-			else if (c == "'")
-				inString = true;
-			else if (c == "\"")
-				inDString = true;
-			else if (c == ";"){
-				result.push(exp.substr(start, i-start));
-				start = i+1;
-			}
-			i++;
-		}
-		if (start < len){
-			result.push(exp.substr(start, len-start));
-		}
-		return result;
-	}
-
-	function echoAttributes( xml:Xml ){
-		if (xml == null)
-			return;
-		for (att in xml.attributes()){
-			var value = xml.get(att);
-			if (value == null)
-				continue;
-			out.writeHtml(" "+att);
-			out.writeHtml("=\"");
-			echoString( StringTools.replace(value, "\"", "&quot;") );
-			out.writeHtml("\"");
-		}
-	}
-
-	function parseComment( xml:Xml ){
-		out.writeHtml("<!--"+StringTools.htmlUnescape(xml.nodeValue)+"-->");
-	}
-
-	function echoExpression( exp:String ){
-		exp = StringTools.trim(exp);
-		if (exp.indexOf("raw ", 0) == 0){
-			out.writeCode(parseExpression(exp.substr(4, exp.length-4)));
-		}
-		else {
-			out.writeEscapedCode(parseExpression(exp));
-		}
-	}
-
-	function echoString( str:String ){
-		var source = str;
-		while (REGEX_DXP.match(source)){
-			var pos = REGEX_DXP.matchedPos();
-			if (pos.pos > 0){
-				out.writeHtml(source.substr(0,pos.pos));
-			}
-			echoExpression(StringTools.htmlUnescape(REGEX_DXP.matched(1)));
-			source = source.substr(pos.pos + pos.len, source.length - pos.pos - pos.len);
-		}
-		if (source.length > 0){
-			out.writeHtml(source);
-		}
-	}
-
-	function parseCDATA( xml:Xml ){
-		out.writeHtml("<![CDATA[\n");
-		var cdataSrc = xml.nodeValue;
-		cdataSrc = StringTools.htmlUnescape(cdataSrc);
-		cdataSrc = "<mt>" + cdataSrc + "</mt>";
-		var cdataxml = null;
-		try {
-			cdataxml = Xml.parse(cdataSrc);
-			if (cdataxml == null)
-				throw "Unable to parse CDATA content";
-		}
-		catch (e:Dynamic){
-			throw { error:e, xmlsource:cdataSrc, cdatasource:xml.nodeValue };
-		}
-		restoreCDATAHtmlEncoding(cdataxml);
-		parseNode(cdataxml);
-		out.writeHtml("]]>");
-	}
-
-	function isBooleanAttribute( attName:String ) : Bool {
-		if (!xhtmlMode)
-			return false;
-		for (f in XHTML_ATTRS){
-			if (f == attName) return true;
-		}
-		return false;
-	}
-
-	function isXHTMLEmptyTag( tag:String ) : Bool {
-		if (!xhtmlMode)
-			return false;
-		for (f in XHTML_EMPTY){
-			if (f == tag) return true;
-		}
-		return false;
-	}
-
-	static function splitArguments( str:String ) : List<String> {
-		var res = new List();
-		var arg = "";
-		var len = str.length;
-		var cto = 0;
-		var string = false;
-		var dstring = false;
-		var i = 0;
-		while (i < len){
-			var c = str.charAt(i);
-			if (c == "("){
-				cto++;
-			}
-			else if (c == ")"){
-				cto--;
-			}
-
-			if (c == "\\"){
-				arg += c;
-				arg += str.charAt(i+1);
-				i += 2;
-				continue;
-			}
-
-			if (c == "\"" && !string)
-				dstring = !dstring;
-
-			if (c == "'" && !dstring)
-				string = !string;
-
-			if (c == "," && cto == 0 && !string && !dstring){
-				res.add(StringTools.trim(arg));
-				arg = "";
-			}
-			else {
-				arg += c;
-			}
-			i++;
-		}
-		if (arg != ""){
-			res.add(StringTools.trim(arg));
-		}
-		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 {
-		var len = str.length;
-		var ctopen = 0;
-		for (i in (pos+1)...(len)){
-			var c = str.charAt(i);
-			if (c == "("){
-				ctopen++;
-			}
-			else if (c == ")"){
-				if (ctopen == 0){
-					return i-1;
-				}
-				else {
-					ctopen--;
-				}
-			}
-		}
-		return -1;
-	}
-
-	static function extractAttribute( xml:Xml, id:String ) : String {
-		var res = xml.get(id);
-		if (res == null){
-			return null;
-		}
-		xml.set(id, null);
-		return StringTools.trim(res.split("&quot;").join("\"").split("&amp;").join("&"));
-	}
-
-	static function restoreCDATAHtmlEncoding( xml:Xml ){
-		if (xml.nodeType == Xml.Element || xml.nodeType == Xml.Document)
-			for (x in xml) restoreCDATAHtmlEncoding(x);
-		else
-			xml.nodeValue = StringTools.htmlUnescape(xml.nodeValue);
-	}
-
-	static function extractExpressionTarget( exp:String ) : { target:String, exp:String } {
-		if (REGEX_EXP.match(exp)){
-			return {target:REGEX_EXP.matched(1), exp:REGEX_EXP.matched(2)};
-		}
-		return {target:null, exp:exp};
-	}
-
-	static function isExpressionKeyword( varName:String ) : Bool {
-		return varName == "true" || varName == "false" || varName == "null" || varName == "if" || varName == "else";
-	}
-
-	// Quick and 'dirty' expression transformer,
-    // This function transform a template expression into a neko compliant expression.
-	public static function parseExpression( exp:String ) : String {
-		var r_num = ~/[0-9]+/;
-		var r_digit = ~/[0-9.]+/;
-		var r_var = ~/[\$a-zA-Z0-9_]/;
-		var r_op = ~/[!+-\/*<>=&|%]+/;  //*/
-		var result = new StringBuf();
-		var states = { none:0, string:1, dstring:2, variable:3, num:4, member:5, array:6 };
-		var str = StringTools.trim(exp);
-		var state = states.none;
-		var mark = 0;
-		var getter = false;
-		var len = str.length;
-		var i = 0;
-		while (i < len+1){
-			var skip = false;
-			var c = if (i == len) "\n" else str.charAt(i);
-			var n = if (i+1 >= len) "\n" else str.charAt(i+1);
-			switch (state){
-				case states.none:
-					if (r_num.match(c)){
-						state = states.num;
-					}
-					else if (c == "\""){
-						result.add("String.new(");
-						state = states.dstring;
-					}
-					else if (c == "'"){
-						result.add("String.new(\"");
-						state = states.string;
-						skip = true;
-					}
-					else if (c == "."){
-						state = states.member;
-						if (i < len && str.charAt(i+1) == "_"){
-							result.add(".get");
-							getter = true;
-							skip = true;
-						}
-					}
-					else if (r_op.match(c)){
-						if (c == '!' && n != "="){
-							result.add("false == ");
-							skip = true;
-						}
-						else if (c == "&" && n != "&" && n != "=" && len-i >= 5){
-							if (str.substr(i,5) == "&amp;"){
-								result.add("&"); i+=4; skip = true;
-							}
-							if (str.substr(i,4) == "&lt;"){
-								result.add("<"); i+=3; skip = true;
-							}
-							else if (str.substr(i,4) == "&gt;"){
-								result.add(">"); i+=3; skip = true;
-							}
-						}
-					}
-					else if (c == "("){
-						var end = findEndOfBracket(str, i);
-						if (end == -1)
-							throw "Missing end ) in expression '"+exp+"'";
-						var sub = str.substr(i+1, end-i);
-						result.add("(");
-						result.add(parseExpression(sub));
-						i = end;
-						skip = true;
-					}
-					else if (c == "["){
-						var def = findEndOfArray(str, i);
-						if (def.end == -1)
-							throw "Missing end ] in expression '"+exp+"'";
-						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)){
-						state = states.variable;
-						mark = i;
-					}
-
-				case states.string:
-					if (c == "\\" && n == "'"){
-						result.add("'");
-						skip = true;
-						++i;
-					}
-					else if (c == "\\" && n == "\""){
-						skip = true;
-					}
-					else if (c == "'"){
-						state = states.none;
-						result.add("\")");
-						skip = true;
-					}
-
-				case states.dstring:
-					if (c == "\\" && n == "\""){
-						result.add("\\\"");
-						skip = true;
-						++i;
-					}
-					else if (c == "\\" && n == "'"){
-						skip = true;
-					}
-					else if (c == "\""){
-						state = states.none;
-						result.add("\")");
-						skip = true;
-					}
-
-				case states.variable:
-					if (r_var.match(c)){
-					}
-					else if (c == "."){
-						var variable = str.substr(mark, i-mark);
-						if (variable == "repeat"){
-							result.add("__ctx.vars.repeat_");
-							state = states.member;
-							skip = true;
-						}
-						else {
-							result.add("__ctx.get(");
-							result.add(Generator.hash(variable));
-							result.add(")");
-							state = states.member;
-							if (i < len && str.charAt(i+1) == "_"){
-								result.add(".get");
-								getter = true;
-								skip = true;
-							}
-						}
-					}
-					else {
-						var variable = str.substr(mark, i-mark);
-						if (isExpressionKeyword(variable)){
-							result.add(variable);
-						}
-						else if (c == "["){
-							result.add("__ctx.get(");
-							result.add(Generator.hash(variable));
-							result.add(")");
-							var def = findEndOfArray(str, i);
-							if (def.end == -1)
-								throw "Missing end ] in expression '"+exp+"'";
-							var sub = str.substr(i+1, def.end-i);
-							result.add("[");
-							result.add(parseExpression(sub));
-							result.add("]");
-							i = def.end + 1;
-							skip = true;
-							state = states.none;
-						}
-						else {
-							result.add("__ctx.get(");
-							result.add(Generator.hash(variable));
-							result.add(")");
-						}
-						state = states.none;
-					}
-
-				case states.num:
-					if (!r_digit.match(c)){
-						state = states.none;
-					}
-
-				case states.member:
-					if (r_var.match(c)){
-					}
-					else if (c == "("){
-						if (getter){
-							result.add("()");
-							getter = false;
-						}
-						var end = findEndOfBracket(str, i);
-						if (end == -1)
-							throw "Missing end bracket in expression '"+exp+"'";
-						var sub = str.substr(i+1, end-i);
-						var argStr = Lambda.array(splitArguments(sub));
-						for (j in 0...argStr.length){
-							argStr[j] = parseExpression(argStr[j]);
-						}
-						result.add("(");
-						result.add(argStr.join(","));
-						result.add(")");
-						i = end+1; skip = true;
-					}
-					else if (c == "."){
-						if (getter){
-							result.add("()");
-							getter = false;
-						}
-						if (i < len && str.charAt(i+1) == "_"){
-							getter = true;
-							result.add(".get");
-							skip = true;
-						}
-					}
-					else if (c == "["){
-						if (getter){
-							result.add("()");
-							getter = false;
-						}
-						var def = findEndOfArray(str, i);
-						if (def.end == -1)
-							throw "Missing end ] in expression '"+exp+"'";
-						var sub = str.substr(i+1, def.end-i);
-						result.add("[");
-						result.add(parseExpression(sub));
-						result.add("]");
-						i = def.end + 1;
-						skip = true;
-						state = states.none;
-					}
-					else {
-						if (getter){
-							result.add("()");
-							getter = false;
-						}
-						state = states.none;
-						if (i != len){
-							i--;
-						}
-						skip = true;
-					}
-			}
-			if (!skip && i < len && state != states.variable){
-				result.add(str.charAt(i));
-			}
-			++i;
-		}
-		return result.toString();
-	}
-}

+ 0 - 260
std/mtwin/templo/Preprocessor.hx

@@ -1,260 +0,0 @@
-/*
- * Copyright (c) 2006, Motion-Twin
- * All rights reserved.
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- *   - Redistributions of source code must retain the above copyright
- *     notice, this list of conditions and the following disclaimer.
- *   - Redistributions in binary form must reproduce the above copyright
- *     notice, this list of conditions and the following disclaimer in the
- *     documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY MOTION-TWIN "AS IS" AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL THE HAXE PROJECT CONTRIBUTORS BE LIABLE FOR
- * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
- * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
- * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
- * DAMAGE.
- */
-
-package mtwin.templo;
-
-class Preprocessor {
-
-	static var r_if      = ~/::if([^_a-zA-Z0-9].*?)::/gs;
-	static var r_elseif  = ~/::elseif([^_a-zA-Z0-9].*?)::/gs;
-	static var r_else    = ~/::else\s*?::/;
-	static var r_foreach = ~/::foreach\s+(.*?)::/gs;
-	static var r_fill    = ~/::fill\s+(.*?)::/gs;
-	static var r_use     = ~/::use\s+(.*?)::/gs;
-	static var r_set     = ~/::set\s+(.*?)::/gs;
-
-	static var r_cond    = ~/::cond\s+(.*?)::/gs;
-	static var r_repeat  = ~/::repeat\s+(.*?)::/gs;
-	static var r_attr    = ~/::attr\s+(.*?)::/gs;
-
-	static var r_cdata     = ~/<!\[CDATA\[([^\0]*?)]]>/g;
-	static var r_comment   = ~/<!--([^\0]*?)-->/g;
-	static var r_macroCall = ~/\$\$([a-zA-Z0-9_]+)\(/g;
-	static var r_print     = ~/::(.*?)::/g;
-
-	public static var macros : Hash<mtwin.templo.Macro> = new Hash();
-	public static var macroFileStamp : Float;
-
-	public static function process( str:String ) : String {
-		if (macroFileStamp == null && Loader.MACROS != null)
-			registerMacroFile(Loader.BASE_DIR+Loader.MACROS);
-
-		var res = str;
-		res = escapeCdata1(res);
-		res = expandMacros(res);
-		res = res.split("::else::").join("</mt><mt mt:else=\"\">");
-		res = res.split("::end::").join("</mt>");
-		while (r_if.match(res)){
-			res = res.split(r_if.matched(0)).join("<mt mt:if=\""+quote(StringTools.trim(r_if.matched(1)))+"\">");
-		}
-		while (r_elseif.match(res)){
-			res = res.split(r_elseif.matched(0)).join("</mt><mt mt:elseif=\""+quote(StringTools.trim(r_elseif.matched(1)))+"\">");
-		}
-		while (r_foreach.match(res)){
-			res = res.split(r_foreach.matched(0)).join("<mt mt:foreach=\""+quote(r_foreach.matched(1))+"\">");
-		}
-		while (r_fill.match(res)){
-			res = res.split(r_fill.matched(0)).join("<mt mt:fill=\""+quote(r_fill.matched(1))+"\">");
-		}
-		while (r_set.match(res)){
-			res = res.split(r_set.matched(0)).join("<mt mt:set=\""+quote(r_set.matched(1))+"\"/>");
-		}
-		while (r_use.match(res)){
-			res = res.split(r_use.matched(0)).join("<mt mt:use=\""+quote(r_use.matched(1))+"\">");
-		}
-		res = escapeComments(res);
-
-		while (r_cond.match(res)){
-			res = res.split(r_cond.matched(0)).join("mt:if=\""+quote(r_cond.matched(1))+"\"");
-		}
-		while (r_repeat.match(res)){
-			res = res.split(r_repeat.matched(0)).join("mt:foreach=\""+quote(r_repeat.matched(1))+"\"");
-		}
-		while (r_attr.match(res)){
-			res = res.split(r_attr.matched(0)).join("mt:attr=\""+quote(r_attr.matched(1))+"\"");
-		}
-		res = unescapeCdata1(res);
-		res = escapePrints(res);
-		return trimExtraSpaces("<mt>" + res + "</mt>");
-	}
-
-	static function trimExtraSpaces( str:String ) : String {
-		var reg = null;
-
-		reg = ~/^\s+(<mt mt:[a-z]+="[^"]+"\/?>)\s*?\n/gm;
-		while (reg.match(str)) str = StringTools.replace(str, reg.matched(0), reg.matched(1));
-
-		reg = ~/^\s+(<\/?mt>)\s*?\n/gm;
-		while (reg.match(str)) str = StringTools.replace(str, reg.matched(0), reg.matched(1));
-
-		reg = ~/^\s+(&lt;mt mt:[a-z]+="[^"]+"\/?&gt;)\s*?\n/gm;
-		while (reg.match(str)) str = StringTools.replace(str, reg.matched(0), reg.matched(1));
-
-		reg = ~/^\s+(&lt;\/?mt&gt;)\s*?\n/gm;
-		while (reg.match(str)) str = StringTools.replace(str, reg.matched(0), reg.matched(1));
-
-		reg = ~/\s+((<|&lt;)mt mt:(set)="[^"]+"\/?(>|&gt;))\s+/g;
-		while (reg.match(str)) str = StringTools.replace(str, reg.matched(0), reg.matched(1));
-
-		reg = ~/(<mt mt:[^=]+="[^"]+"\/?>)\s+(<\/?mt)/g;
-		while (reg.match(str)) str = StringTools.replace(str, reg.matched(0), reg.matched(1)+reg.matched(2));
-
-		reg = ~/(&lt;mt mt:[^=]+="[^"]+"\/?&gt;)\s+(&lt;\/?mt)/g;
-		while (reg.match(str)) str = StringTools.replace(str, reg.matched(0), reg.matched(1)+reg.matched(2));
-		
-		reg = ~/(&lt;\/mt&gt;)\s+(&lt;\/?mt)/g;
-		while (reg.match(str)) str = StringTools.replace(str, reg.matched(0), reg.matched(1)+reg.matched(2));
-
-		return str;
-	}
-
-	public static function expandMacros( str:String ) : String {
-		var res = str;
-		while (r_macroCall.match(res)){
-			var macroName = r_macroCall.matched(1);
-			var macroCallPos = r_macroCall.matchedPos();
-			var i = macroCallPos.pos + macroCallPos.len;
-			var args = new Array();
-			var nargs = 0;
-			var startArg = i;
-			var endArg = -1;
-			var oAccos = 0;
-			var oParas = 0;
-			var end = 0;
-			var forceArg = false;
-			while (i < res.length){
-				var c = res.charAt(i);
-				if (c == "("){
-					if (oAccos == 0){
-						oParas++;
-						++i;
-						continue;
-					}
-				}
-				if (c == ")" && oParas > 0){
-					oParas--;
-					++i;
-					continue;
-				}
-				if (c == "{"){
-					if (oAccos == 0){ 
-						startArg = i+1;
-						forceArg = true; 
-					}
-					oAccos++;
-				}
-				if (c == "}"){
-					if (oAccos > 0){ 
-						oAccos--;
-						if (oAccos == 0){ endArg = i; }
-					}
-				}
-				if (oAccos == 0 && oParas == 0 && (c == "," || c == ")")){
-					if (endArg == -1){ endArg = i; }
-					var p = res.substr(startArg, endArg - startArg);
-					p = StringTools.trim(p);
-					if (p.length > 0 || forceArg){
-						args[ nargs ] = p;
-						nargs++;
-					}
-					startArg = i+1;
-					endArg = -1;
-					forceArg = false;
-				}
-				if (oAccos == 0 && (c == ")")){
-					end = i+1;
-					break;
-				}
-				++i;
-			}
-			var mcr = macros.get(macroName);
-			if (mcr == null){
-				throw "Unknown macro "+macroName;
-			}
-			var src = res.substr(r_macroCall.matchedPos().pos, end - r_macroCall.matchedPos().pos);
-			res = res.split(src).join(mcr.expand(args));
-		}
-		return res;
-	}
-
-	public static function registerMacroFile( path:String ){
-		if (!neko.FileSystem.exists(path)){
-			throw "Macro file "+path+" does not exists";
-		}
-		macroFileStamp = neko.FileSystem.stat(path).mtime.getTime();
-		registerMacros(neko.io.File.getContent(path));
-	}
-
-	public static function registerMacros( src:String ){
-		src = StringTools.replace(src, "\r\n", "\n");
-		src = StringTools.replace(src, "\r", "\n");
-		var rFind = ~/<macro\s+name=['"](.*?)['"]\s*?>([^\0]*?)<\/macro>/g; //"
-		while (rFind.match(src)){
-			var pos = rFind.matchedPos();
-			var name = rFind.matched(1);
-			var content = rFind.matched(2);
-			var macro = new mtwin.templo.Macro(name, content);
-			mtwin.templo.Preprocessor.macros.set( macro.name, macro );
-			var end = pos.pos + pos.len;
-			src = src.substr(end, src.length - end);
-		}
-	}
-
-	static function quote( str:String ) : String {
-		return str.split("&").join("&amp;").split("\"").join("&quot;");
-	}
-
-	static function escapeCdata1( str:String ) : String {
-		var res = str;
-		while (r_cdata.match(res)){
-			var pos   = r_cdata.matchedPos();
-			var cdata = r_cdata.matched(1);
-			cdata = cdata.split("&").join("&amp;").split("<").join("&lt;").split(">").join("&gt;");
-			res = res.substr(0, pos.pos) + "<![CDATAX[" + cdata + "]]>" + res.substr(pos.pos+pos.len, res.length-(pos.pos+pos.len));
-		}
-		return res;
-	}
-
-	static function escapeComments( str:String ) : String {
-		var res = str;
-		while (r_comment.match(res)){
-			var pos = r_comment.matchedPos();
-			var comment = r_comment.matched(1);
-			comment = comment.split("&").join("&amp;").split("<").join("&lt;").split(">").join("&gt;");
-			res = res.substr(0, pos.pos) + "<![COMMENT[" + comment + "]]C>" + res.substr(pos.pos+pos.len, res.length-(pos.pos+pos.len));
-		}
-		return res;
-	}
-
-	static function unescapeCdata1( str:String ) : String {
-		var res = str.split("<![CDATAX[").join("<![CDATA["); //.split("]]>").join("]]>");
-		res = escapeCdata1(res);
-		res = res.split("<![CDATAX[").join("<![CDATA["); // .split("]]>").join("]]>");
-		res = res.split("<![COMMENT[").join("<!--").split("]]C>").join("-->");
-		return res;
-	}
-
-	static function escapePrints( str:String ) : String {
-		var buf = new StringBuf();
-		while (r_print.match(str)){
-			var pos = r_print.matchedPos();
-			buf.add(str.substr(0,pos.pos));
-			buf.add(StringTools.htmlEscape(r_print.matched(0)));
-			str = str.substr(pos.pos+pos.len, str.length);
-		}
-		buf.add(str);
-		return buf.toString();
-	}
-}

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

@@ -1,181 +0,0 @@
-/*
- * Copyright (c) 2006, Motion-Twin
- * All rights reserved.
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- *   - Redistributions of source code must retain the above copyright
- *     notice, this list of conditions and the following disclaimer.
- *   - Redistributions in binary form must reproduce the above copyright
- *     notice, this list of conditions and the following disclaimer in the
- *     documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY MOTION-TWIN "AS IS" AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL THE HAXE PROJECT CONTRIBUTORS BE LIABLE FOR
- * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
- * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
- * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
- * DAMAGE.
- */
-
-package mtwin.templo;
-import haxe.Md5;
-
-class Template {
-
-	static var VERSION = "0.9.0";
-
-	public static var compiledFiles : Hash<Bool> = new Hash();
-	public var execute : Dynamic -> String;
-
-	public function new( file:String ){
-		execute = if (Loader.OPTIMIZED) loadTemplate(nekoBin(file)) else fromFile(file);
-	}
-
-	static function nekoId( path:String ) : String {
-		var rpath = path;
-		var temp = path;
-		if (temp.charAt(0) == "/") temp = temp.substr(1, temp.length-1);
-		temp = StringTools.replace(temp, "/", "__");
-		temp = StringTools.replace(temp, "\\", "__");
-		temp = StringTools.replace(temp, ":", "__");
-		temp = StringTools.replace(temp, "____", "__");
-		return temp;
-	}
-
-	static function nekoBin( path:String ) : String {
-		return Loader.TMP_DIR + nekoId(path) + ".n";
-	}
-
-	static function nekoSrc( path:String ) : String {
-		return Loader.TMP_DIR + nekoId(path) + ".neko";
-	}
-
-	public static function fromFile( path:String ) : Dynamic -> String {
-		if (Loader.OPTIMIZED)
-			return loadTemplate(nekoBin(path));
-		if (Loader.MACROS != null && mtwin.templo.Preprocessor.macroFileStamp == null)
-			mtwin.templo.Preprocessor.registerMacroFile(Loader.BASE_DIR+Loader.MACROS);
-		var binPath = nekoBin(path);
-		if (neko.FileSystem.exists(binPath)){
-			var macroStamp  = mtwin.templo.Preprocessor.macroFileStamp;
-			var sourceStamp = neko.FileSystem.stat(Loader.BASE_DIR+"/"+path).mtime.getTime();
-			var stamp       = neko.FileSystem.stat(binPath).mtime.getTime();
-			if ((stamp >= sourceStamp) && (macroStamp == null || macroStamp < stamp)){
-				return loadTemplate(binPath);
-			}
-		}
-		compiledFiles.set(path,true);
-		var content = neko.io.File.getContent(Loader.BASE_DIR+"/"+path);
-		var isXhtml = StringTools.endsWith(path, ".mtt") || StringTools.endsWith(path,".html") || StringTools.endsWith(path,".tpl");
-		return fromString(content, nekoId(path), isXhtml);
-	}
-
-	public static function fromString( src:String, ?id:String, ?isXhtml:Bool ) : Dynamic -> String {
-		if (id == null){
-			id = Md5.encode(src);
-		}
-
-		// remove BOM
-		if (StringTools.startsWith(src, "\xEF\xBB\xBF"))
-			src = src.substr(3);
-
-		src = StringTools.replace(src, "\r\n", "\n");
-		src = StringTools.replace(src, "\r", "\n");
-
-		src = mtwin.templo.Preprocessor.process(src);
-
-		var path = nekoSrc(id);
-		var x = null;
-		try {
-			x = Xml.parse(src);
-		}
-		catch (e:Dynamic){
-			var source : String = src;
-			var str = Std.string(e);
-			var reg = ~/Xml parse error : .* at line ([0-9]+)/gs;
-			if (reg.match(str)){
-				var margin = 10;
-				var line = Std.parseInt(reg.matched(1));
-				var lines = src.split("\n");
-				var start = Std.int(Math.max(0,line-margin));
-				var splice = lines.splice(start, line+margin);
-				var splice = Lambda.map(splice, function(s:String){ return (start++) + " : " + s; });
-				source = splice.join("\n");
-			}
-			throw { message:"Error in "+id+"\n"+str, source:source };
-		}
-
-		var p = new mtwin.templo.Parser(isXhtml == true);
-		var s = p.parse(x);
-
-		s = "// generated from " + id + "\n// temploc v"+mtwin.templo.Template.VERSION+"\n" + s;
-
-		var f = neko.io.File.write(path, false);
-		f.writeString(s);
-		f.close();
-
-		var r = null;
-		if ((neko.Sys.systemName()=="Windows")&&(neko.Sys.getEnv("OS")!="Windows_NT")){
-		    // Neither Windows 95 or Windows 98 support the 2> redirect
-		    r = neko.Sys.command("nekoc -o \""+Loader.TMP_DIR+"\" \""+path+"\" > \""+Loader.TMP_DIR+"nekoc.out\"");
-		}
-		else {
-		    r = neko.Sys.command("nekoc -o \""+Loader.TMP_DIR+"\" \""+path+"\" 2> \""+Loader.TMP_DIR+"nekoc.out\"");
-		}
-		if (r != 0){
-			if (neko.FileSystem.exists(Loader.TMP_DIR+"nekoc.out")){
-				throw "nekoc compilation of "+path+" failed ("+r+") : "+neko.io.File.getContent(Loader.TMP_DIR+"nekoc.out");
-			}
-			else {
-				throw "nekoc compilation of "+path+" failed ("+r+") -- no nekoc.out available";
-			}
-		}
-
-		return loadTemplate(nekoBin(id));
-	}
-
-	static function loadTemplate( nPath:String ) : Dynamic -> String {
-		return untyped {
-			var loader = __dollar__loader;
-			var oldCache = loader.cache;
-			loader.cache = __dollar__new(oldCache);
-			loader.String = String;
-			loader.Array = Array;
-			loader.iter = function(loop : Dynamic, fnc){
-				if (loop == null){
-					throw "repeat or foreach called on null value";
-				}
-				if (loop.iterator != null){
-					var it : Iterable<Dynamic> = loop;
-					for (v in it.iterator()) fnc(v);
-				}
-				else if (loop.hasNext != null && loop.next != null){
-					var it : Iterator<Dynamic> = loop;
-					for (v in it) fnc(v);
-				}
-				else {
-					throw "repeat or foreach called on non iterable object";
-				}
-			};
-			var code = loader.loadmodule(nPath.__s, loader);
-			loader.cache = oldCache;
-			function(context){
-				var wrapCache = loader.cache;
-				loader.cache = __dollar__new(wrapCache);
-				var macro = function(path){
-					mtwin.templo.Template.fromFile(new String(path));
-					return loader.loadmodule(mtwin.templo.Template.nekoBin(new String(path)).__s, loader);
-				}
-				var result = new String(code.template(macro, context));
-				loader.cache = wrapCache;
-				return result;
-			}
-		}
-	}
-}

+ 0 - 3
std/mtwin/templo/temploc.hxml

@@ -1,3 +0,0 @@
--main mtwin.templo.Main
--neko temploc.n
--cmd nekotools boot temploc.n

+ 0 - 417
std/mtwin/text/Diff.hx

@@ -1,417 +0,0 @@
-/*
- * Copyright (c) 2006, Motion-Twin
- * All rights reserved.
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- *   - Redistributions of source code must retain the above copyright
- *     notice, this list of conditions and the following disclaimer.
- *   - Redistributions in binary form must reproduce the above copyright
- *     notice, this list of conditions and the following disclaimer in the
- *     documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY MOTION-TWIN "AS IS" AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL THE HAXE PROJECT CONTRIBUTORS BE LIABLE FOR
- * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
- * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
- * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
- * DAMAGE.
- */
-
-package mtwin.text;
-
-typedef LcsMatrix = Array<Array<Int>>
-
-/**
-	An haxe implementation of Diff/Patch/Unpatch.
-
-	The diff text format is the same as the gnu diff utility format.
-
-	Usage: [
-	var myDiff = Diff.diff(sourceString, modifiedString);
-	var modified = Diff.patch(sourceString, myDiff); // modified == modifiedString
-	var origin = Diff.unpatch(modified, myDiff); // origin == sourceString
-	]
-
-**/
-class Diff {
-
-	static var END = 0;
-	static var DOWN = 1;
-	static var RIGHT = 2;
-	static var DOWN_RIGHT = 3;
-	static var NO_NEW_LINE = "\n\\ No newline at end of file\n";
-
-	/**
-		This class uses a longest common subsequence algorithm which computes the distance between
-		two array of strings and creates an optimal modification cursor.
-
-		The cursor is stored in a int matrix and starts at index 0:0.
-
-		The matrix is filled of [END], [DOWN], [DOWN_RIGHT], [RIGHT] movements.
-
-		[DOWN] => the src line must be removed
-		[DOWN_RIGHT] => lines are equals, no operation required
-		[RIGHT] => the dst line must be inserted
-		[END] => end of files reached, if END is reached before [m,n], some lines must be removed or inserted
-	**/
-	static function longestCommonSubsequence( src:Array<String>, dst:Array<String> ) : LcsMatrix {
-		var m = src.length;
-		var n = dst.length;
-		var cursor = new Array();
-		var c = new Array();
-		for (i in 0...m+1) {
-			cursor[i] = new Array();
-			cursor[i][n] = 0;
-			c[i] = new Array();
-			c[i][n] = 0;
-		}
-		for (j in 0...n+1) {
-			cursor[m][j] = 0;
-			c[m][j] = 0;
-		}
-		var i = m-1;
-		while (i >= 0){
-			var j = n-1;
-			while (j >= 0){
-				if (src[i] == dst[j]){
-					c[i][j] = c[i+1][j+1]+1;
-					cursor[i][j] = DOWN_RIGHT;
-				}
-				else if (c[i+1][j] >= c[i][j+1]){
-					c[i][j] = c[i+1][j];
-					cursor[i][j] = DOWN;
-				}
-				else {
-					c[i][j] = c[i][j+1];
-					cursor[i][j] = RIGHT;
-				}
-				j--;
-			}
-			i--;
-		}
-		return  cursor;
-	}
-
-	/**
-		Returns an optimized cursor.
-
-		Compacts the cursor and transform it from a sequential operation cursor into a vector of operations.
-	**/
-	static function lcsToStack( c:LcsMatrix ) : List<Array<Int>> {
-		var stack = new List();
-		var i = 0;
-		var w = c.length-1;
-		var j = 0;
-		var h = c[0].length-1;
-		var prev = -1;
-		while (true){
-			// direction changes, store this position
-			if (c[i][j] != prev)
-				stack.add([i,j]);
-			prev = c[i][j];
-			switch (c[i][j]){
-				case DOWN: i++;
-				case RIGHT: j++;
-				case DOWN_RIGHT: i++; j++;
-				case END: break;
-				default: throw "Unknown "+c[i][j]+" at "+i+":"+j; i=0; j=0;
-			}
-		}
-		return stack;
-	}
-
-	static function split( txt:String ){
-		var res = new Array();
-		var old = 0;
-		var pos = txt.indexOf("\n", 0);
-		while (pos != -1){
-			res.push(txt.substr(old, pos+1-old));
-			old = pos+1;
-			pos = txt.indexOf("\n", old);
-		}
-		res.push(txt.substr(old, txt.length));
-		return res;
-	}
-
-	/**
-		Returns the difference between two strings.
-
-		The returned string may be used by the gnu diff/patch utilities.
-	**/
-	public static function diff( source:String, dest:String ) : String {
-		var srcNoNewLine = false;
-		var dstNoNewLine = false;
-
-		var sourceLines = split(source); // source.split("\n");
-		if (sourceLines[sourceLines.length-1].length > 0){
-			// no newline at end of file
-			sourceLines.push("");
-			srcNoNewLine = true;
-		}
-
-		var destLines = split(dest); // dest.split("\n");
-		if (destLines[destLines.length-1].length > 0){
-			// no newline at end of file
-			destLines.push("");
-			dstNoNewLine = true;
-		}
-
-		var m = sourceLines.length;
-		var n = destLines.length;
-
-		var lcs = longestCommonSubsequence(sourceLines, destLines);
-		var stack = lcsToStack(lcs);
-
-		var cursorKind = function(p){
-			return lcs[p[0]][p[1]];
-		}
-
-		var operationAdd = function(after:Int, from:Int, to:Int){
-			var op = new StringBuf();
-			op.add(after);
-			op.add("a");
-			if (from == to) op.add(from) else { op.add(from); op.add(","); op.add(to); }
-			op.add("\n");
-			for (i in (from-1)...to){
-				op.add("> ");
-				op.add(destLines[i]);
-				if (dstNoNewLine && i == (destLines.length-2)){
-					op.add(NO_NEW_LINE);
-					break;
-				}
-			}
-			return op.toString();
-		}
-
-		var operationDel = function(from:Int, to:Int, dest:Int){
-			var op = new StringBuf();
-			if (from == to) op.add(from) else { op.add(from); op.add(","); op.add(to); }
-			op.add("d"); op.add(dest); op.add("\n");
-			for (i in (from-1)...to){
-				op.add("< ");
-				op.add(sourceLines[i]);
-				if (srcNoNewLine && i == sourceLines.length-2){
-					op.add(NO_NEW_LINE);
-					break;
-				}
-			}
-			return op.toString();
-		}
-
-		var operationUpd = function(from:Int, to:Int, byFrom:Int, byTo:Int){
-			var op = new StringBuf();
-			if (from == to) op.add(from) else { op.add(from); op.add(","); op.add(to); }
-			op.add("c");
-			if (byFrom == byTo) op.add(byFrom) else { op.add(byFrom); op.add(","); op.add(byTo); }
-			op.add("\n");
-			for (i in (from-1)...to){
-				op.add("< ");
-				op.add(sourceLines[i]);
-				if (srcNoNewLine && i == sourceLines.length-2){
-					op.add(NO_NEW_LINE);
-					break;
-				}
-			}
-			op.add("---\n");
-			for (i in (byFrom-1)...byTo){
-				op.add("> ");
-				op.add(destLines[i]);
-				if (dstNoNewLine && i == destLines.length-2){
-					op.add(NO_NEW_LINE);
-					break;
-				}
-			}
-			return op.toString();
-		}
-
-		var result = new StringBuf();
-		while (stack.length > 0){
-			var pos = stack.pop();
-			switch (cursorKind(pos)){
-				case DOWN_RIGHT:
-
-				case DOWN:
-					var end = stack.pop();
-					if (cursorKind(end) == RIGHT){
-						var del = stack.pop(); stack.push(del);
-						result.add(operationUpd(pos[0]+1, end[0], pos[1]+1, del[1]));
-					}
-					else {
-						stack.push(end);
-						result.add(operationDel(pos[0]+1, end[0], end[1]));
-					}
-
-				case RIGHT:
-					var end = stack.pop(); stack.push(end);
-					//result.add(operationAdd(pos[0], end[1], pos[1]+1));
-					result.add(operationAdd(pos[0], pos[1]+1, end[1]));
-
-				case END:
-					if (pos[0] < m){
-						result.add(operationDel(pos[0], m-1, n-1));
-					}
-					if (pos[1] < n){
-						result.add(operationAdd(m-1, pos[1], n-1));
-					}
-			}
-		}
-		return result.toString();
-	}
-
-	/**
-		Creates a patch operation structure.
-	**/
-	static function parsePatchOp( left:String, op:String, right:String ): {op:String, left:Array<Int>, right:Array<Int>, data:Array<String>}{
-		var l = Lambda.array(Lambda.map(left.split(","), function(v){ return Std.parseInt(v); }));
-		if (l.length == 1) l.push(l[0]);
-		var r = Lambda.array(Lambda.map(right.split(","), function(v){ return Std.parseInt(v); }));
-		if (r.length == 1) r.push(r[0]);
-		return { op:op, left:l, right:r, data:[] };
-	}
-
-	/**
-		Returns the patched string resulting of the application of the patch data on src.
-	**/
-	public static function patch( src:String, patch:String ) : String {
-		var opRegexp = ~/^([0-9,]+)([adc])([0-9,]+)$/;
-		var lines = src.split("\n");
-		var counter = 0;
-		var result = new StringBuf();
-		var patchLines = patch.split("\n");
-		while (patchLines.length > 0){
-			var patchLine = patchLines.shift();
-			if (opRegexp.match(patchLine)){
-				var op = parsePatchOp(opRegexp.matched(1), opRegexp.matched(2), opRegexp.matched(3));
-				var tmp = patchLines.shift();
-				while (tmp != "" && tmp != null && !opRegexp.match(tmp)){
-					op.data.push(tmp);
-					tmp = patchLines.shift();
-				}
-				if (tmp != null){
-					patchLines.unshift(tmp);
-				}
-				switch (op.op){
-					case "a":
-						while (counter < op.left[0]){
-							result.add(lines[counter]); result.add("\n");
-							counter++;
-						}
-						for (i in 0...op.data.length){
-							var line = op.data[i];
-							if (line.substr(0,2) == "> "){
-								result.add(line.substr(2, line.length));
-								if (i == op.data.length-1 || op.data[i+1].substr(0,2) != "\\ ") result.add("\n");
-							}
-						}
-
-					case "d":
-						while (counter < op.left[0]-1){
-							result.add(lines[counter]); result.add("\n");
-							counter++;
-						}
-						counter = op.left[1];
-
-					case "c":
-						while (counter < op.left[0]-1){
-							result.add(lines[counter]); result.add("\n");
-							counter++;
-						}
-						for (i in 0...op.data.length){
-							var line = op.data[i];
-							if (line.substr(0,2) == "> "){
-								result.add(line.substr(2, line.length));
-								if (i == op.data.length-1 || op.data[i+1].substr(0,2) != "\\ ") result.add("\n");
-							}
-						}
-						counter = op.left[1];
-				}
-			}
-		}
-		for (i in counter...lines.length-1){
-			result.add(lines[i]); result.add("\n");
-		}
-		return result.toString();
-	}
-
-	/**
-		Returns the unpatched string resulting of the cancelation of the patch applied to src.
-	**/
-	public static function unpatch( src:String, patch:String ){
-		var opRegexp = ~/^([0-9,]+)([adc])([0-9,]+)$/;
-		var lines = src.split("\n");
-		var counter = 0;
-		var result = new StringBuf();
-		var patchLines = patch.split("\n");
-		while (patchLines.length > 0){
-			var patchLine = patchLines.shift();
-			if (opRegexp.match(patchLine)){
-				var op = parsePatchOp(opRegexp.matched(1), opRegexp.matched(2), opRegexp.matched(3));
-				var tmp = patchLines.shift();
-				while (tmp != "" && tmp != null && !opRegexp.match(tmp)){
-					op.data.push(tmp);
-					tmp = patchLines.shift();
-				}
-				if (tmp != null){
-					patchLines.unshift(tmp);
-				}
-				switch (op.op){
-					case "a": // unpatch => delete
-						while (counter < op.right[0]-1){
-							result.add(lines[counter]); result.add("\n");
-							counter++;
-						}
-						counter = op.right[1];
-
-					case "d": // unpatch => add
-						while (counter < op.right[0]){
-							result.add(lines[counter]); result.add("\n");
-							counter++;
-						}
-						for (i in 0...op.data.length){
-							var line = op.data[i];
-							if (line.substr(0,2) == "< "){
-								result.add(line.substr(2, line.length));
-								if (i == op.data.length-1 || op.data[i+1].substr(0,2) != "\\ ") result.add("\n");
-							}
-						}
-
-					case "c": // unpatch => change reverse
-						while (counter < op.right[0]-1){
-							result.add(lines[counter]); result.add("\n");
-							counter++;
-						}
-						for (i in 0...op.data.length){
-							var line = op.data[i];
-							if (line.substr(0,2) == "< "){
-								result.add(line.substr(2, line.length));
-								if (i == op.data.length-1 || op.data[i+1].substr(0,2) != "\\ ") result.add("\n");
-							}
-						}
-						counter = op.right[1];
-				}
-			}
-		}
-		for (i in counter...lines.length-1){
-			result.add(lines[i]); result.add("\n");
-		}
-		return result.toString();
-	}
-
-	public static function main(){
-		var src = neko.io.File.getContent("src.txt");
-		var dst = neko.io.File.getContent("dst.txt");
-		var diff = diff(src,dst);
-		neko.Lib.print(diff);
-		var patched = patch(src, diff);
-		if (patched != dst) throw "Patch failed";
-		var unpatched = unpatch(patched, diff);
-		if (unpatched != src) throw "Unpatch failed";
-		neko.Lib.print("diff/patch/unpatch success");
-	}
-}

+ 0 - 406
std/mtwin/text/Text2Xhtml.hx

@@ -1,406 +0,0 @@
-/*
- * Copyright (c) 2006, Motion-Twin
- * All rights reserved.
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- *   - Redistributions of source code must retain the above copyright
- *     notice, this list of conditions and the following disclaimer.
- *   - Redistributions in binary form must reproduce the above copyright
- *     notice, this list of conditions and the following disclaimer in the
- *     documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY MOTION-TWIN "AS IS" AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL THE HAXE PROJECT CONTRIBUTORS BE LIABLE FOR
- * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
- * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
- * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
- * DAMAGE.
- */
-
-package mtwin.text;
-import haxe.Md5;
-
-/**
-	Transform a plain text document into an XHTML document.
-
-	[h1 : at least 4 * after the title]
-	[****]
-
-	or
-
-	[*** h1 : line starts with 3 *]
-
-	[h2 : at least 4 = after the title]
-	[====]
-
-	or
-
-	[=== h2 : line starts with 3 =]
-
-	[h3 : at least 4 - after the title]
-	[----]
-
-	or
-
-	[--- h3 : line starts with 3 -]
-
-
-	You may specify titles' ids using #myid# before your title text :
-
-	--- #anchorhere# my title
-
-	#anchorhere# my title
-	----
-
-	[
-	- list item 1
-	- list item 2
-	- no sub level at this time
-	]
-
-	[
-	* * ordered item 1
-	* * ordered item 2
-	* * no sub level at this time
-	]
-
-	[[pre]some preformatted code[/pre]]
-
-	[Will generate a link : http://www.google.com.]
-
-	[Will generate an internal link [link some name : /foo/bar/baz] with a name.]
-
-    Will generate a link with a name [link some name : http://example.com/foo/bar/baz] too.
-
-	Please notice that spaces around central ":" are required !
-
-	Some [//emphased text//] and some [**strong text**].
-
-	An [abbr title : Abbreviation].
-
-	Now insert an image : [@img http://www.foo.com/foo.jpg@]
-
-	Inserting a Swf is easy : [@swf WxHxV http://path/to/my/swf.swf@] where W means width, H means Height and V means flash Version,
-	this feature uses the SWFObject javascript class to display the specified swf.
-
-	[[html]
-	<p>This is some raw html you may like to insert manually to add some specific data like
-	javascript or other stuff.</p>
-	<p>Raw html may produce parse exceptions thrown by the Text2Xhtml.transform(src) method.</p>
-[/html]]
-
-	You can also insert [[cite]some citations[/cite]] !
-
-	That's almost everything for now :)
-
-	Ah i almost forgot the haxe colorizer :
-
-	[[haxe]
-class Foo {
-	// some comment
-	public function new(){
-	}
-
-	// ...
-
-	public static function foo(){
-	}
-}
-[/haxe]]
-
-**/
-class Text2Xhtml {
-
-	static var rh1 = ~/^\*\*\*\s+(.*?)$/gm;
-	static var rh1e = ~/^(.*?)\n\*{4,}\s*?\n/gm;
-	static var rh2 = ~/^===\s+(.*?)$/gm;
-	static var rh2e = ~/^(.*?)\n={4,}\s*?\n/gm;
-	static var rh3 = ~/^\-\-\-\s+(.*?)$/gm;
-	static var rh3e = ~/^(.*?)\n-{4,}\s*?\n/gm;
-	static var pre = ~/^\[pre\](.*?)\[\/pre\]/gsm;
-	static var em = ~/(?<!http:)\/\/(.*?)(?<!http:)\/\//gsm;
-	static var strong = ~/\*\*(.*?)\*\*/gm;
-	static var link = ~/\[link (.*?) : (.*?)\]/g;
-	static var abbr = ~/\[abbr (.*?) : (.*?)\]/g;
-	static var http = ~/(?<!")(http|https|ftp):\/\/(.*?)(\s|\.\s|$)/g; //"
-	static var img = ~/@img (.*?)@/g;
-	static var li = ~/\n\n(- (.*?))+\n\n/gsm;
-	static var olli = ~/\n\n(\* (.*?))+\n\n/gsm;
-	static var cite = ~/\[cite\](.*?)\[\/cite\]/gsm;
-	static var html = ~/\[html\](.*?)\[\/html\]/gsm;
-	static var haxe = ~/\[haxe\](.*?)\[\/haxe\]/gsm;
-	static var swf = ~/@swf ([0-9]+)x([0-9]+)x([0-9]+) (.*?)@/g;
-
-	public var paragraphSeparator : String;
-	public var htmlEnabled : Bool;
-	public var codeEnabled : Bool;
-	public var swfEnabled : Bool;
-	public var titleIdsEnabled : Bool;
-	public var brEnabled : Bool;
-	public var imgEnabled : Bool;
-
-	public function new(){
-		paragraphSeparator = "\n\n";
-		htmlEnabled = true;
-		codeEnabled = true;
-		swfEnabled = true;
-		titleIdsEnabled = true;
-		brEnabled = false;
-		imgEnabled = true;
-	}
-
-	public function doTransform( str:String ) : String {
-		str = StringTools.replace(str, "\r\n", "\n");
-		str = StringTools.replace(str, "\r", "\n");
-		str = StringTools.htmlEscape(str);
-		while (!StringTools.endsWith(str, "\n\n"))
-			str += "\n";
-		while (!StringTools.startsWith(str, "\n\n"))
-			str = "\n"+str;
-
-		var helper = new StringHelper(str);
-		var extractedPre = helper.extract("pre", pre, "<pre>$1</pre>");
-		var extractedHtml = if (htmlEnabled) helper.extract("html", html, "$1") else new List();
-		extractedHtml = extractedHtml.map(function(data:String){ return StringTools.htmlUnescape(data); });
-		var extractedHaxe = if (codeEnabled) helper.extract("haxe", haxe, "$1") else new List();
-		extractedHaxe = extractedHaxe.map(function(data:String){ return "<pre class=\"code haxe\">" + HaxeColorizer.colorize(data) + "</pre>"; });
-		var swfs = if (swfEnabled) helper.extract("swf", swf, "$1@$2@$3@$4") else new List();
-		swfs = swfs.map(swfProcess);
-
-		str = helper.str;
-		str = rh1.replace(str, "<h1>$1</h1>");
-		str = rh1e.replace(str, "<h1>$1</h1>\n");
-		str = rh2.replace(str, "<h2>$1</h2>");
-		str = rh2e.replace(str, "<h2>$1</h2>\n");
-		str = rh3.replace(str, "<h3>$1</h3>");
-		str = rh3e.replace(str, "<h3>$1</h3>\n");
-
-		if (titleIdsEnabled){
-			str = (~/<h1>#(.*?)# (.*?)<\/h1>/g).replace(str, "<h1 id=\"$1\">$2</h1>\n");
-			str = (~/<h2>#(.*?)# (.*?)<\/h2>/g).replace(str, "<h2 id=\"$1\">$2</h2>\n");
-			str = (~/<h3>#(.*?)# (.*?)<\/h3>/g).replace(str, "<h3 id=\"$1\">$2</h3>\n");
-		}
-
-		while (olli.match(str)){
-			var list = olli.matched(0);
-			var result = new StringBuf();
-			result.add("\n<ol>\n");
-			var items = list.split("\n* ");
-			for (i in 1...items.length){
-				var content = StringTools.trim(items[i]);
-				if (brEnabled)
-					content = StringTools.replace(content, "\n", "<br/>");
-				result.add("<li>"+content+"</li>\n");
-			}
-			result.add("</ol>\n");
-			str = StringTools.replace(str, list, result.toString());
-		}
-
-		while (li.match(str)){
-			var list = li.matched(0);
-			var result = new StringBuf();
-			result.add("\n<ul>\n");
-			var items = list.split("\n- ");
-			for (i in 1...items.length){
-				var content = StringTools.trim(items[i]);
-				if (brEnabled)
-					content = StringTools.replace(content, "\n", "<br/>");
-				result.add("<li>"+content+"</li>\n");
-			}
-			result.add("</ul>\n");
-			str = StringTools.replace(str, list, result.toString());
-		}
-
-		var xml = Xml.parse(str);
-		transformXml(xml);
-		str = xml.toString();
-
-		str = StringTools.replace(str, "\n\n", "\n");
-		str = StringTools.replace(str, "\n\n", "\n");
-
-		helper = new StringHelper(str);
-		helper.restore("pre", extractedPre);
-		helper.restore("html", extractedHtml);
-		helper.restore("haxe", extractedHaxe);
-		helper.restore("swf", swfs);
-		str = helper.str;
-
-		// cleanup
-		str = StringTools.replace(str, "<p><br/>", "<p>");
-		str = StringTools.replace(str, "<br/></p>", "</p>");
-		str = StringTools.replace(str, "<p></p>", "");
-		str = StringTools.replace(str, "><p>", ">\n<p>");
-
-		// XML validation
-		try {
-			xml = Xml.parse(str);
-		}
-		catch (e:Dynamic){
-			throw {error:Std.string(e), xml:str};
-		}
-
-		return str;
-	}
-
-	public static function transform( str:String ) : String {
-		var transformer = new Text2Xhtml();
-		return transformer.doTransform(str);
-	}
-
-	static function swfProcess(data:String){
-		var s = Lambda.array(data.split("@"));
-		var id = Md5.encode(s[3]); // url
-		var str = "<div id=\"swf@id\"></div>
-<script type=\"text/javascript\">
-//<![CDATA[
-var s = new SWFObject('@url', 's@id', '@w', '@h', '@v', '#FFFFFF', true);
-s.addParam('menu','false');
-s.write('swf@id');
-//]]>
-</script>
-";
-		str = StringTools.replace(str, "@id", id);
-		str = StringTools.replace(str, "@url", s[3]);
-		str = StringTools.replace(str, "@v", s[2]);
-		str = StringTools.replace(str, "@w", s[0]);
-		str = StringTools.replace(str, "@h", s[1]);
-		return str;
-	}
-
-	function transformXml( xml:Xml, ?noParagraph:Bool ) {
-		if (xml.nodeType != Xml.Element && xml.nodeType != Xml.Document){
-			var str = xml.nodeValue;
-			if (noParagraph == null || noParagraph == false){
-				var paragraphs = str.split(paragraphSeparator);
-				var me = this;
-				var paragraphs = Lambda.map(paragraphs, function(p){
-					if (me.brEnabled)
-						p = StringTools.replace(p, "\n", "<br/>");
-					return "<p>"+me.transformContent(StringTools.trim(p))+"</p>\n";
-				});
-				str = paragraphs.join("\n");
-			}
-			else {
-				str = transformContent(str);
-			}
-			xml.nodeValue = str;
-			return;
-		}
-		if (xml.nodeType == Xml.Element && (xml.nodeName == "pre" || xml.nodeName == "t2x"))
-			return;
-		for (child in xml){
-			transformXml(child, (xml.nodeType == Xml.Element && contains(SELF_CONTAINING_ELEMENTS.iterator(), xml.nodeName)));
-		}
-	}
-
-	function transformContent( str:String ) : String {
-		var helper = new StringHelper(str);
-		var abbrs = helper.extract("abbr", abbr, "<abbr title=\"$2\">$1</abbr>");
-		var links = helper.extract("link", link, "<a href=\"$2\">$1</a>");
-		var images = if (imgEnabled) helper.extract("img", img, "<img src=\"$1\" alt=\"Image\"/>") else null;
-		var https = helper.extract("http", http, "<a href=\"$1://$2\">$1://$2</a>$3");
-		str = helper.str;
-
-		str = StringTools.replace(str, " !", "&nbsp;!");
-		str = StringTools.replace(str, " :", "&nbsp;:");
-		str = StringTools.replace(str, " ?", "&nbsp;?");
-
-		var pos = 0;
-		var token = findFirst(str, [em, strong, cite]);
-		while (token != null){
-			var repl = switch (token.reg){
-				case strong: "<strong>" + transformContent(token.reg.matched(1)) + "</strong>";
-				case em: "<em>" + transformContent(token.reg.matched(1)) + "</em>";
-				case cite: "<cite>" + transformContent(token.reg.matched(1)) + "</cite>";
-			}
-			var end = pos + token.pos.pos + token.pos.len;
-			str = str.substr(0, pos+token.pos.pos) + repl + str.substr(end, str.length-end);
-			pos = pos + repl.length;
-			token = findFirst(str.substr(pos, str.length-pos), [em,strong]);
-		}
-
-		helper = new StringHelper(str);
-		helper.restore("abbr", abbrs);
-		helper.restore("link", links);
-		if (imgEnabled)
-			helper.restore("img", images);
-		helper.restore("http", https);
-		return helper.str;
-	}
-
-	static function findFirst( str:String, regs:Array<EReg> ) : {reg:EReg, pos:{pos:Int, len:Int}} {
-		var min : {reg:EReg, pos:{pos:Int, len:Int}} = {reg:null, pos:null};
-		for (reg in regs){
-			if (reg.match(str)){
-				var pos : {pos:Int, len:Int} = reg.matchedPos();
-				if (min.pos == null || pos.pos < min.pos.pos){
-					min = {reg:reg, pos:pos};
-				}
-			}
-		}
-		if (min.pos == null)
-			return null;
-		return min;
-	}
-
-	static function contains( i:Iterator<Dynamic>, v:Dynamic ){
-		for (x in i)
-			if (x == v) return true;
-		return false;
-	}
-
-	static var SELF_CONTAINING_ELEMENTS = ["pre","h1","h2","h3","h4","ul","li","cite"];
-}
-
-class StringHelper {
-
-	public var str : String;
-
-	public function new( s:String ){
-		str = s;
-	}
-
-	public function extract( key:String, reg:EReg, replace:String ) : List<String> {
-		var result = new List();
-		while (reg.match(str)){
-			var matched = reg.matched(0);
-			result.push(reg.replace(matched, replace));
-			str = StringTools.replace(str, matched, "<t2x>"+key+result.length+"</t2x>");
-		}
-		return result;
-	}
-
-	public function restore( key:String, list:List<String> ){
-		var i = list.length;
-		for (item in list){
-			str = StringTools.replace(str, "<t2x>"+key+i+"</t2x>", item);
-			--i;
-		}
-	}
-}
-
-class HaxeColorizer {
-	static var lineComment = ~/(\/\/\s.*?)$/gm;
-	static var comment = ~/(\/\*.*?\*\/)/gsm;
-	static var string = ~/(?!<\\)(".*?(?!<\\)")/gsm;
-	static var keywords = ~/(^|\s|[^a-zA-Z_0-9])(var|function|static|private|public|class|extends|typedef|signature|throw|extern|enum|in|interface|untyped|cast|this|new|try|catch|default|case|switch|import|continue|break|for|do|while|if|else|return)(\s|[^a-zA-Z_0-9])/gsm;
-
-	public static function colorize( code:String ) : String {
-		var helper = new StringHelper(code);
-		var comments = helper.extract("comment", comment, "<span class=\"comment\">$1</span>");
-		var strings = helper.extract("string", string, "<span class=\"string\">$1</span>");
-		var lineComments = helper.extract("lc", lineComment, "<span class=\"comment\">$1</span>");
-		helper.str = keywords.replace(helper.str, "$1<span class=\"keyword\">$2</span>$3");
-		helper.restore("lc", lineComments);
-		helper.restore("string", strings);
-		helper.restore("comment", comments);
-		return helper.str;
-	}
-}
-

+ 0 - 225
std/mtwin/web/Handler.hx

@@ -1,225 +0,0 @@
-/*
- * Copyright (c) 2006, Motion-Twin
- * All rights reserved.
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- *   - Redistributions of source code must retain the above copyright
- *     notice, this list of conditions and the following disclaimer.
- *   - Redistributions in binary form must reproduce the above copyright
- *     notice, this list of conditions and the following disclaimer in the
- *     documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY MOTION-TWIN "AS IS" AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL THE HAXE PROJECT CONTRIBUTORS BE LIABLE FOR
- * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
- * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
- * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
- * DAMAGE.
- */
-
-package mtwin.web;
-
-import mtwin.web.Request;
-
-enum ActionError {
-	UnknownAction(name:String);
-	ObjectNotFound(id:Int);
-	ActionReservedToLoggedUsers;
-	ActionReservedToObjectOwner;
-	ActionReservedToAdministrators;
-	ActionReservedToModerators;
-	CallingObjectMethodWithoutId;
-}
-
-/**
-	Generic class to handle web actions.
-
-	Add to your .htaccess : [
-
-	<FilesMatch "^(actionName|actionName|...)$">
-	RewriteEngine On
-	RewriteRule (.*) /index.n
-	</FilesMatch>
-	]
-**/
-class Handler<T> {
-
-	public static var STATIC_DEFAULT = "default";
-	public static var OBJECT_DEFAULT = "objectDefault";
-
-	var ReadWrite : Bool;
-	var ReadOnly : Bool;
-
-	var actions : Hash<Void->Void>;
-	var objectId : Int;
-	var level : Int;
-	var request : mtwin.web.Request;
-
-	public function new(){
-		actions = new Hash();
-		ReadWrite = true;
-		ReadOnly = false;
-	}
-
-	function initialize() {
-	}
-
-	function getObjectId( part:String ) : Int {
-		if (~/^[0-9]+$/.match(part))
-			return Std.parseInt(part);
-		return null;
-	}
-
-	public function execute( request:Request, ?pathLevel:Int ){
-		if (pathLevel == null)
-			pathLevel = 0;
-
-		var part = request.getPathInfoPart(pathLevel);
-		this.objectId = getObjectId(part);
-		if( objectId != null ){
-			part = request.getPathInfoPart(++pathLevel);
-			if (part == "")
-				part = OBJECT_DEFAULT;
-		}
-
-		this.request = request;
-		this.level = pathLevel;
-
-		if (part == "")
-			part = STATIC_DEFAULT;
-
-		initialize();
-		if (actions.exists(part)){
-			actions.get(part)();
-			return;
-		}
-		throw UnknownAction(part);
-	}
-
-	// Methods to override when needed
-
-	function prepareTemplate( t:String ) : Void {
-		throw "not implemented";
-	}
-
-	function isLogged() : Bool {
-		throw "not implemented";
-		return false;
-	}
-
-	function isAdmin() : Bool {
-		throw "not implemented";
-		return false;
-	}
-
-	function isModerator() : Bool {
-		throw "not implemented";
-		return false;
-	}
-
-	function isOwner( o:T ) : Bool {
-		throw "not implemented";
-		return false;
-	}
-
-	function findObject( id : Int, lock:Bool ) : T {
-		throw "findObject(Int) not implemented";
-		return null;
-	}
-
-	// callback wrappers
-
-	function object( cb:T->Void, ?lock:Bool ) : Void->Void {
-		if (lock == null) lock = ReadWrite;
-		var me = this;
-		return function(){
-			if (me.objectId == null)
-				throw CallingObjectMethodWithoutId;
-			var obj = me.findObject(me.objectId, lock);
-			if (obj == null)
-				throw ObjectNotFound(me.objectId);
-			cb(obj);
-		}
-	}
-
-	function owner<K>( cb:T->K ) : T->K {
-		var me = this;
-		return function(u:T){
-			if (!me.isOwner(u))
-				throw ActionReservedToObjectOwner;
-			return cb(u);
-		}
-	}
-
-	function handler( h:Handler<Dynamic> ) : Void->Void {
-		var me = this;
-		return function(){
-			h.execute(me.request, me.level+1);
-		}
-	}
-
-	function objectHandler( cb : T -> Handler<Dynamic>, ?lock : Bool ) {
-		var me = this;
-		return object(function(u:T) {
-			me.handler(cb(u))();
-		},lock);
-	}
-
-
-	function instance<T>( h : T -> Void, get : Int -> Bool -> T, lock : Bool ) : Void -> Void {
-		var me = this;
-		return function() {
-			me.objectId = Std.parseInt(me.request.getPathInfoPart(me.level+1));
-			var inst = get(me.objectId,lock);
-			if( inst == null ) throw ObjectNotFound(me.objectId);
-			h(inst);
-		};
-	}
-
-	// action declarators
-
-	function free( n:String, ?t:String, ?cb:Void->Void ){
-		var me = this;
-		actions.set(n, function(){
-			me.run(t,cb);
-		});
-	}
-
-	function logged( n:String, ?t:String, ?cb:Void->Void ){
-		var me = this;
-		actions.set(n, function(){
-			if (!me.isLogged())
-				throw ActionReservedToLoggedUsers;
-			me.run(t,cb);
-		});
-	}
-
-	function admin( n:String, ?t:String, ?cb:Void->Void ){
-		var me = this;
-		actions.set(n, function(){
-			if (!me.isAdmin())
-				throw ActionReservedToAdministrators;
-			me.run(t,cb);
-		});
-	}
-
-	function moderator( n:String, ?t:String, ?cb:Void->Void ){
-		var me = this;
-		actions.set(n, function(){
-			if (!me.isModerator())
-				throw ActionReservedToModerators;
-			me.run(t,cb);
-		});
-	}
-
-	function run( ?t:String, ?cb:Void->Void ){
-		if (t != null) prepareTemplate(t);
-		if (cb != null) cb();
-	}
-}

+ 0 - 148
std/mtwin/web/Request.hx

@@ -1,148 +0,0 @@
-/*
- * Copyright (c) 2006, Motion-Twin
- * All rights reserved.
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- *   - Redistributions of source code must retain the above copyright
- *     notice, this list of conditions and the following disclaimer.
- *   - Redistributions in binary form must reproduce the above copyright
- *     notice, this list of conditions and the following disclaimer in the
- *     documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY MOTION-TWIN "AS IS" AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL THE HAXE PROJECT CONTRIBUTORS BE LIABLE FOR
- * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
- * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
- * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
- * DAMAGE.
- */
-
-package mtwin.web;
-import neko.Web;
-
-class Request {
-
-	var pathInfoParts  : Array<String>;
-	var params         : Hash<String>;
-
-	public function new( ?uri ) {
-		pathInfoParts = (uri == null ? neko.Web.getURI() : uri).split( "/" );
-		pathInfoParts.shift();
-		params = Web.getParams();
-	}
-
-	public function getPathInfoPart( level:Int ) : String {
-		if( pathInfoParts.length > level )
-			return pathInfoParts[ level ];
-		return "";
-	}
-
-	public function setParams( list : Hash<String> ) {
-		params = new Hash();
-		for( k in list.keys() ){
-			params.set( k, list.get(k) );
-		}
-	}
-
-	public function getParamsObject( ?keys : List<String> ) : Dynamic<String> {
-		var ret : Dynamic<String> = cast {};
-		if( keys == null )
-			for( k in params.keys() )
-				Reflect.setField( ret, k, params.get(k) );
-		else
-			for( k in keys )
-				Reflect.setField( ret, k, params.get(k) );
-		return ret;
-	}
-
-	public function set( key : String , value : String ) {
-		params.set(key,value);
-	}
-
-	public function get( key : String , ?or : String ) : String {
-		if( params.exists( key ) ) return params.get( key );
-		return or;
-	}
-
-	public function getInt( key : String, ?or : Int ) : Int {
-		if( params.exists(key) ){
-			var v = params.get(key);
-			if( v == "NULL" )
-				throw "DEPRECATED";
-			var i = Std.parseInt(v);
-			return (i == null) ? or : i;
-		}
-		return or;
-	}
-
-	public function getFloat( key : String, ?or : Float ) : Float {
-		if( params.exists(key) ){
-			var v = params.get(key);
-			if( v == "NULL" )
-				throw "DEPRECATED";
-			var f = Std.parseFloat(v);
-			return (f == null) ? or : f;
-		}
-		return or;
-	}
-
-	public function getBool( key:String ) : Bool {
-		var val = params.get(key);
-		return (val != null) && (val == "1" || val == "true");
-	}
-
-	public function getURI() : String {
-		return Web.getURI();
-	}
-
-	public function getReferer() : String {
-		return Web.getClientHeader("Referer");
-	}
-
-	static var REG_IP = ~/^\s*([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+)/;
-	public function getIP() : String{
-		var ip = Web.getClientIP();
-		var xf = Web.getClientHeader("X-Forwarded-For");
-		if( xf != null && REG_IP.match( xf ) ){
-			var fip = REG_IP.matched(1);
-			if( !~/^(127\.0\.0\.1|192\.168\..*|172\.16\..*|10\..*|224\..*|240\..*)$/.match(fip) )
-				ip = fip;
-		}
-		return ip;
-	}
-
-	public function getIPs() : List<String> {
-		var ret = new List();
-		ret.add(Web.getClientIP());
-		var xf = Web.getClientHeader("X-Forwarded-For");
-		if( xf != null ){
-			var a = xf.split(",");
-			for( ip in a ){
-				if( REG_IP.match( ip ) ){
-					var fip = REG_IP.matched(1);
-					if( !~/^(127\.0\.0\.1|192\.168\..*|172\.16\..*|10\..*|224\..*|240\..*)$/.match(fip) )
-						ret.add(fip);
-				}
-			}
-		}
-		return ret;
-	}
-
-	public function exists( key ) {
-		return params.exists( key );
-	}
-
-	public function toString() : String {
-		var lst = new List();
-		for (i in params.keys()){
-			lst.add("['"+i+"'] => '"+params.get(i)+"'");
-		}
-		return lst.join(",\n");
-	}
-}