view 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 source

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");
	}

}