OSDN Git Service

CVS最新版の全ファイルを追加
[spring-ext/ozacc-mail.git] / src / java / com / ozacc / mail / fetch / impl / sk_jp / text / EntityRefEncoder.java
1 /*\r
2  * @(#) $Id: EntityRefEncoder.java,v 1.1.2.1 2005/01/18 07:20:43 otsuka Exp $\r
3  * $Revision: 1.1.2.1 $\r
4  * Copyright (c) 2000 Shin Kinoshita All Rights Reserved.\r
5  */\r
6 \r
7 package com.ozacc.mail.fetch.impl.sk_jp.text;\r
8 \r
9 import java.io.IOException;\r
10 import java.io.Reader;\r
11 import java.io.Writer;\r
12 \r
13 /**\r
14  * <>&"を<>&"に\r
15  * 変換するTranslatorです。\r
16  * リエントラントなので、通常はINSTANCE/CANONICAL_INSTANCEを用いればよいです。\r
17  * またStringオブジェクトに対してはencode()メソッドが使用できます。\r
18  * @version $Revision: 1.1.2.1 $ $Date: 2005/01/18 07:20:43 $\r
19  * @author Shin\r
20  */\r
21 public class EntityRefEncoder implements Translator {\r
22     public static final EntityRefEncoder CANONICAL_INSTANCE =\r
23             new EntityRefEncoder(true);\r
24     public static final EntityRefEncoder INSTANCE =\r
25             new EntityRefEncoder(false);\r
26 \r
27     public EntityRefEncoder() {\r
28         this(false);\r
29     }\r
30     public EntityRefEncoder(boolean canonical) {\r
31         setCanonical(canonical);\r
32     }\r
33 \r
34     private boolean canonicalStatus;\r
35     private void setCanonical(boolean canonical) {\r
36 //  public void setCanonical(boolean canonical) {\r
37         this.canonicalStatus = canonical;\r
38     }\r
39 \r
40     /**\r
41      * 文字ストリームから入力した文字列を任意の変換を\r
42      * 行いながら出力ストリームに書き出します。\r
43      * <p>\r
44      * </p>\r
45      */\r
46     public void translate(Reader r, Writer w) throws IOException {\r
47         int c;\r
48         while ((c = r.read()) != -1) {\r
49             translate((char)c, w, canonicalStatus);\r
50         }\r
51         w.flush();\r
52     }\r
53 \r
54     public String translate(String source) {\r
55         return encode(source);\r
56     }\r
57 /*\r
58     public static String encode(String s) {\r
59         if (s == null) return "";\r
60 \r
61         StringWriter w = new StringWriter();\r
62         try {\r
63             EntityRefEncoder.INSTANCE.translate(new StringReader(s), w);\r
64         } catch (IOException e) {\r
65             throw new RuntimeException();\r
66         }\r
67         return w.toString();\r
68     }\r
69 */\r
70 \r
71     /**\r
72      * 文字列の実体参照化を行います。\r
73      * @param s 対象文字列\r
74      * @return 変換後文字列\r
75      */\r
76     // 似たようなコードを書きたくは無いが高速化の為…\r
77     public static String encode(String s) {\r
78         if (s == null) return "";\r
79 \r
80         int len = s.length();\r
81         StringBuffer buf = new StringBuffer(len + 128);\r
82         char c;\r
83 \r
84         for (int i = 0; i < len; i++) {\r
85             c = s.charAt(i);\r
86             switch (c) {\r
87                 case '<': buf.append("&lt;"); break;\r
88                 case '>': buf.append("&gt;"); break;\r
89                 case '&': buf.append("&amp;"); break;\r
90                 case '"': buf.append("&quot;"); break;\r
91                 default:\r
92                     buf.append(c);\r
93             }\r
94         }\r
95         return new String(buf);\r
96     }\r
97 \r
98     /**\r
99      * 特定の文字を実体参照に変換して書き出します。\r
100      */\r
101     public static void translate(char c, Writer w, boolean canonical)\r
102                 throws IOException {\r
103         switch (c) {\r
104             case '<': w.write("&lt;"); break;\r
105             case '>': w.write("&gt;"); break;\r
106             case '&': w.write("&amp;"); break;\r
107             case '"': w.write("&quot;"); break;\r
108             case '\r':\r
109             case '\n':\r
110                 if (canonical) {\r
111                     w.write("&#");\r
112                     w.write(Integer.toString(c));\r
113                     w.write(';');\r
114                 } else {\r
115                     w.write(c);\r
116                 }\r
117                 break;\r
118             default:\r
119                 w.write(c);\r
120         }\r
121     }\r
122 \r
123     /**\r
124      * 実体参照変換されている文字列をもとに戻します。\r
125      * @param s 対象文字列\r
126      * @return 変換後文字列\r
127      */\r
128     public static String decode(String s) {\r
129         if (s == null) return "";\r
130 \r
131         int len = s.length();\r
132         StringBuffer buf = new StringBuffer(len);\r
133         char c;\r
134 \r
135         for (int i = 0; i < len; i++) {\r
136             c = s.charAt(i);\r
137             if (c != '&' || i > len - 4) {\r
138                 buf.append(c);\r
139                 continue;\r
140             }\r
141             if ((s.charAt(i + 2) == 't' || s.charAt(i + 2) == 'T') &&\r
142                 s.charAt(i + 3) == ';') {\r
143                 switch (s.charAt(i + 1)) {\r
144                     case 'l':\r
145                     case 'L':\r
146                         buf.append('<');\r
147                         i += 3;\r
148                         continue;\r
149                     case 'g':\r
150                     case 'G':\r
151                         buf.append('>');\r
152                         i += 3;\r
153                         continue;\r
154                 }\r
155             } else if (i < len - 4 &&\r
156                 (s.charAt(i + 1) == 'a' || s.charAt(i + 1) == 'A') &&\r
157                 (s.charAt(i + 2) == 'm' || s.charAt(i + 2) == 'M') &&\r
158                 (s.charAt(i + 3) == 'p' || s.charAt(i + 3) == 'P') &&\r
159                 s.charAt(i + 4) == ';') {\r
160                 buf.append('&');\r
161                 i += 4;\r
162                 continue;\r
163             } else if (i < len - 5 &&\r
164                 (s.charAt(i + 1) == 'q' || s.charAt(i + 1) == 'Q') &&\r
165                 (s.charAt(i + 2) == 'u' || s.charAt(i + 2) == 'U') &&\r
166                 (s.charAt(i + 3) == 'o' || s.charAt(i + 3) == 'O') &&\r
167                 (s.charAt(i + 4) == 't' || s.charAt(i + 4) == 'T') &&\r
168                 s.charAt(i + 5) == ';') {\r
169                 buf.append('"');\r
170                 i += 5;\r
171                 continue;\r
172             }\r
173             buf.append(c);\r
174         }\r
175         return new String(buf);\r
176     }\r
177 }\r