Как получить список пробелов из анонимного StringTemplate (v4) перед добавлением каких-либо атрибутов?

Я пытаюсь использовать StringTemplate.v4 для упрощенных шаблонов, имея в виду только простые имена пробелов, такие как %body% — я не использую никаких других функций, таких как логика if, подшаблоны или выражения.

(Честно говоря, его 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() возвращает null в этой ветки групп Google и о formalArguments в этом вопросе: список атрибутов StringTemplate, определенных для данного шаблона).

Итак, как мне получить все пробелы, фактически существующие в анонимном шаблоне, прежде чем заполнить какие-либо пробелы? Я понимаю, что мог бы сделать это с помощью регулярного выражения , но я надеюсь, что есть встроенный способ сделать это.

Спасибо.


person aliteralmind    schedule 05.05.2014    source источник


Ответы (1)


Я решил отказаться от StringTemplate4. На самом деле, я только что свернул свой собственный, так как почти все «легкие» решения для шаблонов Java имеют расширенные функции (такие как циклы, выражения, логика, шаблонные «группы»), и мне ничего из этого не нужно. Мне просто нужны пробелы (Hi %name%).

Он называется Шаблон Featherweight (ссылка на GitHub).

Вот два примера:

Во-первых, основное использование, которое преобразует полностью заполненный шаблон в строку:

   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
person aliteralmind    schedule 01.07.2014