Search in sources :

Example 16 with TagLib

use of lucee.transformer.library.tag.TagLib in project Lucee by lucee.

the class CFMLTransformer method tag.

/**
 * Liest einen Tag ein, prueft hierbei ob das Tag innerhalb einer der geladenen Tag-Lib existiert,
 * ansonsten wird ein Tag einfach als literal-string aufgenommen.
 * <br />
 * EBNF:<br />
 * <code>name-space identifier spaces attributes ("/>" | ">" [body "</" identifier spaces ">"]);(* Ob dem Tag ein Body und ein End-Tag folgt ist abhaengig von Definition des body-content in Tag-Lib, gleices gilt fuer appendix *)</code>
 * @param parent uebergeornetes Tag
 * @param parseExpression sollen Expresson innerhalb des Body geparste werden oder nicht.
 * @return Gibt zurueck ob es sich um ein Tag as einer Tag-Lib handelte oder nicht.
 * @throws TemplateException
 */
private boolean tag(TagData data, Body parent, boolean parseExpression) throws TemplateException {
    // lucee.print.ln("--->"+data.cfml.getCurrent());
    boolean hasBody = false;
    Position line = data.srcCode.getPosition();
    // int column=data.cfml.getColumn();
    int start = data.srcCode.getPos();
    data.srcCode.next();
    // read in namespace of tag
    TagLib tagLib = nameSpace(data);
    // return if no matching tag lib
    if (tagLib == null) {
        data.srcCode.previous();
        return false;
    }
    // Get matching tag from tag lib
    String strNameNormal = identifier(data.srcCode, false, true);
    if (strNameNormal == null) {
        data.srcCode.setPos((data.srcCode.getPos() - tagLib.getNameSpaceAndSeparator().length()) - 1);
        return false;
    }
    String strName = strNameNormal.toLowerCase();
    String appendix = null;
    TagLibTag tagLibTag = tagLib.getTag(strName);
    // get taglib
    if (tagLibTag == null) {
        tagLibTag = tagLib.getAppendixTag(strName);
        if (tagLibTag == null) {
            if (tagLib.getIgnoreUnknowTags()) {
                data.srcCode.setPos(start);
                return false;
            }
            throw new TemplateException(data.srcCode, "undefined tag [" + tagLib.getNameSpaceAndSeparator() + strName + "]");
        }
        appendix = StringUtil.removeStartingIgnoreCase(strNameNormal, tagLibTag.getName());
    }
    // CFXD Element
    Tag tag;
    try {
        tag = tagLibTag.getTag(data.factory, line, data.srcCode.getPosition());
    } catch (Exception e) {
        throw new TemplateException(data.srcCode, e);
    }
    parent.addStatement(tag);
    // get tag from tag library
    if (appendix != null) {
        tag.setAppendix(appendix);
        tag.setFullname(tagLibTag.getFullName().concat(appendix));
    } else {
        tag.setFullname(tagLibTag.getFullName());
    }
    // if(tag.getFullname().equalsIgnoreCase("cfcomponent"))data.page.setIsComponent(true);	// MUST to hardcoded, to better
    // else if(tag.getFullname().equalsIgnoreCase("cfinterface"))data.page.setIsInterface(true);	// MUST to hardcoded, to better
    tag.setTagLibTag(tagLibTag);
    comment(data.srcCode, true);
    // Tag Translator Evaluator
    if (tagLibTag.hasTTE()) {
        data.ep.add(tagLibTag, tag, data.flibs, data.srcCode);
    }
    // get Attributes
    attributes(data, tagLibTag, tag);
    if (tagLibTag.hasAttributeEvaluator()) {
        try {
            tagLibTag = tagLibTag.getAttributeEvaluator().evaluate(tagLibTag, tag);
        } catch (AttributeEvaluatorException e) {
            throw new TemplateException(data.srcCode, e);
        }
    }
    // TODO muss erlaubt sein
    if (data.srcCode.forwardIfCurrent('>')) {
        hasBody = tagLibTag.getHasBody();
    } else if (data.srcCode.forwardIfCurrent('/', '>')) {
        if (tagLibTag.getHasBody())
            tag.setBody(new BodyBase(data.factory));
    } else {
        throw createTemplateException(data.srcCode, "tag [" + tagLibTag.getFullName() + "] is not closed", tagLibTag);
    }
    // Body
    if (hasBody) {
        // get Body
        if (tagLibTag.isTagDependent()) {
            // get TagDependentBodyTransformer
            TagDependentBodyTransformer tdbt = null;
            try {
                tdbt = tagLibTag.getBodyTransformer();
            } catch (TagLibException e) {
                throw new TemplateException(data.srcCode, e);
            }
            if (tdbt == null)
                throw createTemplateException(data.srcCode, "Tag dependent body Transformer is invalid for Tag [" + tagLibTag.getFullName() + "]", tagLibTag);
            tag.setBody(tdbt.transform(data.factory, data.root, data.ep, data.tlibs, data.flibs, tagLibTag.getFullName(), data.scriptTags, data.srcCode, data.settings));
            // get TagLib of end Tag
            if (!data.srcCode.forwardIfCurrent("</")) {
                // MUST this is a patch, do a more proper implementation
                TemplateException te = new TemplateException(data.srcCode, "invalid construct");
                if (tdbt instanceof CFMLScriptTransformer && ASMUtil.containsComponent(tag.getBody())) {
                    throw new CFMLScriptTransformer.ComponentTemplateException(te);
                }
                throw te;
            }
            TagLib tagLibEnd = nameSpace(data);
            // same NameSpace
            if (!(tagLibEnd != null && tagLibEnd.getNameSpaceAndSeparator().equals(tagLib.getNameSpaceAndSeparator())))
                throw new TemplateException(data.srcCode, "invalid construct");
            // get end Tag
            String strNameEnd = identifier(data.srcCode, true, true).toLowerCase();
            // not the same name Tag
            if (!strName.equals(strNameEnd)) {
                data.srcCode.setPos(start);
                throw new TemplateException(data.srcCode, "Start and End Tag has not the same Name [" + tagLib.getNameSpaceAndSeparator() + strName + "-" + tagLibEnd.getNameSpaceAndSeparator() + strNameEnd + "]");
            }
            data.srcCode.removeSpace();
            if (!data.srcCode.forwardIfCurrent('>'))
                throw new TemplateException(data.srcCode, "End Tag [" + tagLibEnd.getNameSpaceAndSeparator() + strNameEnd + "] not closed");
        } else {
            // get body of Tag
            BodyBase body = new BodyBase(data.factory);
            body.setParent(tag);
            // parseExpression=(tagLibTag.getParseBody())?true:parseExpression;
            if (tagLibTag.getParseBody())
                parseExpression = true;
            while (true) {
                // Load Expession Transformer from TagLib
                ExprTransformer transfomer = null;
                if (parseExpression) {
                    try {
                        transfomer = tagLibTag.getTagLib().getExprTransfomer();
                    } catch (TagLibException e) {
                        throw new TemplateException(data.srcCode, e);
                    }
                }
                // call body
                body(data, body, parseExpression, transfomer);
                // no End Tag
                if (data.srcCode.isAfterLast()) {
                    if (tagLibTag.isBodyReq()) {
                        data.srcCode.setPos(start);
                        throw createTemplateException(data.srcCode, "No matching end tag found for tag [" + tagLibTag.getFullName() + "]", tagLibTag);
                    }
                    body.moveStatmentsTo(parent);
                    return executeEvaluator(data, tagLibTag, tag);
                }
                // Invalid Construct
                int posBeforeEndTag = data.srcCode.getPos();
                if (!data.srcCode.forwardIfCurrent('<', '/'))
                    throw createTemplateException(data.srcCode, "Missing end tag for [" + tagLibTag.getFullName() + "]", tagLibTag);
                // get TagLib of end Tag
                int _start = data.srcCode.getPos();
                TagLib tagLibEnd = nameSpace(data);
                // same NameSpace
                if (tagLibEnd != null) {
                    String strNameEnd = "";
                    // lucee.print.ln(data.cfml.getLine()+" - "+data.cfml.getColumn()+" - "+tagLibEnd.getNameSpaceAndSeperator()+".equals("+tagLib.getNameSpaceAndSeperator()+")");
                    if (tagLibEnd.getNameSpaceAndSeparator().equals(tagLib.getNameSpaceAndSeparator())) {
                        // get end Tag
                        strNameEnd = identifier(data.srcCode, true, true).toLowerCase();
                        // not the same name Tag
                        // new part
                        data.srcCode.removeSpace();
                        if (strName.equals(strNameEnd)) {
                            if (!data.srcCode.forwardIfCurrent('>'))
                                throw new TemplateException(data.srcCode, "End Tag [" + tagLibEnd.getNameSpaceAndSeparator() + strNameEnd + "] not closed");
                            break;
                        }
                    }
                    // new part
                    if (tagLibTag.isBodyReq()) {
                        TagLibTag endTag = tagLibEnd.getTag(strNameEnd);
                        if (endTag != null && !endTag.getHasBody())
                            throw new TemplateException(data.srcCode, "End Tag [" + tagLibEnd.getNameSpaceAndSeparator() + strNameEnd + "] is not allowed, for this tag only a Start Tag is allowed");
                        data.srcCode.setPos(start);
                        if (tagLibEnd.getIgnoreUnknowTags() && (tagLibEnd.getTag(strNameEnd)) == null) {
                            data.srcCode.setPos(_start);
                        } else
                            throw new TemplateException(data.srcCode, "Start and End Tag has not the same Name [" + tagLib.getNameSpaceAndSeparator() + strName + "-" + tagLibEnd.getNameSpaceAndSeparator() + strNameEnd + "]");
                    } else {
                        body.moveStatmentsTo(parent);
                        data.srcCode.setPos(posBeforeEndTag);
                        return executeEvaluator(data, tagLibTag, tag);
                    }
                // / new part
                }
                body.addPrintOut(data.factory, "</", null, null);
            }
            tag.setBody(body);
        }
    }
    if (tag instanceof StatementBase)
        ((StatementBase) tag).setEnd(data.srcCode.getPosition());
    return executeEvaluator(data, tagLibTag, tag);
}
Also used : CFMLScriptTransformer(lucee.transformer.cfml.script.CFMLScriptTransformer) TagLibTag(lucee.transformer.library.tag.TagLibTag) AttributeEvaluatorException(lucee.transformer.cfml.attributes.AttributeEvaluatorException) Position(lucee.transformer.Position) ComponentTemplateException(lucee.transformer.cfml.script.AbstrCFMLScriptTransformer.ComponentTemplateException) TemplateException(lucee.runtime.exp.TemplateException) ComponentTemplateException(lucee.transformer.cfml.script.AbstrCFMLScriptTransformer.ComponentTemplateException) SimpleExprTransformer(lucee.transformer.cfml.expression.SimpleExprTransformer) ExprTransformer(lucee.transformer.cfml.ExprTransformer) LitString(lucee.transformer.expression.literal.LitString) TagLibException(lucee.transformer.library.tag.TagLibException) EvaluatorException(lucee.transformer.cfml.evaluator.EvaluatorException) AttributeEvaluatorException(lucee.transformer.cfml.attributes.AttributeEvaluatorException) ComponentTemplateException(lucee.transformer.cfml.script.AbstrCFMLScriptTransformer.ComponentTemplateException) TagLibException(lucee.transformer.library.tag.TagLibException) TemplateException(lucee.runtime.exp.TemplateException) IOException(java.io.IOException) ApplicationException(lucee.runtime.exp.ApplicationException) ProcessingDirectiveException(lucee.transformer.cfml.evaluator.impl.ProcessingDirectiveException) StatementBase(lucee.transformer.bytecode.statement.StatementBase) TagLib(lucee.transformer.library.tag.TagLib) CustomTagLib(lucee.transformer.library.tag.CustomTagLib) TagLibTag(lucee.transformer.library.tag.TagLibTag) Tag(lucee.transformer.bytecode.statement.tag.Tag) BodyBase(lucee.transformer.bytecode.BodyBase)

