X-Git-Url: https://code.wpia.club/?a=blobdiff_plain;f=src%2Forg%2Fcacert%2Fgigi%2Foutput%2Ftemplate%2FTemplate.java;h=b8dd7424c5248b9f1ca523988d488e9e9d8de637;hb=aab4ada5bc95c12edd9db623c4a78e26866691dc;hp=57cbd6f2a23439d56849694894760939bfb8871f;hpb=872e9a7ac8a8a143fe63e178e349663fb524d9d7;p=gigi.git diff --git a/src/org/cacert/gigi/output/template/Template.java b/src/org/cacert/gigi/output/template/Template.java index 57cbd6f2..b8dd7424 100644 --- a/src/org/cacert/gigi/output/template/Template.java +++ b/src/org/cacert/gigi/output/template/Template.java @@ -19,33 +19,12 @@ import org.cacert.gigi.Language; import org.cacert.gigi.output.Outputable; public class Template implements Outputable { - static class TemplateBlock implements Outputable { - String[] contents; - Outputable[] vars; - - public TemplateBlock(String[] contents, Outputable[] vars) { - this.contents = contents; - this.vars = vars; - } - - @Override - public void output(PrintWriter out, Language l, Map vars) { - for (int i = 0; i < contents.length; i++) { - out.print(contents[i]); - if (i < this.vars.length) { - this.vars[i].output(out, l, vars); - } - } - } - - } - TemplateBlock data; long lastLoaded; File source; - private static final Pattern IF_PATTERN = Pattern.compile(" ?if\\(\\$([^)]+)\\) ?\\{ ?"); + private static final Pattern CONTROL_PATTERN = Pattern.compile(" ?([a-z]+)\\(\\$([^)]+)\\) ?\\{ ?"); public Template(URL u) { try { @@ -78,42 +57,39 @@ public class Template implements Outputable { LinkedList splitted = new LinkedList(); LinkedList commands = new LinkedList(); StringBuffer buf = new StringBuffer(); - int ch = r.read(); outer: while (true) { while (!endsWith(buf, "")) { - buf.append((char) ch); - ch = r.read(); + int ch = r.read(); if (ch == -1) { throw new EOFException(); } + buf.append((char) ch); } buf.delete(buf.length() - 2, buf.length()); String com = buf.toString().replace("\n", ""); buf.delete(0, buf.length()); - Matcher m = IF_PATTERN.matcher(com); + Matcher m = CONTROL_PATTERN.matcher(com); if (m.matches()) { - final String variable = m.group(1); - final TemplateBlock body = parse(r); - commands.add(new Outputable() { - - @Override - public void output(PrintWriter out, Language l, Map vars) { - Object o = vars.get(variable); - if (o instanceof Boolean && o == Boolean.TRUE) { - body.output(out, l, vars); - } - } - }); + String type = m.group(1); + String variable = m.group(2); + TemplateBlock body = parse(r); + if (type.equals("if")) { + commands.add(new IfStatement(variable, body)); + } else if (type.equals("foreach")) { + commands.add(new ForeachStatement(variable, body)); + } else { + throw new IOException("Syntax error: unknown control structure: " + type); + } continue; } if (com.matches(" ?\\} ?")) { @@ -135,22 +111,10 @@ public class Template implements Outputable { private Outputable parseCommand(String s2) { if (s2.startsWith("=_")) { final String raw = s2.substring(2); - return new Outputable() { - - @Override - public void output(PrintWriter out, Language l, Map vars) { - out.print(l.getTranslation(raw)); - } - }; + return new TranslateCommand(raw); } else if (s2.startsWith("=$")) { final String raw = s2.substring(2); - return new Outputable() { - - @Override - public void output(PrintWriter out, Language l, Map vars) { - outputVar(out, l, vars, raw); - } - }; + return new OutputVariableCommand(raw); } else if (s2.startsWith("=s,")) { String command = s2.substring(3); final LinkedList store = new LinkedList(); @@ -160,19 +124,7 @@ public class Template implements Outputable { command = command.substring(idx + 1); } final String text = command; - return new Outputable() { - - @Override - public void output(PrintWriter out, Language l, Map vars) { - String[] parts = l.getTranslation(text).split("%s"); - String[] myvars = store.toArray(new String[store.size()]); - out.print(parts[0]); - for (int j = 1; j < parts.length; j++) { - outputVar(out, l, vars, myvars[j - 1].substring(1)); - out.print(parts[j]); - } - } - }; + return new SprintfCommand(text, store); } else { System.out.println("Unknown processing instruction: " + s2); } @@ -185,7 +137,7 @@ public class Template implements Outputable { try { System.out.println("Reloading template.... " + source); InputStreamReader r = new InputStreamReader(new FileInputStream(source), "UTF-8"); - parse(r); + data = parse(r); r.close(); lastLoaded = source.lastModified() + 1000; } catch (IOException e) { @@ -196,7 +148,7 @@ public class Template implements Outputable { data.output(out, l, vars); } - private void outputVar(PrintWriter out, Language l, Map vars, String varname) { + protected static void outputVar(PrintWriter out, Language l, Map vars, String varname) { Object s = vars.get(varname); if (s == null) {