cyberweb 0.4.174

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of cyberweb might be problematic. Click here for more details.

Files changed (573) hide show
  1. checksums.yaml +7 -0
  2. data/README.md +3259 -0
  3. data/bin/cyberweb +27 -0
  4. data/cyberweb.gemspec +119 -0
  5. data/doc/AUTHORS.md +12 -0
  6. data/doc/CONVENTIONS.md +7 -0
  7. data/doc/CYBERWEB_TUTORIAL.cgi +43 -0
  8. data/doc/DOCUMENTATION_FOR_CYBERSPRAWL.md +50 -0
  9. data/doc/FUTURE_DESIGN_GOAL_CONSIDERATIONS.md +13 -0
  10. data/doc/JQUERY.md +122 -0
  11. data/doc/MOUSE.md +80 -0
  12. data/doc/README.gen +3231 -0
  13. data/doc/RENDER_WEB_BASE.md +46 -0
  14. data/doc/USAGE.md +246 -0
  15. data/doc/configuration/configuration.md +23 -0
  16. data/doc/deprecations.md +32 -0
  17. data/doc/html_characters.md +15 -0
  18. data/doc/todo/TODO_FOR_THE_CYBERWEB_PROJECT.md +1089 -0
  19. data/examples/README.md +4 -0
  20. data/examples/advanced/delayed_update_of_the_body_via_javascript.cgi +38 -0
  21. data/examples/advanced/hybrid_experiment.cgi +108 -0
  22. data/examples/advanced/larger_image_on_mouse_over_example.cgi +35 -0
  23. data/examples/advanced/no_right_click.cgi +26 -0
  24. data/examples/advanced/objectified_html_tags.cgi +35 -0
  25. data/examples/advanced/simple_calculator.cgi +42 -0
  26. data/examples/advanced/simple_form_example.cgi +38 -0
  27. data/examples/css/blue_border.html +28 -0
  28. data/examples/css/caret_colour_example.html +22 -0
  29. data/examples/css/css_border_spacing_example.html +69 -0
  30. data/examples/css/css_bubbles.html +43 -0
  31. data/examples/css/css_clock.html +344 -0
  32. data/examples/css/css_drag_and_drop.html +89 -0
  33. data/examples/css/css_neon_glow_effects.html +317 -0
  34. data/examples/css/css_text_decoration_example.html +70 -0
  35. data/examples/css/css_tooltip.html +44 -0
  36. data/examples/css/fade_in_and_fade_out_effect.html +66 -0
  37. data/examples/css/font_size_examples.html +40 -0
  38. data/examples/css/letter_spacing_example.cgi +36 -0
  39. data/examples/css/meter_example.html +31 -0
  40. data/examples/css/on_mouse_button_pressed.html +41 -0
  41. data/examples/css/planets.html +187 -0
  42. data/examples/css/scale_example.html +25 -0
  43. data/examples/css/shadow_example_in_CSS.cgi +30 -0
  44. data/examples/css/sticky_div_example.html +56 -0
  45. data/examples/css/stitched_div.html +36 -0
  46. data/examples/csv/README.md +1 -0
  47. data/examples/csv/sample.csv +10 -0
  48. data/examples/example1.rb +7 -0
  49. data/examples/flip_card_example/flip_card_example.html +72 -0
  50. data/examples/frames/frame_left.html +1 -0
  51. data/examples/frames/frame_right.html +1 -0
  52. data/examples/html/README.md +1 -0
  53. data/examples/html/abbr_example.html +25 -0
  54. data/examples/html/base64_image_example.html +26 -0
  55. data/examples/html/colour_wheel.html +1389 -0
  56. data/examples/html/column_width_example.html +34 -0
  57. data/examples/html/custom_cursor.html +103 -0
  58. data/examples/html/draggable_paragraph.html +12 -0
  59. data/examples/html/fieldset_example.html +25 -0
  60. data/examples/html/frames_example.html +7 -0
  61. data/examples/html/glyph_example.html +43 -0
  62. data/examples/html/hbox_and_vbox_example.html +65 -0
  63. data/examples/html/href_examples.html +27 -0
  64. data/examples/html/input_autofocus_example.html +16 -0
  65. data/examples/html/larger_image_on_mouse_over_example.html +30 -0
  66. data/examples/html/ordered_and_unordered_bulletsin.html +33 -0
  67. data/examples/html/play_video_example.html +13 -0
  68. data/examples/html/readonly_textarea_example.html +23 -0
  69. data/examples/html/remote_image_example.html +10 -0
  70. data/examples/html/simple_unordered_list.html +16 -0
  71. data/examples/html/table_with_header_example.html +27 -0
  72. data/examples/html/two_columns_flex_example.html +39 -0
  73. data/examples/javascript/README.md +2 -0
  74. data/examples/javascript/arrays/arrays_example_in_javascript.html +16 -0
  75. data/examples/javascript/delay_example/delay_example.html +46 -0
  76. data/examples/javascript/drag_support/drag_support.html +37 -0
  77. data/examples/javascript/jquery_drag_and_drop/drag_and_drop_image_example.html +33 -0
  78. data/examples/javascript/on_click_event_hello_world/on_click_event_hello_world.html +21 -0
  79. data/examples/javascript/rgb_to_hex/rgb_to_hex.html +15 -0
  80. data/examples/javascript/screen_resolution/screen_resolution.html +20 -0
  81. data/examples/javascript/select_everything/select_everything.html +14 -0
  82. data/examples/javascript/write_into_a_file/write_into_a_file.html +39 -0
  83. data/examples/rack/README.md +4 -0
  84. data/examples/rack/example_with_html_template.rb +123 -0
  85. data/examples/rack/example_with_rack_and_cyberweb_showing_how_to_use_images.rb +56 -0
  86. data/examples/rack/hello_world_example_with_rack.rb +45 -0
  87. data/examples/rack/lobster.rb +79 -0
  88. data/examples/rack/rack_env.rb +10 -0
  89. data/examples/rack/standalone_example.rb +26 -0
  90. data/examples/show_greek_letters.rb +3 -0
  91. data/examples/simple/on_click_event_hello_world.cgi +34 -0
  92. data/examples/sinatra/001_your_ip_address_is.rb +8 -0
  93. data/examples/sinatra/002_the_request_object.rb +16 -0
  94. data/examples/sinatra/003_hello_world_example.rb +82 -0
  95. data/examples/sinatra/004_splat_example.rb +10 -0
  96. data/examples/sinatra/005_attachment_example.rb +11 -0
  97. data/examples/sinatra/006_outer_self_example.rb +8 -0
  98. data/examples/sinatra/007_mime_type_example.rb +17 -0
  99. data/examples/sinatra/008_post_example.rb +55 -0
  100. data/examples/table_example.rb +37 -0
  101. data/images/cyberweb_favicon.png +0 -0
  102. data/images/cyberweb_logo.png +0 -0
  103. data/images/cyberweb_theme.png +0 -0
  104. data/lib/cyberweb/and_sinatra_base.rb +9 -0
  105. data/lib/cyberweb/autoinclude.rb +20 -0
  106. data/lib/cyberweb/autoinclude_webobject.rb +14 -0
  107. data/lib/cyberweb/base/base.rb +41 -0
  108. data/lib/cyberweb/base/colours.rb +69 -0
  109. data/lib/cyberweb/base/constants.rb +18 -0
  110. data/lib/cyberweb/base/encoding.rb +19 -0
  111. data/lib/cyberweb/base/misc.rb +239 -0
  112. data/lib/cyberweb/base/reset.rb +23 -0
  113. data/lib/cyberweb/base/save_file.rb +22 -0
  114. data/lib/cyberweb/cascading_style_sheets/README.md +4 -0
  115. data/lib/cyberweb/cascading_style_sheets/admonition.css +33 -0
  116. data/lib/cyberweb/cascading_style_sheets/balloon.css +344 -0
  117. data/lib/cyberweb/cascading_style_sheets/border.css +202 -0
  118. data/lib/cyberweb/cascading_style_sheets/code.css +58 -0
  119. data/lib/cyberweb/cascading_style_sheets/colours.css +476 -0
  120. data/lib/cyberweb/cascading_style_sheets/default.css +1836 -0
  121. data/lib/cyberweb/cascading_style_sheets/div.css +26 -0
  122. data/lib/cyberweb/cascading_style_sheets/fonts.css +365 -0
  123. data/lib/cyberweb/cascading_style_sheets/links.css +207 -0
  124. data/lib/cyberweb/cascading_style_sheets/margin.css +677 -0
  125. data/lib/cyberweb/cascading_style_sheets/menu.css +37 -0
  126. data/lib/cyberweb/cascading_style_sheets/message_boxes.css +48 -0
  127. data/lib/cyberweb/cascading_style_sheets/misc.css +162 -0
  128. data/lib/cyberweb/cascading_style_sheets/popup.css +63 -0
  129. data/lib/cyberweb/cascading_style_sheets/rpg.css +51 -0
  130. data/lib/cyberweb/cascading_style_sheets/ruby_regexes.css +33 -0
  131. data/lib/cyberweb/cascading_style_sheets/template2.css +18 -0
  132. data/lib/cyberweb/cascading_style_sheets/text_shadow.css +19 -0
  133. data/lib/cyberweb/cascading_style_sheets/tooltip.css +36 -0
  134. data/lib/cyberweb/cgi/README.md +6 -0
  135. data/lib/cyberweb/cgi/cgi.rb +340 -0
  136. data/lib/cyberweb/cgi/constants.rb +121 -0
  137. data/lib/cyberweb/cgi/cookie.rb +218 -0
  138. data/lib/cyberweb/cgi/core.rb +638 -0
  139. data/lib/cyberweb/cgi/exceptions.rb +223 -0
  140. data/lib/cyberweb/cgi/html.rb +1025 -0
  141. data/lib/cyberweb/cgi/mod_ruby_exception_printer.rb +40 -0
  142. data/lib/cyberweb/cgi/query_extension.rb +431 -0
  143. data/lib/cyberweb/cgi/session/file_store.rb +131 -0
  144. data/lib/cyberweb/cgi/session/memory_store.rb +90 -0
  145. data/lib/cyberweb/cgi/session/pstore.rb +127 -0
  146. data/lib/cyberweb/cgi/session.rb +444 -0
  147. data/lib/cyberweb/cgi/tag_maker.rb +94 -0
  148. data/lib/cyberweb/cgi/util.rb +239 -0
  149. data/lib/cyberweb/charts/README.md +2 -0
  150. data/lib/cyberweb/charts/google_charts.rb +51 -0
  151. data/lib/cyberweb/classes/simple_form.rb +55 -0
  152. data/lib/cyberweb/classes/tooltips.rb +169 -0
  153. data/lib/cyberweb/coloured_tags/coloured_tags.rb +3099 -0
  154. data/lib/cyberweb/colours/colour_chart.rb +117 -0
  155. data/lib/cyberweb/colours/colours.rb +50 -0
  156. data/lib/cyberweb/colours/random_colour.rb +28 -0
  157. data/lib/cyberweb/colours/sanitize_for_colours.rb +95 -0
  158. data/lib/cyberweb/commandline/commandline_interface.rb +49 -0
  159. data/lib/cyberweb/configuration/configuration.rb +66 -0
  160. data/lib/cyberweb/configuration/load_the_configuration_file.rb +73 -0
  161. data/lib/cyberweb/constants/array_images.rb +21 -0
  162. data/lib/cyberweb/constants/array_local_css_files.rb +35 -0
  163. data/lib/cyberweb/constants/array_predefined_constants.rb +23 -0
  164. data/lib/cyberweb/constants/configuration_file.rb +33 -0
  165. data/lib/cyberweb/constants/constants.rb +9 -0
  166. data/lib/cyberweb/constants/file_constants.rb +16 -0
  167. data/lib/cyberweb/constants/http_status_codes.rb +42 -0
  168. data/lib/cyberweb/constants/nl.rb +22 -0
  169. data/lib/cyberweb/constants/project_constants.rb +99 -0
  170. data/lib/cyberweb/constants/roebe.rb +28 -0
  171. data/lib/cyberweb/constants/standalone_constants.rb +309 -0
  172. data/lib/cyberweb/controller/README.md +4 -0
  173. data/lib/cyberweb/controller/webobject_controller.rb +50 -0
  174. data/lib/cyberweb/csv/README.md +2 -0
  175. data/lib/cyberweb/csv/csv.rb +58 -0
  176. data/lib/cyberweb/cybersprawl +1 -0
  177. data/lib/cyberweb/debug/debug.rb +69 -0
  178. data/lib/cyberweb/encoding/encoding.rb +84 -0
  179. data/lib/cyberweb/erb/test.rhtml +81 -0
  180. data/lib/cyberweb/erb/test_template.erb +9 -0
  181. data/lib/cyberweb/evaluate_from_the_same_named_file_then_serve.rb +9 -0
  182. data/lib/cyberweb/favicon/favicon.rb +196 -0
  183. data/lib/cyberweb/generator/README.md +2 -0
  184. data/lib/cyberweb/generator/cgi.rb +201 -0
  185. data/lib/cyberweb/generator/class.rb +25 -0
  186. data/lib/cyberweb/generator/static_webpage.rb +162 -0
  187. data/lib/cyberweb/generator/webpage_for_images.rb +553 -0
  188. data/lib/cyberweb/help/help.rb +29 -0
  189. data/lib/cyberweb/html_codes/README.md +15 -0
  190. data/lib/cyberweb/html_codes/greek_letters.rb +204 -0
  191. data/lib/cyberweb/html_tags/README.md +3 -0
  192. data/lib/cyberweb/html_tags/a.rb +65 -0
  193. data/lib/cyberweb/html_tags/accesskey.rb +25 -0
  194. data/lib/cyberweb/html_tags/blockquote.rb +56 -0
  195. data/lib/cyberweb/html_tags/body.rb +14 -0
  196. data/lib/cyberweb/html_tags/br.rb +19 -0
  197. data/lib/cyberweb/html_tags/button.rb +110 -0
  198. data/lib/cyberweb/html_tags/canvas.rb +59 -0
  199. data/lib/cyberweb/html_tags/chtml.rb +14 -0
  200. data/lib/cyberweb/html_tags/div.rb +163 -0
  201. data/lib/cyberweb/html_tags/fieldset.rb +67 -0
  202. data/lib/cyberweb/html_tags/figure.rb +72 -0
  203. data/lib/cyberweb/html_tags/form.rb +203 -0
  204. data/lib/cyberweb/html_tags/h1.rb +75 -0
  205. data/lib/cyberweb/html_tags/h2.rb +73 -0
  206. data/lib/cyberweb/html_tags/h3.rb +58 -0
  207. data/lib/cyberweb/html_tags/h4.rb +60 -0
  208. data/lib/cyberweb/html_tags/h5.rb +54 -0
  209. data/lib/cyberweb/html_tags/h6.rb +54 -0
  210. data/lib/cyberweb/html_tags/hr.rb +22 -0
  211. data/lib/cyberweb/html_tags/html_tags.rb +240 -0
  212. data/lib/cyberweb/html_tags/i.rb +50 -0
  213. data/lib/cyberweb/html_tags/img.rb +294 -0
  214. data/lib/cyberweb/html_tags/input.rb +345 -0
  215. data/lib/cyberweb/html_tags/label.rb +63 -0
  216. data/lib/cyberweb/html_tags/legend.rb +56 -0
  217. data/lib/cyberweb/html_tags/li.rb +67 -0
  218. data/lib/cyberweb/html_tags/map.rb +31 -0
  219. data/lib/cyberweb/html_tags/nav.rb +63 -0
  220. data/lib/cyberweb/html_tags/object.rb +56 -0
  221. data/lib/cyberweb/html_tags/ol.rb +56 -0
  222. data/lib/cyberweb/html_tags/option.rb +61 -0
  223. data/lib/cyberweb/html_tags/p.rb +90 -0
  224. data/lib/cyberweb/html_tags/pre.rb +164 -0
  225. data/lib/cyberweb/html_tags/section.rb +33 -0
  226. data/lib/cyberweb/html_tags/select.rb +100 -0
  227. data/lib/cyberweb/html_tags/span.rb +338 -0
  228. data/lib/cyberweb/html_tags/strong.rb +39 -0
  229. data/lib/cyberweb/html_tags/table.rb +273 -0
  230. data/lib/cyberweb/html_tags/tbody.rb +24 -0
  231. data/lib/cyberweb/html_tags/td.rb +214 -0
  232. data/lib/cyberweb/html_tags/textarea.rb +138 -0
  233. data/lib/cyberweb/html_tags/th.rb +68 -0
  234. data/lib/cyberweb/html_tags/thead.rb +36 -0
  235. data/lib/cyberweb/html_tags/tr.rb +97 -0
  236. data/lib/cyberweb/html_tags/ul.rb +51 -0
  237. data/lib/cyberweb/html_template/html_template.rb +352 -0
  238. data/lib/cyberweb/images/embed_this_image.rb +37 -0
  239. data/lib/cyberweb/images/images.rb +58 -0
  240. data/lib/cyberweb/images/is_image.rb +22 -0
  241. data/lib/cyberweb/images/path_to_images.rb +60 -0
  242. data/lib/cyberweb/images/real/README.md +6 -0
  243. data/lib/cyberweb/images/remove_this_substring_from_all_images.rb +44 -0
  244. data/lib/cyberweb/images/standalone_drag_and_drop_this_image.rb +64 -0
  245. data/lib/cyberweb/images/string_image.rb +399 -0
  246. data/lib/cyberweb/images_base64_encoded/AUSRUFUNGSZEICHEN.png.md +1 -0
  247. data/lib/cyberweb/images_base64_encoded/BLUEARROW.png.md +1 -0
  248. data/lib/cyberweb/images_base64_encoded/BUBBLE.png.md +1 -0
  249. data/lib/cyberweb/images_base64_encoded/CAT.png.md +1 -0
  250. data/lib/cyberweb/images_base64_encoded/CAUTION.png.md +1 -0
  251. data/lib/cyberweb/images_base64_encoded/CHEERING_PERSON.png.md +1 -0
  252. data/lib/cyberweb/images_base64_encoded/CURSOR.png.md +1 -0
  253. data/lib/cyberweb/images_base64_encoded/DOT_01.png.md +5 -0
  254. data/lib/cyberweb/images_base64_encoded/DUCKY.png.md +1 -0
  255. data/lib/cyberweb/images_base64_encoded/ELEPHANT.png.md +1 -0
  256. data/lib/cyberweb/images_base64_encoded/HALLOWEEN.png.md +1 -0
  257. data/lib/cyberweb/images_base64_encoded/HANGING_MONKEY.png.md +1 -0
  258. data/lib/cyberweb/images_base64_encoded/LENS.png.md +1 -0
  259. data/lib/cyberweb/images_base64_encoded/README.md +2 -0
  260. data/lib/cyberweb/images_base64_encoded/TU_WIEN_LOGO.png.md +1 -0
  261. data/lib/cyberweb/images_base64_encoded/VOGEL.png.md +1 -0
  262. data/lib/cyberweb/io/README.md +1 -0
  263. data/lib/cyberweb/io/io.rb +19 -0
  264. data/lib/cyberweb/javascript/drag_and_drop.rb +105 -0
  265. data/lib/cyberweb/javascript/dragula_collection.rb +54 -0
  266. data/lib/cyberweb/javascript/javascript.rb +211 -0
  267. data/lib/cyberweb/javascript/javascript_bundle.rb +223 -0
  268. data/lib/cyberweb/javascript/javascript_clock.rb +69 -0
  269. data/lib/cyberweb/javascript/javascript_last_modified.rb +27 -0
  270. data/lib/cyberweb/javascript/javascript_magic.rb +150 -0
  271. data/lib/cyberweb/javascript/javascript_selectable.rb +24 -0
  272. data/lib/cyberweb/javascript/jquery.rb +30 -0
  273. data/lib/cyberweb/javascript/on_click_change_opacity.rb +97 -0
  274. data/lib/cyberweb/javascript/on_click_hide.rb +63 -0
  275. data/lib/cyberweb/javascript/popup.rb +80 -0
  276. data/lib/cyberweb/javascript/print_javascript.rb +33 -0
  277. data/lib/cyberweb/javascript/registered_javascript_methods.rb +30 -0
  278. data/lib/cyberweb/javascript/resize.rb +28 -0
  279. data/lib/cyberweb/javascript/return_javascript.rb +48 -0
  280. data/lib/cyberweb/javascript/scroll.rb +17 -0
  281. data/lib/cyberweb/javascript/snoweffect.rb +122 -0
  282. data/lib/cyberweb/javascript_code/README.md +6 -0
  283. data/lib/cyberweb/javascript_code/chmod_displayer.js +74 -0
  284. data/lib/cyberweb/javascript_code/custom_functions.js +267 -0
  285. data/lib/cyberweb/javascript_code/jquery/jquery-3.6.0.js +10881 -0
  286. data/lib/cyberweb/javascript_code/jquery/jquery-ui-1.12.1.js +18706 -0
  287. data/lib/cyberweb/javascript_code/rgb_to_hex.js +14 -0
  288. data/lib/cyberweb/javascript_code/select_even_numbers.js +7 -0
  289. data/lib/cyberweb/javascript_code/select_everything.js +22 -0
  290. data/lib/cyberweb/javascript_code/simple_calculator.js +15 -0
  291. data/lib/cyberweb/javascript_code/sleep.js +3 -0
  292. data/lib/cyberweb/javascript_code/to_celsius.js +8 -0
  293. data/lib/cyberweb/mouse/README.md +3 -0
  294. data/lib/cyberweb/mouse/libxdo.rb +321 -0
  295. data/lib/cyberweb/mouse/mouse.rb +264 -0
  296. data/lib/cyberweb/objectified_html_tags/README.md +8 -0
  297. data/lib/cyberweb/objectified_html_tags/a.rb +129 -0
  298. data/lib/cyberweb/objectified_html_tags/abbr.rb +84 -0
  299. data/lib/cyberweb/objectified_html_tags/base.rb +376 -0
  300. data/lib/cyberweb/objectified_html_tags/button.rb +135 -0
  301. data/lib/cyberweb/objectified_html_tags/combobox.rb +165 -0
  302. data/lib/cyberweb/objectified_html_tags/div.rb +129 -0
  303. data/lib/cyberweb/objectified_html_tags/embed.rb +161 -0
  304. data/lib/cyberweb/objectified_html_tags/form.rb +129 -0
  305. data/lib/cyberweb/objectified_html_tags/h1.rb +129 -0
  306. data/lib/cyberweb/objectified_html_tags/h2.rb +129 -0
  307. data/lib/cyberweb/objectified_html_tags/h3.rb +129 -0
  308. data/lib/cyberweb/objectified_html_tags/h4.rb +129 -0
  309. data/lib/cyberweb/objectified_html_tags/h5.rb +129 -0
  310. data/lib/cyberweb/objectified_html_tags/h6.rb +129 -0
  311. data/lib/cyberweb/objectified_html_tags/hbox.rb +71 -0
  312. data/lib/cyberweb/objectified_html_tags/img.rb +202 -0
  313. data/lib/cyberweb/objectified_html_tags/input.rb +185 -0
  314. data/lib/cyberweb/objectified_html_tags/p.rb +129 -0
  315. data/lib/cyberweb/objectified_html_tags/pre.rb +129 -0
  316. data/lib/cyberweb/objectified_html_tags/span.rb +92 -0
  317. data/lib/cyberweb/objectified_html_tags/table.rb +174 -0
  318. data/lib/cyberweb/objectified_html_tags/textarea.rb +173 -0
  319. data/lib/cyberweb/objectified_html_tags/title.rb +82 -0
  320. data/lib/cyberweb/objectified_html_tags/window.rb +79 -0
  321. data/lib/cyberweb/predefined_and_freeform_methods/README.md +1 -0
  322. data/lib/cyberweb/predefined_and_freeform_methods/frage.rb +45 -0
  323. data/lib/cyberweb/predefined_and_freeform_methods/freeform_methods.rb +93 -0
  324. data/lib/cyberweb/predefined_and_freeform_methods/hash_css_class_to_use.rb +55 -0
  325. data/lib/cyberweb/predefined_and_freeform_methods/hash_registered_extra_tags.rb +29 -0
  326. data/lib/cyberweb/predefined_and_freeform_methods/header.rb +81 -0
  327. data/lib/cyberweb/predefined_and_freeform_methods/predefined_methods.rb +413 -0
  328. data/lib/cyberweb/project/project.rb +85 -0
  329. data/lib/cyberweb/rack/README.md +1 -0
  330. data/lib/cyberweb/rack/request.rb +31 -0
  331. data/lib/cyberweb/requires/README.md +4 -0
  332. data/lib/cyberweb/requires/do_require_web_object_files.rb +9 -0
  333. data/lib/cyberweb/requires/remove_html.rb +9 -0
  334. data/lib/cyberweb/requires/require_cgi.rb +16 -0
  335. data/lib/cyberweb/requires/require_charts.rb +20 -0
  336. data/lib/cyberweb/requires/require_generators.rb +23 -0
  337. data/lib/cyberweb/requires/require_html_tags_files.rb +23 -0
  338. data/lib/cyberweb/requires/require_javascript_files.rb +23 -0
  339. data/lib/cyberweb/requires/require_kimurai.rb +13 -0
  340. data/lib/cyberweb/requires/require_objectified_html_tags_files.rb +23 -0
  341. data/lib/cyberweb/requires/require_sinatra.rb +7 -0
  342. data/lib/cyberweb/requires/require_the_constants.rb +26 -0
  343. data/lib/cyberweb/requires/require_the_cyberweb_project.rb +172 -0
  344. data/lib/cyberweb/requires/require_the_html_template.rb +7 -0
  345. data/lib/cyberweb/requires/require_the_toplevel_methods_files.rb +24 -0
  346. data/lib/cyberweb/requires/require_web_images.rb +7 -0
  347. data/lib/cyberweb/requires/require_web_object_files.rb +25 -0
  348. data/lib/cyberweb/requires/require_yaml.rb +11 -0
  349. data/lib/cyberweb/sinatra/README.md +11 -0
  350. data/lib/cyberweb/sinatra/base.rb +145 -0
  351. data/lib/cyberweb/sinatra/custom_extensions.rb +131 -0
  352. data/lib/cyberweb/standalone_classes/all_css_classes.rb +255 -0
  353. data/lib/cyberweb/standalone_classes/calculator.rb +127 -0
  354. data/lib/cyberweb/standalone_classes/correct_image_entries_in_html_file.rb +207 -0
  355. data/lib/cyberweb/standalone_classes/input_focus.rb +97 -0
  356. data/lib/cyberweb/standalone_classes/tag_prototype.rb +43 -0
  357. data/lib/cyberweb/standalone_classes/turn_html_into_cyberweb.rb +174 -0
  358. data/lib/cyberweb/svg/blue_rect.svg +12 -0
  359. data/lib/cyberweb/svg/butterfly.svg +15 -0
  360. data/lib/cyberweb/svg/chemical_molecule.svg +192 -0
  361. data/lib/cyberweb/svg/circles_on_background.svg +29 -0
  362. data/lib/cyberweb/svg/ellipse.svg +12 -0
  363. data/lib/cyberweb/svg/five_circles.svg +26 -0
  364. data/lib/cyberweb/svg/flag_germany.svg +10 -0
  365. data/lib/cyberweb/svg/gaussian_blur.svg +20 -0
  366. data/lib/cyberweb/svg/gradient_circle.svg +18 -0
  367. data/lib/cyberweb/svg/green_butterfly.svg +18 -0
  368. data/lib/cyberweb/svg/green_tilted_lines.svg +25 -0
  369. data/lib/cyberweb/svg/lion.svg +161 -0
  370. data/lib/cyberweb/svg/one_circle.svg +12 -0
  371. data/lib/cyberweb/svg/pie_chart.svg +130 -0
  372. data/lib/cyberweb/svg/svg.cgi +61 -0
  373. data/lib/cyberweb/svg/tetris.svg +487 -0
  374. data/lib/cyberweb/svg/three_circles.svg +18 -0
  375. data/lib/cyberweb/svg/tiger.svg +732 -0
  376. data/lib/cyberweb/svg/tilted_arcs.svg +74 -0
  377. data/lib/cyberweb/svg/transparent_rect.svg +12 -0
  378. data/lib/cyberweb/svg/yellow_fe_blending.svg +42 -0
  379. data/lib/cyberweb/toplevel_methods/a.rb +131 -0
  380. data/lib/cyberweb/toplevel_methods/anmerkung.rb +67 -0
  381. data/lib/cyberweb/toplevel_methods/audio.rb +59 -0
  382. data/lib/cyberweb/toplevel_methods/bold.rb +65 -0
  383. data/lib/cyberweb/toplevel_methods/cgi.rb +65 -0
  384. data/lib/cyberweb/toplevel_methods/charsets.rb +52 -0
  385. data/lib/cyberweb/toplevel_methods/clear.rb +30 -0
  386. data/lib/cyberweb/toplevel_methods/close.rb +62 -0
  387. data/lib/cyberweb/toplevel_methods/consider_serving_the_web_object.rb +41 -0
  388. data/lib/cyberweb/toplevel_methods/css.rb +732 -0
  389. data/lib/cyberweb/toplevel_methods/date.rb +71 -0
  390. data/lib/cyberweb/toplevel_methods/dictionary.rb +48 -0
  391. data/lib/cyberweb/toplevel_methods/disable.rb +49 -0
  392. data/lib/cyberweb/toplevel_methods/document.rb +56 -0
  393. data/lib/cyberweb/toplevel_methods/dot.rb +182 -0
  394. data/lib/cyberweb/toplevel_methods/download_webpage.rb +18 -0
  395. data/lib/cyberweb/toplevel_methods/edit_configuration_file.rb +26 -0
  396. data/lib/cyberweb/toplevel_methods/ee.rb +44 -0
  397. data/lib/cyberweb/toplevel_methods/env.rb +44 -0
  398. data/lib/cyberweb/toplevel_methods/escape_html.rb +54 -0
  399. data/lib/cyberweb/toplevel_methods/fields.rb +46 -0
  400. data/lib/cyberweb/toplevel_methods/filename.rb +33 -0
  401. data/lib/cyberweb/toplevel_methods/frames.rb +131 -0
  402. data/lib/cyberweb/toplevel_methods/glob.rb +30 -0
  403. data/lib/cyberweb/toplevel_methods/google.rb +35 -0
  404. data/lib/cyberweb/toplevel_methods/hardware_information.rb +90 -0
  405. data/lib/cyberweb/toplevel_methods/hfin.rb +56 -0
  406. data/lib/cyberweb/toplevel_methods/html_comment.rb +48 -0
  407. data/lib/cyberweb/toplevel_methods/html_mode.rb +39 -0
  408. data/lib/cyberweb/toplevel_methods/html_tables.rb +818 -0
  409. data/lib/cyberweb/toplevel_methods/input.rb +54 -0
  410. data/lib/cyberweb/toplevel_methods/jquery.rb +82 -0
  411. data/lib/cyberweb/toplevel_methods/last_modified.rb +39 -0
  412. data/lib/cyberweb/toplevel_methods/links.rb +426 -0
  413. data/lib/cyberweb/toplevel_methods/listing.rb +96 -0
  414. data/lib/cyberweb/toplevel_methods/localhost.rb +18 -0
  415. data/lib/cyberweb/toplevel_methods/log_directory.rb +84 -0
  416. data/lib/cyberweb/toplevel_methods/logging.rb +42 -0
  417. data/lib/cyberweb/toplevel_methods/logo.rb +30 -0
  418. data/lib/cyberweb/toplevel_methods/markdown.rb +112 -0
  419. data/lib/cyberweb/toplevel_methods/mathml.rb +130 -0
  420. data/lib/cyberweb/toplevel_methods/message_boxes.rb +140 -0
  421. data/lib/cyberweb/toplevel_methods/misc.rb +1398 -0
  422. data/lib/cyberweb/toplevel_methods/name_of_img_dir.rb +51 -0
  423. data/lib/cyberweb/toplevel_methods/padlem_and_marlem.rb +107 -0
  424. data/lib/cyberweb/toplevel_methods/params.rb +57 -0
  425. data/lib/cyberweb/toplevel_methods/path.rb +69 -0
  426. data/lib/cyberweb/toplevel_methods/pdf.rb +103 -0
  427. data/lib/cyberweb/toplevel_methods/process_content.rb +102 -0
  428. data/lib/cyberweb/toplevel_methods/progress.rb +42 -0
  429. data/lib/cyberweb/toplevel_methods/quote.rb +44 -0
  430. data/lib/cyberweb/toplevel_methods/random.rb +70 -0
  431. data/lib/cyberweb/toplevel_methods/rds.rb +35 -0
  432. data/lib/cyberweb/toplevel_methods/read_and_display.rb +284 -0
  433. data/lib/cyberweb/toplevel_methods/readlines.rb +31 -0
  434. data/lib/cyberweb/toplevel_methods/redirect.rb +29 -0
  435. data/lib/cyberweb/toplevel_methods/registered_ids.rb +178 -0
  436. data/lib/cyberweb/toplevel_methods/remove_html.rb +32 -0
  437. data/lib/cyberweb/toplevel_methods/remove_newlines.rb +28 -0
  438. data/lib/cyberweb/toplevel_methods/return_head_start.rb +33 -0
  439. data/lib/cyberweb/toplevel_methods/return_html_fin.rb +34 -0
  440. data/lib/cyberweb/toplevel_methods/return_html_header.rb +35 -0
  441. data/lib/cyberweb/toplevel_methods/return_html_start.rb +24 -0
  442. data/lib/cyberweb/toplevel_methods/return_html_to_head_start.rb +42 -0
  443. data/lib/cyberweb/toplevel_methods/return_meta_collection.rb +54 -0
  444. data/lib/cyberweb/toplevel_methods/return_pwd.rb +23 -0
  445. data/lib/cyberweb/toplevel_methods/return_strict_doctype.rb +51 -0
  446. data/lib/cyberweb/toplevel_methods/roebe.rb +43 -0
  447. data/lib/cyberweb/toplevel_methods/s2.rb +30 -0
  448. data/lib/cyberweb/toplevel_methods/sanitize_url.rb +57 -0
  449. data/lib/cyberweb/toplevel_methods/sbr.rb +170 -0
  450. data/lib/cyberweb/toplevel_methods/server_base_directory.rb +148 -0
  451. data/lib/cyberweb/toplevel_methods/show_and_display.rb +215 -0
  452. data/lib/cyberweb/toplevel_methods/show_configuration.rb +83 -0
  453. data/lib/cyberweb/toplevel_methods/sitemap.rb +111 -0
  454. data/lib/cyberweb/toplevel_methods/spacer.rb +119 -0
  455. data/lib/cyberweb/toplevel_methods/string_body_start.rb +65 -0
  456. data/lib/cyberweb/toplevel_methods/string_content.rb +35 -0
  457. data/lib/cyberweb/toplevel_methods/svg.rb +66 -0
  458. data/lib/cyberweb/toplevel_methods/tag.rb +237 -0
  459. data/lib/cyberweb/toplevel_methods/temp_directory.rb +73 -0
  460. data/lib/cyberweb/toplevel_methods/test_css.rb +24 -0
  461. data/lib/cyberweb/toplevel_methods/textile.rb +45 -0
  462. data/lib/cyberweb/toplevel_methods/title.rb +125 -0
  463. data/lib/cyberweb/toplevel_methods/umlaute.rb +90 -0
  464. data/lib/cyberweb/toplevel_methods/video.rb +352 -0
  465. data/lib/cyberweb/toplevel_methods/view_source.rb +50 -0
  466. data/lib/cyberweb/toplevel_methods/web_object.rb +42 -0
  467. data/lib/cyberweb/toplevel_methods/write_what_into.rb +27 -0
  468. data/lib/cyberweb/utility_scripts/README.md +4 -0
  469. data/lib/cyberweb/utility_scripts/create_coloured_tags.rb +172 -0
  470. data/lib/cyberweb/utility_scripts/download_balloon_css.rb +160 -0
  471. data/lib/cyberweb/utility_scripts/hyperlink_all_images_from.rb +148 -0
  472. data/lib/cyberweb/version/version.rb +25 -0
  473. data/lib/cyberweb/web_base/web_base.rb +28 -0
  474. data/lib/cyberweb/web_images/array_listing_all_project_images.rb +52 -0
  475. data/lib/cyberweb/web_images/map_symbol_to_image_location.rb +1661 -0
  476. data/lib/cyberweb/web_images/web_images.rb +270 -0
  477. data/lib/cyberweb/web_object/css.rb +627 -0
  478. data/lib/cyberweb/web_object/evaluate.rb +126 -0
  479. data/lib/cyberweb/web_object/favicon.rb +160 -0
  480. data/lib/cyberweb/web_object/html_related_tags.rb +320 -0
  481. data/lib/cyberweb/web_object/images.rb +693 -0
  482. data/lib/cyberweb/web_object/initialize.rb +51 -0
  483. data/lib/cyberweb/web_object/input_related_functionality.rb +414 -0
  484. data/lib/cyberweb/web_object/javascript.rb +427 -0
  485. data/lib/cyberweb/web_object/languages.rb +172 -0
  486. data/lib/cyberweb/web_object/links.rb +228 -0
  487. data/lib/cyberweb/web_object/misc.rb +5159 -0
  488. data/lib/cyberweb/web_object/params.rb +289 -0
  489. data/lib/cyberweb/web_object/reset.rb +192 -0
  490. data/lib/cyberweb/web_object/run.rb +44 -0
  491. data/lib/cyberweb/web_object/sinatra_related_functionality.rb +30 -0
  492. data/lib/cyberweb/web_object/sitemap.rb +176 -0
  493. data/lib/cyberweb/web_object/table.rb +378 -0
  494. data/lib/cyberweb/web_object/web_object.rb +126 -0
  495. data/lib/cyberweb/web_scraper/README.md +8 -0
  496. data/lib/cyberweb/web_scraper/scrape_this_url.rb +183 -0
  497. data/lib/cyberweb/webmin/biology_server.cgi +256 -0
  498. data/lib/cyberweb/webmin/calculator.cgi +52 -0
  499. data/lib/cyberweb/webmin/colour_chart.cgi +33 -0
  500. data/lib/cyberweb/webmin/comments.cgi +137 -0
  501. data/lib/cyberweb/webmin/comments_data +18 -0
  502. data/lib/cyberweb/webmin/constants.rb +46 -0
  503. data/lib/cyberweb/webmin/dictionary.cgi +39 -0
  504. data/lib/cyberweb/webmin/sys_info.cgi +26 -0
  505. data/lib/cyberweb/webmin/webforum.cgi +58 -0
  506. data/lib/cyberweb/webmin/webmin.cgi +679 -0
  507. data/lib/cyberweb/yaml/autogenerated_system_settings.yml +14 -0
  508. data/lib/cyberweb/yaml/custom_tags.yml +7 -0
  509. data/lib/cyberweb/yaml/debug.yml +1 -0
  510. data/lib/cyberweb/yaml/html5_global_attributes.yml +12 -0
  511. data/lib/cyberweb/yaml/html5_new_elements.yml +108 -0
  512. data/lib/cyberweb/yaml/html_tag_legend.yml +12 -0
  513. data/lib/cyberweb/yaml/http_status_codes.yml +38 -0
  514. data/lib/cyberweb/yaml/js_files_to_load.yml +28 -0
  515. data/lib/cyberweb/yaml/project_configuration.yml +229 -0
  516. data/lib/cyberweb/yaml/video_attributes.yml +35 -0
  517. data/lib/cyberweb/yaml/web_images.yml +306 -0
  518. data/lib/cyberweb.rb +5 -0
  519. data/test/README.md +5 -0
  520. data/test/complex_tests/all_tests_in_one_page.cgi +666 -0
  521. data/test/complex_tests/simple_sinatra_example_using_cyberweb/simple.rb +60 -0
  522. data/test/complex_tests/sinatra_or_cyberweb/sinatra_or_cyberweb.cgi +7 -0
  523. data/test/complex_tests/sinatra_or_cyberweb/sinatra_or_cyberweb.rb +23 -0
  524. data/test/complex_tests/sinatra_or_cyberweb/sinatra_or_cyberweb.sinatra +65 -0
  525. data/test/complex_tests/testing_frames.cgi +42 -0
  526. data/test/complex_tests/testing_objectified_html_tags.rb +82 -0
  527. data/test/complex_tests/testing_style_variants/README.md +2 -0
  528. data/test/complex_tests/testing_style_variants/show_coloured_boxes.cgi +58 -0
  529. data/test/complex_tests/testing_tables.cgi +67 -0
  530. data/test/complex_tests/testing_the_cyberweb_shell.rb +188 -0
  531. data/test/complex_tests/testing_web_object.rb +94 -0
  532. data/test/css/README.md +5 -0
  533. data/test/css/return_the_content_of_these_css_classes.rb +7 -0
  534. data/test/css/testing_css_effects.cgi +159 -0
  535. data/test/css/testing_css_masking.cgi +36 -0
  536. data/test/dummy.pdf +0 -0
  537. data/test/hello_world/hello_world.cgi +25 -0
  538. data/test/javascript/README.md +2 -0
  539. data/test/javascript/testing_cheerleader_javascript.cgi +0 -0
  540. data/test/javascript/testing_drag_and_drop_support.cgi +33 -0
  541. data/test/javascript/testing_on_click_change_opacity.cgi +26 -0
  542. data/test/javascript/testing_snowflakes.cgi +20 -0
  543. data/test/simple_tests/README.md +3 -0
  544. data/test/simple_tests/ad-hoc-test.cgi +55 -0
  545. data/test/simple_tests/commandline_tests.rb +70 -0
  546. data/test/simple_tests/display_this_file.cgi +11 -0
  547. data/test/simple_tests/simple_html_example.cgi +29 -0
  548. data/test/simple_tests/simple_status_page.cgi +52 -0
  549. data/test/simple_tests/string_s2_test.rb +11 -0
  550. data/test/simple_tests/test_simple_string_as_input.rb +12 -0
  551. data/test/simple_tests/testing_base64_images.cgi +26 -0
  552. data/test/simple_tests/testing_dragging_an_image.cgi +23 -0
  553. data/test/simple_tests/testing_editable_text.cgi +16 -0
  554. data/test/simple_tests/testing_email.cgi +31 -0
  555. data/test/simple_tests/testing_embedding_a_pdf_file.cgi +32 -0
  556. data/test/simple_tests/testing_google_charts.cgi +24 -0
  557. data/test/simple_tests/testing_html_forms.cgi +31 -0
  558. data/test/simple_tests/testing_html_template.rb +13 -0
  559. data/test/simple_tests/testing_popup_div.cgi +22 -0
  560. data/test/simple_tests/testing_return_dataset_without_any_comments.rb +11 -0
  561. data/test/simple_tests/testing_the_cap_box.cgi +20 -0
  562. data/test/simple_tests/testing_the_div_tag.cgi +21 -0
  563. data/test/simple_tests/testing_the_headers_tag.cgi +36 -0
  564. data/test/simple_tests/testing_the_html_colours.cgi +19 -0
  565. data/test/simple_tests/testing_the_info_box.cgi +19 -0
  566. data/test/simple_tests/testing_the_li_tag.cgi +24 -0
  567. data/test/simple_tests/testing_the_s2_method.rb +7 -0
  568. data/test/simple_tests/testing_the_select_tag.cgi +23 -0
  569. data/test/simple_tests/testing_the_span_tag.cgi +36 -0
  570. data/test/simple_tests/testing_web_images.rb +12 -0
  571. data/test/testing_html_tags/README.md +7 -0
  572. data/test/testing_html_tags/button_example.cgi +42 -0
  573. metadata +759 -0