Example 17 with TagLib

use of lucee.transformer.library.tag.TagLib in project Lucee by lucee.

the class Mail method evaluate.

@Override
public void evaluate(Tag tag, TagLibTag libTag) throws EvaluatorException {
    if (tag.containsAttribute("query")) {
        TagLib lib = libTag.getTagLib();
        TagLibTag outputTag = lib.getTag("output");
        TagOutput output = new TagOutput(tag.getFactory(), tag.getStart(), null);
        output.setFullname(outputTag.getFullName());
        output.setTagLibTag(outputTag);
        output.addAttribute(new Attribute(false, "output", tag.getFactory().TRUE(), "boolean"));
        output.addAttribute(new Attribute(false, "formail", tag.getFactory().TRUE(), "boolean"));
        // output.getBody();
        Body body = new BodyBase(tag.getFactory());
        output.setBody(body);
        ASMUtil.replace(tag, output, false);
        body.addStatement(tag);
        output.addAttribute(tag.removeAttribute("query"));
        if (tag.containsAttribute("group"))
            output.addAttribute(tag.removeAttribute("group"));
        if (tag.containsAttribute("groupcasesensitive"))
            output.addAttribute(tag.removeAttribute("groupcasesensitive"));
        if (tag.containsAttribute("startrow"))
            output.addAttribute(tag.removeAttribute("startrow"));
        if (tag.containsAttribute("maxrows"))
            output.addAttribute(tag.removeAttribute("maxrows"));
        new Output().evaluate(output, outputTag);
    }
}
Also used : TagLibTag(lucee.transformer.library.tag.TagLibTag) TagOutput(lucee.transformer.bytecode.statement.tag.TagOutput) Attribute(lucee.transformer.bytecode.statement.tag.Attribute) TagLib(lucee.transformer.library.tag.TagLib) TagOutput(lucee.transformer.bytecode.statement.tag.TagOutput) Body(lucee.transformer.bytecode.Body) BodyBase(lucee.transformer.bytecode.BodyBase)

