Mercurial Hosting > luan
comparison src/luan/modules/parsers/Html.java @ 1330:f41919741100
fix security
author | Franklin Schmidt <fschmidt@gmail.com> |
---|---|
date | Mon, 11 Feb 2019 01:38:55 -0700 |
parents | 8d54bcc0b6d3 |
children | 25746915a241 |
comparison
equal
deleted
inserted
replaced
1329:5a39b006acd1 | 1330:f41919741100 |
---|---|
4 import java.util.ArrayList; | 4 import java.util.ArrayList; |
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.LuanException; | |
9 import luan.lib.parser.Parser; | 10 import luan.lib.parser.Parser; |
10 | 11 |
11 | 12 |
12 public final class Html { | 13 public final class Html { |
13 | 14 |
14 public static LuanTable toList(LuanState luan,String text,LuanTable containerTagsTbl) { | 15 public static LuanTable toList(LuanState luan,String text,LuanTable containerTagsTbl) { |
15 return new Html(luan,text,containerTagsTbl).parse(); | 16 try { |
17 return new Html(luan,text,containerTagsTbl).parse(); | |
18 } catch(LuanException e) { | |
19 throw new RuntimeException(e); | |
20 } | |
16 } | 21 } |
17 | 22 |
18 private final LuanState luan; | 23 private final LuanState luan; |
19 private final Parser parser; | 24 private final Parser parser; |
20 private final Set<String> containerTags = new HashSet<String>(); | 25 private final Set<String> containerTags = new HashSet<String>(); |
25 for( Object v : containerTagsTbl.asList() ) { | 30 for( Object v : containerTagsTbl.asList() ) { |
26 containerTags.add((String)v); | 31 containerTags.add((String)v); |
27 } | 32 } |
28 } | 33 } |
29 | 34 |
30 private LuanTable parse() { | 35 private LuanTable parse() throws LuanException { |
31 List list = new ArrayList(); | 36 List list = new ArrayList(); |
32 StringBuilder sb = new StringBuilder(); | 37 StringBuilder sb = new StringBuilder(); |
33 while( !parser.endOfInput() ) { | 38 while( !parser.endOfInput() ) { |
34 if( parser.test('<') ) { | 39 if( parser.test('<') ) { |
35 LuanTable tbl = parseTag(); | 40 LuanTable tbl = parseTag(); |
59 if( sb.length() > 0 ) | 64 if( sb.length() > 0 ) |
60 list.add(sb.toString()); | 65 list.add(sb.toString()); |
61 return new LuanTable(luan,list); | 66 return new LuanTable(luan,list); |
62 } | 67 } |
63 | 68 |
64 private LuanTable parseComment() { | 69 private LuanTable parseComment() throws LuanException { |
65 parser.begin(); | 70 parser.begin(); |
66 if( !parser.match("<!--") ) | 71 if( !parser.match("<!--") ) |
67 return parser.failure(null); | 72 return parser.failure(null); |
68 int start = parser.currentIndex(); | 73 int start = parser.currentIndex(); |
69 while( !parser.test("-->") ) { | 74 while( !parser.test("-->") ) { |
70 if( !parser.anyChar() ) | 75 if( !parser.anyChar() ) |
71 return parser.failure(null); | 76 return parser.failure(null); |
72 } | 77 } |
73 String text = parser.textFrom(start); | 78 String text = parser.textFrom(start); |
74 LuanTable tbl = new LuanTable(luan); | 79 LuanTable tbl = new LuanTable(luan); |
75 tbl.rawPut("type","comment"); | 80 tbl.put("type","comment"); |
76 tbl.rawPut("text",text); | 81 tbl.put("text",text); |
77 return parser.success(tbl); | 82 return parser.success(tbl); |
78 } | 83 } |
79 | 84 |
80 private LuanTable parseCdata() { | 85 private LuanTable parseCdata() throws LuanException { |
81 parser.begin(); | 86 parser.begin(); |
82 if( !parser.match("<![CDATA[") ) | 87 if( !parser.match("<![CDATA[") ) |
83 return parser.failure(null); | 88 return parser.failure(null); |
84 int start = parser.currentIndex(); | 89 int start = parser.currentIndex(); |
85 while( !parser.test("]]>") ) { | 90 while( !parser.test("]]>") ) { |
86 if( !parser.anyChar() ) | 91 if( !parser.anyChar() ) |
87 return parser.failure(null); | 92 return parser.failure(null); |
88 } | 93 } |
89 String text = parser.textFrom(start); | 94 String text = parser.textFrom(start); |
90 LuanTable tbl = new LuanTable(luan); | 95 LuanTable tbl = new LuanTable(luan); |
91 tbl.rawPut("type","cdata"); | 96 tbl.put("type","cdata"); |
92 tbl.rawPut("text",text); | 97 tbl.put("text",text); |
93 return parser.success(tbl); | 98 return parser.success(tbl); |
94 } | 99 } |
95 | 100 |
96 private LuanTable parseContainer(LuanTable tag) { | 101 private LuanTable parseContainer(LuanTable tag) throws LuanException { |
97 String endTagName = '/' + (String)tag.rawGet("name"); | 102 String endTagName = '/' + (String)tag.rawGet("name"); |
98 int start = parser.begin(); | 103 int start = parser.begin(); |
99 int end; | 104 int end; |
100 while(true) { | 105 while(true) { |
101 if( parser.test('<') ) { | 106 if( parser.test('<') ) { |
108 if( !parser.anyChar() ) | 113 if( !parser.anyChar() ) |
109 return parser.failure(null); | 114 return parser.failure(null); |
110 } | 115 } |
111 String text = parser.text.substring(start,end); | 116 String text = parser.text.substring(start,end); |
112 LuanTable tbl = new LuanTable(luan); | 117 LuanTable tbl = new LuanTable(luan); |
113 tbl.rawPut("type","container"); | 118 tbl.put("type","container"); |
114 tbl.rawPut("tag",tag); | 119 tbl.put("tag",tag); |
115 tbl.rawPut("text",text); | 120 tbl.put("text",text); |
116 return parser.success(tbl); | 121 return parser.success(tbl); |
117 } | 122 } |
118 | 123 |
119 private LuanTable parseTag() { | 124 private LuanTable parseTag() throws LuanException { |
120 LuanTable tbl = new LuanTable(luan); | 125 LuanTable tbl = new LuanTable(luan); |
121 tbl.rawPut("type","tag"); | 126 tbl.put("type","tag"); |
122 int tagStart = parser.begin(); | 127 int tagStart = parser.begin(); |
123 if( !parser.match('<') ) | 128 if( !parser.match('<') ) |
124 return parser.failure(null); | 129 return parser.failure(null); |
125 int start = parser.currentIndex(); | 130 int start = parser.currentIndex(); |
126 parser.match('/'); | 131 parser.match('/'); |
127 if( !matchNameChar() ) | 132 if( !matchNameChar() ) |
128 return parser.failure(null); | 133 return parser.failure(null); |
129 while( matchNameChar() ); | 134 while( matchNameChar() ); |
130 String name = parser.textFrom(start).toLowerCase(); | 135 String name = parser.textFrom(start).toLowerCase(); |
131 tbl.rawPut("name",name); | 136 tbl.put("name",name); |
132 LuanTable attributes = new LuanTable(luan); | 137 LuanTable attributes = new LuanTable(luan); |
133 tbl.rawPut("attributes",attributes); | 138 tbl.put("attributes",attributes); |
134 String attrName; | 139 String attrName; |
135 while( (attrName = parseAttrName()) != null ) { | 140 while( (attrName = parseAttrName()) != null ) { |
136 String attrValue = parseAttrValue(); | 141 String attrValue = parseAttrValue(); |
137 attributes.rawPut( attrName, attrValue!=null ? attrValue : true ); | 142 attributes.put( attrName, attrValue!=null ? attrValue : true ); |
138 if( attrName.equals("style") && attrValue!=null ) { | 143 if( attrName.equals("style") && attrValue!=null ) { |
139 LuanTable style = Css.style(luan,attrValue); | 144 LuanTable style = Css.style(luan,attrValue); |
140 if( style!=null ) | 145 if( style!=null ) |
141 tbl.rawPut("style",style); | 146 tbl.put("style",style); |
142 } | 147 } |
143 } | 148 } |
144 while( matchSpace() ); | 149 while( matchSpace() ); |
145 boolean isEmpty = parser.match('/'); | 150 boolean isEmpty = parser.match('/'); |
146 tbl.rawPut("is_empty",isEmpty); | 151 tbl.put("is_empty",isEmpty); |
147 if( !parser.match('>') ) | 152 if( !parser.match('>') ) |
148 return parser.failure(null); | 153 return parser.failure(null); |
149 String raw = parser.textFrom(tagStart); | 154 String raw = parser.textFrom(tagStart); |
150 tbl.rawPut("raw",raw); | 155 tbl.put("raw",raw); |
151 return parser.success(tbl); | 156 return parser.success(tbl); |
152 } | 157 } |
153 | 158 |
154 private String parseAttrName() { | 159 private String parseAttrName() { |
155 parser.begin(); | 160 parser.begin(); |