0

我正在尝试将 StringTemplate.v4 用于简单的模板,这意味着只有简单的间隙名称,例如%body%-- 我没有使用任何其他功能,例如 if-logic、子模板或表达式。

(老实说,它的API文档记录很差,此时我正在考虑完全放弃它。如果有 JavaDoc源代码链接会很好,所以至少我可以自己挖掘并解决问题。真的很沮丧.)

我正在尝试确定匿名模板中存在的差距,以在尝试使用它之前验证它是否具有所需的差距。

   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()中返回,以及关于这个问题:StringTemplate list of attributes defined for a given template)。nullformalArguments

那么,在填补任何空白之前,如何获得匿名模板中实际存在的所有空白呢?我意识到我可以用 regex做到这一点,但我希望有一种内置的方式来做到这一点。

谢谢。

4

1 回答 1

-1

我决定放弃 StringTemplate4。事实上,我只是推出了自己的,因为几乎所有“轻量级”Java 模板解决方案都具有高级特性(如循环、表达式、逻辑、模板“组”),而我不想要其中的任何一个。我只想要间隙(Hi %name%)。

它被称为Template FeatherweightGitHub 链接)。

这里有两个例子:

首先,将完全填充的模板呈现为字符串的基本用法:

   import  com.github.aliteralmind.templatefeather.FeatherTemplate;
public class HelloFeather  {
   public static final void main(String[] ignored)  {
      String origText = &quot;Hello %name%. I like you, %name%, %pct_num%__PCT__ guaranteed.&quot;;

      String rendered = (new FeatherTemplate(origText,
         null)).                        //debug on=System.out, off=null
            fill(&quot;name&quot;, &quot;Ralph&quot;).
            fill(&quot;pct_num&quot;, 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 = &quot;Hello %name%. I like you, %name%, %pct_num%__PCT__ guaranteed.&quot;;

      FeatherTemplate tmpl = new FeatherTemplate(origText,
         null);  //debug on=System.out, off=null

      tmpl.setAutoRenderer(System.out);

      System.out.println(&quot;<--Auto renderer set.&quot;);
      tmpl.fill(&quot;name&quot;, &quot;Ralph&quot;);

      System.out.println(&quot;<--Filled first gap&quot;);
      tmpl.fill(&quot;pct_num&quot;, 45);

      System.out.println(&quot;<--Filled second-and-final gap&quot;);
   }
}

输出:

Hello <--Auto renderer set.
Ralph. I like you, Ralph, <--Filled first gap
45% guaranteed.<--Filled second-and-final gap
于 2014-07-01T20:24:00.447 回答