001 /*
002 * Copyright (c) 2009 The openGion Project.
003 *
004 * Licensed under the Apache License, Version 2.0 (the "License");
005 * you may not use this file except in compliance with the License.
006 * You may obtain a copy of the License at
007 *
008 * http://www.apache.org/licenses/LICENSE-2.0
009 *
010 * Unless required by applicable law or agreed to in writing, software
011 * distributed under the License is distributed on an "AS IS" BASIS,
012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
013 * either express or implied. See the License for the specific language
014 * governing permissions and limitations under the License.
015 */
016 package org.opengion.fukurou.util;
017
018 import org.opengion.fukurou.security.HybsCryptography;
019
020 /**
021 * XHTMLTag.java ã¯ã€å?通的ã«ä½¿ç”¨ã•れるHTMLã‚¿ã‚°ã®ç”Ÿæ?メソãƒ?ƒ‰ã‚’集ç´?—ãŸã‚¯ãƒ©ã‚¹ã§ã™ã?
022 *
023 * 全変数?メソãƒ?ƒ‰ã¯ã€public static final 宣è¨?•れã¦ã?¾ã™ã?
024 *
025 * @version 4.0
026 * @author Kazuhiko Hasegawa
027 * @since JDK5.0,
028 */
029 public final class XHTMLTag {
030
031 /** シスãƒ?ƒ ä¾å˜ã?改行記å·ã‚’ã‚»ãƒ?ƒˆã—ã¾ã™ã? */
032 public static final String CR = System.getProperty("line.separator");
033
034 /** ãƒãƒƒãƒ•ã‚¡ã®åˆæœŸå®¹é‡ã‚’通常より若干多ã„ç›®ã«è¨å®šã—ã¾ã™ã?(50) */
035 public static final int BUFFER_SMALL = 50;
036
037 /** ãƒãƒƒãƒ•ã‚¡ã®åˆæœŸå®¹é‡ã‚’通常より多ã„ç›®ã«è¨å®šã—ã¾ã™ã?(200) */
038 public static final int BUFFER_MIDDLE = 200;
039
040 /** ãƒãƒƒãƒ•ã‚¡ã®åˆæœŸå®¹é‡ã‚’通常より大å¹?«å¤šã„ç›®ã«è¨å®šã—ã¾ã™ã?(500) */
041 public static final int BUFFER_LARGE = 500;
042
043 /** URLãƒã‚§ãƒ?‚¯ã‚ー発行用 4.3.7.1 (2009/06/08) */
044 private static final HybsCryptography HYBS_CRYPTOGRAPHY = new HybsCryptography(); // 4.3.7.0 (2009/06/01)
045
046 /**
047 * BUTTON ã‚¿ã‚°ã®å±žæ?リストã§ã™ã?
048 *
049 */
050 private static final String[]
051 BUTTON_KEY = { "type","name","value","onClick",
052 "id","class","lang","dir","title","style","xml:lang",
053 "disabled","tabindex","accesskey",
054 "onBlur","onFocus","ondblClick","onMouseDown","onMouseUp",
055 "onMouseMove","onMouseOut","onMouseOver"
056 };
057
058 /**
059 * INPUT ã‚¿ã‚°ã®å±žæ?リストã§ã™ã?
060 *
061 */
062 private static final String[]
063 INPUT_KEY = { "type","size","maxlength","checked","src",
064 "alt","accept","usemap","ismap",
065 "id","class","lang","dir","title","style","xml:lang",
066 "readonly","disabled","tabindex","accesskey","onClick","onChange",
067 "onBlur","onFocus","ondblClick","onMouseDown","onMouseUp",
068 "onMouseMove","onMouseOut","onMouseOver",
069 "onSelect","onKeydown","onKeypress","onKeyup"
070 };
071
072 /**
073 * TEXTAREA ã‚¿ã‚°ã®å±žæ?リストã§ã™ã?
074 *
075 */
076 private static final String[]
077 TEXTAREA_KEY = { "name","rows","cols",
078 "id","class","lang","dir","title","style","xml:lang",
079 "readonly","disabled","tabindex","accesskey","onClick",
080 "onBlur","onFocus","ondblClick","onMouseDown","onMouseUp",
081 "onMouseMove","onMouseOut","onMouseOver",
082 "onSelect","onKeydown","onKeypress","onKeyup"
083 };
084
085 /**
086 * LINK ã‚¿ã‚°ã®å±žæ?リストã§ã™ã?
087 *
088 */
089 private static final String[]
090 LINK_KEY = { "type","name","hreflang","rel","rev","charset",
091 "target","shape","coords","onClick",
092 "id","class","lang","dir","title","style","xml:lang",
093 "tabindex","accesskey",
094 "onBlur","onFocus","ondblClick","onMouseDown","onMouseUp",
095 "onMouseMove","onMouseOut","onMouseOver"
096 };
097
098 /**
099 * SELECT ã‚¿ã‚°ã®å±žæ?リストã§ã™ã?
100 *
101 */
102 private static final String[]
103 SELECT_KEY = { "size","multiple",
104 "id","class","lang","dir","title","style","xml:lang",
105 "disabled","tabindex","onClick","onChange",
106 "onBlur","onFocus","ondblClick","onMouseDown","onMouseUp",
107 "onMouseMove","onMouseOut","onMouseOver",
108 "onSelect","onKeydown","onKeypress","onKeyup"
109 };
110
111 /**
112 * OPTION ã‚¿ã‚°ã®å±žæ?リストã§ã™ã?
113 *
114 */
115 private static final String[]
116 OPTION_KEY = { "value","label","selected",
117 "id","class","lang","dir","title","style","xml:lang",
118 "disabled"
119 };
120
121 /**
122 * FRAME ã‚¿ã‚°ã®å±žæ?リストã§ã™ã?
123 *
124 */
125 private static final String[]
126 FRAME_KEY = { "name","longdesc","marginwidth","marginheight","noresize",
127 "scrolling","frameborder",
128 "id","class","title","style"
129 };
130
131 /**
132 * IMAGE ã‚¿ã‚°ã®å±žæ?リストã§ã™ã?
133 *
134 */
135 private static final String[]
136 IMAGE_KEY = { "src","alt","longdesc","width","height","usemap","ismap","name","onClick",
137 "align","border","hspace","vspace", // ã“ã?行ã?éžæŽ¨å¥¨å±žæ?ã§ã™ã?
138 "id","class","title","style","lang","dir","xml:lang",
139 "onBlur","onFocus","ondblClick","onMouseDown","onMouseUp",
140 "onMouseMove","onMouseOut","onMouseOver"
141 };
142
143 /**
144 * FORM ã‚¿ã‚°ã®å±žæ?リストã§ã™ã?
145 *
146 */
147 private static final String[]
148 FORM_KEY = { "action","method","enctype","accept-charset","accept","name","target",
149 "id","class","title","style","lang","dir","xml:lang"
150 };
151
152 /**
153 * SPAN ã‚¿ã‚°ã®å±žæ?リストã§ã™ã?
154 *
155 */
156 private static final String[]
157 SPAN_KEY = { "id","class","title","style","lang","dir","xml:lang" };
158
159 /**
160 * PRE ã‚¿ã‚°ã®å±žæ?リストã§ã™ã?
161 *
162 */
163 private static final String[]
164 PRE_KEY = { "id","class","title","style","lang","dir","xml:lang" };
165
166 /**
167 * ãƒ?ƒ•ォルトコンストラクターをprivateã«ã—ã¦ã€?
168 * オブジェクトã?生æ?ã‚’ã•ã›ãªã?‚ˆã?«ã™ã‚‹ã€?
169 *
170 */
171 private XHTMLTag() { }
172
173 /**
174 * ボタンを作æ?ã—ã¾ã™ã?
175 *
176 * <button type="å½¢å¼? name="åå‰" value="é€ä¿¡æ–?? オプション?¥?¥?¥ >ラベル</button>
177 *
178 * Attributes ã«è¨å®šã§ãる属æ?</ br>
179 * <table border="1" frame="box" rules="all" >
180 * <tr><td>name="åå‰"</td><td>オプション</td><td>LabelResource.properties ã®ã‚ー</td></tr>
181 * <tr><td>type="形�</td><td>�?</td><td>submit/reset/button</td></tr>
182 * <tr><td>value="値"</td><td>オプション</td><td>name属æ?ã¨å…±ã«é€ä¿¡ã•れるå?</td></tr>
183 * <tr><td>disabled="disabled"</td><td>オプション</td><td>ボタンを利用ã§ããªã?Š¶æ…‹ã«ã™ã‚‹å ´åˆã«æŒ?®?/td></tr>
184 * <tr><td>tabindex="Tab移動é?"</td><td>オプション</td><td>0??2767ã®ç¯?›²ã§æ•°å—ã§æŒ?®?å°ã•ã??ã«ç§»å‹?</td></tr>
185 * <tr><td>accesskey="ショートカãƒ?ƒˆã‚ー"</td><td>オプション</td><td>æ–?—ã‚»ãƒ?ƒˆä¸ã®?‘æ–‡å—:Windowsã§ã‚れã°Altã‚ーã¨åŒæ™‚使用</td></tr>
186 * <tr><td>汎用属æ?</td><td>オプション</td><td>class,id,title,style,lang,dir,xml:lang</td></tr>
187 * <tr><td>body="表示ã™ã‚‹ã‚¿ã‚°æ–?—å?"</td><td>オリジナル</td><td>ç”»åƒã‚„æ–?—ãªã©ãƒœã‚¿ãƒ³ä¸Šã«è¡¨ç¤ºã•ã›ãŸã„ã‚¿ã‚°ã®æ–?—å?</td></tr>
188 * </table>
189 *
190 * è¨å®šã§ãる属æ?
191 * å½¢å¼ã???
192 * submit é€ä¿¡(サブミãƒ?ƒˆ)
193 * reset リセãƒ?ƒˆ
194 * button 汎用ボタン
195 * を指定ã—ã¾ã™ã?
196 *
197 * ラベルã«?ŒHTMLãƒ?‚スãƒ?強調æ–?—ãªã©)ã‚’ã?ã‚è¾¼ã‚?“ã¨ãŒå?æ¥ã¾ã™ã?
198 * ã¾ãŸï¼Œã‚¤ãƒ¡ãƒ¼ã‚¸ <img ?¥?¥?¥?¥> を指定ã™ã‚‹ã“ã¨ã‚?å¯èƒ½ã§ã™ã?
199 * disabled="disabled" ã®ã¨ã,ã“ã®ãƒœã‚¿ãƒ³ã®ãƒ??ã‚¿ã¯ã‚µãƒ¼ãƒã?ã«é€ä¿¡ã•れã¾ã›ã‚“ã€?
200 * 属æ?群ã¯,ã‚¿ã‚°ã®ä¸ã«,CSSç‰ã§ä½¿ç”¨ã§ãã‚‹ class="XXX" ãªã©ã®
201 * 汎用属æ?ã‚’è?ç”±ã«ç™»éŒ²ã™ã‚‹äº‹ãŒå‡ºæ¥ã¾ã™ã?
202 *
203 * @param attri 属æ?群
204 *
205 * @return ボタンタグæ–?—å?
206 */
207 public static String button( final Attributes attri ) {
208 String checkedType = "|submit|reset|button|";
209
210 String type = attri.get( "type" );
211 if( checkedType.indexOf( "|" + type + "|" ) < 0 ) {
212 String errMsg = "button タイプè¨å®šã‚¨ãƒ©ãƒ¼ [" + type + "]";
213 throw new RuntimeException( errMsg );
214 }
215
216 String values = attri.getAttribute( BUTTON_KEY );
217 String body = attri.get( "body" );
218 if( body == null ) { body = "" ; }
219
220 StringBuilder rtn = new StringBuilder( BUFFER_MIDDLE );
221 rtn.append("<button ");
222 rtn.append( values );
223 rtn.append( ">" );
224 rtn.append( body );
225 rtn.append("</button>");
226
227 return rtn.toString();
228 }
229
230 /**
231 * 入力フォーãƒ?‚’作æ?ã—ã¾ã™ã?
232 *
233 * @param attri 属æ?群
234 *
235 * @return 入力フォーãƒ?‚¿ã‚°æ–?—å?
236 * @see #input( Attributes attri,String name,String value,String optAtt )
237 */
238 public static String input( final Attributes attri ) {
239 String name = attri.get( "name" );
240 String value = attri.get( "value" );
241 String optAttri = attri.get( "optionAttributes" );
242
243 return input( attri,name,value,optAttri );
244 }
245
246 /**
247 * 入力フォーãƒ?‚’作æ?ã—ã¾ã™ã?
248 *
249 * <input type="text" name="åå‰" value="é€ä¿¡æ–?? ....>
250 *
251 * Attributes ã«è¨å®šã§ãる属æ?</ br>
252 * <table border="1" frame="box" rules="all" >
253 * <tr><td>name="åå‰"</td><td>オプション</td><td>LabelResource.properties ã®ã‚ー</td></tr>
254 * <tr><td>type="形�</td><td>�?</td><td>text/password/checkbox/radio/submit/reset/button/image/file/hidden</td></tr>
255 * <tr><td>value="値"</td><td>オプション</td><td>name属æ?ã¨å…±ã«é€ä¿¡ã•れるå?</td></tr>
256 * <tr><td>size="30"</td><td>オプション</td><td>inputã‚¿ã‚°ã®å¤§ãã•</td></tr>
257 * <tr><td>maxlength="50"</td><td>オプション</td><td>type属æ?ãŒï½¢text?£,?¢password?£ ã®ã¨ãã?æœ?¤§æ–?—æ•°</td></tr>
258 * <tr><td>checked="checked"</td><td>オプション</td><td>type属æ?ãŒï½¢checkbox?£,?¢radio?£ ã®å ´åˆã«é¸æŠžã•れã¦ã?‚‹çŠ¶æ…‹ã«ã™ã‚‹ã€?/td></tr>
259 * <tr><td>disabled="disabled"</td><td>オプション</td><td>é¸æŠžã‚„å¤‰æ›´ã®æ“作をã§ããªã?Š¶æ…‹ã«ã™ã‚‹å ´åˆã«æŒ?®?/td></tr>
260 * <tr><td>accept="MIMEタイãƒ?</td><td>オプション</td><td>type属æ?ãŒï½¢file?£ã®å ´åˆã«å‡¦ç?¯èƒ½ãªMIMEタイプをæŒ?®?/td></tr>
261 * <tr><td>tabindex="Tab移動é?"</td><td>オプション</td><td>0??2767ã®ç¯?›²ã§æ•°å—ã§æŒ?®?å°ã•ã??ã«ç§»å‹?</td></tr>
262 * <tr><td>accesskey="ショートカãƒ?ƒˆã‚ー"</td><td>オプション</td><td>æ–?—ã‚»ãƒ?ƒˆä¸ã®?‘æ–‡å—:Windowsã§ã‚れã°Altã‚ーã¨åŒæ™‚使用</td></tr>
263 * <tr><td>src="URL"</td><td>オプション</td><td>type属æ?ãŒï½¢image?£ã®å ´åˆé?信ボタンã®ç”»åƒURLを指å®?/td></tr>
264 * <tr><td>alt="代替æ–?—å?"</td><td>オプション</td><td>type属æ?ãŒï½¢image?£ã®å ´åˆã?ç”»åƒãŒè¡¨ç¤ºã§ããªã?¨ãã?代替æ–?—å?を指å®?/td></tr>
265 * <tr><td>汎用属æ?</td><td>オプション</td><td>class,id,title,style,lang,dir,xml:lang</td></tr>
266 * <tr><td>body="表示ã™ã‚‹ã‚¿ã‚°æ–?—å?"</td><td>オリジナル</td><td>ç”»åƒã‚„æ–?—ãªã©ãƒœã‚¿ãƒ³ä¸Šã«è¡¨ç¤ºã•ã›ãŸã„ã‚¿ã‚°ã®æ–?—å?</td></tr>
267 * <tr><td>サãƒã?トå¤?/td><td>未実è£?/td><td>readonly属æ?ã€usemap属æ?ã€ismap属æ?ã€align属æ?</td></tr>
268 * </table>
269 *
270 * è¨å®šã§ãる属æ?
271 * å½¢å¼ã???
272 * text ?‘行ã?ãƒ?‚ストフィールãƒ?
273 * password パスワード用ãƒ?‚ストフィールãƒ?
274 * checkbox ãƒã‚§ãƒ?‚¯ãƒœãƒƒã‚¯ã‚¹(è¤?•°é¸æŠžå¯)
275 * radio ラジオボタン(è¤?•°é¸æŠžä¸å¯)
276 * submit é€ä¿¡(サブミãƒ?ƒˆ)
277 * reset リセãƒ?ƒˆ
278 * button 汎用ボタン
279 * image イメージã«ã‚ˆã‚‹ç”»åƒã?タン
280 * file é€ä¿¡ãƒ•ァイルã®é¸æŠ?
281 * hidden 表示ã›ãšã«ã‚µãƒ¼ãƒã?ã«é€ä¿¡ã™ã‚‹ã€?
282 * を指定ã—ã¾ã™ã?
283 *
284 * ラジオボタン?ãƒã‚§ãƒ?‚¯ãƒœãƒƒã‚¯ã‚¹ã§ã‚らã‹ã˜ã‚?ãƒã‚§ãƒ?‚¯ã‚’ã—ã¦
285 * ãŠããŸã„å ´åˆã?,checked 属æ?ã« "checked" を登録ã—ã¾ã™ã?
286 * ファイルãƒ?‚¤ã‚¢ãƒã‚°ã®å ´åˆã?,attributesã® accept 属æ?ã« "MIMEタイãƒ?
287 * を登録ã—ã¾ã™ã?
288 * 属æ?群ã¯,ã‚¿ã‚°ã®ä¸ã«,CSSç‰ã§ä½¿ç”¨ã§ãã‚‹ class="XXX" ãªã©ã®
289 * æ–?—を自由ã«ç™»éŒ²ã™ã‚‹äº‹ãŒå‡ºæ¥ã¾ã™ã?
290 * CSSã§ã‚¯ãƒ©ã‚¹ã‚’対å¿?class="XXXX"
291 * タブã§ç§»å‹•é?を指定ã™ã‚?tabindex="タブé?"
292 * ショートカãƒ?ƒˆã‚ーを割り当ã¦ã‚?accesskey="ショートカãƒ?ƒˆã‚ー"
293 *
294 * @param attri 属æ?群
295 * @param name åå‰
296 * @param value 値
297 * @param optAttri オプションæ–?—å?(タグ属æ?定義ã•れã¦ã?ªã?±žæ?ã®ç™»éŒ²ç”¨æ–?—å?)
298 *
299 * @return 入力フォーãƒ?‚¿ã‚°æ–?—å?
300 */
301 public static String input( final Attributes attri,final String name,final String value,final String optAttri ) {
302 String values = attri.getAttribute( INPUT_KEY );
303
304 StringBuilder rtn = new StringBuilder( BUFFER_MIDDLE );
305 rtn.append("<input ");
306 if( name != null ) { rtn.append("name=\"").append( name ).append( "\" " ); }
307 if( value != null ) { rtn.append("value=\"").append( value ).append( "\" " ); }
308 rtn.append( values );
309 if( optAttri != null ) {
310 rtn.append( " " );
311 rtn.append( optAttri );
312 }
313 rtn.append( " />" );
314
315 return rtn.toString();
316 }
317
318 /**
319 * 入力フォーãƒ??属æ?æƒ??ã®ã¿ã®æ–?—å?を作æ?ã—ã¾ã™ã?
320 * ã“れã¯ã€name 属æ?ã‚?value 属æ?ãªã©ã€ä¸?ˆ¬ã«éƒ½åº¦å¤‰æ›´ã•れるフィールãƒ?
321 * 以外ã?固定的ãªå±žæ?æƒ??ã‚’ã?å…ˆã«ä½œæ?ã—ã¦ãŠãå ´åˆã«ã€ä½¿ç”¨ã—ã¾ã™ã?
322 *
323 * @param attri 属æ?リスãƒ?
324 *
325 * @return 入力フォーãƒ?‚¿ã‚°ã®å±žæ?æƒ??æ–?—å?
326 */
327 public static String inputAttri( final Attributes attri ) {
328 return attri.getAttribute( INPUT_KEY );
329 }
330
331 /**
332 * ãƒ?‚ストエリアã®å±žæ?æƒ??ã®ã¿ã®æ–?—å?を作æ?ã—ã¾ã™ã?
333 * ã“れã¯ã€name 属æ?ã‚?value 属æ?ãªã©ã€ä¸?ˆ¬ã«éƒ½åº¦å¤‰æ›´ã•れるフィールãƒ?
334 * 以外ã?固定的ãªå±žæ?æƒ??ã‚’ã?å…ˆã«ä½œæ?ã—ã¦ãŠãå ´åˆã«ã€ä½¿ç”¨ã—ã¾ã™ã?
335 *
336 * @param attri 属æ?リスãƒ?
337 *
338 * @return ãƒ?‚ストエリアã®å±žæ?æƒ??æ–?—å?
339 */
340 public static String textareaAttri( final Attributes attri ) {
341 return attri.getAttribute( TEXTAREA_KEY );
342 }
343
344 /**
345 * プルãƒ?‚¦ãƒ³ç‰ã?メニューã®å±žæ?æƒ??ã®ã¿ã®æ–?—å?を作æ?ã—ã¾ã™ã?
346 * ã“れã¯ã€name 属æ?ã‚?value 属æ?ãªã©ã€ä¸?ˆ¬ã«éƒ½åº¦å¤‰æ›´ã•れるフィールãƒ?
347 * 以外ã?固定的ãªå±žæ?æƒ??ã‚’ã?å…ˆã«ä½œæ?ã—ã¦ãŠãå ´åˆã«ã€ä½¿ç”¨ã—ã¾ã™ã?
348 *
349 * @param attri 属æ?リスãƒ?
350 *
351 * @return プルãƒ?‚¦ãƒ³ç‰ã?メニューã®å±žæ?æƒ??æ–?—å?
352 */
353 public static String selectAttri( final Attributes attri ) {
354 return attri.getAttribute( SELECT_KEY );
355 }
356
357 /**
358 * HIDDEN フォーãƒ?‚’作æ?ã—ã¾ã™ã?
359 *
360 * id属æ?ã«ã€name ã¨åŒã˜å€¤ãŒè¨å®šã•れã¾ã™ã?
361 *
362 * @og.rev 5.5.4.0 (2012/07/02) ID属æ?追åŠ?
363 *
364 * @param name フォーãƒ??åå‰
365 * @param value 値
366 *
367 * @return HIDDENフォーãƒ?‚¿ã‚°æ–?—å?
368 */
369 public static String hidden( final String name,final String value ) {
370 // StringBuilder rtn = new StringBuilder( BUFFER_SMALL );
371
372 // rtn.append("<input type=\"hidden\" ");
373 // rtn.append("name=\"" ).append( name );
374 // rtn.append("\" value=\"").append( value );
375 // rtn.append( "\" />" );
376
377 // return rtn.toString();
378 return hidden(name,value,name);
379 }
380
381 /**
382 * HIDDEN フォーãƒ?‚’作æ?ã—ã¾ã™ã?
383 *
384 * @og.rev 5.5.4.0 (2012/07/02) ID属æ?追åŠ?
385 *
386 * @param name フォーãƒ??åå‰
387 * @param value 値
388 * @param id フォー�?ID
389 *
390 * @return HIDDENフォーãƒ?‚¿ã‚°æ–?—å?
391 */
392 public static String hidden( final String name, final String value, final String id ) {
393 StringBuilder rtn = new StringBuilder( BUFFER_SMALL );
394
395 rtn.append( "<input type=\"hidden\" " );
396 rtn.append( "name=\"" ).append( name );
397 rtn.append( "\" value=\"" ).append( value );
398 rtn.append( "\" id=\"" ).append( id );
399 rtn.append( "\" />" );
400
401 return rtn.toString();
402 }
403
404 /**
405 * ãƒ?‚ストエリアを作æ?ã—ã¾ã™ã?
406 *
407 * <textarea name="åå‰" rows="4" cols="40" ....>é€ä¿¡æ–?—å? </textarea>
408 *
409 * Attributes ã«è¨å®šã§ãる属æ?</ br>
410 * <table border="1" frame="box" rules="all" >
411 * <tr><td>name="åå‰"</td><td>オプション</td><td>LabelResource.properties ã®ã‚ー</td></tr>
412 * <tr><td>rows="行数"</td><td>オプション</td><td>入力フィールドã?表示行数</td></tr>
413 * <tr><td>cols="å¹?</td><td>オプション</td><td>入力フィールドã?表示å¹?æ–?—æ•°)</td></tr>
414 * <tr><td>disabled="disabled"</td><td>オプション</td><td>é¸æŠžã‚„å¤‰æ›´ã®æ“作をã§ããªã?Š¶æ…‹ã«ã™ã‚‹å ´åˆã«æŒ?®?/td></tr>
415 * <tr><td>tabindex="Tab移動é?"</td><td>オプション</td><td>0??2767ã®ç¯?›²ã§æ•°å—ã§æŒ?®?å°ã•ã??ã«ç§»å‹?</td></tr>
416 * <tr><td>accesskey="ショートカãƒ?ƒˆã‚ー"</td><td>オプション</td><td>æ–?—ã‚»ãƒ?ƒˆä¸ã®?‘æ–‡å—:Windowsã§ã‚れã°Altã‚ーã¨åŒæ™‚使用</td></tr>
417 * <tr><td>汎用属æ?</td><td>オプション</td><td>class,id,title,style,lang,dir,xml:lang</td></tr>
418 * <tr><td>value="値"</td><td>オリジナル</td><td>name属æ?ã¨å…±ã«é€ä¿¡ã•れるå?</td></tr>
419 * <tr><td>body="表示ã™ã‚‹ã‚¿ã‚°æ–?—å?"</td><td>オリジナル</td><td>ç”»åƒã‚„æ–?—ãªã©ãƒœã‚¿ãƒ³ä¸Šã«è¡¨ç¤ºã•ã›ãŸã„ã‚¿ã‚°ã®æ–?—å?</td></tr>
420 * <tr><td>サãƒã?トå¤?/td><td>未実è£?/td><td>readonly属æ?</td></tr>
421 * </table>
422 *
423 * è¨å®šã§ãる属æ?
424 *
425 * 属æ?群ã¯,ã‚¿ã‚°ã®ä¸ã«,CSSç‰ã§ä½¿ç”¨ã§ãã‚‹ class="XXX" ãªã©ã®
426 * æ–?—を自由ã«ç™»éŒ²ã™ã‚‹äº‹ãŒå‡ºæ¥ã¾ã™ã?
427 * CSSã§ã‚¯ãƒ©ã‚¹ã‚’対å¿?class="XXXX"
428 * タブã§ç§»å‹•é?を指定ã™ã‚?tabindex="タブé?"
429 * ショートカãƒ?ƒˆã‚ーを割り当ã¦ã‚?accesskey="ショートカãƒ?ƒˆã‚ー"
430 *
431 * @param attri 属æ?群
432 *
433 * @return 入力フォーãƒ?‚¿ã‚°æ–?—å?
434 */
435 public static String textarea( final Attributes attri ) {
436 String values = attri.getAttribute( TEXTAREA_KEY );
437 String body = attri.get( "body" );
438 if( body == null ) { body = "" ; }
439
440 StringBuilder rtn = new StringBuilder( BUFFER_MIDDLE );
441 rtn.append("<textarea ");
442 rtn.append( values );
443 rtn.append( ">" );
444 rtn.append( body );
445 rtn.append( "</textarea>" );
446
447 return rtn.toString();
448 }
449
450 /**
451 * ペã?ジリンクを作æ?ã—ã¾ã™ã?
452 *
453 * <A href="?µ?²?¬" target="ターゲãƒ?ƒˆå?>ラベル</A>
454 *
455 * Attributes ã«è¨å®šã§ãる属æ?</ br>
456 * <table border="1" frame="box" rules="all" >
457 * <tr><td>href="URL"</td><td>å¿??</td><td>リンク先ã?URLを指定ã—ã¾ã™ã?</td></tr>
458 * <tr><td>charset="æ–?—ã‚»ãƒ?ƒˆ"</td><td>オプション</td><td>リンク先ã?æ–?—コードセãƒ?ƒˆã‚’指定ã—ã¾ã™ã?</td></tr>
459 * <tr><td>hreflang="è¨?ªžã‚»ãƒ?ƒˆ"</td><td>オプション</td><td>リンク先ã?基本ã¨ãªã‚‹è¨?ªžã‚³ãƒ¼ãƒ‰ã‚’æŒ?®šã—ã¾ã™ã?</td></tr>
460 * <tr><td>type="MIMEタイãƒ?</td><td>オプション</td><td>リンク先ã?MIMEタイプをæŒ?®šã—ã¾ã™ã?</td></tr>
461 * <tr><td>name="åå‰"</td><td>オプション</td><td>ã“ã?è¦ç´?‚’リンクã®åˆ°é”点ã¨ã™ã‚‹ãŸã‚ã®åå‰ã‚’指定ã—ã¾ã™ã?</td></tr>
462 * <tr><td>rel="リンクタイãƒ?</td><td>オプション</td><td>ã“ã?æ–?›¸ã‹ã‚‰ã¿ã?href 属æ?ã§æŒ?®šã•れるリンク先ã¨ã®é–¢ä¿?/td></tr>
463 * <tr><td>rev="リンクタイãƒ?</td><td>オプション</td><td>href 属æ?ã§æŒ?®šã•れるリンク先ã‹ã‚‰ã¿ãŸã?ã“ã?æ–?›¸ã¨ã®é–¢ä¿?/td></tr>
464 * <tr><td>tabindex="Tab移動é?"</td><td>オプション</td><td>0??2767ã®ç¯?›²ã§æ•°å—ã§æŒ?®?å°ã•ã??ã«ç§»å‹?</td></tr>
465 * <tr><td>accesskey="ショートカãƒ?ƒˆã‚ー"</td><td>オプション</td><td>æ–?—ã‚»ãƒ?ƒˆä¸ã®?‘æ–‡å—:Windowsã§ã‚れã°Altã‚ーã¨åŒæ™‚使用</td></tr>
466 * <tr><td>target="フレーãƒ?"</td><td>オプション</td><td>リンク先ã?フレーãƒ?</td></tr>
467 * <tr><td>body="表示ã™ã‚‹ã‚¿ã‚°æ–?—å?"</td><td>オリジナル</td><td>ç”»åƒã‚„æ–?—ãªã©ã‚’リンクã«ã§ãã¾ã™ã?</td></tr>
468 * <tr><td>汎用属æ?</td><td>オプション</td><td>class,id,title,style,lang,dir,xml:lang</td></tr>
469 * <tr><td>サãƒã?トå¤?/td><td>未実è£?/td><td>shape属æ?ã€coords属æ?</td></tr>
470 * </table>
471 *
472 * è¨å®šã§ãる属æ?
473 *
474 * ラベルãªã—ã?å ´å? href属æ?ã® "URL" ãã?ã‚‚ã?を付ã‘ã¾ã™ã?
475 *
476 * target属æ?ã®ãƒ•レーãƒ?ã¯
477 *
478 * _top フレーãƒ?‚’解除ã—ã¦,リンク先をフレーãƒ??体ã«è¡¨ç¤ºã™ã‚‹ã€?
479 * _parent リンク先を親フレーãƒ?«è¡¨ç¤ºã™ã‚‹ã€?
480 * _self リンク先を自åˆ??身ã«è¡¨ç¤ºã™ã‚‹ã€?
481 * _blank æ–°ã—ã„ウインドウを開ã?¦?Œè¡¨ç¤ºã™ã‚‹ã€?
482 * ãã?ä»? フレーãƒ?½œæ?時ã?åå‰ã§æŒ?®šå¯èƒ½ã€?
483 *
484 * を指定ã—ã¾ã™ã?
485 * ãªã—ã?å ´å?_self (自åˆ??身)を指定ã—ã¾ã™ã?
486 *
487 * リンクメール機è?
488 * URLを,mailto:メールアドレス ã§è¨å®šã™ã‚Œã?,メールé€ä¿¡ãƒ?‚¤ã‚¢ãƒã‚°ã‚?
489 * é–‹ã事ãŒå‡ºæ¥ã¾ã™ã?
490 * ç”»åƒãƒªãƒ³ã‚¯æ©Ÿè?
491 * ç”»åƒã‚’クリãƒ?‚¯ã™ã‚‹ãƒªãƒ³ã‚¯ã¯?Œãƒ©ãƒ™ãƒ«ã®å€‹æ‰€ã« <img>ã‚¿ã‚°ã‚’è¨å®šã—ã¾ã™ã?
492 *
493 * <a href="books.html"><img src="banner.gif" width="468px" height="60px" alt="関連書ç±ç´¹ä»? border="0"></a>
494 *
495 * 属æ?群ã¯,ã‚¿ã‚°ã®ä¸ã«,CSSç‰ã§ä½¿ç”¨ã§ãã‚‹ class="XXX" ãªã©ã®
496 * æ–?—を自由ã«ç™»éŒ²ã™ã‚‹äº‹ãŒå‡ºæ¥ã¾ã™ã?
497 * CSSã§ã‚¯ãƒ©ã‚¹ã‚’対å¿?class="XXXX"
498 * タブã§ç§»å‹•é?を指定ã™ã‚?tabindex="タブé?"
499 * ショートカãƒ?ƒˆã‚ーを割り当ã¦ã‚?accesskey="ショートカãƒ?ƒˆã‚ー"
500 *
501 * @param attri 属æ?群
502 *
503 * @return ペã?ジリンクタグæ–?—å?
504 */
505 public static String link( final Attributes attri ) {
506 return link( attri,"" );
507 }
508
509 /**
510 * ペã?ジリンクを作æ?ã—ã¾ã™ã?
511 *
512 * @param attri 属æ?群
513 * @param urlEncode æ–?—å? ( ?key1=val1&?¥?¥?¥?¥ ã¨ã?†æ–?—å? ç„¡ã?¨ãã? "" )
514 *
515 * @return ペã?ジリンクタグæ–?—å?
516 */
517 public static String link( final Attributes attri, final String urlEncode ) {
518
519 String href = addUrlEncode( attri.get( "href" ),urlEncode );
520
521 String values = attri.getAttribute( LINK_KEY );
522 String body = attri.get( "body" );
523 if( body == null ) { body = attri.get( "href" ) ; }
524
525 StringBuilder rtn = new StringBuilder( BUFFER_MIDDLE );
526 rtn.append("<a href=\"");
527 rtn.append( href );
528 rtn.append( "\" " );
529 rtn.append( values );
530 rtn.append( ">" );
531 rtn.append( body );
532 rtn.append( "</a>" );
533
534 return rtn.toString();
535 }
536
537 /**
538 * xlink å½¢å¼ã?ペã?ジリンクを作æ?ã—ã¾ã™ã?
539 *
540 * 基本çš?«ã¯ã€link ã¨åŒã˜ã§ã™ã?ã‚¢ãƒ‰ãƒ¬ã‚¹ã®æŒ?®šã‚‚ã€href ã§æŒ?®šã—ã¦ãã ã•ã„ã€?
541 * å†?ƒ¨çš?«ã€xlink:href ã«å¤‰æ›ã—ã¾ã™ã?
542 * ã¾ãŸã?URL引数をã?"&" ã§çµåˆã™ã‚‹ã®ã§ã¯ãªãã?"&amp;" ã§çµåˆã•ã›ã¾ã™ã?
543 * ã“れã¯ã€xlink ãã?ã‚‚ã?ãŒã?XML上ã«è¨˜è¿°ã•れãŸå?åˆã«ã€XMLã®ãƒ«ãƒ¼ãƒ«ã§å†åº¦ãƒ‘ã?ス
544 * ã•れる為ã§ã™ã?
545 *
546 * @param attri 属æ?群
547 * @param urlEncode æ–?—å? ( ?key1=val1&?¥?¥?¥?¥ ã¨ã?†æ–?—å? ç„¡ã?¨ãã? "" )
548 *
549 * @return ペã?ジリンクタグæ–?—å?
550 */
551 public static String xlink( final Attributes attri, final String urlEncode ) {
552
553 String href = addUrlEncode( attri.get( "href" ),urlEncode,"&" );
554
555 String values = attri.getAttribute( LINK_KEY );
556 String body = attri.get( "body" );
557 if( body == null ) { body = attri.get( "href" ) ; }
558
559 StringBuilder rtn = new StringBuilder( BUFFER_MIDDLE );
560 rtn.append("<a xlink:href=\"");
561 rtn.append( href );
562 rtn.append( "\" " );
563 rtn.append( values );
564 rtn.append( ">" );
565 rtn.append( body );
566 rtn.append( "</a>" );
567
568 return rtn.toString();
569 }
570
571 /**
572 * メニューを作æ?ã—ã¾ã™ã?
573 *
574 * @param attri 属æ?群
575 * @param opt é¸æŠžè‚¢(オプション)
576 *
577 * @return メニュータグæ–?—å?
578 */
579 public static String select( final Attributes attri,final Options opt ) {
580 String name = attri.get( "name" );
581 String optAttri = attri.get( "optionAttributes" );
582
583 return select( attri,opt,name,optAttri );
584 }
585
586 /**
587 * メニューを作æ?ã—ã¾ã™ã?
588 *
589 * <select size="行数" name="åå‰" multiple>
590 * <option value="é€ä¿¡æ–?—ï¼?>コメンãƒ?lt;/option>
591 * <option value="é€ä¿¡æ–?—ï¼?>コメンãƒ?lt;/option>
592 * <option value="é€ä¿¡æ–?—ï¼? selected="selected">コメンãƒ?lt;/option>
593 * </select>
594 *
595 * Attributes ã«è¨å®šã§ãる属æ?</ br>
596 * <table border="1" frame="box" rules="all" >
597 * <tr><td>name="åå‰"</td><td>オプション</td><td>LabelResource.properties ã®ã‚ー</td></tr>
598 * <tr><td>size="行数"</td><td>オプション</td><td>selectè¦ç´?‚’リストã?ãƒ?‚¯ã‚¹ã¨ã—ã¦è¡¨ç¤ºã™ã‚‹å ´åˆã?行数</td></tr>
599 * <tr><td>multiple="multiple"</td><td>オプション</td><td>é¸æŠžè‚¢ã®ä¸ã‹ã‚‰è¤?•°é¸æŠžå?æ¥ã‚‹ã‚ˆã?«ã™ã‚‹ã€?/td></tr>
600 * <tr><td>disabled="disabled"</td><td>オプション</td><td>é¸æŠžã‚„å¤‰æ›´ã®æ“作をã§ããªã?Š¶æ…‹ã«ã™ã‚‹å ´åˆã«æŒ?®?/td></tr>
601 * <tr><td>tabindex="Tab移動é?"</td><td>オプション</td><td>0??2767ã®ç¯?›²ã§æ•°å—ã§æŒ?®?å°ã•ã??ã«ç§»å‹?</td></tr>
602 * <tr><td>汎用属æ?</td><td>オプション</td><td>class,id,title,style,lang,dir,xml:lang</td></tr>
603 * </table>
604 *
605 * 属æ?群ã¯,ã‚¿ã‚°ã®ä¸ã«,CSSç‰ã§ä½¿ç”¨ã§ãã‚‹ class="XXX" ãªã©ã®
606 * æ–?—を自由ã«ç™»éŒ²ã™ã‚‹äº‹ãŒå‡ºæ¥ã¾ã™ã?
607 * CSSã§ã‚¯ãƒ©ã‚¹ã‚’対å¿?class="XXXX"
608 *
609 * @param attri 属æ?群
610 * @param opt é¸æŠžè‚¢(オプション)
611 * @param name åå‰
612 * @param optAttri オプション属æ?
613 *
614 * @return メニュータグæ–?—å?
615 */
616 public static String select( final Attributes attri,final Options opt,final String name,final String optAttri ) {
617 String values = attri.getAttribute( SELECT_KEY );
618 String options = opt.getOption();
619
620 StringBuilder rtn = new StringBuilder( BUFFER_MIDDLE );
621 rtn.append("<select ");
622 if( name != null ) { rtn.append("name=\"").append( name ).append( "\" " ); }
623 rtn.append( values );
624 if( optAttri != null ) {
625 rtn.append( " " );
626 rtn.append( optAttri );
627 }
628 rtn.append( ">" );
629 rtn.append( options );
630 rtn.append( "</select>" );
631
632 return rtn.toString();
633 }
634
635 /**
636 * オプションを作æ?ã—ã¾ã™ã?
637 *
638 * <select size="行数" name="åå‰" multiple>
639 * <option value="é€ä¿¡æ–?—ï¼?>コメンãƒ?lt;/option>
640 * <option value="é€ä¿¡æ–?—ï¼?>コメンãƒ?lt;/option>
641 * <option value="é€ä¿¡æ–?—ï¼? selected="selected">コメンãƒ?lt;/option>
642 * </select>
643 *
644 * Attributes ã«è¨å®šã§ãる属æ?</ br>
645 * <table border="1" frame="box" rules="all" >
646 * <tr><td>value="値"</td><td>オプション</td><td>é€ä¿¡ã™ã‚‹å€¤</td></tr>
647 * <tr><td>selected="selected"</td><td>オプション</td><td>é¸æŠžè‚¢ã‚’ã‚らã‹ã˜ã‚é¸æŠžã•れãŸçŠ¶æ…‹ã«ã—ã¦ãŠã</td></tr>
648 * <tr><td>disabled="disabled"</td><td>オプション</td><td>é¸æŠžã‚„å¤‰æ›´ã®æ“作をã§ããªã?Š¶æ…‹ã«ã™ã‚‹å ´åˆã«æŒ?®?/td></tr>
649 * <tr><td>body="表示ã™ã‚‹ã‚¿ã‚°æ–?—å?"</td><td>オリジナル</td><td>é¸æŠžè‚¢ã«è¡¨ç¤ºã•ã›ãŸã„ã‚¿ã‚°ã®æ–?—å?</td></tr>
650 * <tr><td>汎用属æ?</td><td>オプション</td><td>class,id,title,style,lang,dir,xml:lang</td></tr>
651 * </table>
652 *
653 * セレクタã¨ã¯?Œãƒªã‚¹ãƒˆã?ãƒ?‚¯ã‚¹ã‚?ƒ¡ãƒ‹ãƒ¥ãƒ¼ãªã©ã® option引数ã«ã‚»ãƒ?ƒˆã™ã‚‹
654 * è¤?•°ã®ãƒ??ã‚¿ã‚’optionã‚¿ã‚°ã§ãã‚‹ã‚“ã ã‚‚ã?ã§ã™ã?
655 *
656 * @param attri 属æ?群
657 *
658 * @return オプションタグæ–?—å?
659 */
660 public static String option( final Attributes attri ) {
661 String values = attri.getAttribute( OPTION_KEY );
662 String body = attri.get( "body" );
663 if( body == null ) { body = "No Label" ; }
664
665 StringBuilder rtn = new StringBuilder( BUFFER_MIDDLE );
666 rtn.append("<option ");
667 rtn.append( values );
668 rtn.append( " >" );
669 rtn.append( body );
670 rtn.append( "</option>" );
671
672 return rtn.toString();
673 }
674
675 /**
676 * フレーãƒ?‚¿ã‚°ã‚’作æ?ã—ã¾ã™ã?
677 *
678 * <frame marginheight="2px" marginwidth="2px" src="query.jsp" name="QUERY" />
679 *
680 * Attributes ã«è¨å®šã§ãる属æ?</ br>
681 * <table border="1" frame="box" rules="all" >
682 * <tr><td>src="URL"</td><td>オプション</td><td>フレーãƒ??表示å…?RLを指定ã—ã¾ã™ã?</td></tr>
683 * <tr><td>name="フレーãƒ?"</td><td>オプション</td><td>フレーãƒ?«ä»˜ã‘ã‚‹åå‰ã‚’æŒ?®šã—ã¾ã™ã?</td></tr>
684 * <tr><td>longdesc="URI"</td><td>オプション</td><td>フレーãƒ??詳ã—ã„説明ã?URI</td></tr>
685 * <tr><td>marginwidth="å·¦å³ã®ãƒžã?ジン"</td><td>オプション</td><td>フレーãƒ??ã®å·¦å³ã®ãƒžã?ジンを指定ã—ã¾ã™ã?</td></tr>
686 * <tr><td>marginheight="上下ã?マã?ジン"</td><td>オプション</td><td>フレーãƒ??ã®ä¸Šä¸‹ã?マã?ジンを指定ã—ã¾ã™ã?</td></tr>
687 * <tr><td>noresize="noresize"</td><td>オプション</td><td>フレーãƒ?‚µã‚¤ã‚ºã‚’変更ã§ããªã?‚ˆã?«ã—ã¾ã™ã?</td></tr>
688 * <tr><td>scrolling="スクãƒãƒ¼ãƒ«ã®åˆ¶å¾¡"</td><td>オプション</td><td>yes:スクãƒãƒ¼ãƒ«ãƒã?を表示 no:表示ã—ãªã?auto:å¿?¦ã«å¿œã˜ã¦è¡¨ç¤º(ãƒ?ƒ•ォルãƒ?</td></tr>
689 * <tr><td>frameborder="æž??表示"</td><td>オプション</td><td>0:æž?‚’表示ã—ãªã? 1:æž?‚’表示ã™ã‚‹ã€?ãƒ?ƒ•ォルãƒ?</td></tr>
690 * <tr><td>keys="引数ã«ã‚»ãƒ?ƒˆã™ã‚‹ã‚ー"</td><td>オプション</td><td>URI ã®å¼•æ•°ã«ã‚»ãƒ?ƒˆã™ã‚‹ã‚ーã‚?CSV å½¢å¼ã§ã‚»ãƒ?ƒˆã—ã¾ã™ã?</td></tr>
691 * <tr><td>value="引数ã«ã‚»ãƒ?ƒˆã™ã‚‹å€¤"</td><td>オプション</td><td>URI ã®å¼•æ•°ã«ã‚»ãƒ?ƒˆã™ã‚‹å€¤ã‚?CSV å½¢å¼ã§ã‚»ãƒ?ƒˆã—ã¾ã™ã?</td></tr>
692 * <tr><td>汎用属æ?</td><td>オプション</td><td>class,id,title,style</td></tr>
693 * </table>
694 *
695 * è¨å®šã§ãる属æ?
696 *
697 * scrolling属æ?
698 *
699 * yes:常ã«ã‚¹ã‚¯ãƒãƒ¼ãƒ«ãƒã?を表示
700 * no:常ã«ã‚¹ã‚¯ãƒãƒ¼ãƒ«ãƒã?を表示ã—ãªã?
701 * auto:å¿?¦ã«å¿œã˜ã¦ã‚¹ã‚¯ãƒãƒ¼ãƒ«ãƒã?を表示(ãƒ?ƒ•ォルãƒ?
702 *
703 * を指定ã—ã¾ã™ã?
704 *
705 * frameborder属æ?
706 *
707 * 0:æž?‚’表示ã—ãªã?
708 * 1:æž?‚’表示ã™ã‚‹ã€?ãƒ?ƒ•ォルãƒ?
709 *
710 * を指定ã—ã¾ã™ã?
711 *
712 * 属æ?群ã¯,ã‚¿ã‚°ã®ä¸ã«,CSSç‰ã§ä½¿ç”¨ã§ãã‚‹ class="XXX" ãªã©ã®
713 * æ–?—を自由ã«ç™»éŒ²ã™ã‚‹äº‹ãŒå‡ºæ¥ã¾ã™ã?
714 * CSSã§ã‚¯ãƒ©ã‚¹ã‚’対å¿?class="XXXX"
715 *
716 * @param attri 属æ?群
717 *
718 * @return フレーãƒ?‚¿ã‚°æ–?—å?
719 */
720 public static String frame( final Attributes attri ) {
721 return frame( attri,"" );
722 }
723
724 /**
725 * フレーãƒ?‚¿ã‚°ã‚’作æ?ã—ã¾ã™ã?
726 *
727 * @param attri 属æ?群
728 * @param urlEncode æ–?—å? ( ?key1=val1&?¥?¥?¥?¥ ã¨ã?†æ–?—å? ç„¡ã?¨ãã? "" )
729 *
730 * @return フレーãƒ?‚¿ã‚°æ–?—å?
731 */
732 public static String frame( final Attributes attri,final String urlEncode ) {
733
734 String src = addUrlEncode( attri.get( "src" ),urlEncode );
735 String values = attri.getAttribute( FRAME_KEY );
736
737 StringBuilder rtn = new StringBuilder( BUFFER_MIDDLE );
738 rtn.append("<frame src=\"");
739 rtn.append( src );
740 rtn.append( "\" " );
741 rtn.append( values );
742 rtn.append( " />" );
743
744 return rtn.toString();
745 }
746
747 /**
748 * URLエンコード文å—å?を作æ?ã—ã¾ã™ã?
749 * エンコードã™ã¹ãæ–‡å—å?ãŒç„¡ã??åˆã?, ?ストリング("") ã‚’è¿”ã—ã¾ã™ã?
750 * エンコード文å—å?ãŒã‚ã‚‹å?åˆã?, "?KEY1=VAL1&KEY2=VAL2&?¥?¥?¥" ã¨ã?†æ–?—å?ã‚?
751 * è¿”ã—ã¾ã™ã?
752 * ã¤ã¾ã‚Šã?ã©ã¡ã‚‰ã?ケースã§ã‚‚ã?URI 㫠連çµã•ã›ã‚Œã°ã‚ˆã„ã“ã¨ã«ãªã‚Šã¾ã™ã?
753 *
754 * @param keys URLã®å¼•æ•°ã¨ãªã‚‹ã‚ー群
755 * @param values URLã®å¼•æ•°ã¨ãªã‚‹å?群
756 *
757 * @return URLエンコード文å—å?
758 */
759 public static String urlEncode( final String keys,final String values ) {
760 return urlEncode( keys,values,"&" );
761 }
762
763 /**
764 * URLエンコード文å—å?を作æ?ã—ã¾ã™ã?
765 * エンコードã™ã¹ãæ–‡å—å?ãŒç„¡ã??åˆã?, ?ストリング("") ã‚’è¿”ã—ã¾ã™ã?
766 * エンコード文å—å?ãŒã‚ã‚‹å?åˆã?, "?KEY1=VAL1&KEY2=VAL2&?¥?¥?¥" ã¨ã?†æ–?—å?ã‚?
767 * è¿”ã—ã¾ã™ã?
768 * ã¤ã¾ã‚Šã?ã©ã¡ã‚‰ã?ケースã§ã‚‚ã?URI 㫠連çµã•ã›ã‚Œã°ã‚ˆã„ã“ã¨ã«ãªã‚Šã¾ã™ã?
769 *
770 * @param keys URLã®å¼•æ•°ã¨ãªã‚‹ã‚ー群
771 * @param values URLã®å¼•æ•°ã¨ãªã‚‹å?群
772 * @param join URLã®å¼•数群をé?çµã•ã›ã‚‹æ–?—å?
773 *
774 * @return URLエンコード文å—å?
775 */
776 public static String urlEncode( final String keys,final String values,final String join ) {
777 if( keys == null || values == null ) { return ""; }
778
779 String[] key = StringUtil.csv2Array( keys );
780 String[] val = StringUtil.csv2Array( values );
781
782 return ( urlEncode( key,val,join ) );
783 }
784
785 /**
786 * URLエンコード文å—å?を作æ?ã—ã¾ã™ã?
787 * エンコードã™ã¹ãæ–‡å—å?ãŒç„¡ã??åˆã?, ?ストリング("") ã‚’è¿”ã—ã¾ã™ã?
788 * エンコード文å—å?ãŒã‚ã‚‹å?åˆã?, "?KEY1=VAL1&KEY2=VAL2&?¥?¥?¥" ã¨ã?†æ–?—å?ã‚?
789 * è¿”ã—ã¾ã™ã?
790 * ã¤ã¾ã‚Šã?ã©ã¡ã‚‰ã?ケースã§ã‚‚ã?URI 㫠連çµã•ã›ã‚Œã°ã‚ˆã„ã“ã¨ã«ãªã‚Šã¾ã™ã?
791 *
792 * @param key URLã®å¼•æ•°ã¨ãªã‚‹ã‚ーã®é…å?
793 * @param val URLã®å¼•æ•°ã¨ãªã‚‹å?ã®é…å?
794 *
795 * @return URLエンコード文å—å?
796 */
797 public static String urlEncode( final String[] key,final String[] val ) {
798 return urlEncode( key,val,"&" );
799 }
800
801 /**
802 * URLエンコード文å—å?を作æ?ã—ã¾ã™ã?
803 * エンコードã™ã¹ãæ–‡å—å?ãŒç„¡ã??åˆã?, ?ストリング("") ã‚’è¿”ã—ã¾ã™ã?
804 * エンコード文å—å?ãŒã‚ã‚‹å?åˆã?, "?KEY1=VAL1&KEY2=VAL2&?¥?¥?¥" ã¨ã?†æ–?—å?ã‚?
805 * è¿”ã—ã¾ã™ã?
806 * ã¤ã¾ã‚Šã?ã©ã¡ã‚‰ã?ケースã§ã‚‚ã?URI 㫠連çµã•ã›ã‚Œã°ã‚ˆã„ã“ã¨ã«ãªã‚Šã¾ã™ã?
807 *
808 * @og.rev 4.3.3.3 (2008/10/22) valã«å¯¾ã—ã¦å‰¯ä½œç”¨ã‚’åŠã¼ã•ãªã?‚ˆã?«ä¿®æ£
809 *
810 * @param key URLã®å¼•æ•°ã¨ãªã‚‹ã‚ーã®é…å?
811 * @param val URLã®å¼•æ•°ã¨ãªã‚‹å?ã®é…å?
812 * @param join URLã®å¼•数群をé?çµã•ã›ã‚‹æ–?—å?
813 *
814 * @return URLエンコード文å—å?
815 */
816 public static String urlEncode( final String[] key,final String[] val,final String join ) {
817 if( key == null || key.length == 0 || val == null || val.length == 0 ) {
818 return "";
819 }
820 else if( key.length != val.length ) {
821 String errMsg = "urlEncode ã®ã‚ーã¨ãƒãƒªãƒ¥ãƒ¼ã®å€‹æ•°ãŒç•°ãªã‚Šã¾ã™ã?" + CR
822 + "key.length=[" + key.length + "] val.length=[" + val.length + "]";
823 throw new RuntimeException( errMsg );
824 }
825
826 // 4.3.3.3 (2008/10/22)
827 String[] tval = new String[val.length];
828
829 for( int i=0; i<val.length; i++ ) {
830 if( key[i] == null || key[i].length() == 0 ) { return ""; }
831 if( val[i] == null || val[i].length() == 0 ) { tval[i] = ""; }
832 else if( val[i].charAt(0) == '[' ) { // 暫定対�
833 tval[i] = val[i];
834 }
835 else {
836 tval[i] = StringUtil.urlEncode( val[i] );
837 }
838 // else if( val[i].charAt(0) != '[' ) { // 暫定対�
839 // tval[i] = StringUtil.urlEncode( val[i] );
840 // }
841 // else {
842 // tval[i] = val[i];
843 // }
844 }
845
846 StringBuilder rtn = new StringBuilder( BUFFER_MIDDLE );
847
848 rtn.append( key[0] ).append( "=" ).append( tval[0] );
849 for( int i=1; i<key.length; i++) {
850 rtn.append( join );
851 rtn.append( key[i] ).append( "=" ).append( tval[i] );
852 }
853 return rtn.toString();
854 }
855
856 /**
857 * URLæ–?—å?ã«ã€URLエンコード文å—å?ã‚’é?çµã—ã¾ã™ã?
858 *
859 * URLæ–?—å?ä¸ã«ã™ã§ã« "?" æ–?—ãŒå˜åœ¨ã™ã‚‹å ´åˆã?ã€URLエンコードå?ã®
860 * æ–?—å?ã¨ã¯ã€?"&" ã§é€£çµã—ã¾ã™ã?
861 * é€?«ã€??" ãŒå˜åœ¨ã—ãªã‘れã°ã€??" ã§é€£çµã—ã¾ã™ã?
862 * URLエンコード文å—å?ã?null ã®å ´åˆã?ã€??çµã—ã¾ã›ã‚“ã€?
863 *
864 * @param url URLæ–?—å?
865 * @param encode URLエンコード文å—å?
866 *
867 * @return é€£çµæ–‡å—å?
868 */
869 public static String addUrlEncode( final String url,final String encode ) {
870 return addUrlEncode( url,encode,"&" );
871 }
872
873 /**
874 * URLæ–?—å?ã«ã€URLエンコード文å—å?ã‚’é?çµã—ã¾ã™ã?
875 *
876 * URLæ–?—å?ä¸ã«ã™ã§ã« "?" æ–?—ãŒå˜åœ¨ã™ã‚‹å ´åˆã?ã€URLエンコードå?ã®
877 * æ–?—å?ã¨ã¯ã€?join (ä¾?"&" ) ã§é€£çµã—ã¾ã™ã?
878 * é€?«ã€??" ãŒå˜åœ¨ã—ãªã‘れã°ã€??" ã§é€£çµã—ã¾ã™ã?
879 * URLエンコード文å—å?ã?null ã®å ´åˆã?ã€??çµã—ã¾ã›ã‚“ã€?
880 * 連çµã™ã‚‹ã?encode æ–?—å?ã®å…ˆé?ãŒã?join æ–?—å?ã®å ´åˆã?ãã?ã¾ã¾é€£çµã—ã¾ã™ã?
881 * å…ˆé?ãŒã?ãã†ã§ãªã??åˆã?ã€join æ–?—å?ã§é€£çµã—ã¾ã™ã?
882 * "?" ãŒå˜åœ¨ã›ãšã€encode æ–?—å?ã®å…ˆé?ãŒã?join æ–?—å?ã®å ´åˆã?ã€ã?
883 * encode æ–?—å?ã®å…ˆé?ã‚’å–り除ã?¦ã€??" ã§é€£çµã—ã¾ã™ã?
884 *
885 * 例�
886 * � abc.html key1=val1&key2=val2 �abc.html?key1=val1&key2=val2
887 * â‘¡?Žabc.html &key1=val1&key2=val2 â‡?abc.html?key1=val1&key2=val2
888 * â‘¢?Žabc.html?key1=val1 key2=val2 â‡?abc.html?key1=val1&key2=val2
889 * â‘£?Žabc.html?key1=val1 &key2=val2 â‡?abc.html?key1=val1&key2=val2
890 *
891 * @og.rev 5.2.1.0 (2010/10/01) urlãŒnullã®å ´åˆã«ã€NullPointerExceptionãŒç™ºç”Ÿã™ã‚‹ãƒã‚°ã‚’ä¿®æ£
892 *
893 * @param url URLæ–?—å?
894 * @param encode URLエンコード文å—å?
895 * @param join URLã®å¼•数群をé?çµã•ã›ã‚‹æ–?—å?
896 *
897 * @return é€£çµæ–‡å—å?
898 */
899 public static String addUrlEncode( final String url,final String encode,final String join ) {
900 // 5.2.1.0 (2010/10/01) urlãŒnullã®å ´åˆã«ã€NullPointerExceptionãŒç™ºç”Ÿã™ã‚‹ãƒã‚°ã‚’ä¿®æ£
901 String tmpUrl = ( url == null ? "" : url );
902
903 if( encode == null || encode.length() == 0 ) { return tmpUrl; }
904
905 final String rtn ;
906 if( tmpUrl.indexOf( '?' ) < 0 ) {
907 if( encode.startsWith( join ) ) {
908 rtn = tmpUrl + "?" + encode.substring(join.length()); // â‘¡
909 }
910 else {
911 rtn = tmpUrl + "?" + encode; // â‘?
912 }
913 }
914 else {
915 if( encode.startsWith( join ) ) {
916 rtn = tmpUrl + encode; // â‘£
917 }
918 else {
919 rtn = tmpUrl + join + encode; // â‘¢
920 }
921 }
922 return rtn ;
923 }
924
925 /**
926 * æŒ?®šä½ç½®ã«ç”»åƒã‚’é…ç½®ã—ã¾ã™ã?
927 *
928 * @param attri 属æ?群
929 *
930 * @return イメージタグæ–?—å?
931 */
932 public static String img( final Attributes attri ) {
933 String values = attri.getAttribute( IMAGE_KEY );
934 StringBuilder rtn = new StringBuilder( BUFFER_MIDDLE );
935 rtn.append( "<img " );
936 rtn.append( values );
937 rtn.append( " />" );
938
939 return rtn.toString();
940 }
941
942 /**
943 * フォーãƒ?‚’作æ?ã—ã¾ã™ã?
944 *
945 * <form action="URI" method="HTTPメソãƒ?ƒ‰" enctype="MIMEタイãƒ? target="フレーãƒ?" ?¥?¥?¥ >フォーãƒ??lt;/form>
946 *
947 * Attributes ã«è¨å®šã§ãる属æ?</ br>
948 * <table border="1" frame="box" rules="all" >
949 * <tr><td>action="URI"</td><td>å¿??</td><td>é€ä¿¡ã•れãŸãƒ•ォーãƒ?ƒ‡ãƒ¼ã‚¿ã‚’å?ç?™ã‚‹ã?ãƒã‚°ãƒ©ãƒ?¼µ?²?©</td></tr>
950 * <tr><td>method="HTTPメソãƒ?ƒ‰"</td><td>オプション</td><td>get/post</td></tr>
951 * <tr><td>enctype="MIMEタイãƒ?</td><td>オプション</td><td>フォーãƒ?ƒ‡ãƒ¼ã‚¿é€ä¿¡æ™‚ã?MIMEタイãƒ?/td></tr>
952 * <tr><td>accept-charset="æ–?—ã‚»ãƒ?ƒˆ"</td><td>オプション</td><td>ãƒ??ã‚¿ã¨ã—ã¦å—付å¯èƒ½ãªæ–?—ã‚»ãƒ?ƒˆã®æŒ?®?/td></tr>
953 * <tr><td>accept="MIMEタイãƒ?</td><td>オプション</td><td>ãƒ??ã‚¿ã¨ã—ã¦å‡¦ç?¯èƒ½ãªMIMEタイプをæŒ?®?/td></tr>
954 * <tr><td>name="åå‰"</td><td>オプション</td><td>スクリプトç‰ã‹ã‚‰å‚ç…§ã™ã‚‹å ´åˆã?åå‰</td></tr>
955 * <tr><td>target="フレーãƒ?"</td><td>オプション</td><td>フォーãƒ?‚’é€ä¿¡ã—ãŸçµæžœã‚’表示ã•ã›ã‚‹ãƒ•レーãƒ?/td></tr>
956 * <tr><td>汎用属æ?</td><td>オプション</td><td>class,id,title,style,lang,dir,xml:lang</td></tr>
957 * <tr><td>body="フォーãƒ?‰ã?æ–?—å?"</td><td>å¿??</td><td>input ç‰ã?フォーãƒ?¦ç´?/td></tr>
958 * </table>
959 *
960 * @param attri 属æ?群
961 *
962 * @return フォーãƒ?‚¿ã‚°æ–?—å?
963 */
964 public static String form( final Attributes attri ) {
965 String values = attri.getAttribute( FORM_KEY );
966 String body = attri.get( "body" );
967 if( body == null ) { body = "" ; }
968
969 StringBuilder rtn = new StringBuilder( BUFFER_MIDDLE );
970 rtn.append("<form ");
971 rtn.append( values );
972 rtn.append( ">" );
973 rtn.append( CR );
974 rtn.append( body );
975 rtn.append( CR );
976 rtn.append("</form>");
977
978 return rtn.toString();
979 }
980
981 /**
982 * 汎用インラインè¦ç´?SPAN)を作æ?ã—ã¾ã™ã?
983 *
984 * <span class="XXXX" ?¥?¥?¥ >ãƒ?‚ストç?lt;/span>
985 *
986 * Attributes ã«è¨å®šã§ãる属æ?</ br>
987 * <table border="1" frame="box" rules="all" >
988 * <tr><td>汎用属æ?</td><td>オプション</td><td>class,id,title,style,lang,dir,xml:lang</td></tr>
989 * <tr><td>body="ãƒ?‚ストç‰ã?æ–?—å?"</td><td>オプション</td><td>ã“ã?ãƒ?‚ストを修飾ã—ã¾ã™ã?</td></tr>
990 * </table>
991 *
992 * @param attri 属æ?群
993 *
994 * @return SPANã‚¿ã‚°æ–?—å?
995 */
996 public static String span( final Attributes attri ) {
997 String values = attri.getAttribute( SPAN_KEY );
998
999 String optAttri = attri.get( "optionAttributes" );
1000 String body = attri.get( "body" );
1001 if( body == null ) { body = "" ; }
1002
1003 StringBuilder rtn = new StringBuilder( BUFFER_MIDDLE );
1004 rtn.append("<span ");
1005 rtn.append( values );
1006 if( optAttri != null ) {
1007 rtn.append( " " );
1008 rtn.append( optAttri );
1009 }
1010 rtn.append( ">" );
1011 rtn.append( body );
1012 rtn.append( "</span>" );
1013
1014 return rtn.toString();
1015 }
1016
1017 /**
1018 * 整形済ã¿ãƒ?‚スãƒ?PRE)を作æ?ã—ã¾ã™ã?
1019 *
1020 * <pre class="XXXX" ?¥?¥?¥ >ãƒ?‚ストç?lt;/pre>
1021 *
1022 * Attributes ã«è¨å®šã§ãる属æ?</ br>
1023 * <table border="1" frame="box" rules="all" >
1024 * <tr><td>汎用属æ?</td><td>オプション</td><td>class,id,title,style,lang,dir,xml:lang</td></tr>
1025 * <tr><td>body="ãƒ?‚ストç‰ã?æ–?—å?"</td><td>オプション</td><td>ã“ã?ãƒ?‚ストを修飾ã—ã¾ã™ã?</td></tr>
1026 * </table>
1027 *
1028 * @param attri 属æ?群
1029 *
1030 * @return PREã‚¿ã‚°æ–?—å?
1031 */
1032 public static String pre( final Attributes attri ) {
1033 String values = attri.getAttribute( PRE_KEY );
1034
1035 String optAttri = attri.get( "optionAttributes" );
1036 String body = attri.get( "body" );
1037 if( body == null ) { body = "" ; }
1038
1039 StringBuilder rtn = new StringBuilder( BUFFER_MIDDLE );
1040 rtn.append("<pre ");
1041 rtn.append( values );
1042 if( optAttri != null ) {
1043 rtn.append( " " );
1044 rtn.append( optAttri );
1045 }
1046 rtn.append( ">" );
1047 rtn.append( body );
1048 rtn.append( "</pre>" );
1049
1050 return rtn.toString();
1051 }
1052
1053 /**
1054 * URLãƒã‚§ãƒ?‚¯ç”¨ã®ã‚ーを返ã—ã¾ã™ã?
1055 *
1056 * å¼•æ•°ã«æŒ?®šã•れãŸhrefã«å¯¾ã—ã¦ã€æ™‚é–“ã¨ãƒ¦ãƒ¼ã‚¶ãƒ¼IDã‚’ä»˜åŠ ã—ãŸæš—å·åŒ–æ–‡å—å?ã‚?
1057 * 引数ã«è¿½åŠ?—ã¾ã™ã?
1058 *
1059 * æš—å·åŒ–ã?ã€org.opengion.fukurou.util.HybsCryptographyを使用ã—ã¾ã™ã?
1060 * æš—å·åŒ–ã‚’è¡Œã†æ–?—å?ã®ãƒ•ォーマットã?ã€[href],time=[checkTime],userid=[loginUser]ã§ã™ã?
1061 *
1062 * @og.rev 4.3.7.1 (2009/06/08) æ–°è¦è¿½åŠ?
1063 * @og.rev 4.3.7.4 (2009/07/01) 循環å‚ç?ã‚’è§£æ¶?
1064 *
1065 * @param href ãƒã‚§ãƒ?‚¯å¯¾è±¡ã®URL
1066 * @param key ãƒã‚§ãƒ?‚¯ã‚ーã®ãƒ‘ラメーターã‚ー
1067 * @param userid ユーザーID
1068 * @param time 有効時間
1069 *
1070 * @return ãƒã‚§ãƒ?‚¯ã‚ー
1071 * @see org.opengion.fukurou.security.HybsCryptography
1072 */
1073 public static String addURLCheckKey( final String href, final String key, final String userid, final long time ) {
1074 String checkKey = href;
1075
1076 checkKey = checkKey.replace( "../", "" );
1077 // int idx = 0;
1078 // if ( ( idx = checkKey.indexOf( '#' ) ) >= 0 ) {
1079 // checkKey = checkKey.substring( 0, idx );
1080 // }
1081 // if ( ( idx = checkKey.indexOf( '?' ) ) >= 0 ) {
1082 // checkKey = checkKey.substring( 0, idx );
1083 // }
1084 checkKey = checkKey + ",time=" + time + ",userid=" + userid;
1085 checkKey = HYBS_CRYPTOGRAPHY.encrypt( checkKey );
1086
1087 return addUrlEncode( href, key + "=" + checkKey );
1088 }
1089
1090 /**
1091 * Aã‚¿ã‚°ã®æ–?—å?ã‚’è§£æžã—ã¦ã€href属æ?ã«URLãƒã‚§ãƒ?‚¯ç”¨ã®æš—å·åŒ–æ–‡å—å?ã‚’ä»˜åŠ ã—ãŸå½¢ã§ã€?
1092 * Aã‚¿ã‚°ã‚’å?構築ã—ã€è¿”ã—ã¾ã™ã?
1093 *
1094 * @og.rev 4.3.7.1 (2009/06/08) æ–°è¦è¿½åŠ?
1095 * @og.rev 4.3.7.4 (2009/07/01) 循環å‚ç?ã‚’è§£æ¶?
1096 *
1097 * @param tag Aã‚¿ã‚°æ–?—å?
1098 * @param key ãƒã‚§ãƒ?‚¯ã‚ーã®ãƒ‘ラメーターã‚ー
1099 * @param userid ユーザーID
1100 * @param time 有効時間
1101 *
1102 * @return URLãƒã‚§ãƒ?‚¯ã‚ーãŒä»˜åŠ ã•れãŸAã‚¿ã‚°æ–?—å?
1103 */
1104 public static String embedURLCheckKey( final String tag, final String key, final String userid, final long time ) {
1105 String rtn = tag;
1106 int hrefStr = rtn.indexOf( "href=\"" );
1107 if( hrefStr >= 0 ) {
1108 int hrefEnd = rtn.indexOf( "\"",hrefStr + 6 );
1109 if( hrefEnd >= 0 ) {
1110 String href = rtn.substring( hrefStr + 6, hrefEnd );
1111 href = XHTMLTag.addURLCheckKey( href, key, userid, time );
1112 rtn = rtn.substring( 0, hrefStr ) + "href=\"" + href + rtn.substring( hrefEnd );
1113 }
1114 }
1115 return rtn;
1116 }
1117 }