3 import java.io.UnsupportedEncodingException;
4 import org.slf4j.Logger;
5 import org.slf4j.LoggerFactory;
11 public class NamePattern {
13 private static final String titlePattern = "{title}";
14 private static final String idPattern = "{id}";
15 private static final String lowPattern = "{low}";
16 private static Logger log = LoggerFactory.getLogger(NamePattern.class);
17 private final String pattern;
18 private String replaceFrom = "";
19 private String replaceTo = "";
20 private String id = "";
21 private String title = "";
22 private boolean isNotLow = true;
24 public NamePattern(String pattern) {
25 this.pattern = pattern;
31 * @param pattern 命名パターン.
32 * @param replaceFrom 禁則文字を指定する.
33 * @param replaceTo 禁則文字をこの文字列に置換する.
34 * @param title ファイル名に用いるタイトル文字列.
36 public NamePattern(String pattern, String replaceFrom, String replaceTo, String title) {
37 this.pattern = pattern;
38 this.replaceFrom = replaceFrom;
39 this.replaceTo = replaceTo;
43 public final String createFileName() {
44 String res = replacePlaceHolder(pattern);
45 return replaceIllegalChar(res);
48 public final String createFileName(String id, boolean isNotLow) {
50 this.isNotLow = isNotLow;
52 return createFileName();
55 public final void setId(String id) {
59 public final void setIsNotLow(boolean isNotLow) {
60 this.isNotLow = isNotLow;
63 public final void setReplaceFrom(String replaceFrom) {
64 this.replaceFrom = replaceFrom;
67 public final void setReplaceTo(String replaceTo) {
68 this.replaceTo = replaceTo;
71 public final void setTitle(String title) {
75 protected String replacePlaceHolder(String str) {
76 String res = str.replace(titlePattern, title);
77 res = res.replace(idPattern, id);
78 String low = isNotLow ? "" : "low";
79 res = res.replace(lowPattern, low);
83 private String replaceIllegalChar(String res) {
85 // char[] replaceds = new char[replaceFrom.length()];
86 // replaceFrom.getChars(0, replaceFrom.length(), replaceds, 0);
87 // StringBuilder str = new StringBuilder();
88 // for (int i = 0; i < res.length(); i++) {
89 // char c = res.charAt(i);
90 // String moji = String.valueOf(c);
91 // for (char replaced : replaceds) {
92 // if (c == replaced) {
98 // return getSanitizedDescription(str.toString());
99 return getSanitizedDescription(res);
102 public static String getSanitizedDescription(String decodedDesc) {
103 String fileNameCharset = System.getProperty("fileNameCharset", "");
105 String narrowedDesc = narrowCharset(decodedDesc, fileNameCharset);
107 // 実体参照を更に実体参照するケースがあるので二回置換する
108 narrowedDesc = replaceER(replaceER(narrowedDesc));
110 char descArray[] = narrowedDesc.toCharArray();
112 for (int i = 0; i < descArray.length; i++) {
113 char c = descArray[i];
143 case '\u203e':// c = '~'; break;
144 case '\u301c':// c = '~'; break;
156 return new String(descArray);
159 private static String replaceER(String src) {
160 return src.replaceAll("&", "&").replaceAll("<", "<").replaceAll(">", ">").replaceAll(""", "\"").
161 replaceAll("'", "'");
164 // 一旦目的の文字コードにしてから戻して、対応してない文字を '?' にする
165 static String narrowCharset(String str, String charsetName) {
166 String narrowedDesc = str;
167 if (!charsetName.equals("")) {
170 new String(str.getBytes(charsetName), charsetName);
171 // characters which are not supported by the charset
173 } catch (UnsupportedEncodingException e) {
174 log.warn(e.toString());