Example 18 with TagLib

use of lucee.transformer.library.tag.TagLib in project Lucee by lucee.

the class AbstrCFMLScriptTransformer method cftagStatement.

private Statement cftagStatement(ExprData data, Body parent) throws TemplateException {
    // that is because cfloop-contition evaluator does not pass this
    if (data.ep == null)
        return null;
    final int start = data.srcCode.getPos();
    // namespace and separator
    final TagLib tagLib = CFMLTransformer.nameSpace(data);
    if (tagLib == null || !tagLib.isCore())
        return null;
    // print.e("namespace:"+tagLib.getNameSpaceAndSeparator());
    // get the name of the tag
    String id = CFMLTransformer.identifier(data.srcCode, false, true);
    if (id == null) {
        data.srcCode.setPos(start);
        return null;
    }
    id = id.toLowerCase();
    String appendix = null;
    TagLibTag tlt = tagLib.getTag(id);
    // get taglib
    if (tlt == null) {
        tlt = tagLib.getAppendixTag(id);
        if (tlt == null) {
            // if(tagLib.getIgnoreUnknowTags()){ if we do this a expression like the following no longer work cfwhatever=1;
            data.srcCode.setPos(start);
            return null;
        // }
        // throw new TemplateException(data.srcCode,"undefined tag ["+tagLib.getNameSpaceAndSeparator()+id+"]");
        }
        appendix = StringUtil.removeStartingIgnoreCase(id, tlt.getName());
    }
    if (tlt.getScript() == null) {
        data.srcCode.setPos(start);
        return null;
    }
    // check for opening bracked or closing semicolon
    comments(data);
    boolean noAttrs = false;
    if (!data.srcCode.forwardIfCurrent('(')) {
        if (checkSemiColonLineFeed(data, false, false, false)) {
            noAttrs = true;
        } else {
            data.srcCode.setPos(start);
            return null;
        }
    }
    Position line = data.srcCode.getPosition();
    // script specific behavior
    short context = CTX_OTHER;
    Boolean allowExpression = Boolean.TRUE;
    {
        TagLibTagScript script = tlt.getScript();
        if (script != null) {
            context = script.getContext();
            // always true for this tags allowExpression=script.getRtexpr()?Boolean.TRUE:Boolean.FALSE;
            if (context == CTX_CFC)
                data.isCFC = true;
            else if (context == CTX_INTERFACE)
                data.isInterface = true;
        }
    }
    Tag tag = getTag(data, parent, tlt, line, null);
    if (appendix != null) {
        tag.setAppendix(appendix);
        tag.setFullname(tlt.getFullName().concat(appendix));
    } else {
        tag.setFullname(tlt.getFullName());
    }
    tag.setTagLibTag(tlt);
    tag.setScriptBase(true);
    // add component meta data
    if (data.isCFC) {
        addMetaData(data, tag, IGNORE_LIST_COMPONENT);
    }
    if (data.isInterface) {
        addMetaData(data, tag, IGNORE_LIST_INTERFACE);
    }
    comments(data);
    // attributes
    Attribute[] attrs = noAttrs ? new Attribute[0] : attributes(tag, tlt, data, BRACKED, data.factory.EMPTY(), allowExpression, null, false, ',', true);
    data.srcCode.forwardIfCurrent(')');
    for (int i = 0; i < attrs.length; i++) {
        tag.addAttribute(attrs[i]);
    }
    comments(data);
    // body
    if (tlt.getHasBody()) {
        Body body = new BodyBase(data.factory);
        boolean wasSemiColon = statement(data, body, context);
        if (!wasSemiColon || !tlt.isBodyFree() || body.hasStatements())
            tag.setBody(body);
    } else
        checkSemiColonLineFeed(data, true, true, true);
    tag.setEnd(data.srcCode.getPosition());
    eval(tlt, data, tag);
    return tag;
}
Also used : TagLibTagScript(lucee.transformer.library.tag.TagLibTagScript) TagLibTag(lucee.transformer.library.tag.TagLibTag) Position(lucee.transformer.Position) Attribute(lucee.transformer.bytecode.statement.tag.Attribute) TagLib(lucee.transformer.library.tag.TagLib) TagLibTag(lucee.transformer.library.tag.TagLibTag) Tag(lucee.transformer.bytecode.statement.tag.Tag) RefBoolean(lucee.commons.lang.types.RefBoolean) ExprBoolean(lucee.transformer.expression.ExprBoolean) CastBoolean(lucee.transformer.bytecode.cast.CastBoolean) LitBoolean(lucee.transformer.expression.literal.LitBoolean) Body(lucee.transformer.bytecode.Body) ScriptBody(lucee.transformer.bytecode.ScriptBody) FunctionBody(lucee.transformer.bytecode.FunctionBody) BodyBase(lucee.transformer.bytecode.BodyBase)

