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("&lt;"); break;        case '>':          writer.write("&gt;"); break;        case '&':          writer.write("&amp;"); break;        case '\"':          writer.write("&quot;"); break;        case '\'':          writer.write("&apos;"); 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 + -
显示快捷键?