Mercurial Hosting > luan
comparison core/src/luan/impl/ThemeParser.java @ 600:b926e53910dd
change theming indentation
author | Franklin Schmidt <fschmidt@gmail.com> |
---|---|
date | Mon, 28 Sep 2015 00:32:27 -0600 |
parents | 8370c4009cce |
children | c5ad80f869da |
comparison
equal
deleted
inserted
replaced
599:50540f0813e2 | 600:b926e53910dd |
---|---|
174 FnDef fnDef = newFnDef(0,block); | 174 FnDef fnDef = newFnDef(0,block); |
175 return fnDef; | 175 return fnDef; |
176 } | 176 } |
177 | 177 |
178 private Stmt parseDef() throws ParseException { | 178 private Stmt parseDef() throws ParseException { |
179 int start = parser.begin(); | 179 int start = parser.currentIndex(); |
180 if( !parser.match("{define:") ) | 180 if( !parser.match("{define:") ) |
181 return parser.failure(null); | 181 return null; |
182 String name = parseName(); | 182 String name = parseName(); |
183 if( name==null ) | 183 if( name==null ) |
184 throw exception("invalid block name"); | 184 throw parser.exception("invalid block name"); |
185 if( !parser.match("}") ) | |
186 throw parser.exception("unclosed define tag"); | |
185 String spaces = ""; | 187 String spaces = ""; |
186 if( BlankLine() ) { | 188 boolean indent = BlankLine(); |
187 while( BlankLine() ); | 189 if( indent ) { |
188 int startSpaces = parser.currentIndex(); | 190 int startSpaces = parser.currentIndex(); |
189 InlineSpaces(); | 191 InlineSpaces(); |
190 spaces = parser.textFrom(startSpaces); | 192 spaces = parser.textFrom(startSpaces); |
191 } | 193 } |
192 if( !parser.match("}") ) | |
193 return null; | |
194 Expr table = new GetLocalVar(null,stackIndex(MOD)); | 194 Expr table = new GetLocalVar(null,stackIndex(MOD)); |
195 Settable fnName = new SetTableEntry(se(start),table,new ConstExpr(null,name)); | 195 Settable fnName = new SetTableEntry(se(start),table,new ConstExpr(null,name)); |
196 frame = new Frame(frame); | 196 frame = new Frame(frame); |
197 addSymbol(ENV); | 197 addSymbol(ENV); |
198 Stmt block = parseBody("define:"+name,spaces,EndOfLine()); | 198 Stmt block = parseBody("define:"+name,spaces,indent); |
199 FnDef fnDef = newFnDef(start,block); | 199 FnDef fnDef = newFnDef(start,block); |
200 frame = frame.parent; | 200 frame = frame.parent; |
201 Stmt rtn = new SetStmt(fnName,fnDef); | 201 Stmt rtn = new SetStmt(fnName,fnDef); |
202 return parser.success(rtn); | 202 return rtn; |
203 } | 203 } |
204 | 204 |
205 private Stmt parseBody(String tagName,String spaces,boolean initIndent) throws ParseException { | 205 private Stmt parseBody(String tagName,String spaces,boolean afterIndent) throws ParseException { |
206 List<Stmt> stmts = new ArrayList<Stmt>(); | 206 List<Stmt> stmts = new ArrayList<Stmt>(); |
207 int stackStart = symbolsSize(); | 207 int stackStart = symbolsSize(); |
208 int start = parser.currentIndex(); | 208 int start = parser.currentIndex(); |
209 { | 209 { |
210 addSymbol(INDENT); | 210 addSymbol(INDENT); |
219 }; | 219 }; |
220 // Expr exp = new IndexExpr( se(start,"indent"), env(), new ConstExpr(null,INDENT) ); | 220 // Expr exp = new IndexExpr( se(start,"indent"), env(), new ConstExpr(null,INDENT) ); |
221 SetStmt setStmt = new SetStmt( new SetLocalVar(stackIndex(INDENT)), exp ); | 221 SetStmt setStmt = new SetStmt( new SetLocalVar(stackIndex(INDENT)), exp ); |
222 stmts.add(setStmt); | 222 stmts.add(setStmt); |
223 } | 223 } |
224 boolean afterIndent = false; | |
225 if( initIndent && parser.match(spaces) ) { | |
226 addText(start,start,stmts,true); | |
227 start = parser.currentIndex(); | |
228 afterIndent = true; | |
229 } | |
230 int end = start; | 224 int end = start; |
231 while( !matchEndTag(tagName) ) { | 225 while( !matchEndTag(tagName) ) { |
232 if( parser.endOfInput() ) | 226 if( parser.endOfInput() ) |
233 throw exception("unclosed block"); | 227 throw exception("unclosed block"); |
234 Stmt block = parseBlock(spaces); | 228 Stmt block = parseBlock(spaces); |
278 return block; | 272 return block; |
279 } | 273 } |
280 | 274 |
281 private boolean matchEndTag(String tagName) { | 275 private boolean matchEndTag(String tagName) { |
282 parser.begin(); | 276 parser.begin(); |
283 if( !parser.match('{') ) | 277 if( tagName.startsWith("define:") ) |
284 return parser.failure(); | 278 EndOfLine(); |
285 Spaces(); | 279 return parser.match("{/") && parser.match(tagName) && parser.match('}') ? parser.success() : parser.failure(); |
286 if( !(parser.match('/') && parser.match(tagName)) ) | |
287 return parser.failure(); | |
288 Spaces(); | |
289 if( !parser.match('}') ) | |
290 return parser.failure(); | |
291 return parser.success(); | |
292 } | 280 } |
293 | 281 |
294 private void addText(int start,int end,List<Stmt> stmts,boolean indent) { | 282 private void addText(int start,int end,List<Stmt> stmts,boolean indent) { |
295 List<Expressions> args = new ArrayList<Expressions>(); | 283 List<Expressions> args = new ArrayList<Expressions>(); |
296 if( start < end ) { | 284 if( start < end ) { |
339 if( !parser.match("{") ) | 327 if( !parser.match("{") ) |
340 return parser.failure(null); | 328 return parser.failure(null); |
341 String name = parseName(); | 329 String name = parseName(); |
342 if( name==null ) | 330 if( name==null ) |
343 return parser.failure(null); | 331 return parser.failure(null); |
344 Spaces(); | |
345 if( !parser.match("}") ) | 332 if( !parser.match("}") ) |
346 return parser.failure(null); | 333 return parser.failure(null); |
347 // rtn = "<% env." + name + (attrs.isEmpty() ? "()" : table(attrs)) + " %>"; | 334 // rtn = "<% env." + name + (attrs.isEmpty() ? "()" : table(attrs)) + " %>"; |
348 Expr env = env(); | 335 Expr env = env(); |
349 Expr fn = new IndexExpr( se(start,name), env, new ConstExpr(null,name) ); | 336 Expr fn = new IndexExpr( se(start,name), env, new ConstExpr(null,name) ); |
367 FnCall fnCall = new FnCall( se(start), fn, env ); | 354 FnCall fnCall = new FnCall( se(start), fn, env ); |
368 Stmt rtn = new ExpressionsStmt(fnCall); | 355 Stmt rtn = new ExpressionsStmt(fnCall); |
369 return parser.success(rtn); | 356 return parser.success(rtn); |
370 } | 357 } |
371 | 358 |
372 private void Spaces() { | |
373 while( parser.anyOf(" \t\r\n") ); | |
374 } | |
375 | |
376 private void InlineSpaces() { | 359 private void InlineSpaces() { |
377 while( parser.anyOf(" \t") ); | 360 while( parser.anyOf(" \t") ); |
378 } | |
379 | |
380 private void BlankLines() { | |
381 while( BlankLine() ); | |
382 } | 361 } |
383 | 362 |
384 private boolean BlankLine() { | 363 private boolean BlankLine() { |
385 parser.begin(); | 364 parser.begin(); |
386 while( parser.anyOf(" \t") ); | 365 while( parser.anyOf(" \t") ); |