/*
* Copyright (C) 2010-2016 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.decompiler.flash.importers;
import com.jpexs.decompiler.flash.SWF;
import com.jpexs.decompiler.flash.configuration.Configuration;
import com.jpexs.decompiler.flash.exporters.settings.TextExportSettings;
import com.jpexs.decompiler.flash.tags.DefineEditTextTag;
import com.jpexs.decompiler.flash.tags.DefineText2Tag;
import com.jpexs.decompiler.flash.tags.DefineTextTag;
import com.jpexs.decompiler.flash.tags.base.MissingCharacterHandler;
import com.jpexs.decompiler.flash.tags.base.TextImportErrorHandler;
import com.jpexs.decompiler.flash.tags.base.TextTag;
import com.jpexs.decompiler.flash.tags.text.TextParseException;
import com.jpexs.helpers.Helper;
import com.jpexs.helpers.Path;
import java.io.File;
import java.io.FilenameFilter;
import java.util.HashMap;
import java.util.Map;
import java.util.regex.Pattern;
/**
*
* @author JPEXS
*/
public class TextImporter {
private final MissingCharacterHandler missingCharacterHandler;
private final TextImportErrorHandler errorHandler;
public TextImporter(MissingCharacterHandler missingCharacterHandler, TextImportErrorHandler errorHandler) {
this.missingCharacterHandler = missingCharacterHandler;
this.errorHandler = errorHandler;
}
private Map<Integer, String[]> splitTextRecords(String texts) {
String[] textsArr = texts.split(Helper.newLine + Configuration.textExportSingleFileSeparator.get() + Helper.newLine);
String recordSeparator = Helper.newLine + Configuration.textExportSingleFileRecordSeparator.get() + Helper.newLine;
Map<Integer, String[]> result = new HashMap<>();
for (String text : textsArr) {
String[] textArr = text.split(Helper.newLine, 2);
String idLine = textArr[0];
if (idLine.startsWith("ID:")) {
int id = Integer.parseInt(idLine.substring(3).trim());
String[] records = textArr[1].split(recordSeparator);
result.put(id, records);
} else if (errorHandler.handle(null)) {
return null;
}
}
return result;
}
public void importTextsSingleFile(File textsFile, SWF swf) {
String texts = Helper.readTextFile(textsFile.getPath());
Map<Integer, String[]> records = splitTextRecords(texts);
boolean ignoreLetterSpacing = Configuration.resetLetterSpacingOnTextImport.get();
if (records != null) {
for (int characterId : records.keySet()) {
TextTag textTag = swf.getText(characterId);
if (textTag != null) {
String[] currentRecords = records.get(characterId);
String text = textTag.getFormattedText(ignoreLetterSpacing).text;
if (!saveText(textTag, text, currentRecords)) {
return;
}
}
}
}
}
public void importTextsSingleFileFormatted(File textsFile, SWF swf) {
String texts = Helper.readTextFile(textsFile.getPath());
Map<Integer, String[]> records = splitTextRecords(texts);
if (records != null) {
for (int characterId : records.keySet()) {
TextTag textTag = swf.getText(characterId);
if (textTag != null) {
String[] currentRecords = records.get(characterId);
if (!saveText(textTag, currentRecords[0], null)) {
return;
}
}
}
}
}
public void importTextsMultipleFiles(String folder, SWF swf) {
File textsFolder = new File(Path.combine(folder, TextExportSettings.EXPORT_FOLDER_NAME));
String[] files = textsFolder.list(new FilenameFilter() {
private final Pattern pat = Pattern.compile("\\d+\\.txt", Pattern.CASE_INSENSITIVE);
@Override
public boolean accept(File dir, String name) {
return pat.matcher(name).matches();
}
});
if (files == null) {
return;
}
for (String fileName : files) {
String texts = Helper.readTextFile(Path.combine(textsFolder.getPath(), fileName));
int characterId = Integer.parseInt(fileName.split("\\.")[0]);
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);
boolean ignoreLetterSpacing = Configuration.resetLetterSpacingOnTextImport.get();
if (!formatted) {
String[] records = newText.split(recordSeparator);
if (textTag != null) {
String text = textTag.getFormattedText(ignoreLetterSpacing).text;
if (!saveText(textTag, text, records)) {
return false;
}
}
} else if (textTag != null) {
if (!saveText(textTag, newText, null)) {
return false;
}
}
return true;
}
/**
* Stores the new text to the text tag
*
* @param textTag
* @param formattedText
* @param texts
* @return If false the processing should be interrupted
*/
private boolean saveText(TextTag textTag, String formattedText, String[] texts) {
try {
if (textTag.setFormattedText(missingCharacterHandler, formattedText, texts)) {
return true;
}
return !errorHandler.handle(textTag);
} catch (TextParseException ex) {
return !errorHandler.handle(textTag, ex.text, ex.line);
}
}
public static int getTextTagType(String format) {
int res = 0;
switch (format) {
case "text":
res = DefineTextTag.ID;
break;
case "text2":
res = DefineText2Tag.ID;
break;
case "edittext":
res = DefineEditTextTag.ID;
break;
}
return res;
}
}