diff src/luan/modules/parsers/Css.java @ 1289:8d54bcc0b6d3

add css style parser
author Franklin Schmidt <fschmidt@gmail.com>
date Mon, 31 Dec 2018 20:59:08 -0700
parents
children f41919741100
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");
+	}
+
+}