OSDN Git Service

nicocache文字列置換方法を追加
authoryukihane <yukihane.feather@gmail.com>
Mon, 19 Mar 2012 13:05:09 +0000 (22:05 +0900)
committeryukihane <yukihane.feather@gmail.com>
Mon, 19 Mar 2012 13:05:09 +0000 (22:05 +0900)
src/nicobrowser/NamePattern.java
test/nicobrowser/NamePatternTest.java

index a0ac37a..365eb0a 100644 (file)
@@ -1,5 +1,9 @@
 package nicobrowser;
 
+import java.io.UnsupportedEncodingException;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
 /**
  *
  * @author yuki
@@ -9,6 +13,7 @@ public class NamePattern {
     private static final String titlePattern = "{title}";
     private static final String idPattern = "{id}";
     private static final String lowPattern = "{low}";
+    private static Logger log = LoggerFactory.getLogger(NamePattern.class);
     private final String pattern;
     private String replaceFrom = "";
     private String replaceTo = "";
@@ -22,6 +27,7 @@ public class NamePattern {
 
     /**
      * 保存ファイル名の命名規則.
+     *
      * @param pattern 命名パターン.
      * @param replaceFrom 禁則文字を指定する.
      * @param replaceTo 禁則文字をこの文字列に置換する.
@@ -89,6 +95,84 @@ public class NamePattern {
             }
             str.append(moji);
         }
-        return str.toString();
+        return getSanitizedDescription(str.toString());
+    }
+
+    public static String getSanitizedDescription(String decodedDesc) {
+        String fileNameCharset = System.getProperty("file.encoding");
+
+        String narrowedDesc = narrowCharset(decodedDesc, fileNameCharset);
+
+        // 実体参照を更に実体参照するケースがあるので二回置換する
+        narrowedDesc = replaceER(replaceER(narrowedDesc));
+
+        char descArray[] = narrowedDesc.toCharArray();
+
+        for (int i = 0; i < descArray.length; i++) {
+            char c = descArray[i];
+            switch (c) {
+                case '\\':
+                case '\u00a5':
+                    c = '¥';
+                    break;
+                case '/':
+                    c = '/';
+                    break;
+                case ':':
+                    c = ':';
+                    break;
+                case '*':
+                    c = '*';
+                    break;
+                case '?':
+                    c = '?';
+                    break;
+                case '"':
+                    c = '”';
+                    break;
+                case '<':
+                    c = '<';
+                    break;
+                case '>':
+                    c = '>';
+                    break;
+                case '|':
+                    c = '|';
+                    break;
+                case '\u203e':// c = '~'; break;
+                case '\u301c':// c = '~'; break;
+                case '\u2016':
+                case '\u2212':
+                case '\u00a2':
+                case '\u00a3':
+                case '\u00ac':
+                    c = '-';
+                    break;
+            }
+
+            descArray[i] = c;
+        }
+        return new String(descArray);
+    }
+
+    private static String replaceER(String src) {
+        return src.replaceAll("&amp;", "&").replaceAll("&lt;", "<").replaceAll("&gt;", ">").replaceAll("&quot;", "\"").
+                replaceAll("&apos;", "'");
+    }
+
+    // 一旦目的の文字コードにしてから戻して、対応してない文字を '?' にする
+    static String narrowCharset(String str, String charsetName) {
+        String narrowedDesc = str;
+        if (!charsetName.equals("")) {
+            try {
+                narrowedDesc =
+                        new String(str.getBytes(charsetName), charsetName);
+                // characters which are not supported by the charset
+                // become '?'
+            } catch (UnsupportedEncodingException e) {
+                log.warn(e.toString());
+            }
+        }
+        return narrowedDesc;
     }
 }
index 2a3e086..59ea520 100644 (file)
@@ -27,15 +27,15 @@ public class NamePatternTest {
 
         NamePattern np2 = new NamePattern("[{id}]{title}", "9タ", "-", title);
         res = np2.createFileName(id, false);
-        assertEquals("[sm----]*-\\イ/ト\"ル", res);
+        assertEquals("[sm----]*-¥イ/ト”ル", res);
 
         NamePattern np3 = new NamePattern("{id}{low}_{title}", "", "", title);
         res = np3.createFileName(id, false);
-        assertEquals("sm9999low_*タ\\イ/ト\"ル", res);
+        assertEquals("sm9999low_*タ¥イ/ト”ル", res);
 
         NamePattern np4 = new NamePattern("{id}{low}_{title}", "/*-", "*", title);
         res = np4.createFileName(id, true);
-        assertEquals("sm9999_*タ\\イ*ト\"ル", res);
+        assertEquals("sm9999_*タ¥イ*ト”ル", res);
 
     }
 }