import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
-import org.cacert.gigi.util.HTMLEncoder;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
Element e = (Element) nl.item(i);
Element id = (Element) e.getElementsByTagName("id").item(0);
Element msg = (Element) e.getElementsByTagName("msg").item(0);
- translations.put(id.getTextContent(), HTMLEncoder.encodeHTML(msg.getTextContent()));
+ translations.put(id.getTextContent(), msg.getTextContent());
}
System.out.println(translations.size() + " strings loaded.");
}
private final String raw;
+ private final boolean escaped;
+
public OutputVariableCommand(String raw) {
- this.raw = raw;
+ if (raw.charAt(0) == '!') {
+ escaped = true;
+ this.raw = raw.substring(1);
+ } else {
+ escaped = true;
+ this.raw = raw;
+ }
}
@Override
public void output(PrintWriter out, Language l, Map<String, Object> vars) {
- Template.outputVar(out, l, vars, raw);
+ Template.outputVar(out, l, vars, raw, escaped);
}
}
import org.cacert.gigi.Language;
import org.cacert.gigi.output.Outputable;
+import org.cacert.gigi.util.HTMLEncoder;
public final class SprintfCommand implements Outputable {
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]);
+ out.print(HTMLEncoder.encodeHTML(parts[0]));
for (int j = 1; j < parts.length; j++) {
- Template.outputVar(out, l, vars, myvars[j - 1].substring(1));
- out.print(parts[j]);
+ String var = myvars[j - 1];
+ if (var.startsWith("$!")) {
+ Template.outputVar(out, l, vars, myvars[j - 1].substring(2), true);
+ } else {
+ Template.outputVar(out, l, vars, myvars[j - 1].substring(1), false);
+ }
+ out.print(HTMLEncoder.encodeHTML(parts[j]));
}
}
}
import org.cacert.gigi.DevelLauncher;
import org.cacert.gigi.Language;
import org.cacert.gigi.output.Outputable;
+import org.cacert.gigi.util.HTMLEncoder;
public class Template implements Outputable {
data.output(out, l, vars);
}
- protected static void outputVar(PrintWriter out, Language l, Map<String, Object> vars, String varname) {
+ protected static void outputVar(PrintWriter out, Language l, Map<String, Object> vars, String varname, boolean unescaped) {
Object s = vars.get(varname);
if (s == null) {
if (s instanceof Outputable) {
((Outputable) s).output(out, l, vars);
} else {
- out.print(s);
+ out.print(s == null ? "null" : (unescaped ? s.toString() : HTMLEncoder.encodeHTML(s.toString())));
}
}
}
import org.cacert.gigi.Language;
import org.cacert.gigi.output.Outputable;
+import org.cacert.gigi.util.HTMLEncoder;
public final class TranslateCommand implements Outputable {
@Override
public void output(PrintWriter out, Language l, Map<String, Object> vars) {
- out.print(l.getTranslation(raw));
+ out.print(HTMLEncoder.encodeHTML(l.getTranslation(raw)));
}
}
<input type="checkbox" id="CCA" name="CCA" />
</td>
<td align="left">
- <label for="CCA"><strong><?=s,$CCA,I accept the CAcert Community Agreement (%s).?> </strong><br />
+ <label for="CCA"><strong><?=s,$!CCA,I accept the CAcert Community Agreement (%s).?> </strong><br />
<?=_Please note: You need to accept the CCA to proceed.?></label>
</td>
</tr>
<tr>
<td valign="top"><?=_Alert me if?>: </td>
<td align="left">
- <input type="checkbox" name="general" value="1"<?=$general?>><?=_General Announcements?><br>
- <input type="checkbox" name="country" value="1"<?=$country?>><?=_Country Announcements?><br>
- <input type="checkbox" name="regional" value="1"<?=$regional?>><?=_Regional Announcements?><br>
- <input type="checkbox" name="radius" value="1"<?=$radius?>><?=_Within 200km Announcements?></td>
+ <input type="checkbox" name="general" value="1"<?=$!general?>><?=_General Announcements?><br>
+ <input type="checkbox" name="country" value="1"<?=$!country?>><?=_Country Announcements?><br>
+ <input type="checkbox" name="regional" value="1"<?=$!regional?>><?=_Regional Announcements?><br>
+ <input type="checkbox" name="radius" value="1"<?=$!radius?>><?=_Within 200km Announcements?></td>
<td> </td>
</tr>