import java.io.Reader;
import java.net.URISyntaxException;
import java.net.URL;
+import java.text.SimpleDateFormat;
+import java.util.Collection;
+import java.util.Date;
import java.util.LinkedList;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
-import org.cacert.gigi.DevelLauncher;
import org.cacert.gigi.localisation.Language;
+import org.cacert.gigi.output.DateSelector;
+import org.cacert.gigi.util.DayDate;
import org.cacert.gigi.util.HTMLEncoder;
+/**
+ * Represents a loaded template file.
+ */
public class Template implements Outputable {
- class ParseResult {
+ private static class ParseResult {
TemplateBlock block;
private File source;
- private static final Pattern CONTROL_PATTERN = Pattern.compile(" ?([a-z]+)\\(\\$([^)]+)\\) ?\\{ ?");
+ private static final Pattern CONTROL_PATTERN = Pattern.compile(" ?([a-zA-Z]+)\\(\\$([^)]+)\\) ?\\{ ?");
private static final Pattern ELSE_PATTERN = Pattern.compile(" ?\\} ?else ?\\{ ?");
+ /**
+ * Creates a new template by parsing the contents from the given URL. This
+ * constructor will fail on syntax error. When the URL points to a file,
+ * {@link File#lastModified()} is monitored for changes of the template.
+ *
+ * @param u
+ * the URL to load the template from. UTF-8 is chosen as charset.
+ */
public Template(URL u) {
try {
Reader r = new InputStreamReader(u.openStream(), "UTF-8");
try {
- if (u.getProtocol().equals("file") && DevelLauncher.DEVEL) {
+ if (u.getProtocol().equals("file")) {
source = new File(u.toURI());
lastLoaded = source.lastModified() + 1000;
}
}
}
+ /**
+ * Creates a new template by parsing the contents from the given reader.
+ * This constructor will fail on syntax error.
+ *
+ * @param r
+ * the Reader containing the data.
+ */
public Template(Reader r) {
try {
data = parse(r).getBlock(null);
private ParseResult parse(Reader r) throws IOException {
LinkedList<String> splitted = new LinkedList<String>();
- LinkedList<Outputable> commands = new LinkedList<Outputable>();
+ LinkedList<Translatable> commands = new LinkedList<Translatable>();
StringBuffer buf = new StringBuffer();
String blockType = null;
outer:
}
}
splitted.add(buf.toString());
- return new ParseResult(new TemplateBlock(splitted.toArray(new String[splitted.size()]), commands.toArray(new Outputable[commands.size()])), blockType);
+ return new ParseResult(new TemplateBlock(splitted.toArray(new String[splitted.size()]), commands.toArray(new Translatable[commands.size()])), blockType);
}
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) {
+ private Translatable parseCommand(String s2) {
if (s2.startsWith("=_")) {
final String raw = s2.substring(2);
if ( !s2.contains("$") && !s2.contains("!'")) {
@Override
public void output(PrintWriter out, Language l, Map<String, Object> vars) {
- if (source != null && DevelLauncher.DEVEL) {
- if (lastLoaded < source.lastModified()) {
- try {
- System.out.println("Reloading template.... " + source);
- InputStreamReader r = new InputStreamReader(new FileInputStream(source), "UTF-8");
- data = parse(r).getBlock(null);
- r.close();
- lastLoaded = source.lastModified() + 1000;
- } catch (IOException e) {
- e.printStackTrace();
- }
+ if (source != null && lastLoaded < source.lastModified()) {
+ try {
+ System.out.println("Reloading template.... " + source);
+ InputStreamReader r = new InputStreamReader(new FileInputStream(source), "UTF-8");
+ data = parse(r).getBlock(null);
+ r.close();
+ lastLoaded = source.lastModified() + 1000;
+ } catch (IOException e) {
+ e.printStackTrace();
}
}
data.output(out, l, vars);
}
if (s instanceof Outputable) {
((Outputable) s).output(out, l, vars);
+ } else if (s instanceof DayDate) {
+ out.print(DateSelector.getDateFormat().format(((DayDate) s).toDate()));
+ } else if (s instanceof Date) {
+ SimpleDateFormat sdfUI = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+ SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'");
+ out.print("<time datetime=\"" + sdf.format(s) + "\">");
+ out.print(sdfUI.format(s));
+ out.print(" UTC</time>");
} else {
out.print(s == null ? "null" : (unescaped ? s.toString() : HTMLEncoder.encodeHTML(s.toString())));
}
}
+
+ public void addTranslations(Collection<String> s) {
+ data.addTranslations(s);
+ }
}