package charactermanaj.model.io;\r
\r
import java.awt.image.BufferedImage;\r
-import java.io.ByteArrayInputStream;\r
-import java.io.ByteArrayOutputStream;\r
import java.io.File;\r
import java.io.IOException;\r
import java.io.InputStream;\r
-import java.io.InputStreamReader;\r
import java.net.URI;\r
import java.net.URISyntaxException;\r
import java.util.ArrayList;\r
if (content == null) {\r
throw new IllegalArgumentException();\r
}\r
-\r
- // 一旦メモリに取り込む\r
- ByteArrayOutputStream bos = new ByteArrayOutputStream();\r
- InputStream is = content.openStream();\r
- try {\r
- int ch;\r
- while ((ch = is.read()) != -1) {\r
- bos.write((byte) ch);\r
- }\r
- } finally {\r
- is.close();\r
- }\r
- byte[] buf = bos.toByteArray();\r
-\r
- String enc = null;\r
- if (buf.length >= 2) {\r
- // Windowsのメモ帳はUTF-16にBOMをつけるので、これで判定できる。\r
- // 本アプリケーションのエクスポート時もUTF-16LEのBOM付きで出力する。\r
- // 一般的なエディタはUTF-16BEにはBOMをつけないので、事前に判定することはできない。\r
- if ((buf[0] & 0xff) == 0xff && (buf[1] & 0xff) == 0xfe) {\r
- enc = "UTF-16LE";\r
- } else if ((buf[0] & 0xff) == 0xfe && (buf[1] & 0xff) == 0xff) {\r
- enc = "UTF-16BE";\r
- }\r
- }\r
- if (enc == null && buf.length >= 3) {\r
- if ((buf[0] & 0xff) == 0xef && (buf[1] & 0xff) == 0xbb\r
- && (buf[1] & 0xff) == 0xbf) {\r
- // Windowsのメモ帳などはUTF-8にBOMをつけるので、これで判定できる。\r
- // 一般的なエディタではUTF-8のBOMはつけないのでUTF-8であるかどうかを事前判定することはできない。\r
- enc = "UTF-8";\r
- }\r
- }\r
- if (enc == null) {\r
- // BOMがない場合はMS932かEUC_JPのいずれかであろう、と仮定する。\r
- enc = "JISAutoDetect"; // SJIS/EUC_JPの自動判定\r
- }\r
-\r
- // 文字列として変換\r
- StringBuilder str = new StringBuilder();\r
- InputStreamReader rd = new InputStreamReader(new ByteArrayInputStream(\r
- buf), enc);\r
- try {\r
- int ch;\r
- while ((ch = rd.read()) != -1) {\r
- str.append((char) ch);\r
- }\r
- } finally {\r
- rd.close();\r
- }\r
-\r
- // 改行コードをプラットフォーム固有のものに変換\r
- String line = str.toString();\r
- line = line.replace("\r\n", "\n");\r
- line = line.replace("\r", "\n");\r
- line = line.replace("\n", System.getProperty("line.separator"));\r
-\r
- return line;\r
+ return TextReadHelper.readTextTryEncoding(content.openStream());\r
}\r
\r
/**\r
version = DefaultCharacterDataVersion.V2;\r
}\r
\r
+ // readmeがあるか?\r
+ String readme = null;\r
+ File readmeFile = new File(dir, "readme.txt");\r
+ if (readmeFile.exists() && readmeFile.canRead()) {\r
+ try {\r
+ readme = TextReadHelper\r
+ .readTextTryEncoding(new FileInputStream(\r
+ readmeFile));\r
+\r
+ } catch (IOException ex) {\r
+ logger.log(Level.WARNING, ex.toString(), ex);\r
+ }\r
+ }\r
+\r
try {\r
convertFromCharacterIni(characterIniFile, characterXmlFile,\r
- version);\r
+ version, readme);\r
\r
} catch (Exception ex) {\r
logger.log(Level.WARNING, "character.xmlの生成に失敗しました。:"\r
* 書き込まれるcharacter.xmlファイル\r
* @param version\r
* デフォルトキャラクターセットのバージョン\r
+ * @param description\r
+ * 説明\r
* @throws IOException\r
* 失敗した場合\r
*/\r
public void convertFromCharacterIni(File characterIniFile,\r
- File characterXmlFile, DefaultCharacterDataVersion version)\r
+ File characterXmlFile, DefaultCharacterDataVersion version,\r
+ String description)\r
throws IOException {\r
if (characterIniFile == null || characterXmlFile == null\r
|| version == null) {\r
is.close();\r
}\r
\r
+ // 説明文を設定する\r
+ if (description != null) {\r
+ characterData.setDescription(description);\r
+ }\r
+\r
// docBase\r
URI docBase = characterXmlFile.toURI();\r
characterData.setDocBase(docBase);\r
--- /dev/null
+package charactermanaj.model.io;\r
+\r
+import java.io.ByteArrayInputStream;\r
+import java.io.ByteArrayOutputStream;\r
+import java.io.IOException;\r
+import java.io.InputStream;\r
+import java.io.InputStreamReader;\r
+\r
+/**\r
+ * テキストの読み込みヘルパー.<br>\r
+ * \r
+ * @author seraphy\r
+ */\r
+public final class TextReadHelper {\r
+\r
+ /**\r
+ * プライベートコンストラクタ\r
+ */\r
+ private TextReadHelper() {\r
+ super();\r
+ }\r
+\r
+ /**\r
+ * 入力ストリームを指定して、テキストファイルを読み込みます.<br>\r
+ * 入力ストリームは内部で閉じられます.<br>\r
+ * \r
+ * @param is\r
+ * 入力ストリーム\r
+ * @return テキスト、もしくはnull\r
+ * @throws IOException\r
+ * 失敗\r
+ */\r
+ public static String readTextTryEncoding(InputStream is) throws IOException {\r
+ if (is == null) {\r
+ return null;\r
+ }\r
+\r
+ // 一旦メモリに取り込む\r
+ ByteArrayOutputStream bos = new ByteArrayOutputStream();\r
+ try {\r
+ int ch;\r
+ while ((ch = is.read()) != -1) {\r
+ bos.write((byte) ch);\r
+ }\r
+ } finally {\r
+ is.close();\r
+ }\r
+ byte[] buf = bos.toByteArray();\r
+\r
+ String enc = null;\r
+ if (buf.length >= 2) {\r
+ // Windowsのメモ帳はUTF-16にBOMをつけるので、これで判定できる。\r
+ // 本アプリケーションのエクスポート時もUTF-16LEのBOM付きで出力する。\r
+ // 一般的なエディタはUTF-16BEにはBOMをつけないので、事前に判定することはできない。\r
+ if ((buf[0] & 0xff) == 0xff && (buf[1] & 0xff) == 0xfe) {\r
+ enc = "UTF-16LE";\r
+ } else if ((buf[0] & 0xff) == 0xfe && (buf[1] & 0xff) == 0xff) {\r
+ enc = "UTF-16BE";\r
+ }\r
+ }\r
+ if (enc == null && buf.length >= 3) {\r
+ if ((buf[0] & 0xff) == 0xef && (buf[1] & 0xff) == 0xbb\r
+ && (buf[1] & 0xff) == 0xbf) {\r
+ // Windowsのメモ帳などはUTF-8にBOMをつけるので、これで判定できる。\r
+ // 一般的なエディタではUTF-8のBOMはつけないのでUTF-8であるかどうかを事前判定することはできない。\r
+ enc = "UTF-8";\r
+ }\r
+ }\r
+ if (enc == null) {\r
+ // BOMがない場合はMS932かEUC_JPのいずれかであろう、と仮定する。\r
+ enc = "JISAutoDetect"; // SJIS/EUC_JPの自動判定\r
+ }\r
+\r
+ // 文字列として変換\r
+ StringBuilder str = new StringBuilder();\r
+ InputStreamReader rd = new InputStreamReader(new ByteArrayInputStream(\r
+ buf), enc);\r
+ try {\r
+ int ch;\r
+ while ((ch = rd.read()) != -1) {\r
+ str.append((char) ch);\r
+ }\r
+ } finally {\r
+ rd.close();\r
+ }\r
+\r
+ // 改行コードをプラットフォーム固有のものに変換\r
+ String line = str.toString();\r
+ line = line.replace("\r\n", "\n");\r
+ line = line.replace("\r", "\n");\r
+ line = line.replace("\n", System.getProperty("line.separator"));\r
+\r
+ return line;\r
+ }\r
+\r
+}\r