我试图将StringTemplate.v4用于简化模板,这意味着只有简单的间隙名称,如%body%
- 我没有使用任何其他功能,例如if-logic,sub-模板或表达。
(说实话,它的API文档记录很少,而且此时我还在考虑完全放弃它。如果有JavaDoc source code links会很好,所以至少我可以自己挖掘并自己解决问题。真的很沮丧。)
我试图确定匿名模板中存在的差距,以便在尝试使用之前验证它是否具有所需的间隙。
import java.util.Arrays;
import java.util.Map;
import java.util.Set;
import org.stringtemplate.v4.ST;
import org.stringtemplate.v4.compiler.FormalArgument;
public class GapsInAnST {
public static final void main(String[] ignored) {
ST tmpl = new ST("Hello %name%. You are %age% years old.", '%', '%');
Map<String,Object> gapMap = tmpl.getAttributes();
System.out.println("gapMap=" + gapMap);
if(gapMap != null) {
System.out.println("getAttributes()=" + Arrays.toString(gapMap.keySet().toArray()));
}
System.out.println("tmpl.impl.hasFormalArgs=" + tmpl.impl.hasFormalArgs);
Map<String,FormalArgument> formalArgMap = tmpl.impl.formalArguments;
if(formalArgMap != null) {
System.out.println("getAttributes()=" + Arrays.toString(formalArgMap.keySet().toArray()));
}
tmpl.add("name", "Seymour");
tmpl.add("age", "43");
System.out.println(tmpl.render());
}
}
输出:
gapMap=null
tmpl.impl.hasFormalArgs=false
Hello Seymour. You are 43 years old.
我发现getAttributes()
在this google groups thread中返回null
,在此问题中回复formalArguments
的原因StringTemplate list of attributes defined for a given template。
那么在填补任何空白之前,如何在匿名模板中获得实际存在的所有差距?我意识到我可以做到with regex,但我希望有一种内置的方法来做到这一点。
感谢。
答案 0 :(得分:-1)
我决定放弃StringTemplate4。事实上,我只是自己动手,因为几乎所有“轻量级”Java模板解决方案都具有高级功能(如循环,表达式,逻辑,模板“组”),我不想要任何它。我只想要差距(Hi %name%
)。
它被称为Template Featherweight(GitHub link)。
以下是两个例子:
首先,将完全填充模板呈现为字符串的基本用法:
import com.github.aliteralmind.templatefeather.FeatherTemplate;
public class HelloFeather {
public static final void main(String[] ignored) {
String origText = "Hello %name%. I like you, %name%, %pct_num%__PCT__ guaranteed.";
String rendered = (new FeatherTemplate(origText,
null)). //debug on=System.out, off=null
fill("name", "Ralph").
fill("pct_num", 45).
getFilled();
System.out.println(rendered);
}
}
输出:
Hello Ralph. I like you, Ralph, 45% guaranteed.
第二个示例演示了“自动呈现”,它将模板作为其填充的呈现为字符串以外的其他内容,例如文件或流 - 或者您可以将其包装到Appendable
:
import com.github.aliteralmind.templatefeather.FeatherTemplate;
public class FeatherAutoRenderDemo {
public static final void main(String[] ignored) {
String origText = "Hello %name%. I like you, %name%, %pct_num%__PCT__ guaranteed.";
FeatherTemplate tmpl = new FeatherTemplate(origText,
null); //debug on=System.out, off=null
tmpl.setAutoRenderer(System.out);
System.out.println("<--Auto renderer set.");
tmpl.fill("name", "Ralph");
System.out.println("<--Filled first gap");
tmpl.fill("pct_num", 45);
System.out.println("<--Filled second-and-final gap");
}
}
输出:
Hello <--Auto renderer set.
Ralph. I like you, Ralph, <--Filled first gap
45% guaranteed.<--Filled second-and-final gap