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,229 @@
1
+ =begin
2
+ = WebUnit::Parser
3
+ Copyright(C) 2001 yuichi TAKAHASHI, Narushima Hironori.
4
+ $Id: parser.rb,v 1.5 2004/04/29 12:34:04 yuichi Exp $
5
+ Part of WebUnit::Parser is variant of html-parser
6
+ =end
7
+
8
+ require 'htmlrepair'
9
+ require 'sgml-parser'
10
+ require 'html-parser'
11
+ require 'formatter'
12
+
13
+ module WebUnit
14
+
15
+ class Parser < SGMLParser
16
+
17
+ include Utils
18
+
19
+ @@ignoretags = []
20
+ SingleTags = %w( meta br hr base link area ) # input, frame, img
21
+
22
+ def initialize()
23
+ super( NullFormatter.new )
24
+ @elem_stack = [ HtmlElem::new( nil, nil ) ]
25
+ @form_stack = []
26
+ @table_stack = []
27
+ self.ignore @@ignoretags
28
+ end
29
+
30
+ def feed( response )
31
+ @response = response
32
+ begin
33
+ $stderr.puts HTMLSplit.new( @response.body ).repair.to_s if $DEBUG
34
+ super( HTMLSplit.new( @response.body ).repair.to_s )
35
+ rescue
36
+ raise BadHtmlTags, $!.message + @elem_stack.inspect
37
+ end
38
+ @elem_stack.pop.children[0]
39
+ end
40
+
41
+ def handle_data(data)
42
+ @elem_stack.last.append data.squeeze( " \n" ).strip
43
+ end
44
+
45
+ def starttag( elem )
46
+ @elem_stack.last.append elem
47
+ @elem_stack.push elem
48
+ end
49
+
50
+ def endtag( tag )
51
+ elem = @elem_stack.pop
52
+ if tag != elem.tag
53
+ if SingleTags.include?(tag)
54
+ @elem_stack.push(elem)
55
+ else
56
+ puts "'#{tag}'(wait for '#{elem.tag.to_s}')" if $DEBUG
57
+ raise BadHtmlTags, "'#{tag}'(wait for '#{elem.tag.to_s}')"
58
+ end
59
+ end
60
+ elem
61
+ end
62
+
63
+ def unknown_starttag( tag, attrs )
64
+ elem = HtmlElem::new( tag, attrs_to_hash( attrs ) )
65
+ starttag( elem )
66
+ end
67
+
68
+ def unknown_endtag( tag )
69
+ endtag( tag )
70
+ end
71
+
72
+ # special start and end ( a, form, table, ... )
73
+
74
+ def start_a( attrs )
75
+ ah = attrs_to_hash attrs
76
+ unless ah["href"] =~ /^#/
77
+ ah["href"] = complete_url( ah["href"], @response.url )
78
+ ah["href"].gsub!( "&amp;", "&" )
79
+ end
80
+ elem = Link::new( ah )
81
+ @response.add_link( elem )
82
+ starttag( elem )
83
+ end
84
+
85
+ def start_form( attrs )
86
+ ah = attrs_to_hash attrs
87
+ ah["action"] = complete_url( ah["action"], @response.url )
88
+ ah["action"].gsub!( "&amp;", "&" )
89
+ elem = Form::new( ah )
90
+ @response.add_form elem
91
+ @form_stack.push elem
92
+ starttag( elem )
93
+ end
94
+ def end_form
95
+ endtag( 'form' )
96
+ @form_stack.pop
97
+ end
98
+
99
+ def start_select( attrs )
100
+ ah = attrs_to_hash attrs
101
+ elem = Select::new( ah )
102
+ @form_stack.last.add_param elem
103
+ starttag( elem )
104
+ end
105
+ def end_select
106
+ endtag( 'select' )
107
+ @form_stack.last.parameters.last.end_option
108
+ end
109
+
110
+ def start_option( attrs )
111
+ ah = attrs_to_hash attrs
112
+ elem = SelectOption::new( ah )
113
+ @form_stack.last.parameters.last.add_option elem
114
+ starttag( elem )
115
+ end
116
+
117
+ def start_textarea( attrs )
118
+ ah = attrs_to_hash attrs
119
+ elem = Textarea::new( ah )
120
+ @form_stack.last.add_param elem
121
+ starttag( elem )
122
+ end
123
+
124
+ def start_table( attrs )
125
+ ah = attrs_to_hash attrs
126
+ elem = Table::new( ah )
127
+ @response.add_table elem
128
+ @table_stack.push elem
129
+ starttag( elem )
130
+ end
131
+ def end_table
132
+ endtag( 'table' )
133
+ @table_stack.pop
134
+ end
135
+
136
+ def start_tr( attrs )
137
+ elem = TableRow::new( attrs_to_hash( attrs ) )
138
+ starttag( elem )
139
+ @table_stack.last.add_row( attrs_to_hash( attrs ) )
140
+ end
141
+
142
+ def start_th( attrs )
143
+ elem = TableCell::new( 'th', attrs_to_hash( attrs ) )
144
+ @table_stack.last.add_cell( elem )
145
+ starttag( elem )
146
+ end
147
+
148
+ def start_td( attrs )
149
+ elem = TableCell::new( 'td', attrs_to_hash( attrs ) )
150
+ @table_stack.last.add_cell( elem )
151
+ starttag( elem )
152
+ end
153
+
154
+ # do ( start only )
155
+ def dotag( tag, attrs )
156
+ elem = HtmlElem::new( tag, attrs_to_hash( attrs ) )
157
+ @elem_stack.last.children.push elem
158
+ end
159
+
160
+ SingleTags.each do |t|
161
+ eval "def do_#{t}( attrs ); dotag( '#{t}', attrs ); end"
162
+ end
163
+
164
+ # special do ( input, frame, ... )
165
+
166
+ def do_input( attrs )
167
+ ah = attrs_to_hash attrs
168
+ case ah['type']
169
+ when 'submit'
170
+ elem = InputSubmit::new( ah )
171
+ when 'reset'
172
+ elem = InputReset::new( ah )
173
+ when 'checkbox'
174
+ elem = InputCheckbox::new( ah )
175
+ when 'radio'
176
+ elem = InputRadio::new( ah )
177
+ when 'image'
178
+ elem = InputImage::new( ah )
179
+ when 'file'
180
+ elem = InputFile::new( ah )
181
+ else # text
182
+ elem = Input::new( ah )
183
+ end
184
+
185
+ @form_stack.last.add_param elem if @form_stack.last
186
+ @elem_stack.last.children.push elem
187
+ end
188
+
189
+ def do_frame( attrs )
190
+ ah = attrs_to_hash attrs
191
+ ah['src'] = complete_url( ah['src'], @response.url )
192
+ elem = Frame::new( ah )
193
+ @response.add_frame( elem )
194
+ end
195
+
196
+ def do_img( attrs )
197
+ ah = attrs_to_hash attrs
198
+ elem = Image::new( ah )
199
+ @response.add_image( elem )
200
+ @elem_stack.last.children.push elem
201
+ end
202
+
203
+ # ignore tag
204
+ def ignore( arr )
205
+ arr.each do |t|
206
+ self.instance_eval( "def start_#{t}( a ); end" )
207
+ self.instance_eval( "def end_#{t}; end" )
208
+ self.instance_eval( "def do_#{t}( a ); end" )
209
+ end
210
+ end
211
+
212
+ def self::ignore( arr )
213
+ @@ignoretags = arr
214
+ end
215
+
216
+ # utils
217
+
218
+ def attrs_to_hash( attrs )
219
+ h = {}
220
+ for a, v in attrs
221
+ v = v.split('"')[1]
222
+ h[a] = v ? v : ''
223
+ end
224
+ h
225
+ end
226
+
227
+ end
228
+
229
+ end
@@ -0,0 +1,464 @@
1
+ =begin
2
+ = WebUnit::Response
3
+ Copyright(C) 2001 yuichi TAKAHASHI, Narushima Hironori.
4
+ $Id: response.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 Response
12
+
13
+ include Utils
14
+
15
+ @@host = nil
16
+ @@port = nil
17
+ @@http = nil
18
+
19
+ attr_reader :url, :method, :response, :body, :code
20
+ attr_reader :tree, :links, :forms, :tables, :frames, :images
21
+ attr_accessor :username, :password
22
+
23
+ =begin
24
+ --- Response.get(url,data=nil)
25
+ return a Response.
26
+ =end
27
+ def self::get( url, data=nil, up=nil )
28
+ r = self.new
29
+ r.username = up[0] if up
30
+ r.password = up[1] if up
31
+ r.init_http( url, "GET", data )
32
+ end
33
+
34
+ =begin
35
+ --- Response.post(url,data=nil)
36
+ return a Response.
37
+ =end
38
+ def self::post( url, data=nil, up=nil )
39
+ r = self.new
40
+ r.username = up[0] if up
41
+ r.password = up[1] if up
42
+ r.init_http( url, "POST", data )
43
+ end
44
+
45
+ =begin
46
+ --- Response.html( html)
47
+ return a Response.
48
+ =end
49
+
50
+ def self::html( html, url=nil )
51
+ html = "<html>#{html}</html>" unless html =~ %r!^<html>!
52
+ self.new.init_html( html, url )
53
+ end
54
+
55
+ def self::reset
56
+ begin
57
+ @@http.finish if @@http
58
+ rescue IOError
59
+ @@http = nil
60
+ end
61
+ @@host = nil
62
+ @@port = nil
63
+ @@http = nil
64
+ end
65
+
66
+ def init_html( html, url )
67
+ @url = url
68
+ @method = 'html'
69
+ @body = html
70
+ feed
71
+ self
72
+ end
73
+
74
+ def do_connect(host, port)
75
+ if @@host != host or @@port != port
76
+ @@host = host
77
+ @@port = port
78
+ begin
79
+ @@http.finish if @@http
80
+ rescue IOError
81
+ @@http = nil
82
+ end
83
+ @@http = Net::HTTP::new( host, port )
84
+ end
85
+ end
86
+
87
+ def init_http( url, method, data=nil, retried=false, multipart=false)
88
+ url = $URLBASE + url unless url =~ %r!://!
89
+ @url = url
90
+ @method = method
91
+ header = {}
92
+
93
+ prot,host,port,path = parse_url( url )
94
+ do_connect( host, port)
95
+
96
+ header.update( Cookies::header( path ) )
97
+ @username ||= nil; @password ||= nil
98
+ if @username != nil && @password != nil
99
+ header['authorization'] =
100
+ 'Basic ' + ["#{@username}:#{@password}"].pack('m').gsub(/\s+/, '')
101
+ end
102
+
103
+ begin
104
+ if multipart
105
+ header['Content-type'] = "multipart/form-data,boundary=#{BOUNDARY}"
106
+
107
+ #puts data
108
+
109
+ @response = @@http.post2( path, data.gsub("\n", "\r\n"), header)
110
+ else
111
+ case @method.upcase
112
+ when "GET" then
113
+ path << '?' + data if data
114
+ puts path if $DEBUG
115
+ @response = @@http.get2( path, header )
116
+ when "POST" then
117
+ if header['Content-type'] == nil
118
+ header['Content-type'] = "application/x-www-form-urlencoded"
119
+ end
120
+ @response = @@http.post2( path, data, header )
121
+ end
122
+ end
123
+ rescue Errno::EPIPE
124
+ @@host = nil
125
+ raise if retried
126
+ return self.init_http( url, method, data, true, multipart)
127
+ end
128
+
129
+ @body = @response.body
130
+ @code = @response.code
131
+ p @response['set-cookie'] if $DEBUG
132
+ Cookies::update( @response['set-cookie'] )
133
+ case @response['content-type']
134
+ when %r!text/html!
135
+ feed
136
+ when %r!text/xml!
137
+ return DomWalker::new( @response.body )
138
+ end
139
+
140
+ raise HttpNotFound if @code == "404"
141
+ self
142
+ end
143
+
144
+ def feed
145
+ @forms = []
146
+ @tables = []
147
+ @links = []
148
+ @frames = []
149
+ @images = []
150
+
151
+ @code ||= nil
152
+ if @code == '302'
153
+ @links.push Link.new( 'href' => @response['Location'] ) if @response.key? 'Location'
154
+ end
155
+ p = Parser.new
156
+ @tree = p.feed( self )
157
+ p.close
158
+ freeze
159
+ end
160
+
161
+ def add_link( link )
162
+ @links.push( link )
163
+ end
164
+
165
+ def add_form( form )
166
+ @forms.push( form )
167
+ end
168
+
169
+ def add_frame( frame )
170
+ @frames.push( frame )
171
+ end
172
+
173
+ def add_table( table )
174
+ @tables.push( table )
175
+ end
176
+
177
+ def add_image( image )
178
+ @images.push( image )
179
+ end
180
+
181
+ def freeze
182
+ @forms.each do |f|
183
+ f.freeze
184
+ end
185
+ end
186
+
187
+ =begin
188
+ --- Response#title
189
+ return title.
190
+ =end
191
+
192
+ def title
193
+ @tree.find( 'title' )[0].data
194
+ end
195
+
196
+ =begin
197
+ --- Response#find( tag )
198
+ same as Htmlelem#find.
199
+ =end
200
+
201
+ def find( tag )
202
+ @tree.find( tag )
203
+ end
204
+
205
+ =begin
206
+ --- Response#search( str )
207
+ same as Htmlelem#search.
208
+ =end
209
+
210
+ def search( str )
211
+ @tree.search( str )
212
+ end
213
+
214
+ =begin
215
+ --- Response#readlink( str )
216
+ same as Htmlelem#find.
217
+ =end
218
+
219
+ def readlink( str )
220
+ @tree.readlink( str )
221
+ end
222
+
223
+ =begin
224
+ --- Response#click( str )
225
+ at first Response#readlink, and then, Form#submit.
226
+ =end
227
+
228
+ def click( str, x=nil, y=nil )
229
+ begin
230
+ @tree.readlink( str )
231
+ rescue ElemNotFound
232
+ matched = 0
233
+ @tree.find( 'input' ).each do |i|
234
+ if i.class == InputSubmit
235
+ matched = i.name if i.name == str || i.value == str
236
+ elsif i.class == InputImage
237
+ matched = i.name if i.name == str
238
+ end
239
+ end
240
+ if matched == 0
241
+ raise ElemNotFound
242
+ else
243
+ submit( matched, x, y )
244
+ end
245
+ end
246
+ end
247
+
248
+ =begin
249
+ --- Response#submit( button=nil,x=nil,y=nil)
250
+ short for Response.forms[0].submit.
251
+ =end
252
+
253
+ def submit( button=nil, x=nil, y=nil )
254
+ @forms[0].submit( button, x, y )
255
+ end
256
+
257
+ def push( button=nil )
258
+ $stderr.puts "no longer support Response#push, use Response#submit"
259
+ submit
260
+ end
261
+
262
+ =begin
263
+ --- Response#param
264
+ short for Response.forms[0].params
265
+ =end
266
+
267
+ def params
268
+ @forms[0].params
269
+ end
270
+
271
+ =begin
272
+ --- Response#image
273
+ =end
274
+
275
+ def image
276
+ self.images[0]
277
+ end
278
+
279
+ =begin
280
+ --- Response#link
281
+ short for Response.links[0]
282
+ =end
283
+
284
+ def link
285
+ @links[0]
286
+ end
287
+
288
+ =begin
289
+ --- Response#form
290
+ short for Response.forms[0]
291
+ =end
292
+
293
+ def form
294
+ @forms[0]
295
+ end
296
+
297
+ =begin
298
+ --- Response#table
299
+ short for Response.tables[0]
300
+ =end
301
+
302
+ def table
303
+ @tables[0]
304
+ end
305
+
306
+ =begin
307
+ --- Response#frame
308
+ short for Response.frames[0]
309
+ =end
310
+
311
+ def frame
312
+ @frames[0]
313
+ end
314
+
315
+ =begin
316
+ --- Response#redirect
317
+ =end
318
+
319
+ def redirect
320
+ if @code == '302'
321
+ @links[0].read
322
+ else
323
+ raise BadOperation
324
+ end
325
+ end
326
+
327
+ =begin
328
+ --- Response#opens
329
+ =end
330
+
331
+ def opens
332
+ a = []
333
+ re_script = %r|<!--(.*?)// *-->|m
334
+ re_open = %r|open\( *['"]([^'"]*)['"], *['"]([^'"]*)['"] *\)|
335
+ body_rest = response.body
336
+ while re_script =~ body_rest
337
+ body_rest = $'
338
+ rest = $1
339
+ while re_open =~ rest
340
+ ah = {}
341
+ ah['file'] = $1
342
+ ah['target'] = $2
343
+ ah['url'] = complete_url( ah['file'], @url )
344
+ a << JSciriptOpenObject::new( ah )
345
+ rest = $'
346
+ end
347
+ end
348
+ a
349
+ end
350
+
351
+ def js_open_objs
352
+ $stderr.puts "no longer support Response#js_open_objs, use Response#opens"
353
+ opens
354
+ end
355
+
356
+ =begin
357
+ --- Response#open
358
+ short for Response.opens[0]
359
+ =end
360
+
361
+ def open
362
+ opens[0]
363
+ end
364
+
365
+ =begin
366
+ --- Response#pbody
367
+ =end
368
+
369
+ def pbody
370
+ puts "\n" + '-' * 72
371
+ puts self.format
372
+ puts '-' * 72
373
+ end
374
+
375
+ =begin
376
+ --- Response#format
377
+ =end
378
+
379
+ def format
380
+ w = MemWriter.new
381
+ p = HTMLParser.new( AbstractFormatter.new( w ) )
382
+ p.feed( @body )
383
+ p.close
384
+ w.to_s
385
+ end
386
+
387
+ end
388
+
389
+ class MemWriter < NullWriter
390
+
391
+ def initialize
392
+ @body = ''
393
+ @maxcol = 72
394
+ super()
395
+ reset
396
+ end
397
+
398
+ def reset
399
+ @col = 0
400
+ @atbreak = false
401
+ end
402
+
403
+ def to_s
404
+ @body.squeeze( "\n" )
405
+ end
406
+
407
+ def send_paragraph(blankline)
408
+ @body << ("\n" + "\n"*blankline)
409
+ @col = 0
410
+ @atbreak = false
411
+ end
412
+
413
+ def send_line_break
414
+ @body << ("\n")
415
+ @col = 0
416
+ @atbreak = false
417
+ end
418
+
419
+ def send_hor_rule #(*args, **kw)
420
+ @body << ("\n")
421
+ @body << ('-'*@maxcol)
422
+ @body << ("\n")
423
+ @col = 0
424
+ @atbreak = false
425
+ end
426
+
427
+ def send_literal_data(data)
428
+ @body << (data)
429
+ i = data.rindex("\n")
430
+ if i
431
+ @col = 0
432
+ data = data[i+1..-1]
433
+ #data = string.expandtabs(data)
434
+ @col = @col + data.length
435
+ @atbreak = false
436
+ end
437
+ end
438
+
439
+ def send_flowing_data(data)
440
+ return if not data
441
+ atbreak = (@atbreak || (/^\s/ =~ data))
442
+ col = @col
443
+ maxcol = @maxcol
444
+ for word in data.split
445
+ if atbreak
446
+ if col + word.length >= maxcol
447
+ @body << ("\n")
448
+ col = 0
449
+ else
450
+ @body << (' ')
451
+ col = col + 1
452
+ end
453
+ end
454
+ @body << (word)
455
+ col = col + word.length
456
+ atbreak = true
457
+ end
458
+ @col = col
459
+ @atbreak = (/\s$/ =~ data)
460
+ end
461
+
462
+ end
463
+
464
+ end