diff --git a/src/helma/util/HtmlEncoder.java b/src/helma/util/HtmlEncoder.java index bc99301c..1b9b5a3d 100644 --- a/src/helma/util/HtmlEncoder.java +++ b/src/helma/util/HtmlEncoder.java @@ -302,6 +302,8 @@ public final class HtmlEncoder { // if we are inside a tag, we encode everything to make // documentation work easier boolean insideCodeTag = false; + // are we within a macro tag? + boolean insideMacroTag = false; // the difference between swallowOneNewline and ignoreNewline is that // swallowOneNewline is just effective once (for the next newline) boolean ignoreNewline = false; @@ -337,13 +339,17 @@ public final class HtmlEncoder { ret.append ("&"); break; case '<': - if (i < l-2) { + if (insideTag) { + ret.append ('<'); + break; + } else if (i < l-2) { boolean insideCloseTag = ('/' == chars[i+1]); int tagStart = insideCloseTag ? i+2 : i+1; int j = tagStart; while (j tagStart && j < l) { + insideMacroTag = ('%' == chars[i+1]); String tagName = new String (chars, tagStart, j-tagStart).toLowerCase (); if ("code".equals (tagName) && insideCloseTag && insideCodeTag) insideCodeTag = false; @@ -360,9 +366,7 @@ public final class HtmlEncoder { } else if (suppressLinebreakTags.contains (tagName)) { ignoreNewline = !insideCloseTag; swallowOneNewline = true; - } else if ("p".equalsIgnoreCase (tagName) || - "blockquote".equalsIgnoreCase (tagName) || - "bq".equalsIgnoreCase (tagName)) { + } else if ("p".equals (tagName) || "blockquote".equals (tagName) || "bq".equals (tagName)) { swallowOneNewline = true; } if ("code".equals (tagName) && !insideCloseTag) @@ -385,7 +389,7 @@ public final class HtmlEncoder { ret.append ('>'); else ret.append (">"); - insideTag = false; + insideTag = insideMacroTag ? chars[i-1] != '%' : false; break; default: // ret.append (c);