ruby-web 1.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (190) hide show
  1. data/ChangeLog +474 -0
  2. data/INSTALL.txt +9 -0
  3. data/InstalledFiles +180 -0
  4. data/LICENSE.txt +74 -0
  5. data/Rakefile +529 -0
  6. data/TODO +65 -0
  7. data/doc/additional.xml +149 -0
  8. data/doc/core.xml +652 -0
  9. data/doc/credits/index.xml +52 -0
  10. data/doc/credits/php.contributors.xml +118 -0
  11. data/doc/credits/php.language-snippets.ent +622 -0
  12. data/doc/install/index.xml +136 -0
  13. data/doc/install/mac/index.xml +21 -0
  14. data/doc/install/ruby-web.install.rb.instructions.xml +7 -0
  15. data/doc/install/unix/index.xml +46 -0
  16. data/doc/install/win/apache1.xml +166 -0
  17. data/doc/install/win/apache2.xml +141 -0
  18. data/doc/install/win/iis.xml +162 -0
  19. data/doc/install/win/index.xml +24 -0
  20. data/doc/install/win/installer.xml +31 -0
  21. data/doc/install/win/manual.xml +43 -0
  22. data/doc/manual.xml +69 -0
  23. data/doc/old/apache_cgi.txt +23 -0
  24. data/doc/old/fastcgi.txt +23 -0
  25. data/doc/old/mod_ruby.txt +21 -0
  26. data/doc/old/snippets.rdoc +183 -0
  27. data/doc/old/webrick.txt +23 -0
  28. data/doc/old/windows_cgi.txt +9 -0
  29. data/doc/tutorial.xml +14 -0
  30. data/doc/xsl/manual-multi.xsl +10 -0
  31. data/doc/xsl/manual-pdf.xsl +6 -0
  32. data/doc/xsl/manual-single.xsl +6 -0
  33. data/doc/xsl/manual.css +22 -0
  34. data/install.rb +1022 -0
  35. data/lib/formatter.rb +314 -0
  36. data/lib/html-parser.rb +429 -0
  37. data/lib/htmlrepair.rb +113 -0
  38. data/lib/htmlsplit.rb +842 -0
  39. data/lib/sgml-parser.rb +332 -0
  40. data/lib/web.rb +68 -0
  41. data/lib/web/assertinclude.rb +129 -0
  42. data/lib/web/config.rb +50 -0
  43. data/lib/web/connection.rb +1070 -0
  44. data/lib/web/convenience.rb +154 -0
  45. data/lib/web/formreader.rb +318 -0
  46. data/lib/web/htmlparser/html-parser.rb +429 -0
  47. data/lib/web/htmlparser/sgml-parser.rb +332 -0
  48. data/lib/web/htmltools/element.rb +296 -0
  49. data/lib/web/htmltools/stparser.rb +276 -0
  50. data/lib/web/htmltools/tags.rb +286 -0
  51. data/lib/web/htmltools/tree.rb +139 -0
  52. data/lib/web/htmltools/xmltree.rb +160 -0
  53. data/lib/web/htmltools/xpath.rb +71 -0
  54. data/lib/web/info.rb +63 -0
  55. data/lib/web/load.rb +210 -0
  56. data/lib/web/mime.rb +87 -0
  57. data/lib/web/phprb.rb +340 -0
  58. data/lib/web/resources/test/cookie.rb +33 -0
  59. data/lib/web/resources/test/counter.rb +20 -0
  60. data/lib/web/resources/test/multipart.rb +14 -0
  61. data/lib/web/resources/test/redirect.rb +8 -0
  62. data/lib/web/resources/test/stock.rb +33 -0
  63. data/lib/web/sapi/apache.rb +129 -0
  64. data/lib/web/sapi/fastcgi.rb +22 -0
  65. data/lib/web/sapi/install/apache.rb +180 -0
  66. data/lib/web/sapi/install/iis.rb +93 -0
  67. data/lib/web/sapi/install/macosx.rb +90 -0
  68. data/lib/web/sapi/webrick.rb +86 -0
  69. data/lib/web/session.rb +83 -0
  70. data/lib/web/shim/cgi.rb +129 -0
  71. data/lib/web/shim/rails.rb +175 -0
  72. data/lib/web/stringio.rb +78 -0
  73. data/lib/web/strscanparser.rb +24 -0
  74. data/lib/web/tagparser.rb +96 -0
  75. data/lib/web/testing.rb +666 -0
  76. data/lib/web/traceoutput.rb +75 -0
  77. data/lib/web/unit.rb +56 -0
  78. data/lib/web/upload.rb +59 -0
  79. data/lib/web/validate.rb +52 -0
  80. data/lib/web/wiki.rb +557 -0
  81. data/lib/web/wiki/linker.rb +72 -0
  82. data/lib/web/wiki/page.rb +201 -0
  83. data/lib/webunit.rb +27 -0
  84. data/lib/webunit/assert.rb +152 -0
  85. data/lib/webunit/converter.rb +154 -0
  86. data/lib/webunit/cookie.rb +118 -0
  87. data/lib/webunit/domwalker.rb +185 -0
  88. data/lib/webunit/exception.rb +14 -0
  89. data/lib/webunit/form.rb +116 -0
  90. data/lib/webunit/frame.rb +37 -0
  91. data/lib/webunit/htmlelem.rb +122 -0
  92. data/lib/webunit/image.rb +26 -0
  93. data/lib/webunit/jscript.rb +31 -0
  94. data/lib/webunit/link.rb +33 -0
  95. data/lib/webunit/params.rb +321 -0
  96. data/lib/webunit/parser.rb +229 -0
  97. data/lib/webunit/response.rb +464 -0
  98. data/lib/webunit/runtest.rb +41 -0
  99. data/lib/webunit/table.rb +148 -0
  100. data/lib/webunit/testcase.rb +45 -0
  101. data/lib/webunit/ui/cui/testrunner.rb +50 -0
  102. data/lib/webunit/utils.rb +68 -0
  103. data/lib/webunit/webunit.rb +28 -0
  104. data/test/dev/action.rb +83 -0
  105. data/test/dev/forms.rb +104 -0
  106. data/test/dev/forms2.rb +104 -0
  107. data/test/dev/parser.rb +17 -0
  108. data/test/dev/scripts/dump.rb +24 -0
  109. data/test/dev/scripts/makedist.rb +62 -0
  110. data/test/dev/scripts/uri.rb +41 -0
  111. data/test/dev/scripts/uri/common.rb +432 -0
  112. data/test/dev/scripts/uri/ftp.rb +149 -0
  113. data/test/dev/scripts/uri/generic.rb +1106 -0
  114. data/test/dev/scripts/uri/http.rb +76 -0
  115. data/test/dev/scripts/uri/https.rb +26 -0
  116. data/test/dev/scripts/uri/ldap.rb +238 -0
  117. data/test/dev/scripts/uri/mailto.rb +260 -0
  118. data/test/dev/scripts/urireg.rb +174 -0
  119. data/test/dev/simpledispatcher.rb +156 -0
  120. data/test/dev/test.action.rb +146 -0
  121. data/test/dev/test.formreader.rb +463 -0
  122. data/test/dev/test.simpledispatcher.rb +186 -0
  123. data/test/dev/webunit/conv/digit-0.rb +21 -0
  124. data/test/dev/webunit/conv/digit-1.rb +17 -0
  125. data/test/dev/webunit/conv/digit.rb +23 -0
  126. data/test/dev/webunit/conv/test_digit-0.rb +16 -0
  127. data/test/dev/webunit/conv/test_digit-1.rb +19 -0
  128. data/test/dev/webunit/conv/test_digit.rb +26 -0
  129. data/test/dev/webunit/conv/test_digit_view-0.rb +76 -0
  130. data/test/dev/webunit/conv/test_digit_view-1.rb +102 -0
  131. data/test/dev/webunit/conv/test_digit_view.rb +134 -0
  132. data/test/installation/htdocs/cgi_test.rb +296 -0
  133. data/test/installation/htdocs/test_install.rb +4 -0
  134. data/test/installation/runwebtest.rb +5 -0
  135. data/test/installation/test_cookie.rb +128 -0
  136. data/test/installation/test_form.rb +47 -0
  137. data/test/installation/test_multipart.rb +51 -0
  138. data/test/installation/test_request.rb +24 -0
  139. data/test/installation/test_response.rb +35 -0
  140. data/test/unit/htdocs/cookie.rb +32 -0
  141. data/test/unit/htdocs/multipart.rb +28 -0
  142. data/test/unit/htdocs/redirect.rb +12 -0
  143. data/test/unit/htdocs/simple.rb +13 -0
  144. data/test/unit/htdocs/stock.rb +33 -0
  145. data/test/unit/test_assert.rb +162 -0
  146. data/test/unit/test_cookie.rb +114 -0
  147. data/test/unit/test_domwalker.rb +77 -0
  148. data/test/unit/test_form.rb +42 -0
  149. data/test/unit/test_frame.rb +40 -0
  150. data/test/unit/test_htmlelem.rb +74 -0
  151. data/test/unit/test_image.rb +45 -0
  152. data/test/unit/test_jscript.rb +57 -0
  153. data/test/unit/test_link.rb +85 -0
  154. data/test/unit/test_multipart.rb +51 -0
  155. data/test/unit/test_params.rb +210 -0
  156. data/test/unit/test_parser.rb +53 -0
  157. data/test/unit/test_response.rb +150 -0
  158. data/test/unit/test_table.rb +70 -0
  159. data/test/unit/test_utils.rb +106 -0
  160. data/test/unit/test_webunit.rb +28 -0
  161. data/test/web/mod_ruby_stub.rb +39 -0
  162. data/test/web/test.assertinclude.rb +109 -0
  163. data/test/web/test.buffer.rb +182 -0
  164. data/test/web/test.code.loader.rb +78 -0
  165. data/test/web/test.config.rb +31 -0
  166. data/test/web/test.error.handling.rb +91 -0
  167. data/test/web/test.formreader-2.0.rb +352 -0
  168. data/test/web/test.load.rb +125 -0
  169. data/test/web/test.mime-type.rb +23 -0
  170. data/test/web/test.narf.cgi.rb +106 -0
  171. data/test/web/test.phprb.rb +239 -0
  172. data/test/web/test.request.rb +368 -0
  173. data/test/web/test.response.rb +637 -0
  174. data/test/web/test.ruby-web.rb +10 -0
  175. data/test/web/test.session.rb +50 -0
  176. data/test/web/test.shim.cgi.rb +96 -0
  177. data/test/web/test.tagparser.rb +65 -0
  178. data/test/web/test.template2.rb +297 -0
  179. data/test/web/test.testing2.rb +318 -0
  180. data/test/web/test.upload.rb +45 -0
  181. data/test/web/test.validate.rb +46 -0
  182. data/test/web/test.web.test.rb +495 -0
  183. data/test/wiki/test.history.rb +297 -0
  184. data/test/wiki/test.illustration_page.rb +287 -0
  185. data/test/wiki/test.linker.rb +197 -0
  186. data/test/wiki/test.tarpit.rb +56 -0
  187. data/test/wiki/test.wiki.rb +300 -0
  188. data/test/wikitestroot/admin.rb +7 -0
  189. data/test/wikitestroot/wiki.rb +6 -0
  190. metadata +234 -0
