Search in sources :

Example 6 with TemplateTransformModel

use of freemarker.template.TemplateTransformModel in project freemarker by apache.

the class UnifiedCall method accept.

@Override
TemplateElement[] accept(Environment env) throws TemplateException, IOException {
    TemplateModel tm = nameExp.eval(env);
    // shortcut here.
    if (tm == Macro.DO_NOTHING_MACRO)
        return null;
    if (tm instanceof Macro) {
        Macro macro = (Macro) tm;
        if (macro.isFunction() && !legacySyntax) {
            throw new _MiscTemplateException(env, "Routine ", new _DelayedJQuote(macro.getName()), " is a function, not a directive. " + "Functions can only be called from expressions, like in ${f()}, ${x + f()} or ", "<@someDirective someParam=f() />", ".");
        }
        env.invoke(macro, namedArgs, positionalArgs, bodyParameterNames, this);
    } else {
        boolean isDirectiveModel = tm instanceof TemplateDirectiveModel;
        if (isDirectiveModel || tm instanceof TemplateTransformModel) {
            Map args;
            if (namedArgs != null && !namedArgs.isEmpty()) {
                args = new HashMap();
                for (Iterator it = namedArgs.entrySet().iterator(); it.hasNext(); ) {
                    Map.Entry entry = (Map.Entry) it.next();
                    String key = (String) entry.getKey();
                    Expression valueExp = (Expression) entry.getValue();
                    TemplateModel value = valueExp.eval(env);
                    args.put(key, value);
                }
            } else {
                args = EmptyMap.instance;
            }
            if (isDirectiveModel) {
                env.visit(getChildBuffer(), (TemplateDirectiveModel) tm, args, bodyParameterNames);
            } else {
                env.visitAndTransform(getChildBuffer(), (TemplateTransformModel) tm, args);
            }
        } else if (tm == null) {
            throw InvalidReferenceException.getInstance(nameExp, env);
        } else {
            throw new NonUserDefinedDirectiveLikeException(nameExp, tm, env);
        }
    }
    return null;
}
Also used : HashMap(java.util.HashMap) TemplateModel(freemarker.template.TemplateModel) Iterator(java.util.Iterator) TemplateTransformModel(freemarker.template.TemplateTransformModel) HashMap(java.util.HashMap) EmptyMap(freemarker.template.EmptyMap) Map(java.util.Map) TemplateDirectiveModel(freemarker.template.TemplateDirectiveModel)

Example 7 with TemplateTransformModel

use of freemarker.template.TemplateTransformModel in project be5 by DevelopmentOnTheEdge.

the class Environment method getNodeProcessor.

private TemplateModel getNodeProcessor(Namespace ns, String localName, String nsURI) throws TemplateException {
    TemplateModel result = null;
    if (nsURI == null) {
        result = ns.get(localName);
        if (!(result instanceof Macro) && !(result instanceof TemplateTransformModel)) {
            result = null;
        }
    } else {
        Template template = ns.getTemplate();
        String prefix = template.getPrefixForNamespace(nsURI);
        if (prefix == null) {
            // since it has no prefix registered for the namespace
            return null;
        }
        if (prefix.length() > 0) {
            result = ns.get(prefix + ":" + localName);
            if (!(result instanceof Macro) && !(result instanceof TemplateTransformModel)) {
                result = null;
            }
        } else {
            if (nsURI.length() == 0) {
                result = ns.get(Template.NO_NS_PREFIX + ":" + localName);
                if (!(result instanceof Macro) && !(result instanceof TemplateTransformModel)) {
                    result = null;
                }
            }
            if (nsURI.equals(template.getDefaultNS())) {
                result = ns.get(Template.DEFAULT_NAMESPACE_PREFIX + ":" + localName);
                if (!(result instanceof Macro) && !(result instanceof TemplateTransformModel)) {
                    result = null;
                }
            }
            if (result == null) {
                result = ns.get(localName);
                if (!(result instanceof Macro) && !(result instanceof TemplateTransformModel)) {
                    result = null;
                }
            }
        }
    }
    return result;
}
Also used : TemplateTransformModel(freemarker.template.TemplateTransformModel) TemplateModel(freemarker.template.TemplateModel) Template(freemarker.template.Template)

