private StringBuilder mOut;
/** String to insert for a single indentation level */
private String mIndentString;
+ /** Line separator to use */
+ private String mLineSeparator;
/**
* Creates a new {@link XmlPrettyPrinter}
*
* @param prefs the preferences to format with
* @param style the style to format with
+ * @param lineSeparator the line separator to use, such as "\n"
*/
- XmlPrettyPrinter(XmlFormatPreferences prefs, XmlFormatStyle style) {
+ XmlPrettyPrinter(XmlFormatPreferences prefs, XmlFormatStyle style, String lineSeparator) {
mPrefs = prefs;
mStyle = style;
+ mLineSeparator = lineSeparator;
}
/**
private void printProcessingInstruction(Node node) {
mOut.append("<?xml "); //$NON-NLS-1$
mOut.append(node.getNodeValue().trim());
- mOut.append('?').append('>').append('\n');
+ mOut.append('?').append('>').append(mLineSeparator);
}
private void printDocType(Node node) {
if (node instanceof DocumentTypeImpl) {
String content = ((DocumentTypeImpl) node).getSource();
mOut.append(content);
- mOut.append('\n');
+ mOut.append(mLineSeparator);
}
}
indent(depth);
mOut.append("<![CDATA["); //$NON-NLS-1$
mOut.append(node.getNodeValue());
- mOut.append("]]>\n"); //$NON-NLS-1$
+ mOut.append("]]>"); //$NON-NLS-1$
+ mOut.append(mLineSeparator);
}
private void printText(Node node) {
DomUtilities.appendXmlTextValue(mOut, text);
if (mStyle != XmlFormatStyle.RESOURCE) {
- mOut.append('\n');
+ mOut.append(mLineSeparator);
}
}
}
|| (curr.getNodeType() == Node.TEXT_NODE
&& curr.getNodeValue().trim().length() == 0
&& (curr.getPreviousSibling() == null
- || curr.getPreviousSibling().getNodeType() == Node.ELEMENT_NODE))) {
- mOut.append('\n');
+ || curr.getPreviousSibling().getNodeType() == Node.ELEMENT_NODE))) {
+ mOut.append(mLineSeparator);
}
}
indent(depth);
mOut.append("<!-- "); //$NON-NLS-1$
mOut.append(trimmed);
- mOut.append(" -->\n"); //$NON-NLS-1$
+ mOut.append(" -->"); //$NON-NLS-1$
+ mOut.append(mLineSeparator);
} else {
indent(depth);
- mOut.append("<!--\n"); //$NON-NLS-1$
+ mOut.append("<!--"); //$NON-NLS-1$
+ mOut.append(mLineSeparator);
int index = 0;
int end = comment.length();
int recentNewline = 0;
if (start < end) {
mOut.append(comment.substring(start, end));
}
- mOut.append('\n');
+ mOut.append(mLineSeparator);
indent(depth);
- mOut.append("-->\n"); //$NON-NLS-1$
+ mOut.append("-->"); //$NON-NLS-1$
+ mOut.append(mLineSeparator);
}
}
private void printOpenElementTag(int depth, Node node) {
Element element = (Element) node;
if (newlineBeforeElementOpen(element, depth)) {
- mOut.append('\n');
+ mOut.append(mLineSeparator);
}
if (indentBeforeElementOpen(element, depth)) {
indent(depth);
if (singleLine) {
mOut.append(' ');
} else {
- mOut.append('\n');
+ mOut.append(mLineSeparator);
}
// Sort the attributes
// Don't add a newline at the last attribute line; the > should
// immediately follow the last attribute
if (attribute != last) {
- mOut.append(singleLine ? ' ' : '\n');
+ mOut.append(singleLine ? " " : mLineSeparator); //$NON-NLS-1$
}
}
}
mOut.append('>');
if (newlineAfterElementOpen(element, depth, isClosed)) {
- mOut.append('\n');
+ mOut.append(mLineSeparator);
}
}
// resource file format
// If the element had element children, separate the end tag from them
if (newlineBeforeElementClose(element, depth)) {
- mOut.append('\n');
+ mOut.append(mLineSeparator);
}
if (indentBeforeElementClose(element, depth)) {
indent(depth);
mOut.append('>');
if (newlineAfterElementClose(element, depth)) {
- mOut.append('\n');
+ mOut.append(mLineSeparator);
}
}
}
private boolean indentBeforeElementClose(Element element, int depth) {
- return mOut.charAt(mOut.length() - 1) == '\n';
+ char lastOutChar = mOut.charAt(mOut.length() - 1);
+ char lastDelimiterChar = mLineSeparator.charAt(mLineSeparator.length() - 1);
+ return lastOutChar == lastDelimiterChar;
}
private boolean newlineAfterElementOpen(Element element, int depth, boolean isClosed) {
public class XmlPrettyPrinterTest extends TestCase {
private void checkFormat(XmlFormatPreferences prefs, XmlFormatStyle style,
- String xml, String expected) throws Exception {
+ String xml, String expected, String delimiter) throws Exception {
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
InputSource is = new InputSource(new StringReader(xml));
});
Document document = builder.parse(is);
- XmlPrettyPrinter printer = new XmlPrettyPrinter(prefs, style);
+ XmlPrettyPrinter printer = new XmlPrettyPrinter(prefs, style, delimiter);
StringBuilder sb = new StringBuilder(1000);
printer.prettyPrint(-1, document, document, document, sb);
assertEquals(expected, formatted);
}
+ private void checkFormat(XmlFormatPreferences prefs, XmlFormatStyle style,
+ String xml, String expected) throws Exception {
+ checkFormat(prefs, style, xml, expected, "\n"); //$NON-NLS-1$
+ }
private void checkFormat(XmlFormatStyle style, String xml, String expected)
throws Exception {
XmlFormatPreferences prefs = XmlFormatPreferences.create();
"\n" +
"</LinearLayout>");
}
+
+ public void testWindowsDelimiters() throws Exception {
+ checkFormat(
+ XmlFormatPreferences.create(), XmlFormatStyle.LAYOUT,
+ "<LinearLayout><Button foo=\"bar\"></Button></LinearLayout>",
+ "<LinearLayout>\r\n" +
+ "\r\n" +
+ " <Button\r\n" +
+ " foo=\"bar\">\r\n" +
+ " </Button>\r\n" +
+ "\r\n" +
+ "</LinearLayout>",
+ "\r\n");
+ }
}