diff --git a/CHANGELOG.md b/CHANGELOG.md index 2b495b375..60aa3789b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,6 +11,7 @@ All notable changes to this project will be documented in this file. - [#1972] AS3 imports taken only from packages, not package internal - Unresponsive status bar and its icon - [#1973] FLA export - improper calculation of shape instance count +- FLA export - XML formatting with blank lines on Java9+ ## [18.3.5] - 2023-02-12 ### Added diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/exporters/script/AS3ScriptExporter.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/exporters/script/AS3ScriptExporter.java index c6db6385e..11c71e774 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/exporters/script/AS3ScriptExporter.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/exporters/script/AS3ScriptExporter.java @@ -49,10 +49,9 @@ import com.jpexs.decompiler.graph.ScopeStack; import com.jpexs.helpers.CancellableWorker; import com.jpexs.helpers.Helper; import com.jpexs.helpers.Path; +import com.jpexs.helpers.XmlPrettyFormat; import com.jpexs.helpers.utf8.Utf8Helper; import java.io.File; -import java.io.StringReader; -import java.io.StringWriter; import java.util.ArrayList; import java.util.HashMap; import java.util.HashSet; @@ -68,14 +67,6 @@ import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeoutException; import java.util.logging.Level; import java.util.logging.Logger; -import javax.xml.transform.OutputKeys; -import javax.xml.transform.Source; -import javax.xml.transform.Transformer; -import javax.xml.transform.TransformerException; -import javax.xml.transform.TransformerFactory; -import javax.xml.transform.TransformerFactoryConfigurationError; -import javax.xml.transform.stream.StreamResult; -import javax.xml.transform.stream.StreamSource; /** * @@ -86,22 +77,7 @@ public class AS3ScriptExporter { private static final Logger logger = Logger.getLogger(AS3ScriptExporter.class.getName()); private static String prettyFormatXML(String input) { - int indent = 5; - try { - Source xmlInput = new StreamSource(new StringReader(input)); - StringWriter stringWriter = new StringWriter(); - StreamResult xmlOutput = new StreamResult(stringWriter); - TransformerFactory transformerFactory = TransformerFactory.newInstance(); - transformerFactory.setAttribute("indent-number", indent); - Transformer transformer = transformerFactory.newTransformer(); - transformer.setOutputProperty(OutputKeys.INDENT, "yes"); - transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes"); - transformer.transform(xmlInput, xmlOutput); - return xmlOutput.getWriter().toString(); - } catch (TransformerFactoryConfigurationError | IllegalArgumentException | TransformerException e) { - logger.log(Level.SEVERE, "Pretty print error", e); - return input; - } + return new XmlPrettyFormat().prettyFormat(input, 5, false); } private String handleMxmlMethod(AbcIndexing abcIndex, Map namespaces, ScriptPack pack, int cindex, TraitMethodGetterSetter t) { diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/exporters/swf/SwfXmlExporter.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/exporters/swf/SwfXmlExporter.java index f34c0358b..8e695a760 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/exporters/swf/SwfXmlExporter.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/exporters/swf/SwfXmlExporter.java @@ -27,6 +27,7 @@ import com.jpexs.decompiler.flash.types.annotations.Multiline; import com.jpexs.helpers.ByteArrayRange; import com.jpexs.helpers.Helper; import com.jpexs.helpers.ReflectionTools; +import com.jpexs.helpers.XmlPrettyFormat; import com.jpexs.helpers.utf8.Utf8OutputStreamWriter; import java.io.BufferedOutputStream; import java.io.File; @@ -45,11 +46,6 @@ import java.util.logging.Logger; import javax.xml.stream.XMLOutputFactory; import javax.xml.stream.XMLStreamException; import javax.xml.stream.XMLStreamWriter; -import javax.xml.transform.OutputKeys; -import javax.xml.transform.Transformer; -import javax.xml.transform.TransformerFactory; -import javax.xml.transform.stream.StreamResult; -import javax.xml.transform.stream.StreamSource; /** * @@ -78,15 +74,10 @@ public class SwfXmlExporter { xmlWriter.flush(); xmlWriter.close(); } - - TransformerFactory factory = TransformerFactory.newInstance(); - - Transformer transformer = factory.newTransformer(); - transformer.setOutputProperty(OutputKeys.INDENT, "yes"); - transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "2"); - - transformer.transform(new StreamSource(tmp), new StreamResult(outFile)); - + + if (!new XmlPrettyFormat().prettyFormat(tmp, outFile, 2, true)) { + logger.log(Level.SEVERE, "Cannot prettyformat SVG"); + } tmp.delete(); } catch (Exception ex) { logger.log(Level.SEVERE, null, ex); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/xfl/XFLConverter.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/xfl/XFLConverter.java index 2e4f32e86..8954ed135 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/xfl/XFLConverter.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/xfl/XFLConverter.java @@ -16,8 +16,8 @@ */ package com.jpexs.decompiler.flash.xfl; +import com.jpexs.helpers.XmlPrettyFormat; import com.jpexs.decompiler.flash.xfl.shapefixer.CurvedEdgeRecordAdvanced; -import com.jpexs.decompiler.flash.xfl.shapefixer.ShapeFixer; import com.jpexs.decompiler.flash.xfl.shapefixer.StraightEdgeRecordAdvanced; import com.jpexs.decompiler.flash.xfl.shapefixer.ShapeRecordAdvanced; import com.jpexs.decompiler.flash.xfl.shapefixer.StyleChangeRecordAdvanced; @@ -48,7 +48,6 @@ import com.jpexs.decompiler.flash.abc.types.traits.TraitMethodGetterSetter; import com.jpexs.decompiler.flash.amf.amf3.Amf3Value; import com.jpexs.decompiler.flash.amf.amf3.types.ObjectType; import com.jpexs.decompiler.flash.configuration.Configuration; -import com.jpexs.decompiler.flash.exporters.ImageExporter; import com.jpexs.decompiler.flash.exporters.MovieExporter; import com.jpexs.decompiler.flash.exporters.SoundExporter; import com.jpexs.decompiler.flash.exporters.commonshape.Matrix; @@ -152,7 +151,6 @@ import java.io.FileOutputStream; import java.io.IOException; import java.io.StringReader; import java.io.StringWriter; -import java.nio.file.Paths; import java.text.DecimalFormat; import java.text.DecimalFormatSymbols; import java.util.ArrayList; @@ -176,11 +174,9 @@ import javax.xml.parsers.SAXParser; import javax.xml.parsers.SAXParserFactory; import javax.xml.stream.XMLStreamException; import javax.xml.transform.OutputKeys; -import javax.xml.transform.Source; import javax.xml.transform.Transformer; import javax.xml.transform.TransformerException; import javax.xml.transform.TransformerFactory; -import javax.xml.transform.TransformerFactoryConfigurationError; import javax.xml.transform.dom.DOMSource; import javax.xml.transform.stream.StreamResult; import javax.xml.transform.stream.StreamSource; @@ -2098,23 +2094,8 @@ public class XFLConverter { writer.writeEndElement(); } - private static String prettyFormatXML(String input) { - int indent = 5; - try { - Source xmlInput = new StreamSource(new StringReader(input)); - StringWriter stringWriter = new StringWriter(); - StreamResult xmlOutput = new StreamResult(stringWriter); - TransformerFactory transformerFactory = TransformerFactory.newInstance(); - transformerFactory.setAttribute("indent-number", indent); - Transformer transformer = transformerFactory.newTransformer(); - transformer.setOutputProperty(OutputKeys.INDENT, "yes"); - transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes"); - transformer.transform(xmlInput, xmlOutput); - return xmlOutput.getWriter().toString(); - } catch (TransformerFactoryConfigurationError | IllegalArgumentException | TransformerException e) { - logger.log(Level.SEVERE, "Pretty print error", e); - return input; - } + private String prettyFormatXML(String input) { + return new XmlPrettyFormat().prettyFormat(input, 5, false); } private static void convertSoundUsage(XFLXmlWriter writer, DefineSoundTag sound, SOUNDINFO soundInfo) throws XMLStreamException { diff --git a/libsrc/ffdec_lib/src/com/jpexs/helpers/XmlPrettyFormat.java b/libsrc/ffdec_lib/src/com/jpexs/helpers/XmlPrettyFormat.java new file mode 100644 index 000000000..175d2e08f --- /dev/null +++ b/libsrc/ffdec_lib/src/com/jpexs/helpers/XmlPrettyFormat.java @@ -0,0 +1,82 @@ +/* + * Copyright (C) 2010-2022 JPEXS, All rights reserved. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3.0 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library. + */ +package com.jpexs.helpers; + +import java.io.File; +import java.io.StringReader; +import java.io.StringWriter; +import java.util.logging.Level; +import java.util.logging.Logger; +import javax.xml.transform.OutputKeys; +import javax.xml.transform.Result; +import javax.xml.transform.Source; +import javax.xml.transform.Transformer; +import javax.xml.transform.TransformerException; +import javax.xml.transform.TransformerFactory; +import javax.xml.transform.TransformerFactoryConfigurationError; +import javax.xml.transform.stream.StreamResult; +import javax.xml.transform.stream.StreamSource; + +/** + * + * @author JPEXS + */ +public class XmlPrettyFormat { + + private static final String PRETTY_PRINT_XSLT = "\n" + + " \n" + + " \n" + + "\n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + "\n" + + ""; + + public boolean prettyFormat(Source source, Result result, int indent, boolean withXmlDeclaration) { + try { + TransformerFactory transformerFactory = TransformerFactory.newInstance(); + transformerFactory.setAttribute("indent-number", indent); + Transformer transformer = transformerFactory.newTransformer(new StreamSource(new StringReader(PRETTY_PRINT_XSLT))); + transformer.setOutputProperty(OutputKeys.INDENT, "yes"); + if (!withXmlDeclaration) { + transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes"); + } + transformer.transform(source, result); + return true; + } catch (TransformerFactoryConfigurationError | IllegalArgumentException | TransformerException e) { + Logger.getLogger(XmlPrettyFormat.class.getName()).log(Level.SEVERE, "Pretty print error", e); + return false; + } + } + + public boolean prettyFormat(File source, File result, int indent, boolean withXmlDeclaration) { + return prettyFormat(new StreamSource(source), new StreamResult(result), indent, withXmlDeclaration); + } + + public String prettyFormat(String input, int indent, boolean withXmlDeclaration) { + Source xmlInput = new StreamSource(new StringReader(input)); + StringWriter stringWriter = new StringWriter(); + StreamResult xmlOutput = new StreamResult(stringWriter); + if (!prettyFormat(xmlInput, xmlOutput, indent, withXmlDeclaration)) { + return input; + } + return xmlOutput.getWriter().toString(); + } +}