Example 8 with TemplateTransformModel

use of freemarker.template.TemplateTransformModel in project be5 by DevelopmentOnTheEdge.

the class Environment method visit.

/**
 * "Visit" A TemplateNodeModel
 */
void visit(TemplateNodeModel node, TemplateSequenceModel namespaces) throws TemplateException, IOException {
    if (nodeNamespaces == null) {
        SimpleSequence ss = new SimpleSequence(1);
        ss.add(currentNamespace);
        nodeNamespaces = ss;
    }
    int prevNodeNamespaceIndex = this.nodeNamespaceIndex;
    String prevNodeName = this.currentNodeName;
    String prevNodeNS = this.currentNodeNS;
    TemplateSequenceModel prevNodeNamespaces = nodeNamespaces;
    TemplateNodeModel prevVisitorNode = currentVisitorNode;
    currentVisitorNode = node;
    if (namespaces != null) {
        this.nodeNamespaces = namespaces;
    }
    try {
        TemplateModel macroOrTransform = getNodeProcessor(node);
        if (macroOrTransform instanceof Macro) {
            visit((Macro) macroOrTransform, null, null, null, null);
        } else if (macroOrTransform instanceof TemplateTransformModel) {
            visitAndTransform(null, (TemplateTransformModel) macroOrTransform, null);
        } else {
            String nodeType = node.getNodeType();
            if (nodeType != null) {
                // If the node's type is 'text', we just output it.
                if ((nodeType.equals("text") && node instanceof TemplateScalarModel)) {
                    out.write(((TemplateScalarModel) node).getAsString());
                } else if (nodeType.equals("document")) {
                    recurse(node, namespaces);
                } else // we just ignore it.
                if (!nodeType.equals("pi") && !nodeType.equals("comment") && !nodeType.equals("document_type")) {
                    throw new _MiscTemplateException(this, noNodeHandlerDefinedDescription(node, node.getNodeNamespace(), nodeType));
                }
            } else {
                throw new _MiscTemplateException(this, noNodeHandlerDefinedDescription(node, node.getNodeNamespace(), "default"));
            }
        }
    } finally {
        this.currentVisitorNode = prevVisitorNode;
        this.nodeNamespaceIndex = prevNodeNamespaceIndex;
        this.currentNodeName = prevNodeName;
        this.currentNodeNS = prevNodeNS;
        this.nodeNamespaces = prevNodeNamespaces;
    }
}
Also used : TemplateSequenceModel(freemarker.template.TemplateSequenceModel) TemplateNodeModel(freemarker.template.TemplateNodeModel) TemplateTransformModel(freemarker.template.TemplateTransformModel) TemplateScalarModel(freemarker.template.TemplateScalarModel) TemplateModel(freemarker.template.TemplateModel) SimpleSequence(freemarker.template.SimpleSequence)

Aggregations

TemplateModel (freemarker.template.TemplateModel)8 TemplateTransformModel (freemarker.template.TemplateTransformModel)8 EmptyMap (freemarker.template.EmptyMap)2 SimpleSequence (freemarker.template.SimpleSequence)2 Template (freemarker.template.Template)2 TemplateNodeModel (freemarker.template.TemplateNodeModel)2 TemplateScalarModel (freemarker.template.TemplateScalarModel)2 TemplateSequenceModel (freemarker.template.TemplateSequenceModel)2 HashMap (java.util.HashMap)2 Iterator (java.util.Iterator)2 Map (java.util.Map)2 TemplateDirectiveModel (freemarker.template.TemplateDirectiveModel)1