1 package org.cacert.gigi.output;
3 import java.io.PrintWriter;
5 import java.util.LinkedList;
7 import java.util.Scanner;
8 import java.util.regex.Pattern;
10 import org.cacert.gigi.Language;
12 public class Template implements Outputable {
16 public Template(Reader r) {
17 LinkedList<String> splitted = new LinkedList<String>();
18 LinkedList<Outputable> commands = new LinkedList<Outputable>();
19 Scanner sc = new Scanner(r);
20 Pattern p1 = Pattern.compile("([^<]|<[^?])*<\\?");
21 Pattern p2 = Pattern.compile("([^<]|<[^?])*\\?>");
23 String s1 = sc.findWithinHorizon(p1, 0);
27 s1 = s1.substring(0, s1.length() - 2);
29 String s2 = sc.findWithinHorizon(p2, 0);
30 s2 = s2.substring(0, s2.length() - 2);
31 commands.add(parseCommand(s2));
33 sc.useDelimiter("\0");
35 splitted.add(sc.next());
38 contents = splitted.toArray(new String[splitted.size()]);
39 vars = commands.toArray(new Outputable[commands.size()]);
41 private Outputable parseCommand(String s2) {
42 if (s2.startsWith("=_")) {
43 final String raw = s2.substring(2);
44 return new Outputable() {
47 public void output(PrintWriter out, Language l,
48 Map<String, Object> vars) {
49 out.print(l.getTranslation(raw));
52 } else if (s2.startsWith("=$")) {
53 final String raw = s2.substring(2);
54 return new Outputable() {
57 public void output(PrintWriter out, Language l,
58 Map<String, Object> vars) {
59 outputVar(out, l, vars, raw);
62 } else if (s2.startsWith("=s,")) {
63 String command = s2.substring(3);
64 final LinkedList<String> store = new LinkedList<String>();
65 while (command.startsWith("$")) {
66 int idx = command.indexOf(",");
67 store.add(command.substring(0, idx));
68 command = command.substring(idx + 1);
70 final String text = command;
71 return new Outputable() {
74 public void output(PrintWriter out, Language l,
75 Map<String, Object> vars) {
76 String[] parts = l.getTranslation(text).split("%s");
77 String[] myvars = store.toArray(new String[store.size()]);
79 for (int j = 1; j < parts.length; j++) {
80 outputVar(out, l, vars, myvars[j - 1].substring(1));
86 System.out.println("Unknown processing instruction: " + s2);
90 public void output(PrintWriter out, Language l, Map<String, Object> vars) {
91 for (int i = 0; i < contents.length; i++) {
92 out.print(contents[i]);
93 if (i < this.vars.length) {
94 this.vars[i].output(out, l, vars);
98 private void outputVar(PrintWriter out, Language l,
99 Map<String, Object> vars, String varname) {
100 Object s = vars.get(varname);
103 System.out.println("Empty variable: " + varname);
105 if (s instanceof Outputable) {
106 ((Outputable) s).output(out, l, vars);