1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-04-23 14:42:11 +02:00

bug 286751: .cproject does not look pretty

pretty-printing for XML files
This commit is contained in:
Andrew Gvozdev 2009-08-19 17:15:59 +00:00
parent a4d4297044
commit 88633a03ea
3 changed files with 108 additions and 0 deletions

View file

@ -37,6 +37,7 @@ import javax.xml.transform.stream.StreamResult;
import org.eclipse.cdt.core.CCorePlugin;
import org.eclipse.cdt.core.settings.model.ICProjectDescription;
import org.eclipse.cdt.internal.core.CConfigBasedDescriptorManager;
import org.eclipse.cdt.internal.core.XmlUtil;
import org.eclipse.cdt.internal.core.settings.model.ICProjectDescriptionStorageType.CProjectDescriptionStorageTypeProxy;
import org.eclipse.cdt.internal.core.settings.model.xml.XmlProjectDescriptionStorage;
import org.eclipse.cdt.internal.core.settings.model.xml2.XmlProjectDescriptionStorage2;
@ -160,6 +161,7 @@ public class CProjectDescriptionStorageManager {
Element el = doc.createElement(ICProjectDescriptionStorageType.STORAGE_ROOT_ELEMENT_NAME);
el.setAttribute(ICProjectDescriptionStorageType.STORAGE_TYPE_ATTRIBUTE, type.id);
doc.appendChild(el);
XmlUtil.prettyFormat(doc);
ByteArrayOutputStream stream = new ByteArrayOutputStream();
Transformer transformer = TransformerFactory.newInstance().newTransformer();

View file

@ -40,6 +40,7 @@ import org.eclipse.cdt.core.settings.model.ICSettingsStorage;
import org.eclipse.cdt.core.settings.model.ICStorageElement;
import org.eclipse.cdt.core.settings.model.extension.ICProjectConverter;
import org.eclipse.cdt.core.settings.model.util.CDataUtil;
import org.eclipse.cdt.internal.core.XmlUtil;
import org.eclipse.cdt.internal.core.envvar.ContributedEnvironment;
import org.eclipse.cdt.internal.core.settings.model.AbstractCProjectDescriptionStorage;
import org.eclipse.cdt.internal.core.settings.model.CProjectDescription;
@ -463,6 +464,7 @@ public class XmlProjectDescriptionStorage extends AbstractCProjectDescriptionSto
*/
private ByteArrayOutputStream write(ICStorageElement element) throws CoreException {
Document doc = ((InternalXmlStorageElement) element).fElement.getOwnerDocument();
XmlUtil.prettyFormat(doc);
ByteArrayOutputStream stream = new ByteArrayOutputStream();
try {

View file

@ -0,0 +1,104 @@
/*******************************************************************************
* Copyright (c) 2009, 2009 Andrew Gvozdev (Quoin Inc.).
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Andrew Gvozdev (Quoin Inc.)
*******************************************************************************/
package org.eclipse.cdt.internal.core;
import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
/**
* XML utilities.
*
*/
public class XmlUtil {
private static final String EOL_XML = "\n"; //$NON-NLS-1$
private static final String DEFAULT_IDENT = "\t"; //$NON-NLS-1$
/**
* As a workaround for {@code javax.xml.transform.Transformer} not being able
* to pretty print XML. This method prepares DOM {@code Document} for the transformer
* to be pretty printed, i.e. providing proper indentations for enclosed tags.
*
* @param doc - DOM document to be pretty printed
*/
public static void prettyFormat(Document doc) {
prettyFormat(doc, DEFAULT_IDENT);
}
/**
* As a workaround for {@code javax.xml.transform.Transformer} not being able
* to pretty print XML. This method prepares DOM {@code Document} for the transformer
* to be pretty printed, i.e. providing proper indentations for enclosed tags.
*
* @param doc - DOM document to be pretty printed
* @param ident - custom indentation as a string of white spaces
*/
public static void prettyFormat(Document doc, String ident) {
doc.normalize();
prettyFormat(doc.getDocumentElement(), "", ident); //$NON-NLS-1$
}
/**
* The method inserts end-of-line+indentation Text nodes where indentation is necessary.
*
* @param node - node to be pretty formatted
* @param identLevel - initial indentation level of the node
* @param ident - additional indentation inside the node
*/
private static void prettyFormat(Node node, String identLevel, String ident) {
NodeList nodelist = node.getChildNodes();
int iStart=0;
Node item = nodelist.item(0);
if (item!=null) {
short type = item.getNodeType();
if (type==Node.ELEMENT_NODE || type==Node.COMMENT_NODE) {
Node newChild = node.getOwnerDocument().createTextNode(EOL_XML + identLevel + ident);
node.insertBefore(newChild, item);
iStart=1;
}
}
for (int i=iStart;i<nodelist.getLength();i++) {
item = nodelist.item(i);
if (item!=null) {
short type = item.getNodeType();
if (type==Node.TEXT_NODE && item.getNodeValue().trim().length()==0) {
if (i+1<nodelist.getLength()) {
item.setNodeValue(EOL_XML + identLevel + ident);
} else {
item.setNodeValue(EOL_XML + identLevel);
}
} else if (type==Node.ELEMENT_NODE) {
prettyFormat(item, identLevel + ident, ident);
if (i+1<nodelist.getLength()) {
Node nextItem = nodelist.item(i+1);
if (nextItem!=null) {
short nextType = nextItem.getNodeType();
if (nextType==Node.ELEMENT_NODE || nextType==Node.COMMENT_NODE) {
Node newChild = node.getOwnerDocument().createTextNode(EOL_XML + identLevel + ident);
node.insertBefore(newChild, nextItem);
i++;
continue;
}
}
} else {
Node newChild = node.getOwnerDocument().createTextNode(EOL_XML + identLevel);
node.appendChild(newChild);
i++;
continue;
}
}
}
}
}
}