author | František Kučera <franta-hg@frantovo.cz> |
Wed, 08 Jan 2014 23:50:22 +0100 | |
branch | v_0 |
changeset 152 | 7a3382823fc3 |
parent 136 | c0f9521900bf |
child 155 | eb3676c6929b |
permissions | -rw-r--r-- |
128
67f5ff139da0
XML formatter: abstract + part of basic XML formatter
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
1 |
/** |
67f5ff139da0
XML formatter: abstract + part of basic XML formatter
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
2 |
* SQL-DK |
67f5ff139da0
XML formatter: abstract + part of basic XML formatter
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
3 |
* Copyright © 2014 František Kučera (frantovo.cz) |
67f5ff139da0
XML formatter: abstract + part of basic XML formatter
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
4 |
* |
67f5ff139da0
XML formatter: abstract + part of basic XML formatter
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
5 |
* This program is free software: you can redistribute it and/or modify |
67f5ff139da0
XML formatter: abstract + part of basic XML formatter
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
6 |
* it under the terms of the GNU General Public License as published by |
67f5ff139da0
XML formatter: abstract + part of basic XML formatter
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
7 |
* the Free Software Foundation, either version 3 of the License, or |
67f5ff139da0
XML formatter: abstract + part of basic XML formatter
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
8 |
* (at your option) any later version. |
67f5ff139da0
XML formatter: abstract + part of basic XML formatter
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
9 |
* |
67f5ff139da0
XML formatter: abstract + part of basic XML formatter
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
10 |
* This program is distributed in the hope that it will be useful, |
67f5ff139da0
XML formatter: abstract + part of basic XML formatter
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
11 |
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
67f5ff139da0
XML formatter: abstract + part of basic XML formatter
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
12 |
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
67f5ff139da0
XML formatter: abstract + part of basic XML formatter
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
13 |
* GNU General Public License for more details. |
67f5ff139da0
XML formatter: abstract + part of basic XML formatter
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
14 |
* |
67f5ff139da0
XML formatter: abstract + part of basic XML formatter
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
15 |
* You should have received a copy of the GNU General Public License |
67f5ff139da0
XML formatter: abstract + part of basic XML formatter
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
16 |
* along with this program. If not, see <http://www.gnu.org/licenses/>. |
67f5ff139da0
XML formatter: abstract + part of basic XML formatter
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
17 |
*/ |
67f5ff139da0
XML formatter: abstract + part of basic XML formatter
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
18 |
package info.globalcode.sql.dk.formatting; |
67f5ff139da0
XML formatter: abstract + part of basic XML formatter
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
19 |
|
67f5ff139da0
XML formatter: abstract + part of basic XML formatter
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
20 |
import info.globalcode.sql.dk.ColorfulPrintWriter; |
67f5ff139da0
XML formatter: abstract + part of basic XML formatter
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
21 |
import info.globalcode.sql.dk.ColorfulPrintWriter.TerminalColor; |
67f5ff139da0
XML formatter: abstract + part of basic XML formatter
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
22 |
import java.util.Stack; |
67f5ff139da0
XML formatter: abstract + part of basic XML formatter
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
23 |
import javax.xml.namespace.QName; |
67f5ff139da0
XML formatter: abstract + part of basic XML formatter
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
24 |
import static info.globalcode.sql.dk.Functions.isEmpty; |
67f5ff139da0
XML formatter: abstract + part of basic XML formatter
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
25 |
import static info.globalcode.sql.dk.Functions.toHex; |
67f5ff139da0
XML formatter: abstract + part of basic XML formatter
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
26 |
import java.nio.charset.Charset; |
67f5ff139da0
XML formatter: abstract + part of basic XML formatter
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
27 |
import java.util.EmptyStackException; |
67f5ff139da0
XML formatter: abstract + part of basic XML formatter
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
28 |
import java.util.HashMap; |
67f5ff139da0
XML formatter: abstract + part of basic XML formatter
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
29 |
import java.util.LinkedHashMap; |
67f5ff139da0
XML formatter: abstract + part of basic XML formatter
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
30 |
import java.util.Map; |
67f5ff139da0
XML formatter: abstract + part of basic XML formatter
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
31 |
import java.util.Map.Entry; |
67f5ff139da0
XML formatter: abstract + part of basic XML formatter
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
32 |
import java.util.logging.Level; |
67f5ff139da0
XML formatter: abstract + part of basic XML formatter
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
33 |
import java.util.logging.Logger; |
67f5ff139da0
XML formatter: abstract + part of basic XML formatter
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
34 |
|
67f5ff139da0
XML formatter: abstract + part of basic XML formatter
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
35 |
/** |
67f5ff139da0
XML formatter: abstract + part of basic XML formatter
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
36 |
* |
67f5ff139da0
XML formatter: abstract + part of basic XML formatter
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
37 |
* @author Ing. František Kučera (frantovo.cz) |
67f5ff139da0
XML formatter: abstract + part of basic XML formatter
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
38 |
*/ |
67f5ff139da0
XML formatter: abstract + part of basic XML formatter
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
39 |
public abstract class AbstractXmlFormatter extends AbstractFormatter { |
67f5ff139da0
XML formatter: abstract + part of basic XML formatter
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
40 |
|
67f5ff139da0
XML formatter: abstract + part of basic XML formatter
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
41 |
private static final Logger log = Logger.getLogger(AbstractXmlFormatter.class.getName()); |
67f5ff139da0
XML formatter: abstract + part of basic XML formatter
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
42 |
public static final String PROPERTY_COLORFUL = "color"; |
67f5ff139da0
XML formatter: abstract + part of basic XML formatter
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
43 |
public static final String PROPERTY_INDENT = "indent"; |
130
8548e21177f9
XML formatter: option for preserve whitespace or indent text with line breaks
František Kučera <franta-hg@frantovo.cz>
parents:
128
diff
changeset
|
44 |
/** |
8548e21177f9
XML formatter: option for preserve whitespace or indent text with line breaks
František Kučera <franta-hg@frantovo.cz>
parents:
128
diff
changeset
|
45 |
* Whether text with line breaks should be indented (default). Otherwise original whitespace |
8548e21177f9
XML formatter: option for preserve whitespace or indent text with line breaks
František Kučera <franta-hg@frantovo.cz>
parents:
128
diff
changeset
|
46 |
* will be preserved. |
8548e21177f9
XML formatter: option for preserve whitespace or indent text with line breaks
František Kučera <franta-hg@frantovo.cz>
parents:
128
diff
changeset
|
47 |
*/ |
8548e21177f9
XML formatter: option for preserve whitespace or indent text with line breaks
František Kučera <franta-hg@frantovo.cz>
parents:
128
diff
changeset
|
48 |
public static final String PROPERTY_INDENT_TEXT = "indentText"; |
128
67f5ff139da0
XML formatter: abstract + part of basic XML formatter
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
49 |
private static final TerminalColor ELEMENT_COLOR = TerminalColor.Magenta; |
67f5ff139da0
XML formatter: abstract + part of basic XML formatter
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
50 |
private static final TerminalColor ATTRIBUTE_NAME_COLOR = TerminalColor.Green; |
67f5ff139da0
XML formatter: abstract + part of basic XML formatter
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
51 |
private static final TerminalColor ATTRIBUTE_VALUE_COLOR = TerminalColor.Yellow; |
67f5ff139da0
XML formatter: abstract + part of basic XML formatter
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
52 |
private static final TerminalColor XML_DECLARATION_COLOR = TerminalColor.Red; |
136
c0f9521900bf
XML/XHTML formatter – DOCTYPE
František Kučera <franta-hg@frantovo.cz>
parents:
132
diff
changeset
|
53 |
private static final TerminalColor XML_DOCTYPE_COLOR = TerminalColor.Cyan; |
128
67f5ff139da0
XML formatter: abstract + part of basic XML formatter
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
54 |
private Stack<QName> treePosition = new Stack<>(); |
67f5ff139da0
XML formatter: abstract + part of basic XML formatter
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
55 |
private final ColorfulPrintWriter out; |
67f5ff139da0
XML formatter: abstract + part of basic XML formatter
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
56 |
private final String indent; |
130
8548e21177f9
XML formatter: option for preserve whitespace or indent text with line breaks
František Kučera <franta-hg@frantovo.cz>
parents:
128
diff
changeset
|
57 |
private final boolean indentText; |
128
67f5ff139da0
XML formatter: abstract + part of basic XML formatter
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
58 |
|
67f5ff139da0
XML formatter: abstract + part of basic XML formatter
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
59 |
public AbstractXmlFormatter(FormatterContext formatterContext) { |
67f5ff139da0
XML formatter: abstract + part of basic XML formatter
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
60 |
super(formatterContext); |
67f5ff139da0
XML formatter: abstract + part of basic XML formatter
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
61 |
boolean colorful = formatterContext.getProperties().getBoolean(PROPERTY_COLORFUL, false); |
67f5ff139da0
XML formatter: abstract + part of basic XML formatter
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
62 |
out = new ColorfulPrintWriter(formatterContext.getOutputStream(), false, colorful); |
67f5ff139da0
XML formatter: abstract + part of basic XML formatter
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
63 |
indent = formatterContext.getProperties().getString(PROPERTY_INDENT, "\t"); |
130
8548e21177f9
XML formatter: option for preserve whitespace or indent text with line breaks
František Kučera <franta-hg@frantovo.cz>
parents:
128
diff
changeset
|
64 |
indentText = formatterContext.getProperties().getBoolean(PROPERTY_INDENT_TEXT, true); |
128
67f5ff139da0
XML formatter: abstract + part of basic XML formatter
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
65 |
|
67f5ff139da0
XML formatter: abstract + part of basic XML formatter
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
66 |
if (!indent.matches("\\s*")) { |
67f5ff139da0
XML formatter: abstract + part of basic XML formatter
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
67 |
log.log(Level.WARNING, "Setting indent to „{0}“ is weird & freaky; in hex: {1}", new Object[]{indent, toHex(indent.getBytes())}); |
67f5ff139da0
XML formatter: abstract + part of basic XML formatter
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
68 |
} |
67f5ff139da0
XML formatter: abstract + part of basic XML formatter
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
69 |
|
67f5ff139da0
XML formatter: abstract + part of basic XML formatter
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
70 |
} |
67f5ff139da0
XML formatter: abstract + part of basic XML formatter
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
71 |
|
67f5ff139da0
XML formatter: abstract + part of basic XML formatter
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
72 |
protected void printStartDocument() { |
67f5ff139da0
XML formatter: abstract + part of basic XML formatter
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
73 |
out.print(XML_DECLARATION_COLOR, "<?xml version=\"1.0\" encoding=\"" + Charset.defaultCharset().name() + "\"?>"); |
67f5ff139da0
XML formatter: abstract + part of basic XML formatter
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
74 |
} |
67f5ff139da0
XML formatter: abstract + part of basic XML formatter
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
75 |
|
136
c0f9521900bf
XML/XHTML formatter – DOCTYPE
František Kučera <franta-hg@frantovo.cz>
parents:
132
diff
changeset
|
76 |
protected void printDoctype(String doctype) { |
c0f9521900bf
XML/XHTML formatter – DOCTYPE
František Kučera <franta-hg@frantovo.cz>
parents:
132
diff
changeset
|
77 |
out.print(XML_DOCTYPE_COLOR, "\n<!DOCTYPE " + doctype + ">"); |
c0f9521900bf
XML/XHTML formatter – DOCTYPE
František Kučera <franta-hg@frantovo.cz>
parents:
132
diff
changeset
|
78 |
} |
c0f9521900bf
XML/XHTML formatter – DOCTYPE
František Kučera <franta-hg@frantovo.cz>
parents:
132
diff
changeset
|
79 |
|
128
67f5ff139da0
XML formatter: abstract + part of basic XML formatter
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
80 |
protected void printEndDocument() { |
67f5ff139da0
XML formatter: abstract + part of basic XML formatter
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
81 |
out.println(); |
67f5ff139da0
XML formatter: abstract + part of basic XML formatter
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
82 |
out.flush(); |
67f5ff139da0
XML formatter: abstract + part of basic XML formatter
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
83 |
if (!treePosition.empty()) { |
67f5ff139da0
XML formatter: abstract + part of basic XML formatter
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
84 |
throw new IllegalStateException("Some elements are not closed: " + treePosition); |
67f5ff139da0
XML formatter: abstract + part of basic XML formatter
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
85 |
} |
67f5ff139da0
XML formatter: abstract + part of basic XML formatter
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
86 |
} |
67f5ff139da0
XML formatter: abstract + part of basic XML formatter
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
87 |
|
67f5ff139da0
XML formatter: abstract + part of basic XML formatter
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
88 |
protected void printStartElement(QName element) { |
67f5ff139da0
XML formatter: abstract + part of basic XML formatter
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
89 |
printStartElement(element, null); |
67f5ff139da0
XML formatter: abstract + part of basic XML formatter
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
90 |
} |
67f5ff139da0
XML formatter: abstract + part of basic XML formatter
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
91 |
|
67f5ff139da0
XML formatter: abstract + part of basic XML formatter
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
92 |
protected Map<QName, String> singleAttribute(QName name, String value) { |
152
7a3382823fc3
XML formatter: use singleAttribute(qname(""), "")
František Kučera <franta-hg@frantovo.cz>
parents:
136
diff
changeset
|
93 |
Map<QName, String> attributes = new HashMap<>(2); |
128
67f5ff139da0
XML formatter: abstract + part of basic XML formatter
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
94 |
attributes.put(name, value); |
67f5ff139da0
XML formatter: abstract + part of basic XML formatter
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
95 |
return attributes; |
67f5ff139da0
XML formatter: abstract + part of basic XML formatter
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
96 |
} |
67f5ff139da0
XML formatter: abstract + part of basic XML formatter
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
97 |
|
67f5ff139da0
XML formatter: abstract + part of basic XML formatter
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
98 |
protected void printStartElement(QName element, Map<QName, String> attributes) { |
67f5ff139da0
XML formatter: abstract + part of basic XML formatter
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
99 |
printStartElement(element, attributes, false); |
67f5ff139da0
XML formatter: abstract + part of basic XML formatter
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
100 |
} |
67f5ff139da0
XML formatter: abstract + part of basic XML formatter
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
101 |
|
67f5ff139da0
XML formatter: abstract + part of basic XML formatter
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
102 |
/** |
67f5ff139da0
XML formatter: abstract + part of basic XML formatter
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
103 |
* @param empty whether element should be closed <codfe>… /></code> (has no content, do not |
67f5ff139da0
XML formatter: abstract + part of basic XML formatter
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
104 |
* call {@linkplain #printEndElement()}) |
67f5ff139da0
XML formatter: abstract + part of basic XML formatter
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
105 |
*/ |
67f5ff139da0
XML formatter: abstract + part of basic XML formatter
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
106 |
private void printStartElement(QName element, Map<QName, String> attributes, boolean empty) { |
67f5ff139da0
XML formatter: abstract + part of basic XML formatter
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
107 |
printIndent(); |
67f5ff139da0
XML formatter: abstract + part of basic XML formatter
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
108 |
|
67f5ff139da0
XML formatter: abstract + part of basic XML formatter
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
109 |
out.print(ELEMENT_COLOR, "<" + toString(element)); |
67f5ff139da0
XML formatter: abstract + part of basic XML formatter
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
110 |
|
67f5ff139da0
XML formatter: abstract + part of basic XML formatter
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
111 |
if (attributes != null) { |
67f5ff139da0
XML formatter: abstract + part of basic XML formatter
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
112 |
for (Entry<QName, String> attribute : attributes.entrySet()) { |
67f5ff139da0
XML formatter: abstract + part of basic XML formatter
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
113 |
out.print(" "); |
67f5ff139da0
XML formatter: abstract + part of basic XML formatter
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
114 |
out.print(ATTRIBUTE_NAME_COLOR, toString(attribute.getKey())); |
67f5ff139da0
XML formatter: abstract + part of basic XML formatter
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
115 |
out.print("="); |
67f5ff139da0
XML formatter: abstract + part of basic XML formatter
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
116 |
out.print(ATTRIBUTE_VALUE_COLOR, '"' + escapeXmlAttribute(attribute.getValue()) + '"'); |
67f5ff139da0
XML formatter: abstract + part of basic XML formatter
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
117 |
} |
67f5ff139da0
XML formatter: abstract + part of basic XML formatter
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
118 |
} |
67f5ff139da0
XML formatter: abstract + part of basic XML formatter
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
119 |
|
67f5ff139da0
XML formatter: abstract + part of basic XML formatter
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
120 |
if (empty) { |
67f5ff139da0
XML formatter: abstract + part of basic XML formatter
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
121 |
out.print(ELEMENT_COLOR, "/>"); |
67f5ff139da0
XML formatter: abstract + part of basic XML formatter
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
122 |
} else { |
67f5ff139da0
XML formatter: abstract + part of basic XML formatter
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
123 |
out.print(ELEMENT_COLOR, ">"); |
67f5ff139da0
XML formatter: abstract + part of basic XML formatter
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
124 |
treePosition.add(element); |
67f5ff139da0
XML formatter: abstract + part of basic XML formatter
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
125 |
} |
67f5ff139da0
XML formatter: abstract + part of basic XML formatter
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
126 |
|
67f5ff139da0
XML formatter: abstract + part of basic XML formatter
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
127 |
out.flush(); |
67f5ff139da0
XML formatter: abstract + part of basic XML formatter
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
128 |
} |
67f5ff139da0
XML formatter: abstract + part of basic XML formatter
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
129 |
|
67f5ff139da0
XML formatter: abstract + part of basic XML formatter
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
130 |
/** |
67f5ff139da0
XML formatter: abstract + part of basic XML formatter
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
131 |
* Prints text node wrapped in given element without indenting the text and adding line breaks |
67f5ff139da0
XML formatter: abstract + part of basic XML formatter
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
132 |
* (useful for short texts). |
67f5ff139da0
XML formatter: abstract + part of basic XML formatter
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
133 |
* |
67f5ff139da0
XML formatter: abstract + part of basic XML formatter
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
134 |
* @param attributes use {@linkplain LinkedHashMap} to preserve attributes order |
67f5ff139da0
XML formatter: abstract + part of basic XML formatter
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
135 |
*/ |
67f5ff139da0
XML formatter: abstract + part of basic XML formatter
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
136 |
protected void printTextElement(QName element, Map<QName, String> attributes, String text) { |
67f5ff139da0
XML formatter: abstract + part of basic XML formatter
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
137 |
printStartElement(element, attributes); |
130
8548e21177f9
XML formatter: option for preserve whitespace or indent text with line breaks
František Kučera <franta-hg@frantovo.cz>
parents:
128
diff
changeset
|
138 |
|
8548e21177f9
XML formatter: option for preserve whitespace or indent text with line breaks
František Kučera <franta-hg@frantovo.cz>
parents:
128
diff
changeset
|
139 |
String[] lines = text.split("\\n"); |
8548e21177f9
XML formatter: option for preserve whitespace or indent text with line breaks
František Kučera <franta-hg@frantovo.cz>
parents:
128
diff
changeset
|
140 |
|
8548e21177f9
XML formatter: option for preserve whitespace or indent text with line breaks
František Kučera <franta-hg@frantovo.cz>
parents:
128
diff
changeset
|
141 |
if (indentText && lines.length > 1) { |
8548e21177f9
XML formatter: option for preserve whitespace or indent text with line breaks
František Kučera <franta-hg@frantovo.cz>
parents:
128
diff
changeset
|
142 |
for (String line : lines) { |
8548e21177f9
XML formatter: option for preserve whitespace or indent text with line breaks
František Kučera <franta-hg@frantovo.cz>
parents:
128
diff
changeset
|
143 |
printText(line, true); |
8548e21177f9
XML formatter: option for preserve whitespace or indent text with line breaks
František Kučera <franta-hg@frantovo.cz>
parents:
128
diff
changeset
|
144 |
} |
8548e21177f9
XML formatter: option for preserve whitespace or indent text with line breaks
František Kučera <franta-hg@frantovo.cz>
parents:
128
diff
changeset
|
145 |
printEndElement(true); |
8548e21177f9
XML formatter: option for preserve whitespace or indent text with line breaks
František Kučera <franta-hg@frantovo.cz>
parents:
128
diff
changeset
|
146 |
} else { |
8548e21177f9
XML formatter: option for preserve whitespace or indent text with line breaks
František Kučera <franta-hg@frantovo.cz>
parents:
128
diff
changeset
|
147 |
/* |
8548e21177f9
XML formatter: option for preserve whitespace or indent text with line breaks
František Kučera <franta-hg@frantovo.cz>
parents:
128
diff
changeset
|
148 |
* line breaks at the end of the text will be eaten – if you need them, use indentText = false |
8548e21177f9
XML formatter: option for preserve whitespace or indent text with line breaks
František Kučera <franta-hg@frantovo.cz>
parents:
128
diff
changeset
|
149 |
*/ |
132
f785ee7a70a2
XML formatter fix: line breaks at the end of the text will be eaten – if you need them, use indentText = false
František Kučera <franta-hg@frantovo.cz>
parents:
130
diff
changeset
|
150 |
if (lines.length == 1 && text.endsWith("\n")) { |
f785ee7a70a2
XML formatter fix: line breaks at the end of the text will be eaten – if you need them, use indentText = false
František Kučera <franta-hg@frantovo.cz>
parents:
130
diff
changeset
|
151 |
text = text.substring(0, text.length() - 1); |
f785ee7a70a2
XML formatter fix: line breaks at the end of the text will be eaten – if you need them, use indentText = false
František Kučera <franta-hg@frantovo.cz>
parents:
130
diff
changeset
|
152 |
} |
f785ee7a70a2
XML formatter fix: line breaks at the end of the text will be eaten – if you need them, use indentText = false
František Kučera <franta-hg@frantovo.cz>
parents:
130
diff
changeset
|
153 |
|
f785ee7a70a2
XML formatter fix: line breaks at the end of the text will be eaten – if you need them, use indentText = false
František Kučera <franta-hg@frantovo.cz>
parents:
130
diff
changeset
|
154 |
printText(text, false); |
130
8548e21177f9
XML formatter: option for preserve whitespace or indent text with line breaks
František Kučera <franta-hg@frantovo.cz>
parents:
128
diff
changeset
|
155 |
printEndElement(false); |
8548e21177f9
XML formatter: option for preserve whitespace or indent text with line breaks
František Kučera <franta-hg@frantovo.cz>
parents:
128
diff
changeset
|
156 |
} |
128
67f5ff139da0
XML formatter: abstract + part of basic XML formatter
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
157 |
} |
67f5ff139da0
XML formatter: abstract + part of basic XML formatter
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
158 |
|
67f5ff139da0
XML formatter: abstract + part of basic XML formatter
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
159 |
protected void printEmptyElement(QName element, Map<QName, String> attributes) { |
67f5ff139da0
XML formatter: abstract + part of basic XML formatter
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
160 |
printStartElement(element, attributes, true); |
67f5ff139da0
XML formatter: abstract + part of basic XML formatter
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
161 |
} |
67f5ff139da0
XML formatter: abstract + part of basic XML formatter
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
162 |
|
67f5ff139da0
XML formatter: abstract + part of basic XML formatter
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
163 |
protected void printEndElement() { |
67f5ff139da0
XML formatter: abstract + part of basic XML formatter
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
164 |
printEndElement(true); |
67f5ff139da0
XML formatter: abstract + part of basic XML formatter
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
165 |
} |
67f5ff139da0
XML formatter: abstract + part of basic XML formatter
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
166 |
|
67f5ff139da0
XML formatter: abstract + part of basic XML formatter
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
167 |
private void printEndElement(boolean indent) { |
67f5ff139da0
XML formatter: abstract + part of basic XML formatter
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
168 |
try { |
67f5ff139da0
XML formatter: abstract + part of basic XML formatter
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
169 |
QName name = treePosition.pop(); |
67f5ff139da0
XML formatter: abstract + part of basic XML formatter
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
170 |
|
67f5ff139da0
XML formatter: abstract + part of basic XML formatter
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
171 |
if (indent) { |
67f5ff139da0
XML formatter: abstract + part of basic XML formatter
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
172 |
printIndent(); |
67f5ff139da0
XML formatter: abstract + part of basic XML formatter
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
173 |
} |
67f5ff139da0
XML formatter: abstract + part of basic XML formatter
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
174 |
|
67f5ff139da0
XML formatter: abstract + part of basic XML formatter
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
175 |
out.print(ELEMENT_COLOR, "</" + toString(name) + ">"); |
67f5ff139da0
XML formatter: abstract + part of basic XML formatter
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
176 |
out.flush(); |
67f5ff139da0
XML formatter: abstract + part of basic XML formatter
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
177 |
|
67f5ff139da0
XML formatter: abstract + part of basic XML formatter
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
178 |
} catch (EmptyStackException e) { |
67f5ff139da0
XML formatter: abstract + part of basic XML formatter
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
179 |
throw new IllegalStateException("No more elements to end.", e); |
67f5ff139da0
XML formatter: abstract + part of basic XML formatter
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
180 |
} |
67f5ff139da0
XML formatter: abstract + part of basic XML formatter
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
181 |
} |
67f5ff139da0
XML formatter: abstract + part of basic XML formatter
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
182 |
|
130
8548e21177f9
XML formatter: option for preserve whitespace or indent text with line breaks
František Kučera <franta-hg@frantovo.cz>
parents:
128
diff
changeset
|
183 |
protected void printText(String s, boolean indent) { |
128
67f5ff139da0
XML formatter: abstract + part of basic XML formatter
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
184 |
if (indent) { |
67f5ff139da0
XML formatter: abstract + part of basic XML formatter
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
185 |
printIndent(); |
67f5ff139da0
XML formatter: abstract + part of basic XML formatter
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
186 |
} |
67f5ff139da0
XML formatter: abstract + part of basic XML formatter
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
187 |
out.print(escapeXmlText(s)); |
67f5ff139da0
XML formatter: abstract + part of basic XML formatter
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
188 |
out.flush(); |
67f5ff139da0
XML formatter: abstract + part of basic XML formatter
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
189 |
} |
67f5ff139da0
XML formatter: abstract + part of basic XML formatter
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
190 |
|
67f5ff139da0
XML formatter: abstract + part of basic XML formatter
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
191 |
protected void printIndent() { |
67f5ff139da0
XML formatter: abstract + part of basic XML formatter
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
192 |
out.println(); |
67f5ff139da0
XML formatter: abstract + part of basic XML formatter
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
193 |
for (int i = 0; i < treePosition.size(); i++) { |
67f5ff139da0
XML formatter: abstract + part of basic XML formatter
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
194 |
out.print(indent); |
67f5ff139da0
XML formatter: abstract + part of basic XML formatter
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
195 |
} |
67f5ff139da0
XML formatter: abstract + part of basic XML formatter
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
196 |
} |
67f5ff139da0
XML formatter: abstract + part of basic XML formatter
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
197 |
|
67f5ff139da0
XML formatter: abstract + part of basic XML formatter
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
198 |
protected static QName qname(String name) { |
67f5ff139da0
XML formatter: abstract + part of basic XML formatter
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
199 |
return new QName(name); |
67f5ff139da0
XML formatter: abstract + part of basic XML formatter
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
200 |
} |
67f5ff139da0
XML formatter: abstract + part of basic XML formatter
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
201 |
|
67f5ff139da0
XML formatter: abstract + part of basic XML formatter
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
202 |
protected static QName qname(String prefix, String name) { |
67f5ff139da0
XML formatter: abstract + part of basic XML formatter
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
203 |
return new QName(null, name, prefix); |
67f5ff139da0
XML formatter: abstract + part of basic XML formatter
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
204 |
} |
67f5ff139da0
XML formatter: abstract + part of basic XML formatter
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
205 |
|
67f5ff139da0
XML formatter: abstract + part of basic XML formatter
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
206 |
private String toString(QName name) { |
67f5ff139da0
XML formatter: abstract + part of basic XML formatter
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
207 |
if (isEmpty(name.getPrefix(), true)) { |
67f5ff139da0
XML formatter: abstract + part of basic XML formatter
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
208 |
return escapeName(name.getLocalPart()); |
67f5ff139da0
XML formatter: abstract + part of basic XML formatter
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
209 |
} else { |
67f5ff139da0
XML formatter: abstract + part of basic XML formatter
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
210 |
return escapeName(name.getPrefix()) + ":" + escapeName(name.getLocalPart()); |
67f5ff139da0
XML formatter: abstract + part of basic XML formatter
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
211 |
} |
67f5ff139da0
XML formatter: abstract + part of basic XML formatter
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
212 |
} |
67f5ff139da0
XML formatter: abstract + part of basic XML formatter
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
213 |
|
67f5ff139da0
XML formatter: abstract + part of basic XML formatter
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
214 |
private String escapeName(String s) { |
67f5ff139da0
XML formatter: abstract + part of basic XML formatter
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
215 |
// TODO: avoid ugly values in <name name="…"/> |
67f5ff139da0
XML formatter: abstract + part of basic XML formatter
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
216 |
return s; |
67f5ff139da0
XML formatter: abstract + part of basic XML formatter
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
217 |
} |
67f5ff139da0
XML formatter: abstract + part of basic XML formatter
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
218 |
|
67f5ff139da0
XML formatter: abstract + part of basic XML formatter
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
219 |
private static String escapeXmlText(String s) { |
67f5ff139da0
XML formatter: abstract + part of basic XML formatter
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
220 |
return s.replaceAll("&", "&").replaceAll("<", "<").replaceAll(">", ">"); |
67f5ff139da0
XML formatter: abstract + part of basic XML formatter
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
221 |
// Not needed: |
67f5ff139da0
XML formatter: abstract + part of basic XML formatter
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
222 |
// return s.replaceAll("&", "&").replaceAll("<", "<").replaceAll(">", ">").replaceAll("\"", """).replaceAll("'", "'"); |
67f5ff139da0
XML formatter: abstract + part of basic XML formatter
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
223 |
} |
67f5ff139da0
XML formatter: abstract + part of basic XML formatter
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
224 |
|
67f5ff139da0
XML formatter: abstract + part of basic XML formatter
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
225 |
/** |
67f5ff139da0
XML formatter: abstract + part of basic XML formatter
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
226 |
* Expects attribute values enclosed in "quotes" not 'apostrophes'. |
67f5ff139da0
XML formatter: abstract + part of basic XML formatter
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
227 |
*/ |
67f5ff139da0
XML formatter: abstract + part of basic XML formatter
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
228 |
private static String escapeXmlAttribute(String s) { |
67f5ff139da0
XML formatter: abstract + part of basic XML formatter
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
229 |
return s.replaceAll("&", "&").replaceAll("<", "<").replaceAll(">", ">").replaceAll("\"", """); |
67f5ff139da0
XML formatter: abstract + part of basic XML formatter
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
230 |
} |
67f5ff139da0
XML formatter: abstract + part of basic XML formatter
František Kučera <franta-hg@frantovo.cz>
parents:
diff
changeset
|
231 |
} |