X-Git-Url: https://code.wpia.club/?a=blobdiff_plain;f=src%2Forg%2Fcacert%2Fgigi%2Foutput%2FTemplate.java;h=b6fb111e20e5419d31651a78a81df2429e59399f;hb=005ed4d2e8fa57b7ede403a310771c9fdf4a9578;hp=586c6dad495b631928b4ea5b0331c7c56f447f00;hpb=8fd2b8c84b2547f532a84f38750dbed4b0503a3b;p=gigi.git diff --git a/src/org/cacert/gigi/output/Template.java b/src/org/cacert/gigi/output/Template.java index 586c6dad..b6fb111e 100644 --- a/src/org/cacert/gigi/output/Template.java +++ b/src/org/cacert/gigi/output/Template.java @@ -1,11 +1,11 @@ package org.cacert.gigi.output; +import java.io.EOFException; +import java.io.IOException; import java.io.PrintWriter; import java.io.Reader; import java.util.LinkedList; import java.util.Map; -import java.util.Scanner; -import java.util.regex.Pattern; import org.cacert.gigi.Language; @@ -14,31 +14,48 @@ public class Template implements Outputable { Outputable[] vars; public Template(Reader r) { - LinkedList splitted = new LinkedList(); - LinkedList commands = new LinkedList(); - 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; + try { + 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(); + if (ch == -1) { + throw new EOFException(); + } + } + buf.delete(buf.length() - 2, buf.length()); + commands.add(parseCommand(buf.toString())); + buf.delete(0, buf.length()); } - 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()); + splitted.add(buf.toString()); + contents = splitted.toArray(new String[splitted.size()]); + vars = commands.toArray(new Outputable[commands.size()]); + r.close(); + } catch (IOException e) { + throw new Error(e); } - sc.close(); - contents = splitted.toArray(new String[splitted.size()]); - vars = commands.toArray(new Outputable[commands.size()]); + } + 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() {