Mercurial Hosting > luan
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"); + } + +}