cyberweb 0.4.174
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.
Potentially problematic release.
This version of cyberweb might be problematic. Click here for more details.
- checksums.yaml +7 -0
- data/README.md +3259 -0
- data/bin/cyberweb +27 -0
- data/cyberweb.gemspec +119 -0
- data/doc/AUTHORS.md +12 -0
- data/doc/CONVENTIONS.md +7 -0
- data/doc/CYBERWEB_TUTORIAL.cgi +43 -0
- data/doc/DOCUMENTATION_FOR_CYBERSPRAWL.md +50 -0
- data/doc/FUTURE_DESIGN_GOAL_CONSIDERATIONS.md +13 -0
- data/doc/JQUERY.md +122 -0
- data/doc/MOUSE.md +80 -0
- data/doc/README.gen +3231 -0
- data/doc/RENDER_WEB_BASE.md +46 -0
- data/doc/USAGE.md +246 -0
- data/doc/configuration/configuration.md +23 -0
- data/doc/deprecations.md +32 -0
- data/doc/html_characters.md +15 -0
- data/doc/todo/TODO_FOR_THE_CYBERWEB_PROJECT.md +1089 -0
- data/examples/README.md +4 -0
- data/examples/advanced/delayed_update_of_the_body_via_javascript.cgi +38 -0
- data/examples/advanced/hybrid_experiment.cgi +108 -0
- data/examples/advanced/larger_image_on_mouse_over_example.cgi +35 -0
- data/examples/advanced/no_right_click.cgi +26 -0
- data/examples/advanced/objectified_html_tags.cgi +35 -0
- data/examples/advanced/simple_calculator.cgi +42 -0
- data/examples/advanced/simple_form_example.cgi +38 -0
- data/examples/css/blue_border.html +28 -0
- data/examples/css/caret_colour_example.html +22 -0
- data/examples/css/css_border_spacing_example.html +69 -0
- data/examples/css/css_bubbles.html +43 -0
- data/examples/css/css_clock.html +344 -0
- data/examples/css/css_drag_and_drop.html +89 -0
- data/examples/css/css_neon_glow_effects.html +317 -0
- data/examples/css/css_text_decoration_example.html +70 -0
- data/examples/css/css_tooltip.html +44 -0
- data/examples/css/fade_in_and_fade_out_effect.html +66 -0
- data/examples/css/font_size_examples.html +40 -0
- data/examples/css/letter_spacing_example.cgi +36 -0
- data/examples/css/meter_example.html +31 -0
- data/examples/css/on_mouse_button_pressed.html +41 -0
- data/examples/css/planets.html +187 -0
- data/examples/css/scale_example.html +25 -0
- data/examples/css/shadow_example_in_CSS.cgi +30 -0
- data/examples/css/sticky_div_example.html +56 -0
- data/examples/css/stitched_div.html +36 -0
- data/examples/csv/README.md +1 -0
- data/examples/csv/sample.csv +10 -0
- data/examples/example1.rb +7 -0
- data/examples/flip_card_example/flip_card_example.html +72 -0
- data/examples/frames/frame_left.html +1 -0
- data/examples/frames/frame_right.html +1 -0
- data/examples/html/README.md +1 -0
- data/examples/html/abbr_example.html +25 -0
- data/examples/html/base64_image_example.html +26 -0
- data/examples/html/colour_wheel.html +1389 -0
- data/examples/html/column_width_example.html +34 -0
- data/examples/html/custom_cursor.html +103 -0
- data/examples/html/draggable_paragraph.html +12 -0
- data/examples/html/fieldset_example.html +25 -0
- data/examples/html/frames_example.html +7 -0
- data/examples/html/glyph_example.html +43 -0
- data/examples/html/hbox_and_vbox_example.html +65 -0
- data/examples/html/href_examples.html +27 -0
- data/examples/html/input_autofocus_example.html +16 -0
- data/examples/html/larger_image_on_mouse_over_example.html +30 -0
- data/examples/html/ordered_and_unordered_bulletsin.html +33 -0
- data/examples/html/play_video_example.html +13 -0
- data/examples/html/readonly_textarea_example.html +23 -0
- data/examples/html/remote_image_example.html +10 -0
- data/examples/html/simple_unordered_list.html +16 -0
- data/examples/html/table_with_header_example.html +27 -0
- data/examples/html/two_columns_flex_example.html +39 -0
- data/examples/javascript/README.md +2 -0
- data/examples/javascript/arrays/arrays_example_in_javascript.html +16 -0
- data/examples/javascript/delay_example/delay_example.html +46 -0
- data/examples/javascript/drag_support/drag_support.html +37 -0
- data/examples/javascript/jquery_drag_and_drop/drag_and_drop_image_example.html +33 -0
- data/examples/javascript/on_click_event_hello_world/on_click_event_hello_world.html +21 -0
- data/examples/javascript/rgb_to_hex/rgb_to_hex.html +15 -0
- data/examples/javascript/screen_resolution/screen_resolution.html +20 -0
- data/examples/javascript/select_everything/select_everything.html +14 -0
- data/examples/javascript/write_into_a_file/write_into_a_file.html +39 -0
- data/examples/rack/README.md +4 -0
- data/examples/rack/example_with_html_template.rb +123 -0
- data/examples/rack/example_with_rack_and_cyberweb_showing_how_to_use_images.rb +56 -0
- data/examples/rack/hello_world_example_with_rack.rb +45 -0
- data/examples/rack/lobster.rb +79 -0
- data/examples/rack/rack_env.rb +10 -0
- data/examples/rack/standalone_example.rb +26 -0
- data/examples/show_greek_letters.rb +3 -0
- data/examples/simple/on_click_event_hello_world.cgi +34 -0
- data/examples/sinatra/001_your_ip_address_is.rb +8 -0
- data/examples/sinatra/002_the_request_object.rb +16 -0
- data/examples/sinatra/003_hello_world_example.rb +82 -0
- data/examples/sinatra/004_splat_example.rb +10 -0
- data/examples/sinatra/005_attachment_example.rb +11 -0
- data/examples/sinatra/006_outer_self_example.rb +8 -0
- data/examples/sinatra/007_mime_type_example.rb +17 -0
- data/examples/sinatra/008_post_example.rb +55 -0
- data/examples/table_example.rb +37 -0
- data/images/cyberweb_favicon.png +0 -0
- data/images/cyberweb_logo.png +0 -0
- data/images/cyberweb_theme.png +0 -0
- data/lib/cyberweb/and_sinatra_base.rb +9 -0
- data/lib/cyberweb/autoinclude.rb +20 -0
- data/lib/cyberweb/autoinclude_webobject.rb +14 -0
- data/lib/cyberweb/base/base.rb +41 -0
- data/lib/cyberweb/base/colours.rb +69 -0
- data/lib/cyberweb/base/constants.rb +18 -0
- data/lib/cyberweb/base/encoding.rb +19 -0
- data/lib/cyberweb/base/misc.rb +239 -0
- data/lib/cyberweb/base/reset.rb +23 -0
- data/lib/cyberweb/base/save_file.rb +22 -0
- data/lib/cyberweb/cascading_style_sheets/README.md +4 -0
- data/lib/cyberweb/cascading_style_sheets/admonition.css +33 -0
- data/lib/cyberweb/cascading_style_sheets/balloon.css +344 -0
- data/lib/cyberweb/cascading_style_sheets/border.css +202 -0
- data/lib/cyberweb/cascading_style_sheets/code.css +58 -0
- data/lib/cyberweb/cascading_style_sheets/colours.css +476 -0
- data/lib/cyberweb/cascading_style_sheets/default.css +1836 -0
- data/lib/cyberweb/cascading_style_sheets/div.css +26 -0
- data/lib/cyberweb/cascading_style_sheets/fonts.css +365 -0
- data/lib/cyberweb/cascading_style_sheets/links.css +207 -0
- data/lib/cyberweb/cascading_style_sheets/margin.css +677 -0
- data/lib/cyberweb/cascading_style_sheets/menu.css +37 -0
- data/lib/cyberweb/cascading_style_sheets/message_boxes.css +48 -0
- data/lib/cyberweb/cascading_style_sheets/misc.css +162 -0
- data/lib/cyberweb/cascading_style_sheets/popup.css +63 -0
- data/lib/cyberweb/cascading_style_sheets/rpg.css +51 -0
- data/lib/cyberweb/cascading_style_sheets/ruby_regexes.css +33 -0
- data/lib/cyberweb/cascading_style_sheets/template2.css +18 -0
- data/lib/cyberweb/cascading_style_sheets/text_shadow.css +19 -0
- data/lib/cyberweb/cascading_style_sheets/tooltip.css +36 -0
- data/lib/cyberweb/cgi/README.md +6 -0
- data/lib/cyberweb/cgi/cgi.rb +340 -0
- data/lib/cyberweb/cgi/constants.rb +121 -0
- data/lib/cyberweb/cgi/cookie.rb +218 -0
- data/lib/cyberweb/cgi/core.rb +638 -0
- data/lib/cyberweb/cgi/exceptions.rb +223 -0
- data/lib/cyberweb/cgi/html.rb +1025 -0
- data/lib/cyberweb/cgi/mod_ruby_exception_printer.rb +40 -0
- data/lib/cyberweb/cgi/query_extension.rb +431 -0
- data/lib/cyberweb/cgi/session/file_store.rb +131 -0
- data/lib/cyberweb/cgi/session/memory_store.rb +90 -0
- data/lib/cyberweb/cgi/session/pstore.rb +127 -0
- data/lib/cyberweb/cgi/session.rb +444 -0
- data/lib/cyberweb/cgi/tag_maker.rb +94 -0
- data/lib/cyberweb/cgi/util.rb +239 -0
- data/lib/cyberweb/charts/README.md +2 -0
- data/lib/cyberweb/charts/google_charts.rb +51 -0
- data/lib/cyberweb/classes/simple_form.rb +55 -0
- data/lib/cyberweb/classes/tooltips.rb +169 -0
- data/lib/cyberweb/coloured_tags/coloured_tags.rb +3099 -0
- data/lib/cyberweb/colours/colour_chart.rb +117 -0
- data/lib/cyberweb/colours/colours.rb +50 -0
- data/lib/cyberweb/colours/random_colour.rb +28 -0
- data/lib/cyberweb/colours/sanitize_for_colours.rb +95 -0
- data/lib/cyberweb/commandline/commandline_interface.rb +49 -0
- data/lib/cyberweb/configuration/configuration.rb +66 -0
- data/lib/cyberweb/configuration/load_the_configuration_file.rb +73 -0
- data/lib/cyberweb/constants/array_images.rb +21 -0
- data/lib/cyberweb/constants/array_local_css_files.rb +35 -0
- data/lib/cyberweb/constants/array_predefined_constants.rb +23 -0
- data/lib/cyberweb/constants/configuration_file.rb +33 -0
- data/lib/cyberweb/constants/constants.rb +9 -0
- data/lib/cyberweb/constants/file_constants.rb +16 -0
- data/lib/cyberweb/constants/http_status_codes.rb +42 -0
- data/lib/cyberweb/constants/nl.rb +22 -0
- data/lib/cyberweb/constants/project_constants.rb +99 -0
- data/lib/cyberweb/constants/roebe.rb +28 -0
- data/lib/cyberweb/constants/standalone_constants.rb +309 -0
- data/lib/cyberweb/controller/README.md +4 -0
- data/lib/cyberweb/controller/webobject_controller.rb +50 -0
- data/lib/cyberweb/csv/README.md +2 -0
- data/lib/cyberweb/csv/csv.rb +58 -0
- data/lib/cyberweb/cybersprawl +1 -0
- data/lib/cyberweb/debug/debug.rb +69 -0
- data/lib/cyberweb/encoding/encoding.rb +84 -0
- data/lib/cyberweb/erb/test.rhtml +81 -0
- data/lib/cyberweb/erb/test_template.erb +9 -0
- data/lib/cyberweb/evaluate_from_the_same_named_file_then_serve.rb +9 -0
- data/lib/cyberweb/favicon/favicon.rb +196 -0
- data/lib/cyberweb/generator/README.md +2 -0
- data/lib/cyberweb/generator/cgi.rb +201 -0
- data/lib/cyberweb/generator/class.rb +25 -0
- data/lib/cyberweb/generator/static_webpage.rb +162 -0
- data/lib/cyberweb/generator/webpage_for_images.rb +553 -0
- data/lib/cyberweb/help/help.rb +29 -0
- data/lib/cyberweb/html_codes/README.md +15 -0
- data/lib/cyberweb/html_codes/greek_letters.rb +204 -0
- data/lib/cyberweb/html_tags/README.md +3 -0
- data/lib/cyberweb/html_tags/a.rb +65 -0
- data/lib/cyberweb/html_tags/accesskey.rb +25 -0
- data/lib/cyberweb/html_tags/blockquote.rb +56 -0
- data/lib/cyberweb/html_tags/body.rb +14 -0
- data/lib/cyberweb/html_tags/br.rb +19 -0
- data/lib/cyberweb/html_tags/button.rb +110 -0
- data/lib/cyberweb/html_tags/canvas.rb +59 -0
- data/lib/cyberweb/html_tags/chtml.rb +14 -0
- data/lib/cyberweb/html_tags/div.rb +163 -0
- data/lib/cyberweb/html_tags/fieldset.rb +67 -0
- data/lib/cyberweb/html_tags/figure.rb +72 -0
- data/lib/cyberweb/html_tags/form.rb +203 -0
- data/lib/cyberweb/html_tags/h1.rb +75 -0
- data/lib/cyberweb/html_tags/h2.rb +73 -0
- data/lib/cyberweb/html_tags/h3.rb +58 -0
- data/lib/cyberweb/html_tags/h4.rb +60 -0
- data/lib/cyberweb/html_tags/h5.rb +54 -0
- data/lib/cyberweb/html_tags/h6.rb +54 -0
- data/lib/cyberweb/html_tags/hr.rb +22 -0
- data/lib/cyberweb/html_tags/html_tags.rb +240 -0
- data/lib/cyberweb/html_tags/i.rb +50 -0
- data/lib/cyberweb/html_tags/img.rb +294 -0
- data/lib/cyberweb/html_tags/input.rb +345 -0
- data/lib/cyberweb/html_tags/label.rb +63 -0
- data/lib/cyberweb/html_tags/legend.rb +56 -0
- data/lib/cyberweb/html_tags/li.rb +67 -0
- data/lib/cyberweb/html_tags/map.rb +31 -0
- data/lib/cyberweb/html_tags/nav.rb +63 -0
- data/lib/cyberweb/html_tags/object.rb +56 -0
- data/lib/cyberweb/html_tags/ol.rb +56 -0
- data/lib/cyberweb/html_tags/option.rb +61 -0
- data/lib/cyberweb/html_tags/p.rb +90 -0
- data/lib/cyberweb/html_tags/pre.rb +164 -0
- data/lib/cyberweb/html_tags/section.rb +33 -0
- data/lib/cyberweb/html_tags/select.rb +100 -0
- data/lib/cyberweb/html_tags/span.rb +338 -0
- data/lib/cyberweb/html_tags/strong.rb +39 -0
- data/lib/cyberweb/html_tags/table.rb +273 -0
- data/lib/cyberweb/html_tags/tbody.rb +24 -0
- data/lib/cyberweb/html_tags/td.rb +214 -0
- data/lib/cyberweb/html_tags/textarea.rb +138 -0
- data/lib/cyberweb/html_tags/th.rb +68 -0
- data/lib/cyberweb/html_tags/thead.rb +36 -0
- data/lib/cyberweb/html_tags/tr.rb +97 -0
- data/lib/cyberweb/html_tags/ul.rb +51 -0
- data/lib/cyberweb/html_template/html_template.rb +352 -0
- data/lib/cyberweb/images/embed_this_image.rb +37 -0
- data/lib/cyberweb/images/images.rb +58 -0
- data/lib/cyberweb/images/is_image.rb +22 -0
- data/lib/cyberweb/images/path_to_images.rb +60 -0
- data/lib/cyberweb/images/real/README.md +6 -0
- data/lib/cyberweb/images/remove_this_substring_from_all_images.rb +44 -0
- data/lib/cyberweb/images/standalone_drag_and_drop_this_image.rb +64 -0
- data/lib/cyberweb/images/string_image.rb +399 -0
- data/lib/cyberweb/images_base64_encoded/AUSRUFUNGSZEICHEN.png.md +1 -0
- data/lib/cyberweb/images_base64_encoded/BLUEARROW.png.md +1 -0
- data/lib/cyberweb/images_base64_encoded/BUBBLE.png.md +1 -0
- data/lib/cyberweb/images_base64_encoded/CAT.png.md +1 -0
- data/lib/cyberweb/images_base64_encoded/CAUTION.png.md +1 -0
- data/lib/cyberweb/images_base64_encoded/CHEERING_PERSON.png.md +1 -0
- data/lib/cyberweb/images_base64_encoded/CURSOR.png.md +1 -0
- data/lib/cyberweb/images_base64_encoded/DOT_01.png.md +5 -0
- data/lib/cyberweb/images_base64_encoded/DUCKY.png.md +1 -0
- data/lib/cyberweb/images_base64_encoded/ELEPHANT.png.md +1 -0
- data/lib/cyberweb/images_base64_encoded/HALLOWEEN.png.md +1 -0
- data/lib/cyberweb/images_base64_encoded/HANGING_MONKEY.png.md +1 -0
- data/lib/cyberweb/images_base64_encoded/LENS.png.md +1 -0
- data/lib/cyberweb/images_base64_encoded/README.md +2 -0
- data/lib/cyberweb/images_base64_encoded/TU_WIEN_LOGO.png.md +1 -0
- data/lib/cyberweb/images_base64_encoded/VOGEL.png.md +1 -0
- data/lib/cyberweb/io/README.md +1 -0
- data/lib/cyberweb/io/io.rb +19 -0
- data/lib/cyberweb/javascript/drag_and_drop.rb +105 -0
- data/lib/cyberweb/javascript/dragula_collection.rb +54 -0
- data/lib/cyberweb/javascript/javascript.rb +211 -0
- data/lib/cyberweb/javascript/javascript_bundle.rb +223 -0
- data/lib/cyberweb/javascript/javascript_clock.rb +69 -0
- data/lib/cyberweb/javascript/javascript_last_modified.rb +27 -0
- data/lib/cyberweb/javascript/javascript_magic.rb +150 -0
- data/lib/cyberweb/javascript/javascript_selectable.rb +24 -0
- data/lib/cyberweb/javascript/jquery.rb +30 -0
- data/lib/cyberweb/javascript/on_click_change_opacity.rb +97 -0
- data/lib/cyberweb/javascript/on_click_hide.rb +63 -0
- data/lib/cyberweb/javascript/popup.rb +80 -0
- data/lib/cyberweb/javascript/print_javascript.rb +33 -0
- data/lib/cyberweb/javascript/registered_javascript_methods.rb +30 -0
- data/lib/cyberweb/javascript/resize.rb +28 -0
- data/lib/cyberweb/javascript/return_javascript.rb +48 -0
- data/lib/cyberweb/javascript/scroll.rb +17 -0
- data/lib/cyberweb/javascript/snoweffect.rb +122 -0
- data/lib/cyberweb/javascript_code/README.md +6 -0
- data/lib/cyberweb/javascript_code/chmod_displayer.js +74 -0
- data/lib/cyberweb/javascript_code/custom_functions.js +267 -0
- data/lib/cyberweb/javascript_code/jquery/jquery-3.6.0.js +10881 -0
- data/lib/cyberweb/javascript_code/jquery/jquery-ui-1.12.1.js +18706 -0
- data/lib/cyberweb/javascript_code/rgb_to_hex.js +14 -0
- data/lib/cyberweb/javascript_code/select_even_numbers.js +7 -0
- data/lib/cyberweb/javascript_code/select_everything.js +22 -0
- data/lib/cyberweb/javascript_code/simple_calculator.js +15 -0
- data/lib/cyberweb/javascript_code/sleep.js +3 -0
- data/lib/cyberweb/javascript_code/to_celsius.js +8 -0
- data/lib/cyberweb/mouse/README.md +3 -0
- data/lib/cyberweb/mouse/libxdo.rb +321 -0
- data/lib/cyberweb/mouse/mouse.rb +264 -0
- data/lib/cyberweb/objectified_html_tags/README.md +8 -0
- data/lib/cyberweb/objectified_html_tags/a.rb +129 -0
- data/lib/cyberweb/objectified_html_tags/abbr.rb +84 -0
- data/lib/cyberweb/objectified_html_tags/base.rb +376 -0
- data/lib/cyberweb/objectified_html_tags/button.rb +135 -0
- data/lib/cyberweb/objectified_html_tags/combobox.rb +165 -0
- data/lib/cyberweb/objectified_html_tags/div.rb +129 -0
- data/lib/cyberweb/objectified_html_tags/embed.rb +161 -0
- data/lib/cyberweb/objectified_html_tags/form.rb +129 -0
- data/lib/cyberweb/objectified_html_tags/h1.rb +129 -0
- data/lib/cyberweb/objectified_html_tags/h2.rb +129 -0
- data/lib/cyberweb/objectified_html_tags/h3.rb +129 -0
- data/lib/cyberweb/objectified_html_tags/h4.rb +129 -0
- data/lib/cyberweb/objectified_html_tags/h5.rb +129 -0
- data/lib/cyberweb/objectified_html_tags/h6.rb +129 -0
- data/lib/cyberweb/objectified_html_tags/hbox.rb +71 -0
- data/lib/cyberweb/objectified_html_tags/img.rb +202 -0
- data/lib/cyberweb/objectified_html_tags/input.rb +185 -0
- data/lib/cyberweb/objectified_html_tags/p.rb +129 -0
- data/lib/cyberweb/objectified_html_tags/pre.rb +129 -0
- data/lib/cyberweb/objectified_html_tags/span.rb +92 -0
- data/lib/cyberweb/objectified_html_tags/table.rb +174 -0
- data/lib/cyberweb/objectified_html_tags/textarea.rb +173 -0
- data/lib/cyberweb/objectified_html_tags/title.rb +82 -0
- data/lib/cyberweb/objectified_html_tags/window.rb +79 -0
- data/lib/cyberweb/predefined_and_freeform_methods/README.md +1 -0
- data/lib/cyberweb/predefined_and_freeform_methods/frage.rb +45 -0
- data/lib/cyberweb/predefined_and_freeform_methods/freeform_methods.rb +93 -0
- data/lib/cyberweb/predefined_and_freeform_methods/hash_css_class_to_use.rb +55 -0
- data/lib/cyberweb/predefined_and_freeform_methods/hash_registered_extra_tags.rb +29 -0
- data/lib/cyberweb/predefined_and_freeform_methods/header.rb +81 -0
- data/lib/cyberweb/predefined_and_freeform_methods/predefined_methods.rb +413 -0
- data/lib/cyberweb/project/project.rb +85 -0
- data/lib/cyberweb/rack/README.md +1 -0
- data/lib/cyberweb/rack/request.rb +31 -0
- data/lib/cyberweb/requires/README.md +4 -0
- data/lib/cyberweb/requires/do_require_web_object_files.rb +9 -0
- data/lib/cyberweb/requires/remove_html.rb +9 -0
- data/lib/cyberweb/requires/require_cgi.rb +16 -0
- data/lib/cyberweb/requires/require_charts.rb +20 -0
- data/lib/cyberweb/requires/require_generators.rb +23 -0
- data/lib/cyberweb/requires/require_html_tags_files.rb +23 -0
- data/lib/cyberweb/requires/require_javascript_files.rb +23 -0
- data/lib/cyberweb/requires/require_kimurai.rb +13 -0
- data/lib/cyberweb/requires/require_objectified_html_tags_files.rb +23 -0
- data/lib/cyberweb/requires/require_sinatra.rb +7 -0
- data/lib/cyberweb/requires/require_the_constants.rb +26 -0
- data/lib/cyberweb/requires/require_the_cyberweb_project.rb +172 -0
- data/lib/cyberweb/requires/require_the_html_template.rb +7 -0
- data/lib/cyberweb/requires/require_the_toplevel_methods_files.rb +24 -0
- data/lib/cyberweb/requires/require_web_images.rb +7 -0
- data/lib/cyberweb/requires/require_web_object_files.rb +25 -0
- data/lib/cyberweb/requires/require_yaml.rb +11 -0
- data/lib/cyberweb/sinatra/README.md +11 -0
- data/lib/cyberweb/sinatra/base.rb +145 -0
- data/lib/cyberweb/sinatra/custom_extensions.rb +131 -0
- data/lib/cyberweb/standalone_classes/all_css_classes.rb +255 -0
- data/lib/cyberweb/standalone_classes/calculator.rb +127 -0
- data/lib/cyberweb/standalone_classes/correct_image_entries_in_html_file.rb +207 -0
- data/lib/cyberweb/standalone_classes/input_focus.rb +97 -0
- data/lib/cyberweb/standalone_classes/tag_prototype.rb +43 -0
- data/lib/cyberweb/standalone_classes/turn_html_into_cyberweb.rb +174 -0
- data/lib/cyberweb/svg/blue_rect.svg +12 -0
- data/lib/cyberweb/svg/butterfly.svg +15 -0
- data/lib/cyberweb/svg/chemical_molecule.svg +192 -0
- data/lib/cyberweb/svg/circles_on_background.svg +29 -0
- data/lib/cyberweb/svg/ellipse.svg +12 -0
- data/lib/cyberweb/svg/five_circles.svg +26 -0
- data/lib/cyberweb/svg/flag_germany.svg +10 -0
- data/lib/cyberweb/svg/gaussian_blur.svg +20 -0
- data/lib/cyberweb/svg/gradient_circle.svg +18 -0
- data/lib/cyberweb/svg/green_butterfly.svg +18 -0
- data/lib/cyberweb/svg/green_tilted_lines.svg +25 -0
- data/lib/cyberweb/svg/lion.svg +161 -0
- data/lib/cyberweb/svg/one_circle.svg +12 -0
- data/lib/cyberweb/svg/pie_chart.svg +130 -0
- data/lib/cyberweb/svg/svg.cgi +61 -0
- data/lib/cyberweb/svg/tetris.svg +487 -0
- data/lib/cyberweb/svg/three_circles.svg +18 -0
- data/lib/cyberweb/svg/tiger.svg +732 -0
- data/lib/cyberweb/svg/tilted_arcs.svg +74 -0
- data/lib/cyberweb/svg/transparent_rect.svg +12 -0
- data/lib/cyberweb/svg/yellow_fe_blending.svg +42 -0
- data/lib/cyberweb/toplevel_methods/a.rb +131 -0
- data/lib/cyberweb/toplevel_methods/anmerkung.rb +67 -0
- data/lib/cyberweb/toplevel_methods/audio.rb +59 -0
- data/lib/cyberweb/toplevel_methods/bold.rb +65 -0
- data/lib/cyberweb/toplevel_methods/cgi.rb +65 -0
- data/lib/cyberweb/toplevel_methods/charsets.rb +52 -0
- data/lib/cyberweb/toplevel_methods/clear.rb +30 -0
- data/lib/cyberweb/toplevel_methods/close.rb +62 -0
- data/lib/cyberweb/toplevel_methods/consider_serving_the_web_object.rb +41 -0
- data/lib/cyberweb/toplevel_methods/css.rb +732 -0
- data/lib/cyberweb/toplevel_methods/date.rb +71 -0
- data/lib/cyberweb/toplevel_methods/dictionary.rb +48 -0
- data/lib/cyberweb/toplevel_methods/disable.rb +49 -0
- data/lib/cyberweb/toplevel_methods/document.rb +56 -0
- data/lib/cyberweb/toplevel_methods/dot.rb +182 -0
- data/lib/cyberweb/toplevel_methods/download_webpage.rb +18 -0
- data/lib/cyberweb/toplevel_methods/edit_configuration_file.rb +26 -0
- data/lib/cyberweb/toplevel_methods/ee.rb +44 -0
- data/lib/cyberweb/toplevel_methods/env.rb +44 -0
- data/lib/cyberweb/toplevel_methods/escape_html.rb +54 -0
- data/lib/cyberweb/toplevel_methods/fields.rb +46 -0
- data/lib/cyberweb/toplevel_methods/filename.rb +33 -0
- data/lib/cyberweb/toplevel_methods/frames.rb +131 -0
- data/lib/cyberweb/toplevel_methods/glob.rb +30 -0
- data/lib/cyberweb/toplevel_methods/google.rb +35 -0
- data/lib/cyberweb/toplevel_methods/hardware_information.rb +90 -0
- data/lib/cyberweb/toplevel_methods/hfin.rb +56 -0
- data/lib/cyberweb/toplevel_methods/html_comment.rb +48 -0
- data/lib/cyberweb/toplevel_methods/html_mode.rb +39 -0
- data/lib/cyberweb/toplevel_methods/html_tables.rb +818 -0
- data/lib/cyberweb/toplevel_methods/input.rb +54 -0
- data/lib/cyberweb/toplevel_methods/jquery.rb +82 -0
- data/lib/cyberweb/toplevel_methods/last_modified.rb +39 -0
- data/lib/cyberweb/toplevel_methods/links.rb +426 -0
- data/lib/cyberweb/toplevel_methods/listing.rb +96 -0
- data/lib/cyberweb/toplevel_methods/localhost.rb +18 -0
- data/lib/cyberweb/toplevel_methods/log_directory.rb +84 -0
- data/lib/cyberweb/toplevel_methods/logging.rb +42 -0
- data/lib/cyberweb/toplevel_methods/logo.rb +30 -0
- data/lib/cyberweb/toplevel_methods/markdown.rb +112 -0
- data/lib/cyberweb/toplevel_methods/mathml.rb +130 -0
- data/lib/cyberweb/toplevel_methods/message_boxes.rb +140 -0
- data/lib/cyberweb/toplevel_methods/misc.rb +1398 -0
- data/lib/cyberweb/toplevel_methods/name_of_img_dir.rb +51 -0
- data/lib/cyberweb/toplevel_methods/padlem_and_marlem.rb +107 -0
- data/lib/cyberweb/toplevel_methods/params.rb +57 -0
- data/lib/cyberweb/toplevel_methods/path.rb +69 -0
- data/lib/cyberweb/toplevel_methods/pdf.rb +103 -0
- data/lib/cyberweb/toplevel_methods/process_content.rb +102 -0
- data/lib/cyberweb/toplevel_methods/progress.rb +42 -0
- data/lib/cyberweb/toplevel_methods/quote.rb +44 -0
- data/lib/cyberweb/toplevel_methods/random.rb +70 -0
- data/lib/cyberweb/toplevel_methods/rds.rb +35 -0
- data/lib/cyberweb/toplevel_methods/read_and_display.rb +284 -0
- data/lib/cyberweb/toplevel_methods/readlines.rb +31 -0
- data/lib/cyberweb/toplevel_methods/redirect.rb +29 -0
- data/lib/cyberweb/toplevel_methods/registered_ids.rb +178 -0
- data/lib/cyberweb/toplevel_methods/remove_html.rb +32 -0
- data/lib/cyberweb/toplevel_methods/remove_newlines.rb +28 -0
- data/lib/cyberweb/toplevel_methods/return_head_start.rb +33 -0
- data/lib/cyberweb/toplevel_methods/return_html_fin.rb +34 -0
- data/lib/cyberweb/toplevel_methods/return_html_header.rb +35 -0
- data/lib/cyberweb/toplevel_methods/return_html_start.rb +24 -0
- data/lib/cyberweb/toplevel_methods/return_html_to_head_start.rb +42 -0
- data/lib/cyberweb/toplevel_methods/return_meta_collection.rb +54 -0
- data/lib/cyberweb/toplevel_methods/return_pwd.rb +23 -0
- data/lib/cyberweb/toplevel_methods/return_strict_doctype.rb +51 -0
- data/lib/cyberweb/toplevel_methods/roebe.rb +43 -0
- data/lib/cyberweb/toplevel_methods/s2.rb +30 -0
- data/lib/cyberweb/toplevel_methods/sanitize_url.rb +57 -0
- data/lib/cyberweb/toplevel_methods/sbr.rb +170 -0
- data/lib/cyberweb/toplevel_methods/server_base_directory.rb +148 -0
- data/lib/cyberweb/toplevel_methods/show_and_display.rb +215 -0
- data/lib/cyberweb/toplevel_methods/show_configuration.rb +83 -0
- data/lib/cyberweb/toplevel_methods/sitemap.rb +111 -0
- data/lib/cyberweb/toplevel_methods/spacer.rb +119 -0
- data/lib/cyberweb/toplevel_methods/string_body_start.rb +65 -0
- data/lib/cyberweb/toplevel_methods/string_content.rb +35 -0
- data/lib/cyberweb/toplevel_methods/svg.rb +66 -0
- data/lib/cyberweb/toplevel_methods/tag.rb +237 -0
- data/lib/cyberweb/toplevel_methods/temp_directory.rb +73 -0
- data/lib/cyberweb/toplevel_methods/test_css.rb +24 -0
- data/lib/cyberweb/toplevel_methods/textile.rb +45 -0
- data/lib/cyberweb/toplevel_methods/title.rb +125 -0
- data/lib/cyberweb/toplevel_methods/umlaute.rb +90 -0
- data/lib/cyberweb/toplevel_methods/video.rb +352 -0
- data/lib/cyberweb/toplevel_methods/view_source.rb +50 -0
- data/lib/cyberweb/toplevel_methods/web_object.rb +42 -0
- data/lib/cyberweb/toplevel_methods/write_what_into.rb +27 -0
- data/lib/cyberweb/utility_scripts/README.md +4 -0
- data/lib/cyberweb/utility_scripts/create_coloured_tags.rb +172 -0
- data/lib/cyberweb/utility_scripts/download_balloon_css.rb +160 -0
- data/lib/cyberweb/utility_scripts/hyperlink_all_images_from.rb +148 -0
- data/lib/cyberweb/version/version.rb +25 -0
- data/lib/cyberweb/web_base/web_base.rb +28 -0
- data/lib/cyberweb/web_images/array_listing_all_project_images.rb +52 -0
- data/lib/cyberweb/web_images/map_symbol_to_image_location.rb +1661 -0
- data/lib/cyberweb/web_images/web_images.rb +270 -0
- data/lib/cyberweb/web_object/css.rb +627 -0
- data/lib/cyberweb/web_object/evaluate.rb +126 -0
- data/lib/cyberweb/web_object/favicon.rb +160 -0
- data/lib/cyberweb/web_object/html_related_tags.rb +320 -0
- data/lib/cyberweb/web_object/images.rb +693 -0
- data/lib/cyberweb/web_object/initialize.rb +51 -0
- data/lib/cyberweb/web_object/input_related_functionality.rb +414 -0
- data/lib/cyberweb/web_object/javascript.rb +427 -0
- data/lib/cyberweb/web_object/languages.rb +172 -0
- data/lib/cyberweb/web_object/links.rb +228 -0
- data/lib/cyberweb/web_object/misc.rb +5159 -0
- data/lib/cyberweb/web_object/params.rb +289 -0
- data/lib/cyberweb/web_object/reset.rb +192 -0
- data/lib/cyberweb/web_object/run.rb +44 -0
- data/lib/cyberweb/web_object/sinatra_related_functionality.rb +30 -0
- data/lib/cyberweb/web_object/sitemap.rb +176 -0
- data/lib/cyberweb/web_object/table.rb +378 -0
- data/lib/cyberweb/web_object/web_object.rb +126 -0
- data/lib/cyberweb/web_scraper/README.md +8 -0
- data/lib/cyberweb/web_scraper/scrape_this_url.rb +183 -0
- data/lib/cyberweb/webmin/biology_server.cgi +256 -0
- data/lib/cyberweb/webmin/calculator.cgi +52 -0
- data/lib/cyberweb/webmin/colour_chart.cgi +33 -0
- data/lib/cyberweb/webmin/comments.cgi +137 -0
- data/lib/cyberweb/webmin/comments_data +18 -0
- data/lib/cyberweb/webmin/constants.rb +46 -0
- data/lib/cyberweb/webmin/dictionary.cgi +39 -0
- data/lib/cyberweb/webmin/sys_info.cgi +26 -0
- data/lib/cyberweb/webmin/webforum.cgi +58 -0
- data/lib/cyberweb/webmin/webmin.cgi +679 -0
- data/lib/cyberweb/yaml/autogenerated_system_settings.yml +14 -0
- data/lib/cyberweb/yaml/custom_tags.yml +7 -0
- data/lib/cyberweb/yaml/debug.yml +1 -0
- data/lib/cyberweb/yaml/html5_global_attributes.yml +12 -0
- data/lib/cyberweb/yaml/html5_new_elements.yml +108 -0
- data/lib/cyberweb/yaml/html_tag_legend.yml +12 -0
- data/lib/cyberweb/yaml/http_status_codes.yml +38 -0
- data/lib/cyberweb/yaml/js_files_to_load.yml +28 -0
- data/lib/cyberweb/yaml/project_configuration.yml +229 -0
- data/lib/cyberweb/yaml/video_attributes.yml +35 -0
- data/lib/cyberweb/yaml/web_images.yml +306 -0
- data/lib/cyberweb.rb +5 -0
- data/test/README.md +5 -0
- data/test/complex_tests/all_tests_in_one_page.cgi +666 -0
- data/test/complex_tests/simple_sinatra_example_using_cyberweb/simple.rb +60 -0
- data/test/complex_tests/sinatra_or_cyberweb/sinatra_or_cyberweb.cgi +7 -0
- data/test/complex_tests/sinatra_or_cyberweb/sinatra_or_cyberweb.rb +23 -0
- data/test/complex_tests/sinatra_or_cyberweb/sinatra_or_cyberweb.sinatra +65 -0
- data/test/complex_tests/testing_frames.cgi +42 -0
- data/test/complex_tests/testing_objectified_html_tags.rb +82 -0
- data/test/complex_tests/testing_style_variants/README.md +2 -0
- data/test/complex_tests/testing_style_variants/show_coloured_boxes.cgi +58 -0
- data/test/complex_tests/testing_tables.cgi +67 -0
- data/test/complex_tests/testing_the_cyberweb_shell.rb +188 -0
- data/test/complex_tests/testing_web_object.rb +94 -0
- data/test/css/README.md +5 -0
- data/test/css/return_the_content_of_these_css_classes.rb +7 -0
- data/test/css/testing_css_effects.cgi +159 -0
- data/test/css/testing_css_masking.cgi +36 -0
- data/test/dummy.pdf +0 -0
- data/test/hello_world/hello_world.cgi +25 -0
- data/test/javascript/README.md +2 -0
- data/test/javascript/testing_cheerleader_javascript.cgi +0 -0
- data/test/javascript/testing_drag_and_drop_support.cgi +33 -0
- data/test/javascript/testing_on_click_change_opacity.cgi +26 -0
- data/test/javascript/testing_snowflakes.cgi +20 -0
- data/test/simple_tests/README.md +3 -0
- data/test/simple_tests/ad-hoc-test.cgi +55 -0
- data/test/simple_tests/commandline_tests.rb +70 -0
- data/test/simple_tests/display_this_file.cgi +11 -0
- data/test/simple_tests/simple_html_example.cgi +29 -0
- data/test/simple_tests/simple_status_page.cgi +52 -0
- data/test/simple_tests/string_s2_test.rb +11 -0
- data/test/simple_tests/test_simple_string_as_input.rb +12 -0
- data/test/simple_tests/testing_base64_images.cgi +26 -0
- data/test/simple_tests/testing_dragging_an_image.cgi +23 -0
- data/test/simple_tests/testing_editable_text.cgi +16 -0
- data/test/simple_tests/testing_email.cgi +31 -0
- data/test/simple_tests/testing_embedding_a_pdf_file.cgi +32 -0
- data/test/simple_tests/testing_google_charts.cgi +24 -0
- data/test/simple_tests/testing_html_forms.cgi +31 -0
- data/test/simple_tests/testing_html_template.rb +13 -0
- data/test/simple_tests/testing_popup_div.cgi +22 -0
- data/test/simple_tests/testing_return_dataset_without_any_comments.rb +11 -0
- data/test/simple_tests/testing_the_cap_box.cgi +20 -0
- data/test/simple_tests/testing_the_div_tag.cgi +21 -0
- data/test/simple_tests/testing_the_headers_tag.cgi +36 -0
- data/test/simple_tests/testing_the_html_colours.cgi +19 -0
- data/test/simple_tests/testing_the_info_box.cgi +19 -0
- data/test/simple_tests/testing_the_li_tag.cgi +24 -0
- data/test/simple_tests/testing_the_s2_method.rb +7 -0
- data/test/simple_tests/testing_the_select_tag.cgi +23 -0
- data/test/simple_tests/testing_the_span_tag.cgi +36 -0
- data/test/simple_tests/testing_web_images.rb +12 -0
- data/test/testing_html_tags/README.md +7 -0
- data/test/testing_html_tags/button_example.cgi +42 -0
- 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
|