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