Example 19 with TagLib

use of lucee.transformer.library.tag.TagLib in project Lucee by lucee.

the class GetTagList method _call.

private static lucee.runtime.type.Struct _call(PageContext pc, int dialect) throws PageException {
    Struct sct = new StructImpl();
    // synchronized(sct) {
    // hasSet=true;
    TagLib[] tlds;
    TagLibTag tag;
    tlds = ((ConfigImpl) pc.getConfig()).getTLDs(dialect);
    for (int i = 0; i < tlds.length; i++) {
        String ns = tlds[i].getNameSpaceAndSeparator();
        Map<String, TagLibTag> tags = tlds[i].getTags();
        Iterator<String> it = tags.keySet().iterator();
        Struct inner = new StructImpl();
        sct.set(ns, inner);
        while (it.hasNext()) {
            Object n = it.next();
            tag = tlds[i].getTag(n.toString());
            if (tag.getStatus() != TagLib.STATUS_HIDDEN && tag.getStatus() != TagLib.STATUS_UNIMPLEMENTED)
                inner.set(n.toString(), "");
        }
    }
    // }
    return sct;
}
Also used : TagLibTag(lucee.transformer.library.tag.TagLibTag) StructImpl(lucee.runtime.type.StructImpl) TagLib(lucee.transformer.library.tag.TagLib) Struct(lucee.runtime.type.Struct)

