changeset 1289:8d54bcc0b6d3

add css style parser
author Franklin Schmidt <fschmidt@gmail.com>
date Mon, 31 Dec 2018 20:59:08 -0700
parents 8432d20a2729
children fb802d8aba0b
files src/luan/modules/parsers/Css.java src/luan/modules/parsers/Html.java
diffstat 2 files changed, 72 insertions(+), 11 deletions(-) [+]
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/luan/modules/parsers/Css.java	Mon Dec 31 20:59:08 2018 -0700
@@ -0,0 +1,59 @@
+package luan.modules.parsers;
+
+import luan.LuanState;
+import luan.LuanTable;
+import luan.lib.parser.Parser;
+
+
+public final class Css {
+
+	public static LuanTable style(LuanState luan,String text) {
+		return new Css(luan,text).parseStyle();
+	}
+
+	private final LuanState luan;
+	private final Parser parser;
+
+	private Css(LuanState luan,String text) {
+		this.luan = luan;
+		this.parser = new Parser(text);
+	}
+
+	private LuanTable parseStyle() {
+		LuanTable tbl = new LuanTable(luan);
+		while( matchSpace() );
+		while( !parser.endOfInput() ) {
+			int start = parser.currentIndex();
+			if( !matchPropertyChar() )
+				return null;
+			while( matchPropertyChar() );
+			String prop = parser.textFrom(start).toLowerCase();
+
+			while( matchSpace() );
+			if( !parser.match(':') )
+				return null;
+
+			start = parser.currentIndex();
+			while( !parser.endOfInput() && parser.noneOf(";") );
+			String val = parser.textFrom(start).trim();
+
+			tbl.rawPut(prop,val);
+			parser.match(';');
+			while( matchSpace() );
+		}
+		return tbl;
+	}
+
+	private boolean matchPropertyChar() {
+		return parser.inCharRange('a','z')
+			|| parser.inCharRange('A','Z')
+			|| parser.inCharRange('0','9')
+			|| parser.anyOf("_-")
+		;
+	}
+
+	private boolean matchSpace() {
+		return parser.anyOf(" \t\r\n");
+	}
+
+}
--- a/src/luan/modules/parsers/Html.java	Mon Dec 31 18:39:04 2018 -0700
+++ b/src/luan/modules/parsers/Html.java	Mon Dec 31 20:59:08 2018 -0700
@@ -7,14 +7,11 @@
 import luan.LuanState;
 import luan.LuanTable;
 import luan.lib.parser.Parser;
-import luan.lib.parser.ParseException;
 
 
 public final class Html {
 
-	public static LuanTable toList(LuanState luan,String text,LuanTable containerTagsTbl)
-		throws ParseException
-	{
+	public static LuanTable toList(LuanState luan,String text,LuanTable containerTagsTbl) {
 		return new Html(luan,text,containerTagsTbl).parse();
 	}
 
@@ -30,7 +27,7 @@
 		}
 	}
 
-	private LuanTable parse() throws ParseException {
+	private LuanTable parse() {
 		List list = new ArrayList();
 		StringBuilder sb = new StringBuilder();
 		while( !parser.endOfInput() ) {
@@ -120,6 +117,8 @@
 	}
 
 	private LuanTable parseTag() {
+		LuanTable tbl = new LuanTable(luan);
+		tbl.rawPut("type","tag");
 		int tagStart = parser.begin();
 		if( !parser.match('<') )
 			return parser.failure(null);
@@ -129,22 +128,25 @@
 			return parser.failure(null);
 		while( matchNameChar() );
 		String name = parser.textFrom(start).toLowerCase();
+		tbl.rawPut("name",name);
 		LuanTable attributes = new LuanTable(luan);
+		tbl.rawPut("attributes",attributes);
 		String attrName;
 		while( (attrName = parseAttrName()) != null ) {
 			String attrValue = parseAttrValue();
 			attributes.rawPut( attrName, attrValue!=null ? attrValue : true );
+			if( attrName.equals("style") && attrValue!=null ) {
+				LuanTable style = Css.style(luan,attrValue);
+				if( style!=null )
+					tbl.rawPut("style",style);
+			}
 		}
 		while( matchSpace() );
 		boolean isEmpty = parser.match('/');
+		tbl.rawPut("is_empty",isEmpty);
 		if( !parser.match('>') )
 			return parser.failure(null);
 		String raw = parser.textFrom(tagStart);
-		LuanTable tbl = new LuanTable(luan);
-		tbl.rawPut("type","tag");
-		tbl.rawPut("name",name);
-		tbl.rawPut("attributes",attributes);
-		tbl.rawPut("is_empty",isEmpty);
 		tbl.rawPut("raw",raw);
 		return parser.success(tbl);
 	}
@@ -158,7 +160,7 @@
 		if( !matchNameChar() )
 			return parser.failure(null);
 		while( matchNameChar() );
-		String name = parser.textFrom(start);
+		String name = parser.textFrom(start).toLowerCase();
 		return parser.success(name);
 	}