]> WPIA git - gigi.git/blobdiff - src/org/cacert/gigi/output/Template.java
Use an URL-constructor for templates
[gigi.git] / src / org / cacert / gigi / output / Template.java
index 586c6dad495b631928b4ea5b0331c7c56f447f00..c7e90674c0370d4e46f0c78f92173630ea48d238 100644 (file)
@@ -1,11 +1,13 @@
 package org.cacert.gigi.output;
 
+import java.io.EOFException;
+import java.io.IOException;
+import java.io.InputStreamReader;
 import java.io.PrintWriter;
 import java.io.Reader;
+import java.net.URL;
 import java.util.LinkedList;
 import java.util.Map;
-import java.util.Scanner;
-import java.util.regex.Pattern;
 
 import org.cacert.gigi.Language;
 
@@ -13,39 +15,72 @@ public class Template implements Outputable {
        String[] contents;
        Outputable[] vars;
 
+       URL source;
+
+       public Template(URL u) {
+               try {
+                       source = u;
+                       Reader r = new InputStreamReader(u.openStream(), "UTF-8");
+                       parse(r);
+               } catch (IOException e) {
+                       throw new Error(e);
+               }
+       }
+
        public Template(Reader r) {
+               try {
+                       parse(r);
+               } catch (IOException e) {
+                       throw new Error(e);
+               }
+       }
+
+       private void parse(Reader r) throws IOException {
                LinkedList<String> splitted = new LinkedList<String>();
                LinkedList<Outputable> commands = new LinkedList<Outputable>();
-               Scanner sc = new Scanner(r);
-               Pattern p1 = Pattern.compile("([^<]|<[^?])*<\\?");
-               Pattern p2 = Pattern.compile("[^?]*\\?>");
-               while (true) {
-                       String s1 = sc.findWithinHorizon(p1, 0);
-                       if (s1 == null) {
-                               break;
+               StringBuffer buf = new StringBuffer();
+               int ch = r.read();
+               outer: while (true) {
+                       while (!endsWith(buf, "<?")) {
+                               if (ch == -1) {
+                                       break outer;
+                               }
+                               buf.append((char) ch);
+                               ch = r.read();
                        }
-                       s1 = s1.substring(0, s1.length() - 2);
-                       splitted.add(s1);
-                       String s2 = sc.findWithinHorizon(p2, 0);
-                       s2 = s2.substring(0, s2.length() - 2);
-                       commands.add(parseCommand(s2));
-               }
-               sc.useDelimiter("\0");
-               if (sc.hasNext()) {
-                       splitted.add(sc.next());
+                       buf.delete(buf.length() - 2, buf.length());
+                       splitted.add(buf.toString());
+                       buf.delete(0, buf.length());
+                       while (!endsWith(buf, "?>")) {
+                               buf.append((char) ch);
+                               ch = r.read();
+                               if (ch == -1) {
+                                       throw new EOFException();
+                               }
+                       }
+                       buf.delete(buf.length() - 2, buf.length());
+                       commands.add(parseCommand(buf.toString()));
+                       buf.delete(0, buf.length());
                }
-               sc.close();
+               splitted.add(buf.toString());
                contents = splitted.toArray(new String[splitted.size()]);
                vars = commands.toArray(new Outputable[commands.size()]);
+               r.close();
+       }
+
+       private boolean endsWith(StringBuffer buf, String string) {
+               return buf.length() >= string.length()
+                       && buf.substring(buf.length() - string.length(), buf.length()).equals(string);
        }
+
        private Outputable parseCommand(String s2) {
+               s2 = s2.replace("\n", "");
                if (s2.startsWith("=_")) {
                        final String raw = s2.substring(2);
                        return new Outputable() {
 
                                @Override
-                               public void output(PrintWriter out, Language l,
-                                               Map<String, Object> vars) {
+                               public void output(PrintWriter out, Language l, Map<String, Object> vars) {
                                        out.print(l.getTranslation(raw));
                                }
                        };
@@ -54,8 +89,7 @@ public class Template implements Outputable {
                        return new Outputable() {
 
                                @Override
-                               public void output(PrintWriter out, Language l,
-                                               Map<String, Object> vars) {
+                               public void output(PrintWriter out, Language l, Map<String, Object> vars) {
                                        outputVar(out, l, vars, raw);
                                }
                        };
@@ -71,8 +105,7 @@ public class Template implements Outputable {
                        return new Outputable() {
 
                                @Override
-                               public void output(PrintWriter out, Language l,
-                                               Map<String, Object> vars) {
+                               public void output(PrintWriter out, Language l, Map<String, Object> vars) {
                                        String[] parts = l.getTranslation(text).split("%s");
                                        String[] myvars = store.toArray(new String[store.size()]);
                                        out.print(parts[0]);
@@ -87,6 +120,7 @@ public class Template implements Outputable {
                }
                return null;
        }
+
        public void output(PrintWriter out, Language l, Map<String, Object> vars) {
                for (int i = 0; i < contents.length; i++) {
                        out.print(contents[i]);
@@ -95,8 +129,8 @@ public class Template implements Outputable {
                        }
                }
        }
-       private void outputVar(PrintWriter out, Language l,
-                       Map<String, Object> vars, String varname) {
+
+       private void outputVar(PrintWriter out, Language l, Map<String, Object> vars, String varname) {
                Object s = vars.get(varname);
 
                if (s == null) {