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();