From c4530dfdd5d84c14078f65d705c9b486c8826da1 Mon Sep 17 00:00:00 2001 From: "honfika@gmail.com" Date: Tue, 14 Jul 2015 21:52:44 +0200 Subject: [PATCH] #967 Replace DefineText content from CLI --- .../flash/importers/TextImporter.java | 39 +++++++++++-------- .../console/CommandLineArgumentParser.java | 25 +++++++++++- .../jpexs/decompiler/flash/gui/MainPanel.java | 6 +-- 3 files changed, 50 insertions(+), 20 deletions(-) diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/importers/TextImporter.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/importers/TextImporter.java index 5bf9ddc54..06fa79231 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/importers/TextImporter.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/importers/TextImporter.java @@ -119,26 +119,33 @@ public class TextImporter { for (String fileName : files) { String texts = Helper.readTextFile(Path.combine(textsFolder.getPath(), fileName)); int characterId = Integer.parseInt(fileName.split("\\.")[0]); - String recordSeparator = Helper.newLine + Configuration.textExportSingleFileRecordSeparator.get() + Helper.newLine; - boolean formatted = !texts.contains(recordSeparator) && texts.startsWith("[" + Helper.newLine); - if (!formatted) { - String[] records = texts.split(recordSeparator); - TextTag textTag = swf.getText(characterId); - if (textTag != null) { - String text = textTag.getFormattedText().text; - if (!saveText(textTag, text, records)) { - return; - } + TextTag textTag = swf.getText(characterId); + if (!importText(textTag, texts)) { + return; + } + } + } + + public boolean importText(TextTag textTag, String newText) { + String recordSeparator = Helper.newLine + Configuration.textExportSingleFileRecordSeparator.get() + Helper.newLine; + boolean formatted = !newText.contains(recordSeparator) && newText.startsWith("[" + Helper.newLine); + if (!formatted) { + String[] records = newText.split(recordSeparator); + if (textTag != null) { + String text = textTag.getFormattedText().text; + if (!saveText(textTag, text, records)) { + return false; } - } else { - TextTag textTag = swf.getText(characterId); - if (textTag != null) { - if (!saveText(textTag, texts, null)) { - return; - } + } + } else { + if (textTag != null) { + if (!saveText(textTag, newText, null)) { + return false; } } } + + return true; } /** diff --git a/src/com/jpexs/decompiler/flash/console/CommandLineArgumentParser.java b/src/com/jpexs/decompiler/flash/console/CommandLineArgumentParser.java index 05670831c..22586dc88 100644 --- a/src/com/jpexs/decompiler/flash/console/CommandLineArgumentParser.java +++ b/src/com/jpexs/decompiler/flash/console/CommandLineArgumentParser.java @@ -83,6 +83,7 @@ import com.jpexs.decompiler.flash.importers.BinaryDataImporter; import com.jpexs.decompiler.flash.importers.ImageImporter; import com.jpexs.decompiler.flash.importers.ShapeImporter; import com.jpexs.decompiler.flash.importers.SwfXmlImporter; +import com.jpexs.decompiler.flash.importers.TextImporter; import com.jpexs.decompiler.flash.tags.DefineBinaryDataTag; import com.jpexs.decompiler.flash.tags.DefineBitsJPEG2Tag; import com.jpexs.decompiler.flash.tags.DefineBitsJPEG3Tag; @@ -95,8 +96,11 @@ import com.jpexs.decompiler.flash.tags.base.ButtonTag; import com.jpexs.decompiler.flash.tags.base.CharacterIdTag; import com.jpexs.decompiler.flash.tags.base.CharacterTag; import com.jpexs.decompiler.flash.tags.base.ImageTag; +import com.jpexs.decompiler.flash.tags.base.MissingCharacterHandler; import com.jpexs.decompiler.flash.tags.base.ShapeTag; import com.jpexs.decompiler.flash.tags.base.SoundTag; +import com.jpexs.decompiler.flash.tags.base.TextImportErrorHandler; +import com.jpexs.decompiler.flash.tags.base.TextTag; import com.jpexs.decompiler.flash.treeitems.SWFList; import com.jpexs.decompiler.flash.types.ColorTransform; import com.jpexs.decompiler.flash.types.RECT; @@ -107,6 +111,7 @@ import com.jpexs.helpers.CancellableWorker; import com.jpexs.helpers.Helper; import com.jpexs.helpers.Path; import com.jpexs.helpers.streams.SeekableInputStream; +import com.jpexs.helpers.utf8.Utf8Helper; import com.sun.jna.Platform; import com.sun.jna.platform.win32.Kernel32; import gnu.jpdf.PDFJob; @@ -316,7 +321,7 @@ public class CommandLineArgumentParser { out.println(" " + (cnt++) + ") -zoom "); out.println(" ...apply zoom during export (currently for FlashPaper conversion only)"); out.println(" " + (cnt++) + ") -replace (|) [methodBodyIndex1] [(|) [methodBodyIndex2]]..."); - out.println(" ...replaces the data of the specified BinaryData, Image, DefineSound tag or Script"); + out.println(" ...replaces the data of the specified BinaryData, Image, Text, DefineSound tag or Script"); out.println(" ...methodBodyIndexN parameter should be specified if and only if the imported entity is an AS3 P-Code"); out.println(" " + (cnt++) + ") -replaceAlpha [ ]..."); out.println(" ...replaces the alpha channel of the specified JPEG3 or JPEG4 tag"); @@ -1788,6 +1793,24 @@ public class CommandLineArgumentParser { } else if (characterTag instanceof ShapeTag) { ShapeTag shapeTag = (ShapeTag) characterTag; new ShapeImporter().importImage(shapeTag, data); + } else if (characterTag instanceof TextTag) { + TextTag textTag = (TextTag) characterTag; + new TextImporter(new MissingCharacterHandler(), new TextImportErrorHandler() { + + @Override + public boolean handle(TextTag textTag) { + String msg = "Error during text import."; + logger.log(Level.SEVERE, msg); + return false; + } + + @Override + public boolean handle(TextTag textTag, String message, long line) { + String msg = "Error during text import: %text% on line %line%".replace("%text%", message).replace("%line%", Long.toString(line)); + logger.log(Level.SEVERE, msg); + return false; + } + }).importText(textTag, new String(data, Utf8Helper.charset)); } else if (characterTag instanceof SoundTag) { SoundTag st = (SoundTag) characterTag; int soundFormat = SoundFormat.FORMAT_UNCOMPRESSED_LITTLE_ENDIAN; diff --git a/src/com/jpexs/decompiler/flash/gui/MainPanel.java b/src/com/jpexs/decompiler/flash/gui/MainPanel.java index 0f392f8d2..792a297fc 100644 --- a/src/com/jpexs/decompiler/flash/gui/MainPanel.java +++ b/src/com/jpexs/decompiler/flash/gui/MainPanel.java @@ -1981,12 +1981,12 @@ public final class MainPanel extends JPanel implements TreeSelectionListener, Se private final ConfigurationItem showAgainInvalidText = new ConfigurationItem<>("showAgainInvalidText", true, true); private String getTextTagInfo(TextTag textTag) { - String ret = ""; + StringBuilder ret = new StringBuilder(); if (textTag != null) { - ret += " TextId: " + textTag.getCharacterId() + " (" + String.join(", ", textTag.getTexts()) + ")"; + ret.append(" TextId: ").append(textTag.getCharacterId()).append(" (").append(String.join(", ", textTag.getTexts())).append(")"); } - return ret; + return ret.toString(); } @Override