2016-07-20 60 views
2

Ich versuche, eine in FreeMarker integrierte verwenden, aber ich habe Probleme mit einer bestimmten Situation.Verwenden von FreeMarker-Einbauten mit zugewiesenen Variablen über mehrere Zeilen

Warum funktioniert das

<#assign foo="bar" /> 
${foo?trim} 

aber nicht, dass

<#assign foo> 
    bar 
</#assign> 
${foo?trim} 

?

Ich erhalte diese Ausnahme:

FreeMarker template error: 
For "?trim" left-hand operand: Expected a string or something automatically convertible to string (number, date or boolean), but this has evaluated to a markup_output (wrapper: f.c.TemplateXHTMLOutputModel): 
==> foo [in template "template.ftl" at line 23, column 7] 

---- 
FTL stack trace ("~" means nesting-related): 
    - Failed at: ${foo?trim} [in template "faq.ftl" at line 23, column 5] 
---- 

Java stack trace (for programmers): 
---- 
freemarker.core.NonStringException: [... Exception message was already printed; see it above ...] 
    at freemarker.core.EvalUtil.coerceModelToTextualCommon(EvalUtil.java:494) 
    at freemarker.core.EvalUtil.coerceModelToStringOrUnsupportedMarkup(EvalUtil.java:407) 
    at freemarker.core.Expression.evalAndCoerceToStringOrUnsupportedMarkup(Expression.java:107) 
    at freemarker.core.BuiltInForString.getTargetString(BuiltInForString.java:34) 
    at freemarker.core.BuiltInForString._eval(BuiltInForString.java:29) 
    at freemarker.core.Expression.eval(Expression.java:81) 
    at freemarker.core.DollarVariable.calculateInterpolatedStringOrMarkup(DollarVariable.java:96) 
    at freemarker.core.DollarVariable.accept(DollarVariable.java:59) 
    at freemarker.core.Environment.visit(Environment.java:362) 
    at freemarker.core.Environment.visitAndTransform(Environment.java:460) 
    at freemarker.core.BlockAssignment.accept(BlockAssignment.java:55) 
    at freemarker.core.Environment.visit(Environment.java:326) 
    at freemarker.core.Environment.visit(Environment.java:332) 
    at freemarker.core.Environment.process(Environment.java:305) 
    at freemarker.template.Template.process(Template.java:384) 
    ... 

Ich brauche die zweite Form, weil bar mehrere Zeilen lang sein kann.
Wie kann ich das erreichen?

Antwort

3

Das Erfassen von Zuweisungen dient nicht zum Erstellen von mehrzeiligen Zeichenfolgenwerten. Das kann mit <#assign foo="line 1\nline 2"> erreicht werden, oder Sie können nur einen echten Zeilenumbruch statt der \n (im Gegensatz zu Java, Freemarker ermöglicht, dass):

<#assign foo=" 
    bar 
    baaz 
"> 
${foo?trim} 

Capturing für die Erfassung Fragmente Ausgabe gemacht wurde, so dass es herumgereicht und schließlich gedruckt werden. Sie haben Markup aufgrund Ihrer output_format (XHTML) erfasst, und es ist nicht wesentlich, wenn es nur Character-Daten enthält, es ist kein einfacher Text mehr und so String-Operationen (die die Regeln der erfassten Markup nicht kennen) und damit könnte es korrumpieren) sind darauf verboten.

Wenn Sie dies wirklich tun müssen, können Sie das erfasste Markup auf eine Zeichenfolge erzwingen und es so trimmen: ${foo?markup_string?trim}. Aber wissen Sie, dass schlimme Dinge passieren werden, wenn Sie Tags oder Entity-Referenzen erfasst haben, es sei denn, Sie wenden auch ?no_esc auf das getrimmte Ergebnis an.