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