@@ -0,0 +1,40 @@
1
+ #!/usr/bin/ruby -w
2
+ # Encoding: UTF-8
3
+ # frozen_string_literal: true
4
+ # =========================================================================== #
5
+ module Cyberweb
6
+
7
+ require 'cyberweb/cgi/exceptions.rb'
8
+
9
+ class CGI
10
+
11
+ class ModRubyExceptionPrinter < ::Cyberweb::CGI::Exception
12
+
13
+ # ========================================================================= #
14
+ # === print_header
15
+ #
16
+ # print HTTP header (for mod_ruby)
17
+ # ========================================================================= #
18
+ def print_header
19
+ request = Apache::request # Request for when we use Apache.
20
+ request.status = 500
21
+ request.status_line = '500 Internal Error'
22
+ request.content_type = 'text/html'
23
+ request.headers_out['X-CGI-Exception'] = '0.3.0'
24
+ request.send_http_header
25
+ end
26
+
27
+ # ========================================================================= #
28
+ # === print_exception
29
+ #
30
+ # This method is responsible for printing the exception.
31
+ # ========================================================================= #
32
+ def print_exception(
33
+ the_exception
34
+ )
35
+ super
36
+ result = "#{the_exception.backtrace.first}: #{the_exception.message} (#{the_exception.class.name})\n"
37
+ $stderr.write(result)
38
+ end
39
+
40
+ end; end; end
@@ -0,0 +1,431 @@
1
+ #!/usr/bin/ruby -w
2
+ # Encoding: UTF-8
3
+ # frozen_string_literal: true
4
+ # =========================================================================== #
5
+ # === Cyberweb::CGI::QueryExtension
6
+ # =========================================================================== #
7
+ module Cyberweb
8
+
9
+ class CGI # === Cyberweb::CGI
10
+
11
+ require 'cyberweb/cgi/cookie.rb'
12
+
13
+ # ========================================================================= #
14
+ # === USE_OFFLINE_MODE
15
+ #
16
+ # The default is to have this constant set to true.
17
+ # ========================================================================= #
18
+ USE_OFFLINE_MODE = false
19
+
20
+ # ========================================================================= #
21
+ # === Cyberweb::CGI.use_commandline_input?
22
+ # ========================================================================= #
23
+ def self.use_commandline_input?
24
+ USE_OFFLINE_MODE
25
+ end
26
+
27
+ # ========================================================================= #
28
+ # === Cyberweb::CGI::QueryExtension
29
+ #
30
+ # Mixin module that provides the following:
31
+ #
32
+ # 1. Access to the CGI environment variables as methods. See
33
+ # documentation to the CGI class for a list of these variables. The
34
+ # methods are exposed by removing the leading +HTTP_+ (if it exists) and
35
+ # downcasing the name. For example, +auth_type+ will return the
36
+ # environment variable +AUTH_TYPE+, and +accept+ will return the value
37
+ # for +HTTP_ACCEPT+.
38
+ #
39
+ # 2. Access to cookies, including the cookies attribute.
40
+ #
41
+ # 3. Access to parameters, including the params attribute, and
42
+ # overloading #[] to perform parameter value lookup by key.
43
+ #
44
+ # 4. The initialize_query method, for initializing the above
45
+ # mechanisms, handling multipart forms, and allowing the
46
+ # class to be used in "offline" mode.
47
+ # ========================================================================= #
48
+ module QueryExtension
49
+
50
+ # ======================================================================= #
51
+ # === cookies
52
+ #
53
+ # Get the cookies as a hash of cookie-name=>Cookie pairs.
54
+ # ======================================================================= #
55
+ attr_accessor :cookies
56
+
57
+ # ======================================================================= #
58
+ # === params
59
+ #
60
+ # Get the parameters as a hash of name=>values pairs, where
61
+ # values is an Array.
62
+ # ======================================================================= #
63
+ attr_reader :params
64
+
65
+ # ======================================================================= #
66
+ # === files
67
+ #
68
+ # Get the uploaded files as a hash of name=>values pairs
69
+ # ======================================================================= #
70
+ attr_reader :files
71
+
72
+ # ======================================================================= #
73
+ # Defined two methods next.
74
+ # ======================================================================= #
75
+ %w( CONTENT_LENGTH SERVER_PORT ).each { |env|
76
+ define_method(env.sub(/^HTTP_/, '').downcase) {
77
+ (val = env_table[env]) && Integer(val)
78
+ }
79
+ }
80
+ # ======================================================================= #
81
+ # Define several methods next, depending on the predefined environment
82
+ # variables.
83
+ # ======================================================================= #
84
+ ARRAY_PREDEFINED_CGI_ENV_VARIABLES.each { |env|
85
+ define_method(env.sub(/^HTTP_/, '').downcase) {
86
+ env_table[env]
87
+ }
88
+ }
89
+
90
+ # ======================================================================= #
91
+ # === use_commandline_input?
92
+ # ======================================================================= #
93
+ def use_commandline_input?
94
+ ::Cyberweb::CGI.use_commandline_input?
95
+ end
96
+
97
+ # ========================================================================= #
98
+ # === raw_cookie
99
+ #
100
+ # Get the raw cookies as a string.
101
+ # ========================================================================= #
102
+ def raw_cookie
103
+ env_table['HTTP_COOKIE']
104
+ end
105
+
106
+ # ========================================================================= #
107
+ # === raw_cookie2
108
+ #
109
+ # Get the raw RFC2965 cookies as a string.
110
+ # ========================================================================= #
111
+ def raw_cookie2
112
+ env_table['HTTP_COOKIE2']
113
+ end
114
+
115
+ # ======================================================================= #
116
+ # === params=
117
+ #
118
+ # Set all the parameters. We should pass a Hash to this method.
119
+ # ======================================================================= #
120
+ def params=(hash)
121
+ @params.clear
122
+ @params.update(hash)
123
+ end
124
+
125
+ # ======================================================================= #
126
+ # === read_multipart
127
+ #
128
+ # Parses multipart form elements according to
129
+ # http://www.w3.org/TR/html401/interact/forms.html#h-17.13.4.2
130
+ #
131
+ # Returns a hash of multipart form parameters with bodies of type StringIO or
132
+ # Tempfile depending on whether the multipart form element exceeds 10 KB
133
+ #
134
+ # params[name => body]
135
+ # ======================================================================= #
136
+ def read_multipart(
137
+ boundary,
138
+ content_length
139
+ )
140
+ # read first boundary
141
+ stdin = stdinput
142
+ first_line = "--#{boundary}#{EOL}"
143
+ content_length -= first_line.bytesize
144
+ status = stdin.read(first_line.bytesize)
145
+ raise EOFError.new('no content body') unless status
146
+ raise EOFError.new('bad content body') unless first_line == status
147
+ # parse and set params
148
+ params = {}
149
+ @files = {}
150
+ boundary_rexp = /--#{Regexp.quote(boundary)}(#{EOL}|--)/
151
+ boundary_size = "#{EOL}--#{boundary}#{EOL}".bytesize
152
+ buf = ''
153
+ bufsize = 10 * 1024
154
+ max_count = MAX_MULTIPART_COUNT
155
+ n = 0
156
+ tempfiles = []
157
+ while true
158
+ (n += 1) < max_count or raise StandardError.new("too many parameters.")
159
+ # create body (StringIO or Tempfile)
160
+ body = create_body(bufsize < content_length)
161
+ tempfiles << body if defined?(Tempfile) && body.is_a?(Tempfile)
162
+ class << body
163
+ if method_defined?(:path)
164
+ alias local_path path
165
+ else
166
+ def local_path
167
+ nil
168
+ end
169
+ end
170
+ attr_reader :original_filename, :content_type
171
+ end
172
+ # find head and boundary
173
+ head = nil
174
+ separator = EOL * 2
175
+ until head && matched = boundary_rexp.match(buf)
176
+ if !head && pos = buf.index(separator)
177
+ len = pos + EOL.bytesize
178
+ head = buf[0, len]
179
+ buf = buf[(pos+separator.bytesize)..-1]
180
+ else
181
+ if head && buf.size > boundary_size
182
+ len = buf.size - boundary_size
183
+ body.print(buf[0, len])
184
+ buf[0, len] = ''
185
+ end
186
+ c = stdin.read(bufsize < content_length ? bufsize : content_length)
187
+ raise EOFError.new("bad content body") if c.nil? || c.empty?
188
+ buf << c
189
+ content_length -= c.bytesize
190
+ end
191
+ end
192
+ # read to end of boundary
193
+ m = matched
194
+ len = m.begin(0)
195
+ s = buf[0, len]
196
+ if s =~ /(\r?\n)\z/
197
+ s = buf[0, len - $1.bytesize]
198
+ end
199
+ body.print(s)
200
+ buf = buf[m.end(0)..-1]
201
+ boundary_end = m[1]
202
+ content_length = -1 if boundary_end == '--'
203
+ # reset file cursor position
204
+ body.rewind
205
+ # original filename
206
+ /Content-Disposition:.* filename=(?:"(.*?)"|([^;\r\n]*))/i.match(head)
207
+ filename = $1 || $2 || ''
208
+ filename = CGI.unescape(filename) if unescape_filename?()
209
+ body.instance_variable_set(:@original_filename, filename.taint)
210
+ ## content type
211
+ /Content-Type: (.*)/i.match(head)
212
+ (content_type = $1 || '').chomp!
213
+ body.instance_variable_set(:@content_type, content_type.taint)
214
+ ## query parameter name
215
+ /Content-Disposition:.* name=(?:"(.*?)"|([^;\r\n]*))/i.match(head)
216
+ name = $1 || $2 || ''
217
+ if body.original_filename.empty?
218
+ value = body.read.dup.force_encoding(@accept_charset)
219
+ body.close! if defined?(Tempfile) && body.is_a?(Tempfile)
220
+ (params[name] ||= []) << value
221
+ unless value.valid_encoding?
222
+ if @accept_charset_error_block
223
+ @accept_charset_error_block.call(name,value)
224
+ else
225
+ raise InvalidEncoding, 'Accept-Charset encoding error'
226
+ end
227
+ end
228
+ class << params[name].last; self; end.class_eval do
229
+ define_method(:read){self}
230
+ define_method(:original_filename){''}
231
+ define_method(:content_type){''}
232
+ end
233
+ else
234
+ (params[name] ||= []) << body
235
+ @files[name]=body
236
+ end
237
+ ## break loop
238
+ break if content_length == -1
239
+ end
240
+ raise EOFError, 'bad boundary end of body part' unless boundary_end =~ /--/
241
+ params.default = []
242
+ params
243
+ rescue Exception
244
+ if tempfiles
245
+ tempfiles.each {|t|
246
+ if t.path
247
+ t.close!
248
+ end
249
+ }
250
+ end
251
+ raise
252
+ end; private :read_multipart # read_multipart
253
+
254
+ # ======================================================================= #
255
+ # === create_body
256
+ # ======================================================================= #
257
+ def create_body(is_large)
258
+ if is_large
259
+ require 'tempfile'
260
+ body = Tempfile.new('CGI', encoding: Encoding::ASCII_8BIT)
261
+ else
262
+ begin
263
+ require 'stringio'
264
+ body = StringIO.new(''.force_encoding(Encoding::ASCII_8BIT))
265
+ rescue LoadError
266
+ require 'tempfile'
267
+ body = Tempfile.new('CGI', encoding: Encoding::ASCII_8BIT)
268
+ end
269
+ end
270
+ body.binmode if defined? body.binmode
271
+ return body
272
+ end
273
+
274
+ # ======================================================================= #
275
+ # === unescape_filename?
276
+ # ======================================================================= #
277
+ def unescape_filename?
278
+ user_agent = $CGI_ENV['HTTP_USER_AGENT']
279
+ return /Mac/i.match(user_agent) && /Mozilla/i.match(user_agent) && !/MSIE/i.match(user_agent)
280
+ end
281
+
282
+ # ========================================================================= #
283
+ # === keys
284
+ #
285
+ # Return all query parameter names as an array of String.
286
+ # ========================================================================= #
287
+ def keys(*i)
288
+ @params.keys(*i)
289
+ end
290
+
291
+ # ========================================================================= #
292
+ # === has_key?
293
+ #
294
+ # Returns true if a given query string parameter exists.
295
+ # ========================================================================= #
296
+ def has_key?(*i)
297
+ @params.has_key?(*i)
298
+ end; alias key? has_key? # === key?
299
+ alias include? has_key? # === include?
300
+
301
+ # ======================================================================= #
302
+ # === read_from_cmdline
303
+ #
304
+ # Offline mode for CGI. read name=value pairs on standard input.
305
+ # ======================================================================= #
306
+ def read_from_cmdline
307
+ require 'shellwords'
308
+ string = unless ARGV.empty?
309
+ ARGV.join(' ')
310
+ else
311
+ if STDIN.tty?
312
+ _ = "(offline mode detected via STDIN.tty?: enter name=value pairs on standard input)\n"
313
+ STDERR.print(_)
314
+ end if USE_OFFLINE_MODE
315
+ array = readlines rescue nil
316
+ if not array.nil?
317
+ array.join(' ').gsub(/\n/n, '')
318
+ else
319
+ ""
320
+ end
321
+ end.gsub(/\\=/n, '%3D').gsub(/\\&/n, '%26')
322
+
323
+ words = Shellwords.shellwords(string)
324
+
325
+ if words.find {|x| /=/n.match(x) }
326
+ words.join('&')
327
+ else
328
+ words.join('+')
329
+ end
330
+ end; private :read_from_cmdline
331
+
332
+ # ========================================================================= #
333
+ # === multipart?
334
+ #
335
+ # Returns whether the form contained multipart/form-data
336
+ # ========================================================================= #
337
+ def multipart?
338
+ @multipart
339
+ end
340
+
341
+ # ======================================================================= #
342
+ # === initialize_query
343
+ #
344
+ # A wrapper class to use a StringIO object as the body and switch
345
+ # to a TempFile when the passed threshold is passed.
346
+ #
347
+ # Initialize the data from the query.
348
+ #
349
+ # Handles multipart forms (in particular, forms that involve file uploads).
350
+ # Reads query parameters in the @params field, and cookies into @cookies.
351
+ # ======================================================================= #
352
+ def initialize_query
353
+ if ('POST' == env_table['REQUEST_METHOD']) and
354
+ %r|\Amultipart/form-data.*boundary=\"?([^\";,]+)\"?|.match(env_table['CONTENT_TYPE'])
355
+ current_max_multipart_length = @max_multipart_length.respond_to?(:call) ? @max_multipart_length.call : @max_multipart_length
356
+ if env_table['CONTENT_LENGTH'].to_i > current_max_multipart_length
357
+ raise StandardError.new('too large multipart data.')
358
+ end
359
+ boundary = $1.dup # Obtain the match element for the boundary.
360
+ @multipart = true
361
+ @params = read_multipart(boundary, Integer(env_table['CONTENT_LENGTH']))
362
+ else
363
+ @multipart = false
364
+ # =================================================================== #
365
+ # We have to obtain the available params next. We do this via
366
+ # CGI.parse().
367
+ # =================================================================== #
368
+ @params = CGI.parse(
369
+ case env_table['REQUEST_METHOD']
370
+ when 'GET', 'HEAD'
371
+ if defined? MOD_RUBY
372
+ Apache::request.args or ''
373
+ else
374
+ env_table['QUERY_STRING'] or ''
375
+ end
376
+ when 'POST'
377
+ stdinput.binmode if defined? stdinput.binmode
378
+ stdinput.read(Integer(env_table['CONTENT_LENGTH'])) or ''
379
+ else # This may be empty here.
380
+ read_from_cmdline if use_commandline_input?
381
+ end.to_s.dup.force_encoding(@accept_charset)
382
+ )
383
+ # =================================================================== #
384
+ # === Handle ASCII 8BIT Encoding next
385
+ # =================================================================== #
386
+ unless ::Encoding.find(@accept_charset) == ::Encoding::ASCII_8BIT
387
+ @params.each {|key,values|
388
+ values.each { |value|
389
+ unless value.valid_encoding?
390
+ if @accept_charset_error_block
391
+ @accept_charset_error_block.call(key,value)
392
+ else
393
+ raise InvalidEncoding, 'Accept-Charset encoding error'
394
+ end
395
+ end
396
+ }
397
+ }
398
+ end
399
+ end
400
+ @cookies = ::Cyberweb::CGI::Cookie.parse((env_table['HTTP_COOKIE'] or env_table['COOKIE']))
401
+ end; private :initialize_query
402
+
403
+ # ========================================================================= #
404
+ # === []
405
+ #
406
+ # Get the value for the parameter with a given key.
407
+ #
408
+ # If the parameter has multiple values, only the first will
409
+ # be retrieved; use #params to get the array of values.
410
+ # ========================================================================= #
411
+ def [](key)
412
+ params = @params[key]
413
+ return '' unless params
414
+ value = params.first
415
+ if @multipart
416
+ if value
417
+ return value
418
+ elsif defined? StringIO
419
+ StringIO.new(''.force_encoding(::Encoding::ASCII_8BIT))
420
+ else
421
+ Tempfile.new('CGI', encoding: ::Encoding::ASCII_8BIT)
422
+ end
423
+ else
424
+ str = if value then value.dup else '' end
425
+ str
426
+ end
427
+ end
428
+
429
+ end # CGI::QueryExtension
430
+
431
+ end; end
@@ -0,0 +1,131 @@
1
+ #!/usr/bin/ruby -w
2
+ # Encoding: UTF-8
3
+ # frozen_string_literal: true
4
+ # =========================================================================== #
5
+ module Cyberweb
6
+
7
+ class CGI
8
+
9
+ class Session # === Cyberweb::CGI::Session
10
+
11
+ # ======================================================================= #
12
+ # File-based session storage class.
13
+ #
14
+ # Implements session storage as a flat file of 'key=value' values.
15
+ # This storage type only works directly with String values; the
16
+ # user is responsible for converting other types to Strings when
17
+ # storing and from Strings when retrieving.
18
+ # ======================================================================= #
19
+ class FileStore
20
+ # Create a new FileStore instance.
21
+ #
22
+ # This constructor is used internally by CGI::Session. The
23
+ # user does not generally need to call it directly.
24
+ #
25
+ # +session+ is the session for which this instance is being
26
+ # created. The session id must only contain alphanumeric
27
+ # characters; automatically generated session ids observe
28
+ # this requirement.
29
+ #
30
+ # +option+ is a hash of options for the initializer. The
31
+ # following options are recognised:
32
+ #
33
+ # tmpdir:: the directory to use for storing the FileStore
34
+ # file. Defaults to Dir::tmpdir (generally "/tmp"
35
+ # on Unix systems).
36
+ # prefix:: the prefix to add to the session id when generating
37
+ # the filename for this session's FileStore file.
38
+ # Defaults to "cgi_sid_".
39
+ # suffix:: the prefix to add to the session id when generating
40
+ # the filename for this session's FileStore file.
41
+ # Defaults to the empty string.
42
+ #
43
+ # This session's FileStore file will be created if it does
44
+ # not exist, or opened if it does.
45
+ def initialize(session, option = {})
46
+ dir = option['tmpdir'] || Dir::tmpdir
47
+ prefix = option['prefix'] || 'cgi_sid_'
48
+ suffix = option['suffix'] || ''
49
+ id = session.session_id
50
+ require 'digest/md5'
51
+ md5 = Digest::MD5.hexdigest(id)[0,16]
52
+ @path = dir+"/"+prefix+md5+suffix
53
+ if File::exist? @path
54
+ @hash = nil
55
+ else
56
+ unless session.new_session
57
+ raise CGI::Session::NoSession, "uninitialized session"
58
+ end
59
+ @hash = {}
60
+ end
61
+ end
62
+
63
+ # === restore
64
+ #
65
+ # Restore session state from the session's FileStore file.
66
+ #
67
+ # Returns the session state as a hash.
68
+ def restore
69
+ unless @hash
70
+ @hash = {}
71
+ begin
72
+ lockf = File.open(@path+'.lock', 'r')
73
+ lockf.flock File::LOCK_SH
74
+ f = File.open(@path, 'r')
75
+ for line in f
76
+ line.chomp!
77
+ k, v = line.split('=',2)
78
+ @hash[CGI.unescape(k)] = Marshal.restore(CGI.unescape(v))
79
+ end
80
+ ensure
81
+ f.close unless f.nil?
82
+ lockf.close if lockf
83
+ end
84
+ end
85
+ @hash
86
+ end
87
+
88
+ # ======================================================================= #
89
+ # === update
90
+ #
91
+ # Save session state to the session's FileStore file.
92
+ # ======================================================================= #
93
+ def update
94
+ return unless @hash
95
+ begin
96
+ lockf = File.open(@path+".lock", File::CREAT|File::RDWR, 0600)
97
+ lockf.flock File::LOCK_EX
98
+ f = File.open(@path+".new", File::CREAT|File::TRUNC|File::WRONLY, 0600)
99
+ for k,v in @hash
100
+ f.printf "%s=%s\n", CGI::escape(k), CGI::escape(String(Marshal.dump(v)))
101
+ end
102
+ f.close
103
+ File.rename @path+".new", @path
104
+ ensure
105
+ f.close if f and !f.closed?
106
+ lockf.close if lockf
107
+ end
108
+ end
109
+
110
+ # ======================================================================= #
111
+ # === close
112
+ #
113
+ # Update and close the session's FileStore file.
114
+ # ======================================================================= #
115
+ def close
116
+ update
117
+ end
118
+
119
+ # ======================================================================= #
120
+ # === delete
121
+ #
122
+ # Close and delete the session's FileStore file.
123
+ # ======================================================================= #
124
+ def delete
125
+ File.unlink @path+'.lock' rescue nil
126
+ File.unlink @path+'.new' rescue nil
127
+ File.unlink @path rescue nil
128
+ end
129
+ end
130
+
131
+ end; end; end
@@ -0,0 +1,90 @@
1
+ #!/usr/bin/ruby -w
2
+ # Encoding: UTF-8
3
+ # frozen_string_literal: true
4
+ # =========================================================================== #
5
+ module Cyberweb
6
+
7
+ class CGI
8
+
9
+ class Session
10
+
11
+ # ======================================================================= #
12
+ # === MemoryStore
13
+ #
14
+ # In-memory session storage class.
15
+ #
16
+ # Implements session storage as a global in-memory hash. Session
17
+ # data will only persist for as long as the Ruby interpreter
18
+ # instance does.
19
+ # ======================================================================= #
20
+ class MemoryStore
21
+
22
+ # ===================================================================== #
23
+ # === GLOBAL_HASH_TABLE
24
+ # ===================================================================== #
25
+ GLOBAL_HASH_TABLE = {} #:nodoc:
26
+
27
+ # ===================================================================== #
28
+ # === initialize
29
+ #
30
+ # Create a new MemoryStore instance.
31
+ #
32
+ # +session+ is the session this instance is associated with.
33
+ #
34
+ # +option+ is a list of initialisation options. None are
35
+ # currently recognized.
36
+ # ===================================================================== #
37
+ def initialize(
38
+ session, option = nil
39
+ )
40
+ @session_id = session.session_id
41
+ unless GLOBAL_HASH_TABLE.key?(@session_id)
42
+ unless session.new_session
43
+ raise CGI::Session::NoSession, 'uninitialized session'
44
+ end
45
+ GLOBAL_HASH_TABLE[@session_id] = {}
46
+ end
47
+ end
48
+
49
+ # ===================================================================== #
50
+ # === restore
51
+ #
52
+ # Restore session state.
53
+ #
54
+ # Returns session data as a hash.
55
+ # ===================================================================== #
56
+ def restore
57
+ GLOBAL_HASH_TABLE[@session_id]
58
+ end
59
+
60
+ # ===================================================================== #
61
+ # === update
62
+ #
63
+ # Update session state.
64
+ #
65
+ # A no-op.
66
+ # ===================================================================== #
67
+ def update
68
+ # don't need to update; hash is shared
69
+ end
70
+
71
+ # ===================================================================== #
72
+ # Close session storage.
73
+ #
74
+ # A no-op.
75
+ # ===================================================================== #
76
+ def close
77
+ # don't need to close
78
+ end
79
+
80
+ # ===================================================================== #
81
+ # === delete
82
+ #
83
+ # Delete the session state.
84
+ # ===================================================================== #
85
+ def delete
86
+ GLOBAL_HASH_TABLE.delete(@session_id)
87
+ end
88
+ end
89
+
90
+ end; end; end