Aggregations

TagLib (lucee.transformer.library.tag.TagLib)19 TagLibTag (lucee.transformer.library.tag.TagLibTag)9 TemplateException (lucee.runtime.exp.TemplateException)5 CustomTagLib (lucee.transformer.library.tag.CustomTagLib)5 Resource (lucee.commons.io.res.Resource)4 ConfigImpl (lucee.runtime.config.ConfigImpl)3 BodyBase (lucee.transformer.bytecode.BodyBase)3 Attribute (lucee.transformer.bytecode.statement.tag.Attribute)3 EvaluatorException (lucee.transformer.cfml.evaluator.EvaluatorException)3 ComponentTemplateException (lucee.transformer.cfml.script.AbstrCFMLScriptTransformer.ComponentTemplateException)3 LitString (lucee.transformer.expression.literal.LitString)3 TagLibException (lucee.transformer.library.tag.TagLibException)3 IOException (java.io.IOException)2 ExtensionResourceFilter (lucee.commons.io.res.filter.ExtensionResourceFilter)2 Position (lucee.transformer.Position)2 Body (lucee.transformer.bytecode.Body)2 Page (lucee.transformer.bytecode.Page)2 Tag (lucee.transformer.bytecode.statement.tag.Tag)2 ExprTransformer (lucee.transformer.cfml.ExprTransformer)2 AttributeEvaluatorException (lucee.transformer.cfml.attributes.AttributeEvaluatorException)2