@@ -0,0 +1,14 @@
1
+ =begin
2
+ = WebUnit::exception
3
+ Copyright(C) 2001 yuichi TAKAHASHI
4
+ $Id: exception.rb,v 1.1.1.1 2003/01/21 11:50:40 yuichi Exp $
5
+ =end
6
+
7
+ module WebUnit
8
+
9
+ class HttpNotFound < StandardError; end
10
+ class ElemNotFound < StandardError; end
11
+ class BadHtmlTags < StandardError; end
12
+ class BadOperation < StandardError; end
13
+
14
+ end
@@ -0,0 +1,116 @@
1
+ =begin
2
+ = WebUnit::Form
3
+ Copyright(C) 2001 yuichi TAKAHASHI, Narushima Hironori.
4
+ $Id: form.rb,v 1.1.1.1 2003/01/21 11:50:40 yuichi Exp $
5
+ =end
6
+ module WebUnit
7
+
8
+ BOUNDARY = '--divider'
9
+
10
+ class Form < HtmlElem
11
+
12
+ attr_accessor :name, :action, :method, :encoding
13
+ attr_reader :parameters, :params
14
+
15
+ def initialize( ah )
16
+ super( 'form', ah )
17
+ @parameters = [] # index by int
18
+ @params = {} # index by name
19
+ @action = ah["name"]
20
+ @action = ah["action"]
21
+ @method = ah["method"] == nil ? "GET" : ah["method"]
22
+ #print @action,":",method,"\n"
23
+ end
24
+
25
+ def add_param( param )
26
+ @parameters.push param
27
+ if @params.key?param.name then
28
+ @params[param.name].update( param )
29
+ param.update( @params[param.name] )
30
+ else
31
+ @params[param.name] = param
32
+ end
33
+ end
34
+
35
+ def freeze
36
+ @parameters.freeze
37
+ @params.freeze
38
+ end
39
+
40
+ =begin
41
+ --- Form#set_params( hash )
42
+ fill up each fields, by name.
43
+ =end
44
+
45
+ def set_params( hash )
46
+ hash.each do |k,v|
47
+ raise ArgumentError.new("wrong key: " + k) unless self.params[k]
48
+ self.params[k].value = v
49
+ end
50
+ self
51
+ end
52
+
53
+ =begin
54
+ --- Form#set_parameters( array )
55
+ fill up each fields, by index.
56
+ =end
57
+
58
+ def set_parameters( array )
59
+ array.each_index do |i|
60
+ self.parameters[i].value = array[i]
61
+ end
62
+ self
63
+ end
64
+
65
+ =begin
66
+ --- Form#store_test_data(fields,data,s=',',button=nil)
67
+ store data to backend ( Database, File, ... ).
68
+ input csv data to each fields, and submit.
69
+ =end
70
+
71
+ def store_test_data( fields, data, s=',', button=nil )
72
+ data.split( "\n" ).collect{ |r| r.strip.split( s ) }.each do |r|
73
+ fields.each_index{ |i| @params[fields[i]].value = r[i] }
74
+ self.submit( button )
75
+ end
76
+ end
77
+
78
+ =begin
79
+ --- Form#submit(button=nil,x=nil,y=nil)
80
+ submit form, and return a Response.
81
+ =end
82
+ def submit( button=nil, x=nil, y=nil )
83
+ data = []
84
+ matched = nil
85
+ multipart = (attrs['enctype'] == 'multipart/form-data')
86
+ # make data from params
87
+
88
+ @parameters.each do |p|
89
+ puts "#{p.class}/#{p.name}/#{p.value}" if $DEBUG
90
+ if p.class == InputSubmit || p.class == InputImage
91
+ next unless p.name == button || p.value == button
92
+ matched = p
93
+ if p.class == InputImage
94
+ p.x = x
95
+ p.y = y
96
+ end
97
+ end
98
+
99
+ if multipart
100
+ data << p.multipart_query_data(BOUNDARY)
101
+ else
102
+ data << p.query_data
103
+ end
104
+ end
105
+
106
+ if multipart
107
+ data = data.join('') + "--#{BOUNDARY}--\n"
108
+ else
109
+ data = data.compact.join('&')
110
+ end
111
+
112
+ Response::new.init_http( @action, @method, data, false, multipart)
113
+ end
114
+ end
115
+
116
+ end
@@ -0,0 +1,37 @@
1
+ =begin
2
+ = WebUnit::Frame
3
+ Copyright(C) 2001 yuichi TAKAHASHI
4
+ $Id: frame.rb,v 1.1.1.1 2003/01/21 11:50:40 yuichi Exp $
5
+ =end
6
+
7
+ module WebUnit
8
+
9
+ class Frame < HtmlElem
10
+
11
+ def initialize( ah )
12
+ super( 'frame', ah )
13
+ @src = ah["src"]
14
+ @name = ah["name"]
15
+ end
16
+
17
+ =begin
18
+ --- Frame#src
19
+ reader of 'src' attribute.
20
+ --- Frame#name
21
+ reader of 'name' attribute.
22
+ =end
23
+
24
+ attr_reader :src, :name
25
+
26
+ =begin
27
+ --- Frame#read
28
+ return a Response of getting of 'src' attribute.
29
+ =end
30
+
31
+ def read
32
+ Response::new.init_http( @src, "GET" ) if @src != nil
33
+ end
34
+
35
+ end
36
+
37
+ end
@@ -0,0 +1,122 @@
1
+ =begin
2
+ = WebUnit::HtmlElem
3
+ Copyright(C) 2001 yuichi TAKAHASHI
4
+ $Id: htmlelem.rb,v 1.1.1.1 2003/01/21 11:50:40 yuichi Exp $
5
+ =end
6
+
7
+ module WebUnit
8
+
9
+ class HtmlElem
10
+
11
+ attr_reader :tag, :data, :attrs, :children, :array, :name
12
+
13
+ def initialize( tag, ah={} )
14
+ @children = []
15
+ @tag = tag
16
+ @attrs = ah
17
+ @data = ''
18
+ @array = []
19
+ @name = ah['name'] if ah
20
+ end
21
+
22
+ def append( data )
23
+ if data.is_a?( HtmlElem )
24
+ @children << data
25
+ else
26
+ @data << data
27
+ end
28
+ @array << data
29
+ end
30
+
31
+ def extract
32
+ data = ''
33
+ @array.each do |e|
34
+ if e.is_a?( String )
35
+ data << " #{e} "
36
+ elsif e.is_a?( HtmlElem )
37
+ data << e.extract
38
+ end
39
+ end
40
+ data.squeeze( ' ' ).strip
41
+ end
42
+
43
+ def inspect
44
+ return "<#toplevel>" if @tag == nil
45
+ as = ''
46
+ attrs.each{ |k,v| as << " #{k}=#{v}" }
47
+ "<#{@tag+as}>:#{data}:"
48
+ end
49
+
50
+ =begin
51
+ --- HtmlElem#find(tag)
52
+ return an Array of HtmlElems, which have ((|tag|)).
53
+ =end
54
+
55
+ def find( tag )
56
+ a = []
57
+ a.push self if @tag == tag
58
+ @children.each do |c|
59
+ a = a + c.find( tag )
60
+ end
61
+ a
62
+ end
63
+
64
+ =begin
65
+ --- HtmlElem#search(data)
66
+ return an Array of HtmlElems, which have ((|data|)).
67
+ =end
68
+
69
+ def search( data )
70
+ a = []
71
+ a.push self if @data == data
72
+ @children.each do |c|
73
+ a = a + c.search( data )
74
+ end
75
+ a
76
+ end
77
+
78
+ =begin
79
+ --- HtmlElem#readlink(str)
80
+ return a Response, gotten with reading a Link have ((|str|)).
81
+ raise ElemNotFound exception, when no Links found.
82
+ =end
83
+
84
+ def readlink( str )
85
+ self.find( 'a' ).each do |link|
86
+ return link.read if link.data == str
87
+ end
88
+ raise ElemNotFound, "no Links have '#{str}' as data."
89
+ end
90
+
91
+ =begin
92
+ --- HtmlElem#has?(elem)
93
+ return true, when self have ((|elem|)) as child.
94
+ otherwise, return false.
95
+ ((|elem|)) should be a HtmlElem or a String.
96
+ =end
97
+
98
+ def has?( elem )
99
+ if elem.kind_of?( HtmlElem )
100
+ @children.include?( elem )
101
+ elsif elem.instance_of?( String )
102
+ @array.include?( elem )
103
+ else
104
+ false
105
+ end
106
+ end
107
+
108
+ =begin
109
+ --- HtmlElem#print(indent='') -- FOR TEST USE ONLY
110
+ print tree structure, from self to lower.
111
+ =end
112
+
113
+ def print( indent='' ) # not tested :-(
114
+ puts indent + inspect
115
+ @children.each do |c|
116
+ c.print( indent + ' ' )
117
+ end
118
+ end
119
+
120
+ end # class HtmlElem
121
+
122
+ end # module WebUnit
@@ -0,0 +1,26 @@
1
+ =begin
2
+ = WebUnit::Image
3
+ Copyright(C) 2001 yuichi TAKAHASHI
4
+ $Id: image.rb,v 1.1.1.1 2003/01/21 11:50:40 yuichi Exp $
5
+ =end
6
+
7
+ require 'net/http'
8
+
9
+ module WebUnit
10
+
11
+ class Image < HtmlElem
12
+
13
+ attr_reader :src, :alt, :width, :height, :border
14
+
15
+ def initialize( ah )
16
+ super( 'img', ah )
17
+ @src = ah["src"]
18
+ @alt = ah["alt"]
19
+ @width = ah["width"]
20
+ @height = ah["height"]
21
+ @border = ah["border"]
22
+ end
23
+
24
+ end
25
+
26
+ end
@@ -0,0 +1,31 @@
1
+ =begin
2
+ = WebUnit::JSciriptOpenObject
3
+ Copyright(C) 2001 yuichi TAKAHASHI
4
+ $Id: jscript.rb,v 1.1.1.1 2003/01/21 11:50:40 yuichi Exp $
5
+ =end
6
+
7
+ module WebUnit
8
+
9
+ class JSciriptOpenObject < HtmlElem
10
+
11
+ attr_reader :url, :file, :target
12
+
13
+ def initialize( ah )
14
+ super( 'open', ah )
15
+ @url = ah['url']
16
+ @file = ah['file']
17
+ @target = ah['target']
18
+ end
19
+
20
+ =begin
21
+ --- JSciriptOpenObject#read
22
+ return a Response of getting of '@url'
23
+ =end
24
+
25
+ def read
26
+ Response::new.init_http( @url, "GET" ) if @url != nil
27
+ end
28
+
29
+ end
30
+
31
+ end
@@ -0,0 +1,33 @@
1
+ =begin
2
+ = WebUnit::Link
3
+ Copyright(C) 2001 yuichi TAKAHASHI
4
+ $Id: link.rb,v 1.1.1.1 2003/01/21 11:50:40 yuichi Exp $
5
+ =end
6
+
7
+ require 'net/http'
8
+
9
+ module WebUnit
10
+
11
+ class Link < HtmlElem
12
+
13
+ attr_reader :href, :target, :onClick
14
+
15
+ def initialize( ah )
16
+ super( 'a', ah )
17
+ @href = ah["href"]
18
+ @target = ah["target"]
19
+ @onClick = ah["onclick"]
20
+ end
21
+
22
+ =begin
23
+ --- Link#read
24
+ return a Response of getting of '@href'
25
+ =end
26
+
27
+ def read
28
+ Response::new.init_http( @href, "GET" ) if @href != nil
29
+ end
30
+
31
+ end
32
+
33
+ end
@@ -0,0 +1,321 @@
1
+ =begin
2
+ = WebUnit::Param/...
3
+ Copyright(C) 2001 yuichi TAKAHASHI, Narushima Hironori.
4
+ $Id: params.rb,v 1.1.1.1 2003/01/21 11:50:40 yuichi Exp $
5
+ =end
6
+
7
+ module WebUnit
8
+
9
+ class Param < HtmlElem
10
+
11
+ attr_reader :name, :type, :relations
12
+ attr_accessor :stat, :value
13
+
14
+ def initialize( tag, ah )
15
+ super
16
+ @type = ah["type"] ? ah["type"] : 'text'
17
+ @value = ah["value"]
18
+ @relations = []
19
+ @stat = ah.key?( 'checked' ) ? 'on' : 'off'
20
+ end
21
+
22
+ def update( p )
23
+ @relations << p
24
+ end
25
+
26
+ def query_data
27
+ value = @value ? CGI::escape( @value ) : ''
28
+ @name ? ( CGI::escape( @name ) + '=' + value ) : nil
29
+ end
30
+
31
+ def multipart_query_data( boundary)
32
+ value = @value ? @value : ''
33
+
34
+ if (@name)
35
+ name = CGI::escape(@name)
36
+ "--#{boundary}\n" +
37
+ %!Content-Disposition: form-data; name="#{name}"\n! +
38
+ "\n" +
39
+ value + "\n"
40
+ else
41
+ nil
42
+ end
43
+ end
44
+ end
45
+
46
+ class Input < Param
47
+
48
+ def initialize( ah )
49
+ super( 'input', ah )
50
+ end
51
+
52
+ def on
53
+ @stat = 'on'
54
+ end
55
+
56
+ def off
57
+ @stat = 'off'
58
+ end
59
+
60
+ def inspect
61
+ a = super + "[stat:#{@stat}]"
62
+ end
63
+
64
+ end
65
+
66
+ class InputRadio < Input
67
+
68
+ def on
69
+ @stat = 'on'
70
+ @relations.each do |r|
71
+ r.off
72
+ end
73
+ end
74
+
75
+ def query_data
76
+ value = @value ? CGI::escape( @value ) : ''
77
+ (@stat == 'on' and @name) ? CGI::escape(@name) + '=' + value : nil
78
+ end
79
+
80
+ def multipart_query_data( boundary)
81
+ if @stat == 'on'
82
+ super(boundary)
83
+ else
84
+ nil
85
+ end
86
+ end
87
+
88
+ def value=( v )
89
+ self.stat = self.value == v ? 'on' : 'off'
90
+ @relations.each do |e|
91
+ e.stat = e.value == v ? 'on' : 'off'
92
+ end
93
+ end
94
+ end
95
+
96
+ class InputCheckbox < Input
97
+ def query_data
98
+ value = @value ? CGI::escape( @value ) : 'on'
99
+ (@stat == 'on' and @name) ? @name + '=' + value : nil
100
+ end
101
+
102
+ def multipart_query_data( boundary)
103
+ if @stat == 'on'
104
+ super( boundary)
105
+ else
106
+ nil
107
+ end
108
+ end
109
+ end
110
+
111
+ class InputSubmit < Input
112
+ def query_data
113
+ value = CGI::escape( @value ? @value : 'Submit Query' )
114
+ @name ? CGI::escape(@name) + '=' + value : nil
115
+ end
116
+ end
117
+
118
+ class InputImage < Input
119
+ attr_writer :x, :y
120
+
121
+ def query_data
122
+ @name + '.x=' + @x.to_s + '&' + @name + '.y=' + @y.to_s
123
+ end
124
+
125
+ def multipart_query_data( boundary)
126
+ "--#{boundary}\n" +
127
+ %!Content-Disposition: form-data; name="#{@name}.x"\n! +
128
+ "\n" +
129
+ @x.to_s + "\n" +
130
+ "--#{boundary}\n" +
131
+ %!Content-Disposition: form-data; name="#{@name}.y"\n! +
132
+ "\n" +
133
+ @y.to_s + "\n"
134
+ end
135
+ end
136
+
137
+ class InputReset < Input
138
+
139
+ def query_data
140
+ nil
141
+ end
142
+
143
+ def multipart_query_data( boundary)
144
+ nil
145
+ end
146
+
147
+ end
148
+
149
+ class Select < Param
150
+
151
+ attr_reader :options
152
+
153
+ def initialize( ah )
154
+ super( 'select', ah )
155
+ @options = []
156
+ @size = ah["size"]
157
+ @type = 'select'
158
+ end
159
+
160
+ def add_option( option )
161
+ @options.push( option )
162
+ end
163
+
164
+ def end_option
165
+ if @size == nil && @options.reject { |o| o.stat == 'off' } == []
166
+ @options[0].select
167
+ end
168
+ end
169
+
170
+ def select( arr )
171
+ @options.each do |o|
172
+ o.deselect
173
+ end
174
+ arr.each do |e|
175
+ @options[e].select if e.kind_of?( Integer )
176
+ if e.kind_of?( String )
177
+ @options.each do |o|
178
+ o.select if o.value == e || o.data == e
179
+ end
180
+ end
181
+ end
182
+ end
183
+
184
+ def query_data
185
+ a = []
186
+ @options.each do |o|
187
+ a << o.query_data( @name )
188
+ end
189
+ s = a.compact.join('&')
190
+ s == '' ? nil : s
191
+ end
192
+
193
+ def multipart_query_data( boundary)
194
+ lines = ''
195
+ @options.each do |o|
196
+ data = o.multipart_query_data(boundary, @name)
197
+ lines << data if data
198
+ end
199
+
200
+ lines
201
+ end
202
+
203
+ def value
204
+ arr = []
205
+ @options.each do |o|
206
+ arr << o.value if o.stat == 'on'
207
+ end
208
+ case arr.size
209
+ when 0 then nil
210
+ when 1 then arr[0]
211
+ else arr
212
+ end
213
+ end
214
+
215
+ def value= ( v )
216
+ @options.each do |o|
217
+ if o.value == v
218
+ o.select
219
+ else
220
+ o.deselect
221
+ end
222
+ end
223
+ end
224
+ end
225
+
226
+ class SelectOption < HtmlElem
227
+ attr_reader :stat
228
+
229
+ def initialize( ah )
230
+ super( 'option', ah )
231
+ @value = ah["value"]
232
+ @stat = ah.key?( 'selected' ) ? 'on' : 'off'
233
+ @type = 'option'
234
+ end
235
+
236
+ def value
237
+ @value ? @value : @data
238
+ end
239
+
240
+ def select
241
+ @stat = 'on'
242
+ end
243
+
244
+ def deselect
245
+ @stat = 'off'
246
+ end
247
+
248
+ def query_data( name )
249
+ @value = @data unless @value
250
+ value = @value ? CGI::escape( @value ) : ''
251
+ (@stat == 'on' and name) ? name + '=' + value : nil
252
+ end
253
+
254
+ def multipart_query_data( boundary, name)
255
+ @value = @data unless @value
256
+ value = @value ? @value : ''
257
+
258
+ if @stat == 'on' and name
259
+ "--#{boundary}\n" +
260
+ %!Content-Disposition: form-data; name="#{CGI::escape(name)}"\n! +
261
+ "\n" +
262
+ value + "\n"
263
+ else
264
+ nil
265
+ end
266
+ end
267
+
268
+ end
269
+
270
+ class Textarea < Param
271
+ def initialize( ah )
272
+ super( 'textarea', ah )
273
+ @type = 'textarea'
274
+ end
275
+
276
+ def value
277
+ @value ? @value : @data
278
+ end
279
+
280
+ def query_data
281
+ val = @value ? @value : @data
282
+ value = val ? CGI::escape( val ) : ''
283
+ @name ? ( CGI::escape( @name ) + '=' + value ) : nil
284
+ end
285
+
286
+ def multipart_query_data( boundary)
287
+ @value = @data unless @value
288
+ value = @value ? @value : ''
289
+
290
+ if @name
291
+ "--#{boundary}\n" +
292
+ %!Content-Disposition: form-data; name="#{CGI::escape(@name)}"\n! +
293
+ "\n" +
294
+ value + "\n"
295
+ else
296
+ nil
297
+ end
298
+ end
299
+
300
+ end
301
+
302
+ class InputFile < Input
303
+ def query_data
304
+ nil
305
+ end
306
+
307
+ def multipart_query_data( boundary)
308
+ if @name and @value
309
+ "--#{boundary}\n" +
310
+ %!Content-Disposition: form-data; name="#{File.basename(@name)}"; filename="#{File.basename(@value)}"\n! +
311
+ "Content-Type: text/plain\n" +
312
+ "\n" +
313
+ IO.readlines(@value).join('') + "\n"
314
+ else
315
+ nil
316
+ end
317
+ end
318
+
319
+ end
320
+
321
+ end