Mercurial Hosting > luan
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(); |