comparison src/luan/modules/parsers/Html.java @ 1289:8d54bcc0b6d3

add css style parser
author Franklin Schmidt <fschmidt@gmail.com>
date Mon, 31 Dec 2018 20:59:08 -0700
parents 323743a7f317
children f41919741100
comparison
equal deleted inserted replaced
1288:8432d20a2729 1289:8d54bcc0b6d3
5 import java.util.Set; 5 import java.util.Set;
6 import java.util.HashSet; 6 import java.util.HashSet;
7 import luan.LuanState; 7 import luan.LuanState;
8 import luan.LuanTable; 8 import luan.LuanTable;
9 import luan.lib.parser.Parser; 9 import luan.lib.parser.Parser;
10 import luan.lib.parser.ParseException;
11 10
12 11
13 public final class Html { 12 public final class Html {
14 13
15 public static LuanTable toList(LuanState luan,String text,LuanTable containerTagsTbl) 14 public static LuanTable toList(LuanState luan,String text,LuanTable containerTagsTbl) {
16 throws ParseException
17 {
18 return new Html(luan,text,containerTagsTbl).parse(); 15 return new Html(luan,text,containerTagsTbl).parse();
19 } 16 }
20 17
21 private final LuanState luan; 18 private final LuanState luan;
22 private final Parser parser; 19 private final Parser parser;
28 for( Object v : containerTagsTbl.asList() ) { 25 for( Object v : containerTagsTbl.asList() ) {
29 containerTags.add((String)v); 26 containerTags.add((String)v);
30 } 27 }
31 } 28 }
32 29
33 private LuanTable parse() throws ParseException { 30 private LuanTable parse() {
34 List list = new ArrayList(); 31 List list = new ArrayList();
35 StringBuilder sb = new StringBuilder(); 32 StringBuilder sb = new StringBuilder();
36 while( !parser.endOfInput() ) { 33 while( !parser.endOfInput() ) {
37 if( parser.test('<') ) { 34 if( parser.test('<') ) {
38 LuanTable tbl = parseTag(); 35 LuanTable tbl = parseTag();
118 tbl.rawPut("text",text); 115 tbl.rawPut("text",text);
119 return parser.success(tbl); 116 return parser.success(tbl);
120 } 117 }
121 118
122 private LuanTable parseTag() { 119 private LuanTable parseTag() {
120 LuanTable tbl = new LuanTable(luan);
121 tbl.rawPut("type","tag");
123 int tagStart = parser.begin(); 122 int tagStart = parser.begin();
124 if( !parser.match('<') ) 123 if( !parser.match('<') )
125 return parser.failure(null); 124 return parser.failure(null);
126 int start = parser.currentIndex(); 125 int start = parser.currentIndex();
127 parser.match('/'); 126 parser.match('/');
128 if( !matchNameChar() ) 127 if( !matchNameChar() )
129 return parser.failure(null); 128 return parser.failure(null);
130 while( matchNameChar() ); 129 while( matchNameChar() );
131 String name = parser.textFrom(start).toLowerCase(); 130 String name = parser.textFrom(start).toLowerCase();
131 tbl.rawPut("name",name);
132 LuanTable attributes = new LuanTable(luan); 132 LuanTable attributes = new LuanTable(luan);
133 tbl.rawPut("attributes",attributes);
133 String attrName; 134 String attrName;
134 while( (attrName = parseAttrName()) != null ) { 135 while( (attrName = parseAttrName()) != null ) {
135 String attrValue = parseAttrValue(); 136 String attrValue = parseAttrValue();
136 attributes.rawPut( attrName, attrValue!=null ? attrValue : true ); 137 attributes.rawPut( attrName, attrValue!=null ? attrValue : true );
138 if( attrName.equals("style") && attrValue!=null ) {
139 LuanTable style = Css.style(luan,attrValue);
140 if( style!=null )
141 tbl.rawPut("style",style);
142 }
137 } 143 }
138 while( matchSpace() ); 144 while( matchSpace() );
139 boolean isEmpty = parser.match('/'); 145 boolean isEmpty = parser.match('/');
146 tbl.rawPut("is_empty",isEmpty);
140 if( !parser.match('>') ) 147 if( !parser.match('>') )
141 return parser.failure(null); 148 return parser.failure(null);
142 String raw = parser.textFrom(tagStart); 149 String raw = parser.textFrom(tagStart);
143 LuanTable tbl = new LuanTable(luan);
144 tbl.rawPut("type","tag");
145 tbl.rawPut("name",name);
146 tbl.rawPut("attributes",attributes);
147 tbl.rawPut("is_empty",isEmpty);
148 tbl.rawPut("raw",raw); 150 tbl.rawPut("raw",raw);
149 return parser.success(tbl); 151 return parser.success(tbl);
150 } 152 }
151 153
152 private String parseAttrName() { 154 private String parseAttrName() {
156 while( matchSpace() ); 158 while( matchSpace() );
157 int start = parser.currentIndex(); 159 int start = parser.currentIndex();
158 if( !matchNameChar() ) 160 if( !matchNameChar() )
159 return parser.failure(null); 161 return parser.failure(null);
160 while( matchNameChar() ); 162 while( matchNameChar() );
161 String name = parser.textFrom(start); 163 String name = parser.textFrom(start).toLowerCase();
162 return parser.success(name); 164 return parser.success(name);
163 } 165 }
164 166
165 private String parseAttrValue() { 167 private String parseAttrValue() {
166 parser.begin(); 168 parser.begin();