如何在添加任何属性之前从匿名StringTemplate(v4)获取gap-name列表?

时间:2014-05-05 18:41:20

标签: java stringtemplate stringtemplate-4

我试图将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,但我希望有一种内置的方法来做到这一点。

感谢。

1 个答案:

答案 0 :(得分:-1)

我决定放弃StringTemplate4。事实上,我只是自己动手,因为几乎所有“轻量级”Java模板解决方案都具有高级功能(如循环,表达式,逻辑,模板“组”),我不想要任何它。我只想要差距(Hi %name%)。

它被称为Template FeatherweightGitHub link)。

以下是两个例子:

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

   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