Package railo.transformer.cfml.expression

Source Code of railo.transformer.cfml.expression.SimpleExprTransformer

package railo.transformer.cfml.expression;

import railo.runtime.exp.TemplateException;
import railo.transformer.bytecode.Page;
import railo.transformer.bytecode.Position;
import railo.transformer.bytecode.expression.Expression;
import railo.transformer.bytecode.literal.LitString;
import railo.transformer.cfml.ExprTransformer;
import railo.transformer.cfml.TransfomerSettings;
import railo.transformer.cfml.evaluator.EvaluatorPool;
import railo.transformer.library.function.FunctionLib;
import railo.transformer.library.tag.TagLibTag;
import railo.transformer.util.CFMLString;

/**
* Zum lesen von Attributen bei dem CFML expressions nicht geparst werden sollen (cfloop condition)
*/
public final class SimpleExprTransformer implements ExprTransformer {
 
  //char specialChar=0;
  //protected CFMLString cfml;

  /* *
   * Setzt welcher Character speziell behandelt werden soll.
   * @param c char der speziell behandelt werden soll.
   * /
  public void setSpecialChar(char c) {
    specialChar=c;
  }*/
 

  private char specialChar;

  public SimpleExprTransformer(char specialChar) {
    this.specialChar=specialChar;
  }

  /**
   * @see railo.transformer.cfml.ExprTransformer#transformAsString(railo.transformer.library.function.FunctionLib[], org.w3c.dom.Document, railo.transformer.util.CFMLString)
   */
  public Expression transformAsString(Page page,EvaluatorPool ep,FunctionLib[] fld,TagLibTag[] scriptTags, CFMLString cfml, TransfomerSettings settings,boolean allowLowerThan) throws TemplateException {
    return transform(page,ep,fld,scriptTags, cfml,settings);
  }
 
  /**
   * @see railo.transformer.cfml.ExprTransformer#transform(railo.transformer.library.function.FunctionLib[], org.w3c.dom.Document, railo.transformer.util.CFMLString)
   */
  public Expression transform(Page page,EvaluatorPool ep,FunctionLib[] fld,TagLibTag[] scriptTags, CFMLString cfml, TransfomerSettings settings) throws TemplateException {
      Expression expr=null;
      // String
        if((expr=string(cfml))!=null) {
          return expr;
        }
      // Simple
        return simple(cfml);
  }
  /**
   * Liest den String ein
   * @return Element
   * @throws TemplateException
   */
  public Expression string(CFMLString cfml)
    throws TemplateException {
    cfml.removeSpace();
    char quoter=cfml.getCurrentLower();
    if(quoter!='"' && quoter!='\'')
      return null;
    StringBuffer str=new StringBuffer();
    boolean insideSpecial=false;
 
    Position line = cfml.getPosition();
    while(cfml.hasNext()) {
      cfml.next();
      // check special
      if(cfml.isCurrent(specialChar)) {
        insideSpecial=!insideSpecial;
        str.append(specialChar);
             
      }
      // check quoter
      else if(!insideSpecial && cfml.isCurrent(quoter)) {
        // Ecaped sharp
        if(cfml.isNext(quoter)){
          cfml.next();
          str.append(quoter);
        }
        // finsish
        else {
          break;
        }       
      }
      // all other character
      else {
        str.append(cfml.getCurrent());
      }
    }   


    if(!cfml.forwardIfCurrent(quoter))
      throw new TemplateException(cfml,"Invalid Syntax Closing ["+quoter+"] not found");
 
    LitString rtn = new LitString(str.toString(),line,cfml.getPosition());
    cfml.removeSpace();
    return rtn;
  }
 
  /**
   * Liest ein
   * @return Element
   * @throws TemplateException
   */
  public Expression simple(CFMLString cfml) throws TemplateException {
    StringBuffer sb=new StringBuffer();
    Position line = cfml.getPosition();
    while(cfml.isValidIndex()) {
      if(cfml.isCurrent(' ') || cfml.isCurrent('>') || cfml.isCurrent("/>")) break;
      else if(cfml.isCurrent('"') || cfml.isCurrent('#') || cfml.isCurrent('\'')) {
        throw new TemplateException(cfml,"simple attribute value can't contain ["+cfml.getCurrent()+"]");
      }
      else sb.append(cfml.getCurrent());
      cfml.next();
    }
    cfml.removeSpace();
   
    return new LitString(sb.toString(),line,cfml.getPosition());
  }
 

}
TOP

Related Classes of railo.transformer.cfml.expression.SimpleExprTransformer

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.