xmlwriter.java
来自「RESIN 3.2 最新源码」· Java 代码 · 共 834 行 · 第 1/2 页
JAVA
834 行
_isNewLine = false; super.write(ch); } public void write(char buf[], int off, int len) { closeElementIfNeeded(false); _isNewLine = false; super.write(buf, off, len); } public void write(char buf[]) { closeElementIfNeeded(false); _isNewLine = false; super.write(buf); } public void write(String s, int off, int len) { closeElementIfNeeded(false); _isNewLine = false; super.write(s, off, len); } public void write(String s) { closeElementIfNeeded(false); _isNewLine = false; super.write(s); } static public abstract class Strategy { abstract void openElement(XmlWriter writer, String name); abstract void closeElement(XmlWriter writer, String name, boolean isEnd); abstract void endElement(XmlWriter writer, String name); abstract void writeAttribute(XmlWriter writer, String name, Object value); abstract void writeAttribute(XmlWriter writer, String name, Object ... values); abstract void writeText(XmlWriter writer, char ch); abstract void writeText(XmlWriter writer, char[] buf); abstract void writeText(XmlWriter writer, char[] buf, int offset, int length); abstract void writeTextObject(XmlWriter writer, Object obj); abstract void writeComment(XmlWriter writer, String comment); } static public class Xml extends Strategy { void openElement(XmlWriter writer, String name) { writer.writeIndentIfNewLine(); writer.write('<'); writer.write(name); } void closeElement(XmlWriter writer, String name, boolean isEnd) { if (isEnd) writer.write('/'); writer.write('>'); } void endElement(XmlWriter writer, String name) { writer.writeIndentIfNewLine(); writer.write("</"); writer.write(name); writer.write('>'); } void writeAttribute(XmlWriter writer, String name, Object value) { writer.write(" "); writer.write(name); writer.write('='); writer.write("'"); writeAttributeValue(writer, name, value); writer.write("'"); } void writeAttribute(XmlWriter writer, String name, Object ... values) { writer.write(" "); writer.write(name); writer.write('='); writer.write("'"); int len = values.length; for (int i = 0; i < len; i++) { Object value = values[i]; if (value == null) continue; if (i > 0) writer.write(' '); writeAttributeValue(writer, name, value); } writer.write("'"); } protected void writeAttributeValue(XmlWriter writer, String name, Object value) { writeXmlEscaped(writer, value); } public void writeText(XmlWriter writer, char ch) { writeXmlEscapedChar(writer, ch); } public void writeText(XmlWriter writer, char[] buf) { int endIndex = buf.length; for (int i = 0; i < endIndex; i++) { writeXmlEscapedChar(writer, buf[i]); } } public void writeText(XmlWriter writer, char[] buf, int offset, int length) { int endIndex = offset + length; for (int i = offset; i < endIndex; i++) { writeXmlEscapedChar(writer, buf[i]); } } public void writeTextObject(XmlWriter writer, Object obj) { String string = String.valueOf(obj); int len = string.length(); for (int i = 0; i < len; i++) { writeXmlEscapedChar(writer, string.charAt(i)); } } public void writeComment(XmlWriter writer, String comment) { writer.write("<!-- "); writeXmlEscaped(writer, comment); writer.write(" -->"); } private void writeXmlEscapedChar(XmlWriter writer, char ch) { switch (ch) { case '<': writer.write("<"); break; case '>': writer.write(">"); break; case '&': writer.write("&"); break; case '\"': writer.write("""); break; case '\'': writer.write("'"); break; default: writer.write(ch); } } private void writeXmlEscaped(XmlWriter writer, Object object) { String string = object.toString(); int len = string.length(); for (int i = 0; i < len; i++) { writeXmlEscapedChar(writer, string.charAt(i)); } } } private void writeIndentIfNewLine() { if (isNewLine()) { for (int i = _indent * 2; i > 0; i--) { write(' '); } } } /** * If content model is empty, <br /> */ static public class Xhtml extends Xml { private int EMPTY = 1; private int BREAK_BEFORE = 2; private int BREAK_AFTER = 4; private int BREAK_AFTER_CONTENT = 8; private int EAT_BREAK_BEFORE = 16; // ignore a BREAK_AFTER in the next element private int BOOLEAN_ATTRIBUTE = 1024; private HashMap<String, Integer> _flags = new HashMap<String, Integer>(); public Xhtml() { addFlags("html", BREAK_BEFORE | BREAK_AFTER); addFlags("head", BREAK_BEFORE | BREAK_AFTER); addFlags("body", BREAK_BEFORE | BREAK_AFTER); addFlags("style", BREAK_BEFORE | BREAK_AFTER); addFlags("meta", BREAK_BEFORE | BREAK_AFTER | EMPTY); addFlags("link", BREAK_BEFORE | BREAK_AFTER | EMPTY); addFlags("title", BREAK_BEFORE | BREAK_AFTER_CONTENT); addFlags("base", BREAK_BEFORE | BREAK_AFTER | EMPTY); addFlags("h1", BREAK_BEFORE | BREAK_AFTER_CONTENT); addFlags("h2", BREAK_BEFORE | BREAK_AFTER_CONTENT); addFlags("h3", BREAK_BEFORE | BREAK_AFTER_CONTENT); addFlags("h4", BREAK_BEFORE | BREAK_AFTER_CONTENT); addFlags("h5", BREAK_BEFORE | BREAK_AFTER_CONTENT); addFlags("h6", BREAK_BEFORE | BREAK_AFTER_CONTENT); addFlags("p", BREAK_BEFORE | BREAK_AFTER); addFlags("div", BREAK_BEFORE | BREAK_AFTER); addFlags("ul", BREAK_BEFORE | BREAK_AFTER); addFlags("ol", BREAK_BEFORE | BREAK_AFTER); addFlags("li", BREAK_BEFORE | BREAK_AFTER_CONTENT); addFlags("dl", BREAK_BEFORE | BREAK_AFTER); addFlags("dt", BREAK_BEFORE | BREAK_AFTER_CONTENT); addFlags("dd", BREAK_BEFORE | BREAK_AFTER_CONTENT); addFlags("hr", BREAK_BEFORE | BREAK_AFTER | EMPTY); addFlags("br", BREAK_AFTER | EMPTY); addFlags("option", EMPTY); addFlags("img", EMPTY); addFlags("area", EMPTY); addFlags("pre", BREAK_BEFORE | BREAK_AFTER); addFlags("blockquote", BREAK_BEFORE | BREAK_AFTER); addFlags("address", BREAK_BEFORE | BREAK_AFTER); addFlags("fieldset", BREAK_BEFORE | BREAK_AFTER); addFlags("form", BREAK_BEFORE | BREAK_AFTER); addFlags("ins", BREAK_BEFORE | BREAK_AFTER); addFlags("del", BREAK_BEFORE | BREAK_AFTER); addFlags("script", BREAK_BEFORE | BREAK_AFTER); addFlags("noscript", BREAK_BEFORE | BREAK_AFTER); addFlags("input", EMPTY); // addFlag("select", BREAK_BEFORE | BREAK_AFTER); // addFlag("optgroup", BREAK_BEFORE | BREAK_AFTER); // addFlag("option", BREAK_BEFORE | BREAK_AFTER); // addFlag("textarea", BREAK_BEFORE | BREAK_AFTER); // addFlag("fieldset", BREAK_BEFORE | BREAK_AFTER); // addFlag("legend", BREAK_BEFORE | BREAK_AFTER); addFlags("table", BREAK_BEFORE | BREAK_AFTER); addFlags("thead", BREAK_BEFORE | BREAK_AFTER); addFlags("tfoot", BREAK_BEFORE | BREAK_AFTER); addFlags("tr", BREAK_BEFORE | BREAK_AFTER_CONTENT); addFlags("col", EMPTY); addFlags("object", BREAK_BEFORE | BREAK_AFTER); addFlags("param", BREAK_BEFORE | BREAK_AFTER | EMPTY); addFlags("compact", BOOLEAN_ATTRIBUTE); addFlags("nowrap", BOOLEAN_ATTRIBUTE); addFlags("ismap", BOOLEAN_ATTRIBUTE); addFlags("declare", BOOLEAN_ATTRIBUTE); addFlags("noshade", BOOLEAN_ATTRIBUTE); addFlags("checked", BOOLEAN_ATTRIBUTE); addFlags("disabled", BOOLEAN_ATTRIBUTE); addFlags("readonly", BOOLEAN_ATTRIBUTE); addFlags("multiple", BOOLEAN_ATTRIBUTE); addFlags("selected", BOOLEAN_ATTRIBUTE); addFlags("noresize", BOOLEAN_ATTRIBUTE); addFlags("defer", BOOLEAN_ATTRIBUTE); } protected void addFlags(String name, int flag) { int intValue = getFlags(name); intValue |= flag; _flags.put(name, intValue); } protected int getFlags(String name) { int intValue; Integer integer = _flags.get(name); if (integer == null) intValue = 0; else intValue = integer; return intValue; } void openElement(XmlWriter writer, String name) { int flags = getFlags(name); if ((flags & BREAK_BEFORE) > 0) writer.softPrintln(); writer.writeIndentIfNewLine(); writer.write('<'); writer.write(name); } protected void writeAttributeValue(XmlWriter writer, String name, Object value) { int flags = getFlags(name); if ( (flags & BOOLEAN_ATTRIBUTE) > 0) value = name.toUpperCase(); super.writeAttributeValue(writer, name, value); } void closeElement(XmlWriter writer, String name, boolean isEnd) { int flags = getFlags(name); boolean isEmpty = (flags & EMPTY) > 0; if (isEnd && isEmpty) writer.write(" />"); else writer.write('>'); if ((flags & BREAK_AFTER) > 0) writer.softPrintln(); if (isEnd && !isEmpty) endElement(writer, name); } void endElement(XmlWriter writer, String name) { int flags = getFlags(name); boolean isFullBreak = (flags & (BREAK_BEFORE | BREAK_AFTER)) == (BREAK_BEFORE | BREAK_AFTER); if (isFullBreak) writer.softPrintln(); writer.writeIndentIfNewLine(); if ((flags & EMPTY) == 0) { writer.write("</"); writer.write(name); writer.write('>'); } if (isFullBreak || ( (flags & BREAK_AFTER_CONTENT) > 0)) writer.softPrintln(); } protected void writeDoctype(XmlWriter writer) { // TODO: review this, should perhaps use strict here, transitional in something else writer.println("<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">"); /** <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Frameset//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd"> **/ } protected void writeXmlDeclaration(XmlWriter writer) { String encoding = writer.getCharacterEncoding(); writer.println("<?xml version=\"1.0\" encoding=\"" + encoding + "\"?>"); } } static public class Html extends Xhtml { public Html() { } }}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?