diff --git a/src/helma/util/HtmlEncoder.java b/src/helma/util/HtmlEncoder.java
index d9b23fa9..bc99301c 100644
--- a/src/helma/util/HtmlEncoder.java
+++ b/src/helma/util/HtmlEncoder.java
@@ -158,94 +158,248 @@ public final class HtmlEncoder {
};
+ static final HashSet allTags = new HashSet ();
+ static {
+ allTags.add ("a");
+ allTags.add ("abbr");
+ allTags.add ("address");
+ allTags.add ("applet");
+ allTags.add ("area");
+ allTags.add ("b");
+ allTags.add ("base");
+ allTags.add ("basefont");
+ allTags.add ("bgsound");
+ allTags.add ("big");
+ allTags.add ("blink");
+ allTags.add ("blockquote");
+ allTags.add ("bq");
+ allTags.add ("body");
+ allTags.add ("br");
+ allTags.add ("button");
+ allTags.add ("caption");
+ allTags.add ("center");
+ allTags.add ("cite");
+ allTags.add ("code");
+ allTags.add ("col");
+ allTags.add ("colgroup");
+ allTags.add ("del");
+ allTags.add ("dir");
+ allTags.add ("div");
+ allTags.add ("dl");
+ allTags.add ("dt");
+ allTags.add ("dd");
+ allTags.add ("em");
+ allTags.add ("embed");
+ allTags.add ("fieldset");
+ allTags.add ("font");
+ allTags.add ("form");
+ allTags.add ("frame");
+ allTags.add ("frameset");
+ allTags.add ("h1");
+ allTags.add ("h2");
+ allTags.add ("h3");
+ allTags.add ("h4");
+ allTags.add ("h5");
+ allTags.add ("h6");
+ allTags.add ("head");
+ allTags.add ("html");
+ allTags.add ("i");
+ allTags.add ("iframe");
+ allTags.add ("img");
+ allTags.add ("input");
+ allTags.add ("ins");
+ allTags.add ("isindex");
+ allTags.add ("kbd");
+ allTags.add ("li");
+ allTags.add ("link");
+ allTags.add ("listing");
+ allTags.add ("map");
+ allTags.add ("marquee");
+ allTags.add ("menu");
+ allTags.add ("meta");
+ allTags.add ("nobr");
+ allTags.add ("noframes");
+ allTags.add ("object");
+ allTags.add ("ol");
+ allTags.add ("option");
+ allTags.add ("optgroup");
+ allTags.add ("p");
+ allTags.add ("param");
+ allTags.add ("plaintext");
+ allTags.add ("pre");
+ allTags.add ("q");
+ allTags.add ("samp");
+ allTags.add ("script");
+ allTags.add ("select");
+ allTags.add ("small");
+ allTags.add ("span");
+ allTags.add ("strike");
+ allTags.add ("strong");
+ allTags.add ("style");
+ allTags.add ("sub");
+ allTags.add ("sup");
+ allTags.add ("table");
+ allTags.add ("tbody");
+ allTags.add ("td");
+ allTags.add ("textarea");
+ allTags.add ("tfoot");
+ allTags.add ("th");
+ allTags.add ("thead");
+ allTags.add ("title");
+ allTags.add ("tr");
+ allTags.add ("tt");
+ allTags.add ("u");
+ allTags.add ("ul");
+ allTags.add ("var");
+ allTags.add ("wbr");
+ allTags.add ("xmp");
+ allTags.add ("%");
+ }
+
+ // tags which signal us to start suppressing \n ->
encoding
+ // these are "structrural" tags, for example, we don't want to add
s
+ // between a
+ static final HashSet encodeLinebreakTags = new HashSet ();
+ static {
+ encodeLinebreakTags.add ("td");
+ encodeLinebreakTags.add ("th");
+ encodeLinebreakTags.add ("li");
+ }
+
/**
- *
- */
+ *
+ */
public final static String encode (String str) {
// try to make stringbuffer large enough from the start
StringBuffer ret = new StringBuffer (Math.round (str.length()*1.4f));
encode (str, ret);
- return ret.toString();
+ return ret.toString();
}
-
+
/**
- *
- */
+ *
+ */
public final static void encode (String str, StringBuffer ret) {
if (str == null)
return;
-
- int l = str.length();
-
- boolean closeTag=false, readTag=false, tagOpen=false;
- // the difference between swallowOneNewline and ignoreNewline is that swallowOneNewline is just effective once (for the next newline)
+
+ char[] chars = str.toCharArray ();
+ int l = chars.length;
+
+ // are we currently within a < and a >?
+ boolean insideTag=false;
+ // if we are inside a tag, we encode everything to make
+ // documentation work easier
+ boolean insideCodeTag = false;
+ // the difference between swallowOneNewline and ignoreNewline is that
+ // swallowOneNewline is just effective once (for the next newline)
boolean ignoreNewline = false;
boolean swallowOneNewline = false;
- StringBuffer tag = new StringBuffer ();
-
+
for (int i=0; i |