HTMLWriter takes a DOM4J tree and formats it to a stream as
HTML. This formatter is similar to XMLWriter but it outputs the text of CDATA
and Entity sections rather than the serialised format as in XML, it has an
XHTML mode, it retains whitespace in certain elements such as <PRE>,
and it supports certain elements which have no corresponding close tag such
as for <BR> and <P>.
The OutputFormat passed in to the constructor is checked for isXHTML() and
isExpandEmptyElements(). See OutputFormatfor details.
Here are the rules for this class based on an OutputFormat, "format",
passed in to the constructor:
getOmitElementCloseSet, then it is treated specially:
format.isXHTML() , then
it has a space before the closing single-tag slash, since Netscape 4.x-
treats this: <HR /> as an element named "HR" with an attribute named
"/", but that's better than when it refuses to recognize this: <hr/>
which it thinks is an element named "HR/".format.isXHTML() , all
elements must have either a close element, or be a closed single tag.format.isExpandEmptyElements() () is true, all elements are expanded except
as above.<myelement><![CDATA[My data]]></myelement>Otherwise, they look like this:
<myelement>My data</myelement>Basically,
OutputFormat#isXHTML() ==
true will produce valid XML, while OutputFormat#isExpandEmptyElements() determines whether empty elements are
expanded if isXHTML is true, excepting the special HTML single tags.
Also, HTMLWriter handles tags whose contents should be preformatted, that is,
whitespace-preserved. By default, this set includes the tags <PRE>,
<SCRIPT>, <STYLE>, and <TEXTAREA>, case insensitively. It
does not include <IFRAME>. Other tags, such as <CODE>,
<KBD>, <TT>, <VAR>, are usually rendered in a different
font in most browsers, but don't preserve whitespace, so they also don't
appear in the default list. HTML Comments are always whitespace-preserved.
However, the parser you use may store comments with linefeed-only text nodes
(\n) even if your platform uses another line.separator character, and
HTMLWriter outputs Comment nodes exactly as the DOM is set up by the parser.
See examples and discussion here: setPreformattedTags(java.util.Set)
Examples
Pretty Printing
This example shows how to pretty print a string containing a valid HTML
document to a string. You can also just call the static methods of this
class: prettyPrintHTML(String)or prettyPrintHTML(String, boolean, boolean, boolean, boolean)
or prettyPrintXHTML(String) for XHTML (note the X)
String testPrettyPrint(String html) {
StringWriter sw = new StringWriter();
OutputFormat format = OutputFormat.createPrettyPrint();
// These are the default values for createPrettyPrint,
// so you needn't set them:
// format.setNewlines(true);
// format.setTrimText(true);</font>
format.setXHTML(true);
HTMLWriter writer = new HTMLWriter(sw, format);
Document document = DocumentHelper.parseText(html);
writer.write(document);
writer.flush();
return sw.toString();
}
This example shows how to create a "squeezed" document, but one that will
work in browsers even if the browser line length is limited. No newlines are
included, no extra whitespace at all, except where it it required by
setPreformattedTags.
String testCrunch(String html) {
StringWriter sw = new StringWriter();
OutputFormat format = OutputFormat.createPrettyPrint();
format.setNewlines(false);
format.setTrimText(true);
format.setIndent("");
format.setXHTML(true);
format.setExpandEmptyElements(false);
format.setNewLineAfterNTags(20);
org.dom4j.io.HTMLWriter writer = new HTMLWriter(sw, format);
org.dom4j.Document document = DocumentHelper.parseText(html);
writer.write(document);
writer.flush();
return sw.toString();
}
| Modifier and Type | Class and Description |
|---|---|
| private class |
| Modifier and Type | Field and Description |
|---|---|
| protected static final OutputFormat | |
| protected static final HashSet | |
| private Stack | |
| private String | |
| private static String | |
| private int | |
| private HashSet | omitElementCloseSet
Used to store the qualified element names which should have no close element tag |
| private HashSet | |
| private int |
| Access | Constructor and Description |
|---|---|
| public | |
| public | |
| public | |
| public | |
| public | |
| public |
| Modifier and Type | Method and Description |
|---|---|
| public void | endCDATA()
Overrides org. Implements org. |
| public Set | Returns: A clone of the Set.A clone of the Set of elements that can have their close-tags omitted. |
| public Set | |
| private HashSet | |
| public boolean | Returns: true if the qualifiedName passed in matched (case-insensitively) a tag in the preformattedTags set, or false if not found or if the set is empty or null.DOCUMENT ME! qualifiedName)DOCUMENT ME! |
| private String | |
| private void | |
| protected void | |
| protected boolean | |
| public static String | Returns: a pretty printed String from the source string, preserving whitespace in the defaultPreformattedTags set, and leaving the close tags off of the default omitElementCloseSet set. Use one of the write methods if you want stream output.DOCUMENT ME! html)Convenience method to just get a String result. |
| public static String | Returns: a pretty printed String from the source string, preserving whitespace in the defaultPreformattedTags set, and leaving the close tags off of the default omitElementCloseSet set. This override allows you to specify various formatter options. Use one of the write methods if you want stream output.DOCUMENT ME! html, boolean DOCUMENT ME! newlines, boolean DOCUMENT ME! trim, boolean DOCUMENT ME! isXHTML, boolean DOCUMENT ME! expandEmpty)DOCUMENT ME! |
| public static String | Returns: a pretty printed String from the source string, preserving whitespace in the defaultPreformattedTags set, but conforming to XHTML: no close tags are omitted (though if empty, they will be converted to XHTML empty tags: <HR/> Use one of the write methods if you want stream output.DOCUMENT ME! html)Convenience method to just get a String result, but As XHTML . |
| public void | setOmitElementCloseSet(Set<String>
DOCUMENT ME! newSet)To use the empty set, pass an empty Set, or null:
setOmitElementCloseSet(new HashSet());
or
setOmitElementCloseSet(null);
|
| public void | setPreformattedTags(Set<String>
DOCUMENT ME! newSet)Override the default set, which includes PRE, SCRIPT, STYLE, and TEXTAREA, case insensitively. |
| public void | startCDATA()
Overrides org. Implements org. |
| protected void | |
| protected void | writeClose(String
DOCUMENT ME! qualifiedName)Overrides org. |
| protected void | writeDeclaration()
Overrides org. This will write the declaration to the given Writer. |
| protected void | writeElement(Element
DOCUMENT ME! element)Overrides org. |
| protected void | writeEmptyElementClose(String qualifiedName)
|
| protected void | |
| protected void |
| DEFAULT_HTML_FORMAT | back to summary |
|---|---|
| protected static final OutputFormat DEFAULT_HTML_FORMAT | |
| DEFAULT_PREFORMATTED_TAGS | back to summary |
|---|---|
| protected static final HashSet<String> DEFAULT_PREFORMATTED_TAGS | |
| formatStack | back to summary |
|---|---|
| private Stack<HTMLWriter. | |
| lastText | back to summary |
|---|---|
| private String lastText | |
| lineSeparator | back to summary |
|---|---|
| private static String lineSeparator | |
| newLineAfterNTags | back to summary |
|---|---|
| private int newLineAfterNTags | |
| omitElementCloseSet | back to summary |
|---|---|
| private HashSet<String> omitElementCloseSet Used to store the qualified element names which should have no close element tag | |
| preformattedTags | back to summary |
|---|---|
| private HashSet<String> preformattedTags | |
| tagsOuput | back to summary |
|---|---|
| private int tagsOuput | |
| HTMLWriter | back to summary |
|---|---|
| public HTMLWriter(Writer writer) | |
| HTMLWriter | back to summary |
|---|---|
| public HTMLWriter(Writer writer, OutputFormat format) | |
| HTMLWriter | back to summary |
|---|---|
| public HTMLWriter() throws UnsupportedEncodingException | |
| HTMLWriter | back to summary |
|---|---|
| public HTMLWriter(OutputFormat format) throws UnsupportedEncodingException | |
| HTMLWriter | back to summary |
|---|---|
| public HTMLWriter(OutputStream out) throws UnsupportedEncodingException | |
| HTMLWriter | back to summary |
|---|---|
| public HTMLWriter(OutputStream out, OutputFormat format) throws UnsupportedEncodingException | |
| endCDATA | back to summary |
|---|---|
| public void endCDATA() throws SAXException Overrides org. Implements org. Doc from org. Report the end of a CDATA section.
| |
| getOmitElementCloseSet | back to summary |
|---|---|
| public Set A clone of the Set of elements that can have their close-tags omitted. By default it should be "AREA", "BASE", "BR", "COL", "HR", "IMG", "INPUT", "LINK", "META", "P", "PARAM" | |
| getPreformattedTags | back to summary |
|---|---|
public Set
| |
| internalGetOmitElementCloseSet | back to summary |
|---|---|
| private HashSet | |
| isPreformattedTag | back to summary |
|---|---|
| public boolean isPreformattedTag(String qualifiedName) DOCUMENT ME!
| |
| justSpaces | back to summary |
|---|---|
| private String justSpaces(String text) | |
| lazyInitNewLinesAfterNTags | back to summary |
|---|---|
| private void lazyInitNewLinesAfterNTags() | |
| loadOmitElementCloseSet | back to summary |
|---|---|
| protected void loadOmitElementCloseSet(Set<String> set) | |
| omitElementClose | back to summary |
|---|---|
| protected boolean omitElementClose(String qualifiedName) | |
| prettyPrintHTML | back to summary |
|---|---|
| public static String prettyPrintHTML(String html) throws IOException, UnsupportedEncodingException, DocumentException Convenience method to just get a String result.
| |
| prettyPrintHTML | back to summary |
|---|---|
| public static String prettyPrintHTML(String html, boolean newlines, boolean trim, boolean isXHTML, boolean expandEmpty) throws IOException, UnsupportedEncodingException, DocumentException DOCUMENT ME!
| |
| prettyPrintXHTML | back to summary |
|---|---|
| public static String prettyPrintXHTML(String html) throws IOException, UnsupportedEncodingException, DocumentException Convenience method to just get a String result, but As XHTML .
| |
| setOmitElementCloseSet | back to summary |
|---|---|
| public void setOmitElementCloseSet(Set<String> newSet) To use the empty set, pass an empty Set, or null:
setOmitElementCloseSet(new HashSet());
or
setOmitElementCloseSet(null);
| |
| setPreformattedTags | back to summary |
|---|---|
| public void setPreformattedTags(Set<String> newSet) Override the default set, which includes PRE, SCRIPT, STYLE, and TEXTAREA, case insensitively. Setting Preformatted Tags Pass in a Set of Strings, one for each tag name that should be treated like a PRE tag. You may pass in null or an empty Set to assign the empty set, in which case no tags will be treated as preformatted, except that HTML Comments will continue to be preformatted. If a tag is included in the set of preformatted tags, all whitespace within the tag will be preserved, including whitespace on the same line preceding the close tag. This will generally make the close tag not line up with the start tag, but it preserves the intention of the whitespace within the tag. The browser considers leading whitespace before the close tag to be significant, but leading whitespace before the open tag to be insignificant. For example, if the HTML author doesn't put the close TEXTAREA tag flush to the left margin, then the TEXTAREA control in the browser will have spaces on the last line inside the control. This may be the HTML author's intent. Similarly, in a PRE, the browser treats a flushed left close PRE tag as different from a close tag with leading whitespace. Again, this must be left up to the HTML author. Examples Here is an example of how you can set the PreformattedTags list using setPreformattedTags to include IFRAME, as well as the default set, if you have an instance of this class named myHTMLWriter:
Set current = myHTMLWriter.getPreformattedTags();
current.add("IFRAME");
myHTMLWriter.setPreformattedTags(current);
//The set is now <b>PRE, SCRIPT, STYLE, TEXTAREA, IFRAME</b>
Similarly, you can simply replace it with your own:
HashSet newset = new HashSet();
newset.add("PRE");
newset.add("TEXTAREA");
myHTMLWriter.setPreformattedTags(newset);
//The set is now <b>{PRE, TEXTAREA}</b>
You can remove all tags from the preformatted tags list, with an empty
set, like this:
myHTMLWriter.setPreformattedTags(new HashSet());
//The set is now <b>{}</b>
or with null, like this:
myHTMLWriter.setPreformattedTags(null);
//The set is now <b>{}</b>
| |
| startCDATA | back to summary |
|---|---|
| public void startCDATA() throws SAXException Overrides org. Implements org. Doc from org. Report the start of a CDATA section. The contents of the CDATA section will be reported through
the regular
| |
| writeCDATA | back to summary |
|---|---|
| protected void writeCDATA(String text) throws IOException Overrides org. | |
| writeClose | back to summary |
|---|---|
| protected void writeClose(String qualifiedName) throws IOException Overrides org. Overriden method to not close certain element names to avoid wierd behaviour from browsers for versions up to 5.x
| |
| writeDeclaration | back to summary |
|---|---|
| protected void writeDeclaration() throws IOException Overrides org. Doc from org. This will write the declaration to the given Writer. Assumes XML version 1.0 since we don't directly know.
| |
| writeElement | back to summary |
|---|---|
| protected void writeElement(Element element) throws IOException Overrides org. This override handles any elements that should not remove whitespace, such as <PRE>, <SCRIPT>, <STYLE>, and <TEXTAREA>. Note the close tags won't line up with the open tag, but we can't alter that. See javadoc note at setPreformattedTags.
| |
| writeEmptyElementClose | back to summary |
|---|---|
| protected void writeEmptyElementClose(String qualifiedName) throws IOException | |
| writeEntity | back to summary |
|---|---|
| protected void writeEntity(Entity entity) throws IOException Overrides org. | |
| writeString | back to summary |
|---|---|
| protected void writeString(String text) throws IOException Overrides org. | |
| Modifier and Type | Field and Description |
|---|---|
| private String | |
| private boolean | |
| private boolean |
| Access | Constructor and Description |
|---|---|
| public |
| Modifier and Type | Method and Description |
|---|---|
| public String | |
| public boolean | |
| public boolean |
| indent | back to summary |
|---|---|
| private String indent | |
| newlines | back to summary |
|---|---|
| private boolean newlines | |
| trimText | back to summary |
|---|---|
| private boolean trimText | |
| FormatState | back to summary |
|---|---|
| public FormatState(boolean newLines, boolean trimText, String indent) | |
| getIndent | back to summary |
|---|---|
| public String getIndent() | |
| isNewlines | back to summary |
|---|---|
| public boolean isNewlines() | |
| isTrimText | back to summary |
|---|---|
| public boolean isTrimText() | |