herb 0.10.3-aarch64-linux-gnu → 0.11.0-aarch64-linux-gnu
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.
- checksums.yaml +4 -4
- data/Makefile +16 -6
- data/README.md +36 -119
- data/Rakefile +2 -11
- data/config/action_view_helpers/actioncable/action_cable_helper/action_cable_meta_tag.yml +12 -8
- data/config/action_view_helpers/actionpack/content_security_policy/content_security_policy?.yml +9 -6
- data/config/action_view_helpers/actionpack/content_security_policy/content_security_policy_nonce.yml +9 -6
- data/config/action_view_helpers/actionpack/polymorphic_routes/polymorphic_path.yml +20 -12
- data/config/action_view_helpers/actionpack/polymorphic_routes/polymorphic_url.yml +30 -18
- data/config/action_view_helpers/actionpack/request_forgery_protection/form_authenticity_token.yml +15 -9
- data/config/action_view_helpers/actionpack/request_forgery_protection/protect_against_forgery?.yml +9 -6
- data/config/action_view_helpers/actiontext/content_helper/render_action_text_content.yml +15 -9
- data/config/action_view_helpers/actiontext/content_helper/sanitize_action_text_content.yml +15 -9
- data/config/action_view_helpers/actiontext/tag_helper/rich_textarea_tag.yml +34 -22
- data/config/action_view_helpers/actionview/active_model_helper/error_message.yml +9 -6
- data/config/action_view_helpers/actionview/active_model_helper/error_wrapping.yml +9 -6
- data/config/action_view_helpers/actionview/active_model_helper/object.yml +9 -6
- data/config/action_view_helpers/actionview/asset_tag_helper/apply_stylesheet_media_default.yml +9 -6
- data/config/action_view_helpers/actionview/asset_tag_helper/audio_tag.yml +40 -27
- data/config/action_view_helpers/actionview/asset_tag_helper/auto_discovery_link_tag.yml +37 -23
- data/config/action_view_helpers/actionview/asset_tag_helper/auto_include_nonce.yml +9 -6
- data/config/action_view_helpers/actionview/asset_tag_helper/auto_include_nonce_for_scripts.yml +9 -6
- data/config/action_view_helpers/actionview/asset_tag_helper/auto_include_nonce_for_styles.yml +9 -6
- data/config/action_view_helpers/actionview/asset_tag_helper/favicon_link_tag.yml +32 -22
- data/config/action_view_helpers/actionview/asset_tag_helper/image_decoding.yml +9 -6
- data/config/action_view_helpers/actionview/asset_tag_helper/image_loading.yml +9 -6
- data/config/action_view_helpers/actionview/asset_tag_helper/image_tag.yml +67 -46
- data/config/action_view_helpers/actionview/asset_tag_helper/javascript_include_tag.yml +58 -39
- data/config/action_view_helpers/actionview/asset_tag_helper/picture_tag.yml +22 -14
- data/config/action_view_helpers/actionview/asset_tag_helper/preload_link_tag.yml +45 -30
- data/config/action_view_helpers/actionview/asset_tag_helper/preload_links_header.yml +9 -6
- data/config/action_view_helpers/actionview/asset_tag_helper/stylesheet_link_tag.yml +49 -30
- data/config/action_view_helpers/actionview/asset_tag_helper/video_tag.yml +53 -35
- data/config/action_view_helpers/actionview/asset_url_helper/asset_path.yml +16 -10
- data/config/action_view_helpers/actionview/asset_url_helper/asset_url.yml +16 -10
- data/config/action_view_helpers/actionview/asset_url_helper/audio_path.yml +16 -10
- data/config/action_view_helpers/actionview/asset_url_helper/audio_url.yml +16 -10
- data/config/action_view_helpers/actionview/asset_url_helper/compute_asset_extname.yml +9 -6
- data/config/action_view_helpers/actionview/asset_url_helper/compute_asset_host.yml +9 -6
- data/config/action_view_helpers/actionview/asset_url_helper/compute_asset_path.yml +9 -6
- data/config/action_view_helpers/actionview/asset_url_helper/font_path.yml +16 -10
- data/config/action_view_helpers/actionview/asset_url_helper/font_url.yml +16 -10
- data/config/action_view_helpers/actionview/asset_url_helper/image_path.yml +16 -10
- data/config/action_view_helpers/actionview/asset_url_helper/image_url.yml +16 -10
- data/config/action_view_helpers/actionview/asset_url_helper/javascript_path.yml +16 -10
- data/config/action_view_helpers/actionview/asset_url_helper/javascript_url.yml +16 -10
- data/config/action_view_helpers/actionview/asset_url_helper/public_compute_asset_path.yml +9 -6
- data/config/action_view_helpers/actionview/asset_url_helper/stylesheet_path.yml +16 -10
- data/config/action_view_helpers/actionview/asset_url_helper/stylesheet_url.yml +16 -10
- data/config/action_view_helpers/actionview/asset_url_helper/video_path.yml +16 -10
- data/config/action_view_helpers/actionview/asset_url_helper/video_url.yml +16 -10
- data/config/action_view_helpers/actionview/atom_feed_helper/atom_feed.yml +52 -27
- data/config/action_view_helpers/actionview/cache_helper/cache.yml +25 -15
- data/config/action_view_helpers/actionview/cache_helper/cache_fragment_name.yml +9 -6
- data/config/action_view_helpers/actionview/cache_helper/cache_if.yml +20 -12
- data/config/action_view_helpers/actionview/cache_helper/cache_unless.yml +20 -12
- data/config/action_view_helpers/actionview/cache_helper/caching_predicate.yml +9 -6
- data/config/action_view_helpers/actionview/cache_helper/digest_path_from_template.yml +9 -6
- data/config/action_view_helpers/actionview/cache_helper/fragment_for.yml +9 -6
- data/config/action_view_helpers/actionview/cache_helper/fragment_name_with_digest.yml +9 -6
- data/config/action_view_helpers/actionview/cache_helper/read_fragment_for.yml +9 -6
- data/config/action_view_helpers/actionview/cache_helper/uncacheable.yml +9 -6
- data/config/action_view_helpers/actionview/cache_helper/write_fragment_for.yml +9 -6
- data/config/action_view_helpers/actionview/capture_helper/capture.yml +9 -6
- data/config/action_view_helpers/actionview/capture_helper/content_for.yml +20 -12
- data/config/action_view_helpers/actionview/capture_helper/content_for_predicate.yml +15 -9
- data/config/action_view_helpers/actionview/capture_helper/provide.yml +15 -9
- data/config/action_view_helpers/actionview/capture_helper/with_output_buffer.yml +9 -6
- data/config/action_view_helpers/actionview/content_exfiltration_prevention_helper/prepend_content_exfiltration_prevention.yml +9 -6
- data/config/action_view_helpers/actionview/content_exfiltration_prevention_helper/prevent_content_exfiltration.yml +9 -6
- data/config/action_view_helpers/actionview/controller_helper/action_name.yml +9 -6
- data/config/action_view_helpers/actionview/controller_helper/assign_controller.yml +9 -6
- data/config/action_view_helpers/actionview/controller_helper/controller.yml +9 -6
- data/config/action_view_helpers/actionview/controller_helper/controller_name.yml +9 -6
- data/config/action_view_helpers/actionview/controller_helper/controller_path.yml +9 -6
- data/config/action_view_helpers/actionview/controller_helper/cookies.yml +9 -6
- data/config/action_view_helpers/actionview/controller_helper/flash.yml +9 -6
- data/config/action_view_helpers/actionview/controller_helper/headers.yml +9 -6
- data/config/action_view_helpers/actionview/controller_helper/logger.yml +9 -6
- data/config/action_view_helpers/actionview/controller_helper/params.yml +9 -6
- data/config/action_view_helpers/actionview/controller_helper/request.yml +9 -6
- data/config/action_view_helpers/actionview/controller_helper/request_forgery_protection_token.yml +9 -6
- data/config/action_view_helpers/actionview/controller_helper/response.yml +9 -6
- data/config/action_view_helpers/actionview/controller_helper/session.yml +9 -6
- data/config/action_view_helpers/actionview/csp_helper/csp_meta_tag.yml +18 -11
- data/config/action_view_helpers/actionview/csrf_helper/csrf_meta_tags.yml +16 -10
- data/config/action_view_helpers/actionview/date_helper/date_select.yml +85 -51
- data/config/action_view_helpers/actionview/date_helper/datetime_select.yml +65 -39
- data/config/action_view_helpers/actionview/date_helper/distance_of_time_in_words.yml +30 -18
- data/config/action_view_helpers/actionview/date_helper/relative_time_in_words.yml +35 -21
- data/config/action_view_helpers/actionview/date_helper/select_date.yml +50 -30
- data/config/action_view_helpers/actionview/date_helper/select_datetime.yml +65 -39
- data/config/action_view_helpers/actionview/date_helper/select_day.yml +40 -24
- data/config/action_view_helpers/actionview/date_helper/select_hour.yml +50 -30
- data/config/action_view_helpers/actionview/date_helper/select_minute.yml +40 -24
- data/config/action_view_helpers/actionview/date_helper/select_month.yml +60 -36
- data/config/action_view_helpers/actionview/date_helper/select_second.yml +35 -21
- data/config/action_view_helpers/actionview/date_helper/select_time.yml +55 -33
- data/config/action_view_helpers/actionview/date_helper/select_year.yml +45 -27
- data/config/action_view_helpers/actionview/date_helper/time_ago_in_words.yml +21 -13
- data/config/action_view_helpers/actionview/date_helper/time_select.yml +60 -36
- data/config/action_view_helpers/actionview/date_helper/time_tag.yml +32 -20
- data/config/action_view_helpers/actionview/debug_helper/debug.yml +15 -9
- data/config/action_view_helpers/actionview/form_builder/button.yml +60 -0
- data/config/action_view_helpers/actionview/form_builder/submit.yml +48 -0
- data/config/action_view_helpers/actionview/form_helper/apply_form_for_options.yml +9 -6
- data/config/action_view_helpers/actionview/form_helper/checkbox.yml +41 -25
- data/config/action_view_helpers/actionview/form_helper/color_field.yml +25 -15
- data/config/action_view_helpers/actionview/form_helper/date_field.yml +35 -21
- data/config/action_view_helpers/actionview/form_helper/datetime_field.yml +41 -25
- data/config/action_view_helpers/actionview/form_helper/email_field.yml +25 -15
- data/config/action_view_helpers/actionview/form_helper/emitted_hidden_id.yml +9 -6
- data/config/action_view_helpers/actionview/form_helper/fields.yml +37 -18
- data/config/action_view_helpers/actionview/form_helper/fields_for.yml +33 -15
- data/config/action_view_helpers/actionview/form_helper/file_field.yml +45 -27
- data/config/action_view_helpers/actionview/form_helper/form_for.yml +45 -24
- data/config/action_view_helpers/actionview/form_helper/form_with.yml +56 -30
- data/config/action_view_helpers/actionview/form_helper/form_with_generates_ids.yml +9 -6
- data/config/action_view_helpers/actionview/form_helper/form_with_generates_remote_forms.yml +9 -6
- data/config/action_view_helpers/actionview/form_helper/hidden_field.yml +25 -15
- data/config/action_view_helpers/actionview/form_helper/label.yml +52 -27
- data/config/action_view_helpers/actionview/form_helper/month_field.yml +25 -15
- data/config/action_view_helpers/actionview/form_helper/multipart.yml +9 -6
- data/config/action_view_helpers/actionview/form_helper/multiple_file_field_include_hidden.yml +9 -6
- data/config/action_view_helpers/actionview/form_helper/number_field.yml +45 -27
- data/config/action_view_helpers/actionview/form_helper/password_field.yml +25 -15
- data/config/action_view_helpers/actionview/form_helper/radio_button.yml +30 -18
- data/config/action_view_helpers/actionview/form_helper/range_field.yml +45 -27
- data/config/action_view_helpers/actionview/form_helper/search_field.yml +25 -15
- data/config/action_view_helpers/actionview/form_helper/telephone_field.yml +26 -16
- data/config/action_view_helpers/actionview/form_helper/text_field.yml +25 -15
- data/config/action_view_helpers/actionview/form_helper/textarea.yml +31 -19
- data/config/action_view_helpers/actionview/form_helper/time_field.yml +40 -24
- data/config/action_view_helpers/actionview/form_helper/url_field.yml +25 -15
- data/config/action_view_helpers/actionview/form_helper/week_field.yml +25 -15
- data/config/action_view_helpers/actionview/form_options_helper/collection_checkboxes.yml +58 -31
- data/config/action_view_helpers/actionview/form_options_helper/collection_radio_buttons.yml +57 -30
- data/config/action_view_helpers/actionview/form_options_helper/collection_select.yml +65 -39
- data/config/action_view_helpers/actionview/form_options_helper/grouped_collection_select.yml +65 -39
- data/config/action_view_helpers/actionview/form_options_helper/grouped_options_for_select.yml +35 -21
- data/config/action_view_helpers/actionview/form_options_helper/option_groups_from_collection_for_select.yml +40 -24
- data/config/action_view_helpers/actionview/form_options_helper/options_for_select.yml +20 -12
- data/config/action_view_helpers/actionview/form_options_helper/options_from_collection_for_select.yml +30 -18
- data/config/action_view_helpers/actionview/form_options_helper/select.yml +60 -36
- data/config/action_view_helpers/actionview/form_options_helper/time_zone_options_for_select.yml +25 -15
- data/config/action_view_helpers/actionview/form_options_helper/time_zone_select.yml +50 -30
- data/config/action_view_helpers/actionview/form_options_helper/weekday_options_for_select.yml +30 -18
- data/config/action_view_helpers/actionview/form_options_helper/weekday_select.yml +30 -18
- data/config/action_view_helpers/actionview/form_tag_helper/button_tag.yml +39 -21
- data/config/action_view_helpers/actionview/form_tag_helper/checkbox_tag.yml +33 -21
- data/config/action_view_helpers/actionview/form_tag_helper/color_field_tag.yml +26 -17
- data/config/action_view_helpers/actionview/form_tag_helper/date_field_tag.yml +27 -17
- data/config/action_view_helpers/actionview/form_tag_helper/datetime_field_tag.yml +28 -18
- data/config/action_view_helpers/actionview/form_tag_helper/default_enforce_utf8.yml +9 -6
- data/config/action_view_helpers/actionview/form_tag_helper/email_field_tag.yml +27 -17
- data/config/action_view_helpers/actionview/form_tag_helper/embed_authenticity_token_in_remote_forms.yml +9 -6
- data/config/action_view_helpers/actionview/form_tag_helper/field_id.yml +30 -18
- data/config/action_view_helpers/actionview/form_tag_helper/field_name.yml +30 -18
- data/config/action_view_helpers/actionview/form_tag_helper/field_set_tag.yml +23 -15
- data/config/action_view_helpers/actionview/form_tag_helper/file_field_tag.yml +35 -22
- data/config/action_view_helpers/actionview/form_tag_helper/form_tag.yml +38 -24
- data/config/action_view_helpers/actionview/form_tag_helper/hidden_field_tag.yml +27 -17
- data/config/action_view_helpers/actionview/form_tag_helper/image_submit_tag.yml +31 -21
- data/config/action_view_helpers/actionview/form_tag_helper/label_tag.yml +33 -17
- data/config/action_view_helpers/actionview/form_tag_helper/month_field_tag.yml +27 -17
- data/config/action_view_helpers/actionview/form_tag_helper/number_field_tag.yml +47 -29
- data/config/action_view_helpers/actionview/form_tag_helper/password_field_tag.yml +27 -17
- data/config/action_view_helpers/actionview/form_tag_helper/radio_button_tag.yml +32 -20
- data/config/action_view_helpers/actionview/form_tag_helper/range_field_tag.yml +47 -29
- data/config/action_view_helpers/actionview/form_tag_helper/search_field_tag.yml +27 -17
- data/config/action_view_helpers/actionview/form_tag_helper/select_tag.yml +47 -29
- data/config/action_view_helpers/actionview/form_tag_helper/submit_tag.yml +33 -21
- data/config/action_view_helpers/actionview/form_tag_helper/telephone_field_tag.yml +28 -18
- data/config/action_view_helpers/actionview/form_tag_helper/text_field_tag.yml +27 -17
- data/config/action_view_helpers/actionview/form_tag_helper/textarea_tag.yml +31 -20
- data/config/action_view_helpers/actionview/form_tag_helper/time_field_tag.yml +27 -17
- data/config/action_view_helpers/actionview/form_tag_helper/url_field_tag.yml +27 -17
- data/config/action_view_helpers/actionview/form_tag_helper/utf8_enforcer_tag.yml +9 -6
- data/config/action_view_helpers/actionview/form_tag_helper/week_field_tag.yml +28 -18
- data/config/action_view_helpers/actionview/javascript_helper/escape_javascript.yml +16 -10
- data/config/action_view_helpers/actionview/javascript_helper/javascript_cdata_section.yml +9 -6
- data/config/action_view_helpers/actionview/javascript_helper/javascript_tag.yml +41 -27
- data/config/action_view_helpers/actionview/number_helper/number_to_currency.yml +29 -18
- data/config/action_view_helpers/actionview/number_helper/number_to_human.yml +25 -15
- data/config/action_view_helpers/actionview/number_helper/number_to_human_size.yml +20 -12
- data/config/action_view_helpers/actionview/number_helper/number_to_percentage.yml +20 -12
- data/config/action_view_helpers/actionview/number_helper/number_to_phone.yml +33 -20
- data/config/action_view_helpers/actionview/number_helper/number_with_delimiter.yml +21 -13
- data/config/action_view_helpers/actionview/number_helper/number_with_precision.yml +25 -15
- data/config/action_view_helpers/actionview/output_safety_helper/raw.yml +15 -9
- data/config/action_view_helpers/actionview/output_safety_helper/safe_join.yml +20 -12
- data/config/action_view_helpers/actionview/output_safety_helper/to_sentence.yml +24 -15
- data/config/action_view_helpers/actionview/record_identifier/dom_class.yml +20 -12
- data/config/action_view_helpers/actionview/record_identifier/dom_id.yml +20 -12
- data/config/action_view_helpers/actionview/record_identifier/dom_target.yml +15 -9
- data/config/action_view_helpers/actionview/record_identifier/model_name_from_record_or_class.yml +9 -6
- data/config/action_view_helpers/actionview/rendering_helper/render.yml +108 -22
- data/config/action_view_helpers/actionview/sanitize_helper/sanitize.yml +25 -15
- data/config/action_view_helpers/actionview/sanitize_helper/sanitize_css.yml +15 -9
- data/config/action_view_helpers/actionview/sanitize_helper/sanitizer_vendor.yml +9 -6
- data/config/action_view_helpers/actionview/sanitize_helper/strip_links.yml +15 -9
- data/config/action_view_helpers/actionview/sanitize_helper/strip_tags.yml +15 -9
- data/config/action_view_helpers/actionview/tag_helper/cdata_section.yml +15 -9
- data/config/action_view_helpers/actionview/tag_helper/content_tag.yml +59 -38
- data/config/action_view_helpers/actionview/tag_helper/escape_once.yml +15 -9
- data/config/action_view_helpers/actionview/tag_helper/tag.yml +54 -31
- data/config/action_view_helpers/actionview/tag_helper/token_list.yml +16 -10
- data/config/action_view_helpers/actionview/text_helper/concat.yml +15 -9
- data/config/action_view_helpers/actionview/text_helper/current_cycle.yml +15 -9
- data/config/action_view_helpers/actionview/text_helper/cycle.yml +23 -14
- data/config/action_view_helpers/actionview/text_helper/excerpt.yml +33 -20
- data/config/action_view_helpers/actionview/text_helper/highlight.yml +37 -18
- data/config/action_view_helpers/actionview/text_helper/pluralize.yml +30 -18
- data/config/action_view_helpers/actionview/text_helper/reset_cycle.yml +15 -9
- data/config/action_view_helpers/actionview/text_helper/safe_concat.yml +9 -6
- data/config/action_view_helpers/actionview/text_helper/simple_format.yml +33 -20
- data/config/action_view_helpers/actionview/text_helper/truncate.yml +38 -23
- data/config/action_view_helpers/actionview/text_helper/word_wrap.yml +25 -15
- data/config/action_view_helpers/actionview/translation_helper/debug_missing_translation.yml +9 -6
- data/config/action_view_helpers/actionview/translation_helper/localize.yml +26 -16
- data/config/action_view_helpers/actionview/translation_helper/translate.yml +31 -19
- data/config/action_view_helpers/actionview/url_helper/button_to.yml +57 -33
- data/config/action_view_helpers/actionview/url_helper/button_to_generates_button_tag.yml +9 -6
- data/config/action_view_helpers/actionview/url_helper/current_page?.yml +25 -15
- data/config/action_view_helpers/actionview/url_helper/link_to.yml +76 -53
- data/config/action_view_helpers/actionview/url_helper/link_to_if.yml +54 -20
- data/config/action_view_helpers/actionview/url_helper/link_to_unless.yml +54 -20
- data/config/action_view_helpers/actionview/url_helper/link_to_unless_current.yml +49 -17
- data/config/action_view_helpers/actionview/url_helper/mail_to.yml +60 -34
- data/config/action_view_helpers/actionview/url_helper/phone_to.yml +40 -22
- data/config/action_view_helpers/actionview/url_helper/sms_to.yml +45 -25
- data/config/action_view_helpers/actionview/url_helper/url_for.yml +15 -9
- data/config/action_view_helpers/importmap-rails/importmap_tags_helper/javascript_import_module_tag.yml +32 -0
- data/config/action_view_helpers/importmap-rails/importmap_tags_helper/javascript_importmap_module_preload_tags.yml +39 -0
- data/config/action_view_helpers/importmap-rails/importmap_tags_helper/javascript_importmap_tags.yml +35 -0
- data/config/action_view_helpers/importmap-rails/importmap_tags_helper/javascript_inline_importmap_tag.yml +32 -0
- data/config/action_view_helpers/importmap-rails/importmap_tags_helper/javascript_module_preload_tag.yml +35 -0
- data/config/action_view_helpers/turbo-rails/drive_helper/turbo_exempts_page_from_cache.yml +9 -6
- data/config/action_view_helpers/turbo-rails/drive_helper/turbo_exempts_page_from_cache_tag.yml +12 -8
- data/config/action_view_helpers/turbo-rails/drive_helper/turbo_exempts_page_from_preview.yml +9 -6
- data/config/action_view_helpers/turbo-rails/drive_helper/turbo_exempts_page_from_preview_tag.yml +12 -8
- data/config/action_view_helpers/turbo-rails/drive_helper/turbo_page_requires_reload.yml +9 -6
- data/config/action_view_helpers/turbo-rails/drive_helper/turbo_page_requires_reload_tag.yml +12 -8
- data/config/action_view_helpers/turbo-rails/drive_helper/turbo_refresh_method_tag.yml +17 -11
- data/config/action_view_helpers/turbo-rails/drive_helper/turbo_refresh_scroll_tag.yml +17 -11
- data/config/action_view_helpers/turbo-rails/drive_helper/turbo_refreshes_with.yml +20 -12
- data/config/action_view_helpers/turbo-rails/frames_helper/turbo_frame_tag.yml +54 -33
- data/config/action_view_helpers/turbo-rails/includes_helper/turbo_include_tags.yml +9 -6
- data/config/action_view_helpers/turbo-rails/streams_action_helper/turbo_stream_action_tag.yml +32 -20
- data/config/action_view_helpers/turbo-rails/streams_action_helper/turbo_stream_refresh_tag.yml +18 -11
- data/config/action_view_helpers/turbo-rails/streams_helper/turbo_stream.yml +9 -6
- data/config/action_view_helpers/turbo-rails/streams_helper/turbo_stream_from.yml +28 -18
- data/config/html_elements.yml +597 -0
- data/config/options.yml +1 -0
- data/config/slots/components.yml +52 -0
- data/config/state/kind.yml +61 -0
- data/config/state/operators.yml +27 -0
- data/config/state/predicates.yml +39 -0
- data/config/state/transforms.yml +18 -0
- data/config/view_context_methods/actionview/base/annotate_rendered_view_with_filenames.yml +4 -4
- data/config/view_context_methods/actionview/base/assign.yml +4 -4
- data/config/view_context_methods/actionview/base/assigns.yml +4 -4
- data/config/view_context_methods/actionview/base/automatically_disable_submit_tag.yml +4 -4
- data/config/view_context_methods/actionview/base/compiled_method_container.yml +4 -4
- data/config/view_context_methods/actionview/base/config.yml +4 -4
- data/config/view_context_methods/actionview/base/default_form_builder.yml +4 -4
- data/config/view_context_methods/actionview/base/default_formats.yml +4 -4
- data/config/view_context_methods/actionview/base/field_error_proc.yml +4 -4
- data/config/view_context_methods/actionview/base/formats.yml +4 -4
- data/config/view_context_methods/actionview/base/in_rendering_context.yml +4 -4
- data/config/view_context_methods/actionview/base/locale.yml +4 -4
- data/config/view_context_methods/actionview/base/lookup_context.yml +4 -4
- data/config/view_context_methods/actionview/base/output_buffer.yml +4 -4
- data/config/view_context_methods/actionview/base/prefix_partial_path_with_controller_namespace.yml +4 -4
- data/config/view_context_methods/actionview/base/remove_hidden_field_autocomplete.yml +4 -4
- data/config/view_context_methods/actionview/base/streaming_completion_on_exception.yml +4 -4
- data/config/view_context_methods/actionview/base/view_flow.yml +4 -4
- data/config/view_context_methods/actionview/base/view_paths.yml +4 -4
- data/config/view_context_methods/actionview/base/view_renderer.yml +4 -4
- data/config/view_context_methods/actionview/template/local_assigns.yml +4 -4
- data/config/view_context_methods/activemodel/conversion/convert_to_model.yml +4 -4
- data/config/view_context_methods/activesupport/benchmarkable/benchmark.yml +4 -4
- data/config.yml +1240 -790
- data/exe/herb +2 -0
- data/ext/herb/error_helpers.c +355 -17
- data/ext/herb/error_helpers.h +1 -1
- data/ext/herb/extconf.rb +4 -2
- data/ext/herb/extension.c +137 -89
- data/ext/herb/extension_helpers.c +81 -42
- data/ext/herb/extension_helpers.h +4 -1
- data/ext/herb/nodes.c +826 -358
- data/ext/herb/nodes.h +3 -2
- data/ext/herb/parser_options_helpers.c +151 -0
- data/ext/herb/parser_options_helpers.h +14 -0
- data/herb.gemspec +2 -2
- data/lib/herb/3.2/herb.so +0 -0
- data/lib/herb/3.3/herb.so +0 -0
- data/lib/herb/3.4/herb.so +0 -0
- data/lib/herb/4.0/herb.so +0 -0
- data/lib/herb/action_view/helper_registry.rb +1358 -62
- data/lib/herb/analysis/partial_declaration.rb +140 -0
- data/lib/herb/analysis/partial_index.rb +189 -0
- data/lib/herb/analysis/partial_resolution.rb +161 -0
- data/lib/herb/analysis/partial_resolver.rb +144 -0
- data/lib/herb/analysis/project_index.rb +152 -0
- data/lib/herb/{action_view → analysis}/render_analyzer.rb +287 -77
- data/lib/herb/analysis/render_graph/ancestor_chain.rb +27 -0
- data/lib/herb/analysis/render_graph/builder.rb +376 -0
- data/lib/herb/analysis/render_graph/call_frame.rb +9 -0
- data/lib/herb/analysis/render_graph/call_site_location.rb +23 -0
- data/lib/herb/analysis/render_graph/inferred_signature.rb +21 -0
- data/lib/herb/analysis/render_graph/partial_call_site.rb +40 -0
- data/lib/herb/analysis/render_graph/partial_context.rb +46 -0
- data/lib/herb/analysis/render_graph/template_roots.rb +31 -0
- data/lib/herb/analysis/render_graph.rb +285 -0
- data/lib/herb/analysis/ruby_locals_index/local.rb +25 -0
- data/lib/herb/analysis/ruby_locals_index/named_reference.rb +22 -0
- data/lib/herb/analysis/ruby_locals_index/offset_table.rb +44 -0
- data/lib/herb/analysis/ruby_locals_index/reference_collector.rb +80 -0
- data/lib/herb/analysis/ruby_locals_index/state_locals.rb +49 -0
- data/lib/herb/analysis/ruby_locals_index.rb +165 -0
- data/lib/herb/analysis/ruby_reference.rb +67 -0
- data/lib/herb/analysis/template_dependencies/dependency_collector.rb +179 -0
- data/lib/herb/analysis/template_dependencies/node_dependency_collector.rb +309 -0
- data/lib/herb/analysis/template_dependencies.rb +562 -0
- data/lib/herb/ast/erb_render_node.rb +26 -94
- data/lib/herb/ast/helpers.rb +90 -10
- data/lib/herb/ast/herb_directive_node.rb +18 -0
- data/lib/herb/ast/node.rb +32 -2
- data/lib/herb/ast/nodes.rb +1342 -105
- data/lib/herb/backend.rb +73 -0
- data/lib/herb/bootstrap.rb +3 -7
- data/lib/herb/cli.rb +550 -32
- data/lib/herb/colors.rb +14 -0
- data/lib/herb/configuration.rb +71 -35
- data/lib/herb/defaults.yml +2 -1
- data/lib/herb/dev/assets.rb +57 -0
- data/lib/herb/dev/classifier.rb +84 -0
- data/lib/herb/dev/embedded.rb +27 -0
- data/lib/herb/dev/pipeline.rb +305 -0
- data/lib/herb/dev/protocol.rb +221 -0
- data/lib/herb/dev/runner.rb +175 -175
- data/lib/herb/dev/server.rb +89 -26
- data/lib/herb/dev/server_entry.rb +41 -6
- data/lib/herb/dev/watcher.rb +181 -0
- data/lib/herb/dev.rb +163 -0
- data/lib/herb/diagnostic/formatter.rb +88 -0
- data/lib/herb/diagnostic.rb +172 -0
- data/lib/herb/diff/operation.rb +36 -0
- data/lib/herb/diff/result.rb +62 -0
- data/lib/herb/diff.rb +10 -0
- data/lib/herb/engine/collector.rb +62 -0
- data/lib/herb/engine/compiler.rb +346 -108
- data/lib/herb/engine/component_tags/constant_resolver.rb +28 -0
- data/lib/herb/engine/component_tags/partial_resolver.rb +54 -0
- data/lib/herb/engine/component_tags/resolver.rb +32 -0
- data/lib/herb/engine/component_tags/visitor.rb +231 -0
- data/lib/herb/engine/css_inliner/inliner.rb +101 -0
- data/lib/herb/engine/css_inliner/visitor.rb +174 -0
- data/lib/herb/engine/errors.rb +122 -0
- data/lib/herb/engine/helpers.rb +82 -0
- data/lib/herb/engine/inline_render/inliner.rb +122 -0
- data/lib/herb/engine/inline_render/visitor.rb +267 -0
- data/lib/herb/engine/runtime/entry.rb +62 -0
- data/lib/herb/engine/runtime/error_page.rb +362 -0
- data/lib/herb/engine/runtime/html_safe_assertions.rb +217 -0
- data/lib/herb/engine/runtime/journal/summary.rb +227 -0
- data/lib/herb/engine/runtime/journal.rb +379 -0
- data/lib/herb/engine/runtime/middleware.rb +212 -0
- data/lib/herb/engine/runtime/observations.rb +73 -0
- data/lib/herb/engine/runtime/report.rb +204 -0
- data/lib/herb/engine/runtime/session.rb +437 -0
- data/lib/herb/engine/runtime.rb +21 -0
- data/lib/herb/engine/scoped_style/channel.rb +66 -0
- data/lib/herb/engine/scoped_style/collector.rb +74 -0
- data/lib/herb/engine/scoped_style/visitor.rb +533 -0
- data/lib/herb/engine/slots/annotation.rb +98 -0
- data/lib/herb/engine/slots/bindings.rb +61 -0
- data/lib/herb/engine/slots/callee.rb +118 -0
- data/lib/herb/engine/slots/component_definitions.rb +67 -0
- data/lib/herb/engine/slots/components/async.rb +24 -0
- data/lib/herb/engine/slots/components/base.rb +132 -0
- data/lib/herb/engine/slots/components/deferred.rb +81 -0
- data/lib/herb/engine/slots/components/fallback.rb +27 -0
- data/lib/herb/engine/slots/components/fragment.rb +99 -0
- data/lib/herb/engine/slots/components/lazy.rb +24 -0
- data/lib/herb/engine/slots/components.rb +52 -0
- data/lib/herb/engine/slots/dependencies/channel.rb +72 -0
- data/lib/herb/engine/slots/dependencies.rb +269 -0
- data/lib/herb/engine/slots/dynamics_compiler.rb +854 -0
- data/lib/herb/engine/slots/identifier.rb +35 -0
- data/lib/herb/engine/slots/manifest/channel.rb +74 -0
- data/lib/herb/engine/slots/manifest/collector.rb +75 -0
- data/lib/herb/engine/slots/markers.rb +128 -0
- data/lib/herb/engine/slots/render_bindings.rb +141 -0
- data/lib/herb/engine/slots/schema_compiler.rb +94 -0
- data/lib/herb/engine/slots/state_anchor.rb +94 -0
- data/lib/herb/engine/slots/state_compiler.rb +1326 -0
- data/lib/herb/engine/slots/state_directives.rb +854 -0
- data/lib/herb/engine/slots/state_kinds.rb +54 -0
- data/lib/herb/engine/slots/state_operators.rb +36 -0
- data/lib/herb/engine/slots/state_overrides.rb +79 -0
- data/lib/herb/engine/slots/state_predicates.rb +65 -0
- data/lib/herb/engine/slots/state_transforms.rb +42 -0
- data/lib/herb/engine/slots/statics.rb +185 -0
- data/lib/herb/engine/slots/subtree.rb +82 -0
- data/lib/herb/engine/slots/subtree_compiler.rb +255 -0
- data/lib/herb/engine/slots/types.rb +42 -0
- data/lib/herb/engine/slots/visitor.rb +2256 -0
- data/lib/herb/engine/validators/accessibility_validator.rb +3 -3
- data/lib/herb/engine/validators/base.rb +36 -0
- data/lib/herb/engine/validators/generator_template_validator.rb +39 -0
- data/lib/herb/engine/validators/nesting_validator.rb +3 -3
- data/lib/herb/engine/validators/render_validator.rb +13 -33
- data/lib/herb/engine/validators/security_validator.rb +3 -17
- data/lib/herb/engine/validators.rb +43 -0
- data/lib/herb/engine/visitors/auto_close_omitted_tags_visitor.rb +48 -0
- data/lib/herb/engine/visitors/content_for_visitor.rb +127 -0
- data/lib/herb/engine/{debug_visitor.rb → visitors/debug_visitor.rb} +121 -93
- data/lib/herb/engine/visitors/html_safe_assertions_visitor.rb +281 -0
- data/lib/herb/engine/visitors/instrumentation_visitor.rb +290 -0
- data/lib/herb/engine/visitors/optimize_visitor.rb +728 -0
- data/lib/herb/engine/visitors/remove_comments_visitor.rb +106 -0
- data/lib/herb/engine/visitors/source_attribution_visitor.rb +177 -0
- data/lib/herb/engine.rb +218 -257
- data/lib/herb/ensure_installed.rb +43 -0
- data/lib/herb/errors.rb +646 -157
- data/lib/herb/fingerprint.rb +82 -0
- data/lib/herb/html/elements.rb +18 -0
- data/lib/herb/html/util.rb +21 -2
- data/lib/herb/lex_result.rb +0 -10
- data/lib/herb/locate.rb +163 -0
- data/lib/herb/location.rb +20 -0
- data/lib/herb/parse_result.rb +17 -11
- data/lib/herb/parser_options.rb +65 -46
- data/lib/herb/position.rb +19 -0
- data/lib/herb/prism_inspect.rb +1 -4
- data/lib/herb/project.rb +31 -18
- data/lib/herb/range.rb +5 -0
- data/lib/herb/result.rb +2 -2
- data/lib/herb/ruby_program.rb +110 -0
- data/lib/herb/source_path.rb +232 -0
- data/lib/herb/token.rb +14 -3
- data/lib/herb/version.rb +1 -1
- data/lib/herb/visitor/context/origin.rb +52 -0
- data/lib/herb/visitor/context/replacements.rb +59 -0
- data/lib/herb/visitor/context.rb +169 -0
- data/lib/herb/visitor/context_aware.rb +45 -0
- data/lib/herb/visitor/diagnostics.rb +148 -0
- data/lib/herb/visitor/experimental.rb +33 -0
- data/lib/herb/visitor/parser_option_requirements.rb +151 -0
- data/lib/herb/visitor/stack.rb +192 -0
- data/lib/herb/visitor.rb +47 -1
- data/lib/herb/warnings.rb +25 -0
- data/lib/herb.rb +74 -63
- data/sig/herb/action_view/helper_registry.rbs +82 -10
- data/sig/herb/analysis/partial_declaration.rbs +80 -0
- data/sig/herb/analysis/partial_index.rbs +66 -0
- data/sig/herb/analysis/partial_resolution.rbs +57 -0
- data/sig/herb/analysis/partial_resolver.rbs +76 -0
- data/sig/herb/analysis/project_index.rbs +57 -0
- data/sig/herb/{action_view → analysis}/render_analyzer.rbs +25 -4
- data/sig/herb/analysis/render_graph/ancestor_chain.rbs +22 -0
- data/sig/herb/analysis/render_graph/builder.rbs +180 -0
- data/sig/herb/analysis/render_graph/call_frame.rbs +26 -0
- data/sig/herb/analysis/render_graph/call_site_location.rbs +28 -0
- data/sig/herb/analysis/render_graph/inferred_signature.rbs +27 -0
- data/sig/herb/analysis/render_graph/partial_call_site.rbs +36 -0
- data/sig/herb/analysis/render_graph/partial_context.rbs +31 -0
- data/sig/herb/analysis/render_graph/template_roots.rbs +32 -0
- data/sig/herb/analysis/render_graph.rbs +83 -0
- data/sig/herb/analysis/ruby_locals_index/local.rbs +21 -0
- data/sig/herb/analysis/ruby_locals_index/named_reference.rbs +20 -0
- data/sig/herb/analysis/ruby_locals_index/offset_table.rbs +26 -0
- data/sig/herb/analysis/ruby_locals_index/reference_collector.rbs +40 -0
- data/sig/herb/analysis/ruby_locals_index/state_locals.rbs +19 -0
- data/sig/herb/analysis/ruby_locals_index.rbs +62 -0
- data/sig/herb/analysis/ruby_reference.rbs +28 -0
- data/sig/herb/analysis/template_dependencies/dependency_collector.rbs +52 -0
- data/sig/herb/analysis/template_dependencies/node_dependency_collector.rbs +81 -0
- data/sig/herb/analysis/template_dependencies.rbs +125 -0
- data/sig/herb/ast/erb_render_node.rbs +10 -2
- data/sig/herb/ast/helpers.rbs +31 -1
- data/sig/herb/ast/herb_directive_node.rbs +13 -0
- data/sig/herb/ast/node.rbs +9 -0
- data/sig/herb/ast/nodes.rbs +662 -89
- data/sig/herb/backend.rbs +52 -0
- data/sig/herb/colors.rbs +3 -0
- data/sig/herb/configuration.rbs +27 -3
- data/sig/herb/dev/assets.rbs +27 -0
- data/sig/herb/dev/classifier.rbs +57 -0
- data/sig/herb/dev/embedded.rbs +21 -0
- data/sig/herb/dev/pipeline.rbs +118 -0
- data/sig/herb/dev/protocol.rbs +78 -0
- data/sig/herb/dev/runner.rbs +61 -23
- data/sig/herb/dev/server.rbs +49 -22
- data/sig/herb/dev/server_entry.rbs +46 -21
- data/sig/herb/dev/watcher.rbs +84 -0
- data/sig/herb/dev.rbs +58 -0
- data/sig/herb/diagnostic/formatter.rbs +28 -0
- data/sig/herb/diagnostic.rbs +88 -0
- data/sig/herb/diff/operation.rbs +36 -0
- data/sig/herb/diff/result.rbs +36 -0
- data/sig/herb/diff.rbs +6 -0
- data/sig/herb/engine/collector.rbs +48 -0
- data/sig/herb/engine/compiler.rbs +62 -23
- data/sig/herb/engine/component_tags/constant_resolver.rbs +19 -0
- data/sig/herb/engine/component_tags/partial_resolver.rbs +30 -0
- data/sig/herb/engine/component_tags/resolver.rbs +25 -0
- data/sig/herb/engine/component_tags/visitor.rbs +69 -0
- data/sig/herb/engine/css_inliner/inliner.rbs +65 -0
- data/sig/herb/engine/css_inliner/visitor.rbs +87 -0
- data/sig/herb/engine/errors.rbs +68 -0
- data/sig/herb/engine/helpers.rbs +28 -0
- data/sig/herb/engine/inline_render/inliner.rbs +39 -0
- data/sig/herb/engine/inline_render/visitor.rbs +104 -0
- data/sig/herb/engine/runtime/entry.rbs +43 -0
- data/sig/herb/engine/runtime/error_page.rbs +115 -0
- data/sig/herb/engine/runtime/html_safe_assertions.rbs +99 -0
- data/sig/herb/engine/runtime/journal/summary.rbs +172 -0
- data/sig/herb/engine/runtime/journal.rbs +126 -0
- data/sig/herb/engine/runtime/middleware.rbs +96 -0
- data/sig/herb/engine/runtime/observations.rbs +38 -0
- data/sig/herb/engine/runtime/report.rbs +97 -0
- data/sig/herb/engine/runtime/session.rbs +233 -0
- data/sig/herb/engine/runtime.rbs +14 -0
- data/sig/herb/engine/scoped_style/channel.rbs +45 -0
- data/sig/herb/engine/scoped_style/collector.rbs +45 -0
- data/sig/herb/engine/scoped_style/visitor.rbs +220 -0
- data/sig/herb/engine/slots/annotation.rbs +72 -0
- data/sig/herb/engine/slots/bindings.rbs +34 -0
- data/sig/herb/engine/slots/callee.rbs +62 -0
- data/sig/herb/engine/slots/component_definitions.rbs +19 -0
- data/sig/herb/engine/slots/components/async.rbs +20 -0
- data/sig/herb/engine/slots/components/base.rbs +60 -0
- data/sig/herb/engine/slots/components/deferred.rbs +29 -0
- data/sig/herb/engine/slots/components/fallback.rbs +21 -0
- data/sig/herb/engine/slots/components/fragment.rbs +34 -0
- data/sig/herb/engine/slots/components/lazy.rbs +20 -0
- data/sig/herb/engine/slots/components.rbs +30 -0
- data/sig/herb/engine/slots/dependencies/channel.rbs +51 -0
- data/sig/herb/engine/slots/dependencies.rbs +94 -0
- data/sig/herb/engine/slots/dynamics_compiler.rbs +349 -0
- data/sig/herb/engine/slots/identifier.rbs +19 -0
- data/sig/herb/engine/slots/manifest/channel.rbs +49 -0
- data/sig/herb/engine/slots/manifest/collector.rbs +45 -0
- data/sig/herb/engine/slots/markers.rbs +85 -0
- data/sig/herb/engine/slots/render_bindings.rbs +69 -0
- data/sig/herb/engine/slots/schema_compiler.rbs +62 -0
- data/sig/herb/engine/slots/state_anchor.rbs +41 -0
- data/sig/herb/engine/slots/state_compiler.rbs +258 -0
- data/sig/herb/engine/slots/state_directives.rbs +278 -0
- data/sig/herb/engine/slots/state_kinds.rbs +24 -0
- data/sig/herb/engine/slots/state_operators.rbs +19 -0
- data/sig/herb/engine/slots/state_overrides.rbs +33 -0
- data/sig/herb/engine/slots/state_predicates.rbs +16 -0
- data/sig/herb/engine/slots/state_transforms.rbs +15 -0
- data/sig/herb/engine/slots/statics.rbs +67 -0
- data/sig/herb/engine/slots/subtree.rbs +49 -0
- data/sig/herb/engine/slots/subtree_compiler.rbs +130 -0
- data/sig/herb/engine/slots/types.rbs +46 -0
- data/sig/herb/engine/slots/visitor.rbs +599 -0
- data/sig/herb/engine/validators/accessibility_validator.rbs +1 -1
- data/sig/herb/engine/validators/base.rbs +28 -0
- data/sig/herb/engine/validators/generator_template_validator.rbs +19 -0
- data/sig/herb/engine/validators/nesting_validator.rbs +1 -1
- data/sig/herb/engine/validators/render_validator.rbs +2 -6
- data/sig/herb/engine/validators/security_validator.rbs +1 -3
- data/sig/herb/engine/validators.rbs +21 -0
- data/sig/herb/engine/visitors/auto_close_omitted_tags_visitor.rbs +26 -0
- data/sig/herb/engine/visitors/content_for_visitor.rbs +52 -0
- data/sig/herb/engine/{debug_visitor.rbs → visitors/debug_visitor.rbs} +26 -15
- data/sig/herb/engine/visitors/html_safe_assertions_visitor.rbs +100 -0
- data/sig/herb/engine/visitors/instrumentation_visitor.rbs +111 -0
- data/sig/herb/engine/visitors/optimize_visitor.rbs +246 -0
- data/sig/herb/engine/visitors/remove_comments_visitor.rbs +66 -0
- data/sig/herb/engine/visitors/source_attribution_visitor.rbs +90 -0
- data/sig/herb/engine.rbs +47 -41
- data/sig/herb/ensure_installed.rbs +9 -0
- data/sig/herb/errors.rbs +293 -0
- data/sig/herb/fingerprint.rbs +37 -0
- data/sig/herb/html/elements.rbs +19 -0
- data/sig/herb/html/util.rbs +15 -1
- data/sig/herb/lex_result.rbs +0 -6
- data/sig/herb/locate.rbs +89 -0
- data/sig/herb/location.rbs +12 -0
- data/sig/herb/parse_result.rbs +10 -8
- data/sig/herb/parser_options.rbs +47 -21
- data/sig/herb/position.rbs +11 -0
- data/sig/herb/range.rbs +3 -0
- data/sig/herb/ruby_program.rbs +51 -0
- data/sig/herb/source_path.rbs +132 -0
- data/sig/herb/token.rbs +5 -2
- data/sig/herb/visitor/context/origin.rbs +51 -0
- data/sig/herb/visitor/context/replacements.rbs +39 -0
- data/sig/herb/visitor/context.rbs +83 -0
- data/sig/herb/visitor/context_aware.rbs +32 -0
- data/sig/herb/visitor/diagnostics.rbs +82 -0
- data/sig/herb/visitor/experimental.rbs +23 -0
- data/sig/herb/visitor/parser_option_requirements.rbs +76 -0
- data/sig/herb/visitor/stack.rbs +91 -0
- data/sig/herb/visitor.rbs +22 -0
- data/sig/herb/warnings.rbs +10 -0
- data/sig/herb.rbs +27 -10
- data/sig/serialized_ast_errors.rbs +58 -1
- data/sig/serialized_ast_nodes.rbs +58 -2
- data/src/analyze/action_view/attribute_extraction_helpers.c +73 -36
- data/src/analyze/action_view/generated_handlers.c +37 -1
- data/src/analyze/action_view/generated_handlers.h +2 -1
- data/src/analyze/action_view/helper_registry.c +1353 -58
- data/src/analyze/action_view/registry.c +10 -17
- data/src/analyze/action_view/stylesheet_link_tag.c +40 -0
- data/src/analyze/action_view/tag_helper_node_builders.c +57 -0
- data/src/analyze/action_view/tag_helpers.c +423 -93
- data/src/analyze/analyze.c +301 -64
- data/src/analyze/analyze_helpers.c +420 -23
- data/src/analyze/builders.c +79 -51
- data/src/analyze/conditional_elements.c +13 -8
- data/src/analyze/conditional_open_tags.c +11 -5
- data/src/analyze/control_type.c +16 -1
- data/src/analyze/herb_directives.c +701 -0
- data/src/analyze/invalid_structures.c +11 -7
- data/src/analyze/iteration_nodes.c +306 -0
- data/src/analyze/missing_end.c +116 -32
- data/src/analyze/parse_errors.c +8 -3
- data/src/analyze/postfix_conditionals.c +98 -63
- data/src/analyze/prism_annotate.c +13 -4
- data/src/analyze/render_nodes.c +345 -123
- data/src/analyze/strict_locals.c +30 -26
- data/src/analyze/ternary_conditionals.c +95 -70
- data/src/analyze/transform.c +43 -1
- data/src/ast/ast_node.c +3 -13
- data/src/ast/ast_nodes.c +911 -112
- data/src/ast/ast_pretty_print.c +161 -2
- data/src/diff/herb_diff.c +8 -0
- data/src/diff/herb_diff_attributes.c +1 -0
- data/src/diff/herb_diff_children.c +4 -3
- data/src/diff/herb_diff_helpers.c +7 -1
- data/src/diff/herb_diff_nodes.c +186 -71
- data/src/diff/herb_hash_tree.c +99 -1
- data/src/errors.c +1096 -128
- data/src/extract.c +30 -8
- data/src/herb.c +30 -11
- data/src/include/analyze/action_view/attribute_extraction_helpers.h +1 -1
- data/src/include/analyze/action_view/helper_registry.h +28 -4
- data/src/include/analyze/action_view/tag_helper_handler.h +1 -1
- data/src/include/analyze/action_view/tag_helper_node_builders.h +7 -0
- data/src/include/analyze/analyze.h +11 -0
- data/src/include/analyze/builders.h +16 -0
- data/src/include/analyze/helpers.h +23 -2
- data/src/include/analyze/herb_directive_kinds.h +41 -0
- data/src/include/analyze/herb_directives.h +14 -0
- data/src/include/analyze/iteration_nodes.h +11 -0
- data/src/include/analyze/prism_annotate.h +3 -3
- data/src/include/analyze/ternary_conditionals.h +2 -0
- data/src/include/ast/ast_node.h +1 -5
- data/src/include/ast/ast_nodes.h +76 -2
- data/src/include/ast/ast_pretty_print.h +1 -1
- data/src/include/diff/herb_diff.h +11 -0
- data/src/include/errors.h +156 -39
- data/src/include/extract.h +11 -0
- data/src/include/herb.h +6 -0
- data/src/include/lexer/erb_openers.h +29 -0
- data/src/include/lexer/lexer_peek_helpers.h +8 -1
- data/src/include/lexer/lexer_struct.h +4 -0
- data/src/include/lexer/token.h +3 -0
- data/src/include/lexer/token_struct.h +8 -6
- data/src/include/lib/hb_allocator.h +2 -1
- data/src/include/lib/hb_array.h +2 -0
- data/src/include/lib/hb_foreach.h +1 -1
- data/src/include/lib/hb_string.h +7 -0
- data/src/include/parser/dot_notation.h +1 -1
- data/src/include/parser/foreign_content_elements.h +32 -0
- data/src/include/parser/parser.h +16 -30
- data/src/include/parser/parser_helpers.h +13 -11
- data/src/include/parser/parser_options.h +41 -0
- data/src/include/prism/ruby_parser.h +6 -0
- data/src/include/util/html_elements.h +85 -0
- data/src/include/util/html_util.h +1 -0
- data/src/include/version.h +1 -1
- data/src/lexer/lexer_peek_helpers.c +15 -1
- data/src/lexer/token.c +83 -1
- data/src/lexer.c +196 -12
- data/src/lib/hb_allocator.c +2 -0
- data/src/lib/hb_array.c +26 -0
- data/src/lib/hb_string.c +26 -0
- data/src/main.c +1 -1
- data/src/parser/dot_notation.c +4 -3
- data/src/parser/match_tags.c +66 -1
- data/src/parser/parser_helpers.c +69 -37
- data/src/parser.c +606 -383
- data/src/parser_options_defaults.c +30 -0
- data/src/prism/prism_helpers.c +3 -0
- data/src/prism/ruby_parser.c +49 -0
- data/src/util/html_util.c +11 -58
- data/src/visitor.c +77 -1
- data/templates/ext/herb/error_helpers.c.erb +1 -1
- data/templates/ext/herb/nodes.c.erb +18 -13
- data/templates/ext/herb/nodes.h.erb +2 -1
- data/templates/ext/herb/parser_options_helpers.c.erb +69 -0
- data/templates/ext/herb/parser_options_helpers.h.erb +11 -0
- data/templates/java/nodes.c.erb +20 -16
- data/templates/java/nodes.h.erb +3 -2
- data/templates/java/org/herb/ParserOptions.java.erb +24 -0
- data/templates/java/org/herb/ast/HelperRegistry.java.erb +67 -31
- data/templates/java/org/herb/ast/HelperType.java.erb +29 -0
- data/templates/java/org/herb/ast/Nodes.java.erb +11 -7
- data/templates/java/parser_options_helpers.c.erb +45 -0
- data/templates/java/parser_options_helpers.h.erb +10 -0
- data/templates/javascript/packages/client/src/state-kinds.ts.erb +49 -0
- data/templates/javascript/packages/client/src/state-operators.ts.erb +15 -0
- data/templates/javascript/packages/client/src/state-predicates.ts.erb +27 -0
- data/templates/javascript/packages/client/src/state-transforms.ts.erb +19 -0
- data/templates/javascript/packages/core/src/action-view-helpers.ts.erb +47 -0
- data/templates/javascript/packages/core/src/built-in-components.ts.erb +67 -0
- data/templates/javascript/packages/core/src/errors.ts.erb +9 -3
- data/templates/javascript/packages/core/src/foreign-content-elements.ts.erb +18 -0
- data/templates/javascript/packages/core/src/html-constants.ts.erb +32 -0
- data/templates/javascript/packages/core/src/html-elements.ts.erb +41 -0
- data/templates/javascript/packages/core/src/node-type-guards.ts.erb +11 -7
- data/templates/javascript/packages/core/src/nodes.ts.erb +82 -19
- data/templates/javascript/packages/core/src/parser-options.ts.erb +41 -0
- data/templates/javascript/packages/core/src/visitor.ts.erb +1 -1
- data/templates/javascript/packages/node/extension/error_helpers.cpp.erb +3 -3
- data/templates/javascript/packages/node/extension/nodes.cpp.erb +17 -12
- data/templates/javascript/packages/node/extension/nodes.h.erb +3 -3
- data/templates/javascript/packages/node/extension/parser_options_helpers.cpp.erb +41 -0
- data/templates/javascript/packages/node/extension/parser_options_helpers.h.erb +12 -0
- data/templates/lib/herb/action_view/helper_registry.rb.erb +77 -3
- data/templates/lib/herb/ast/nodes.rb.erb +16 -6
- data/templates/lib/herb/engine/slots/component_definitions.rb.erb +38 -0
- data/templates/lib/herb/engine/slots/state_kinds.rb.erb +37 -0
- data/templates/lib/herb/engine/slots/state_operators.rb.erb +26 -0
- data/templates/lib/herb/engine/slots/state_predicates.rb.erb +39 -0
- data/templates/lib/herb/engine/slots/state_transforms.rb.erb +27 -0
- data/templates/lib/herb/errors.rb.erb +34 -6
- data/templates/lib/herb/html/elements.rb.erb +12 -0
- data/templates/lib/herb/parser_options.rb.erb +32 -0
- data/templates/lib/herb/visitor.rb.erb +7 -1
- data/templates/rust/herb-printer/src/printer_visitor.rs.erb +14 -0
- data/templates/rust/src/action_view_helpers.rs.erb +38 -0
- data/templates/rust/src/ast/nodes.rs.erb +24 -31
- data/templates/rust/src/errors.rs.erb +1 -1
- data/templates/rust/src/nodes.rs.erb +58 -26
- data/templates/rust/src/parser_options.rs.erb +16 -0
- data/templates/rust/src/prism/generated_deserialize.rs.erb +109 -0
- data/templates/rust/src/prism/generated_prettyprint.rs.erb +153 -0
- data/templates/rust/src/union_types.rs.erb +7 -1
- data/templates/rust/src/visitor.rs.erb +1 -1
- data/templates/src/analyze/action_view/helper_registry.c.erb +22 -0
- data/templates/src/analyze/missing_end.c.erb +13 -5
- data/templates/src/ast/ast_nodes.c.erb +41 -2
- data/templates/src/diff/herb_diff_nodes.c.erb +44 -8
- data/templates/src/errors.c.erb +8 -3
- data/templates/src/include/analyze/action_view/helper_registry.h.erb +19 -0
- data/templates/src/include/analyze/herb_directive_kinds.h.erb +25 -0
- data/templates/src/include/errors.h.erb +3 -1
- data/templates/src/include/parser/foreign_content_elements.h.erb +23 -0
- data/templates/src/include/parser/parser_options.h.erb +21 -0
- data/templates/src/include/util/html_elements.h.erb +28 -0
- data/templates/src/parser_options_defaults.c.erb +9 -0
- data/templates/template.rb +564 -9
- data/templates/wasm/error_helpers.cpp.erb +4 -4
- data/templates/wasm/nodes.cpp.erb +12 -12
- data/templates/wasm/nodes.h.erb +3 -3
- data/templates/wasm/parser_options_helpers.cpp.erb +25 -0
- data/templates/wasm/parser_options_helpers.h.erb +12 -0
- metadata +306 -27
- data/config/action_view_helpers/actionview/form_helper/button.yml +0 -38
- data/config/action_view_helpers/actionview/form_helper/submit.yml +0 -35
- data/lib/herb/ast.rb +0 -7
- data/lib/herb/diff_operation.rb +0 -34
- data/lib/herb/diff_result.rb +0 -59
- data/lib/herb/engine/error_formatter.rb +0 -432
- data/lib/herb/engine/parser_error_overlay.rb +0 -773
- data/lib/herb/engine/validation_error_overlay.rb +0 -182
- data/lib/herb/engine/validation_errors.rb +0 -65
- data/lib/herb/engine/validator.rb +0 -80
- data/sig/herb/ast.rbs +0 -6
- data/sig/herb/diff_operation.rbs +0 -34
- data/sig/herb/diff_result.rbs +0 -34
- data/sig/herb/engine/debug.rbs +0 -38
- data/sig/herb/engine/error_formatter.rbs +0 -47
- data/sig/herb/engine/parser_error_overlay.rbs +0 -41
- data/sig/herb/engine/validation_error_overlay.rbs +0 -35
- data/sig/herb/engine/validation_errors.rbs +0 -45
- data/sig/herb/engine/validator.rbs +0 -41
- data/sig/herb_c_extension.rbs +0 -10
|
@@ -21,10 +21,13 @@ typedef struct {
|
|
|
21
21
|
uint32_t previous_column;
|
|
22
22
|
char current_character;
|
|
23
23
|
lexer_state_T state;
|
|
24
|
+
bool in_erb_comment;
|
|
25
|
+
uint8_t malformed_erb_close_length;
|
|
24
26
|
} lexer_state_snapshot_T;
|
|
25
27
|
|
|
26
28
|
bool lexer_peek_for_doctype(const lexer_T* lexer, uint32_t offset);
|
|
27
29
|
bool lexer_peek_for_xml_declaration(const lexer_T* lexer, uint32_t offset);
|
|
30
|
+
bool lexer_peek_for_xml_processing_instruction(const lexer_T* lexer, uint32_t offset);
|
|
28
31
|
bool lexer_peek_for_cdata_start(const lexer_T* lexer, uint32_t offset);
|
|
29
32
|
bool lexer_peek_for_cdata_end(const lexer_T* lexer, uint32_t offset);
|
|
30
33
|
bool lexer_peek_for_html_comment_start(const lexer_T* lexer, uint32_t offset);
|
|
@@ -102,7 +105,9 @@ static inline lexer_state_snapshot_T lexer_save_state(lexer_T* lexer) {
|
|
|
102
105
|
.previous_line = lexer->previous_line,
|
|
103
106
|
.previous_column = lexer->previous_column,
|
|
104
107
|
.current_character = lexer->current_character,
|
|
105
|
-
.state = lexer->state
|
|
108
|
+
.state = lexer->state,
|
|
109
|
+
.in_erb_comment = lexer->in_erb_comment,
|
|
110
|
+
.malformed_erb_close_length = lexer->malformed_erb_close_length };
|
|
106
111
|
return snapshot;
|
|
107
112
|
}
|
|
108
113
|
|
|
@@ -115,6 +120,8 @@ static inline void lexer_restore_state(lexer_T* lexer, lexer_state_snapshot_T sn
|
|
|
115
120
|
lexer->previous_column = snapshot.previous_column;
|
|
116
121
|
lexer->current_character = snapshot.current_character;
|
|
117
122
|
lexer->state = snapshot.state;
|
|
123
|
+
lexer->in_erb_comment = snapshot.in_erb_comment;
|
|
124
|
+
lexer->malformed_erb_close_length = snapshot.malformed_erb_close_length;
|
|
118
125
|
}
|
|
119
126
|
|
|
120
127
|
#endif
|
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
|
|
4
4
|
#include "../lib/hb_allocator.h"
|
|
5
5
|
#include "../lib/hb_string.h"
|
|
6
|
+
#include "erb_openers.h"
|
|
6
7
|
|
|
7
8
|
#include <stdbool.h>
|
|
8
9
|
#include <stdint.h>
|
|
@@ -28,6 +29,9 @@ typedef struct LEXER_STRUCT {
|
|
|
28
29
|
|
|
29
30
|
char current_character;
|
|
30
31
|
lexer_state_T state;
|
|
32
|
+
erb_openers_T erb_openers;
|
|
33
|
+
bool in_erb_comment;
|
|
34
|
+
uint8_t malformed_erb_close_length;
|
|
31
35
|
uint32_t stall_counter;
|
|
32
36
|
uint32_t last_position;
|
|
33
37
|
bool stalled;
|
data/src/include/lexer/token.h
CHANGED
|
@@ -8,6 +8,8 @@
|
|
|
8
8
|
#include "token_struct.h"
|
|
9
9
|
|
|
10
10
|
#include <stdarg.h>
|
|
11
|
+
#include <stdbool.h>
|
|
12
|
+
#include <stdint.h>
|
|
11
13
|
|
|
12
14
|
token_T* token_init(hb_string_T value, token_type_T type, lexer_T* lexer);
|
|
13
15
|
hb_string_T token_to_string(hb_allocator_T* allocator, const token_T* token);
|
|
@@ -23,6 +25,7 @@ hb_string_T token_value(const token_T* token);
|
|
|
23
25
|
int token_type(const token_T* token);
|
|
24
26
|
|
|
25
27
|
token_T* token_copy(token_T* token, hb_allocator_T* allocator);
|
|
28
|
+
bool token_split(const token_T* token, uint32_t offset, hb_allocator_T* allocator, token_T** head, token_T** tail);
|
|
26
29
|
|
|
27
30
|
void token_free(token_T* token, hb_allocator_T* allocator);
|
|
28
31
|
|
|
@@ -13,11 +13,12 @@ typedef enum {
|
|
|
13
13
|
TOKEN_NEWLINE, // \n
|
|
14
14
|
TOKEN_IDENTIFIER,
|
|
15
15
|
|
|
16
|
-
TOKEN_HTML_DOCTYPE,
|
|
17
|
-
TOKEN_XML_DECLARATION,
|
|
18
|
-
TOKEN_XML_DECLARATION_END,
|
|
19
|
-
|
|
20
|
-
|
|
16
|
+
TOKEN_HTML_DOCTYPE, // <!DOCTYPE, <!doctype, <!DoCtYpE, <!dOcTyPe
|
|
17
|
+
TOKEN_XML_DECLARATION, // <?xml
|
|
18
|
+
TOKEN_XML_DECLARATION_END, // ?>
|
|
19
|
+
TOKEN_XML_PROCESSING_INSTRUCTION_START, // <?
|
|
20
|
+
TOKEN_CDATA_START, // <![CDATA[
|
|
21
|
+
TOKEN_CDATA_END, // ]]>
|
|
21
22
|
|
|
22
23
|
TOKEN_HTML_TAG_START, // <
|
|
23
24
|
TOKEN_HTML_TAG_START_CLOSE, // </
|
|
@@ -30,7 +31,7 @@ typedef enum {
|
|
|
30
31
|
|
|
31
32
|
TOKEN_ERB_START, // <%, <%=, <%%=, <%#, <%-, <%==, <%%
|
|
32
33
|
TOKEN_ERB_CONTENT, // Ruby Code
|
|
33
|
-
TOKEN_ERB_END, // %>, -%>,
|
|
34
|
+
TOKEN_ERB_END, // %>, -%>, =%>, %%>, and recovered: >, %, -%, =%, %%, "% >"
|
|
34
35
|
|
|
35
36
|
TOKEN_LT, // <
|
|
36
37
|
TOKEN_SLASH, // /
|
|
@@ -60,6 +61,7 @@ typedef struct TOKEN_STRUCT {
|
|
|
60
61
|
range_T range;
|
|
61
62
|
location_T location;
|
|
62
63
|
token_type_T type;
|
|
64
|
+
bool owns_value;
|
|
63
65
|
} token_T;
|
|
64
66
|
|
|
65
67
|
#endif
|
|
@@ -4,10 +4,11 @@
|
|
|
4
4
|
#include <stdbool.h>
|
|
5
5
|
#include <stddef.h>
|
|
6
6
|
|
|
7
|
+
#include "../macros.h"
|
|
7
8
|
#include "hb_arena.h"
|
|
8
9
|
|
|
9
10
|
#ifndef HB_ALLOCATOR_DEFAULT_ARENA_SIZE
|
|
10
|
-
# define HB_ALLOCATOR_DEFAULT_ARENA_SIZE (
|
|
11
|
+
# define HB_ALLOCATOR_DEFAULT_ARENA_SIZE KB(128)
|
|
11
12
|
#endif
|
|
12
13
|
|
|
13
14
|
typedef enum {
|
data/src/include/lib/hb_array.h
CHANGED
|
@@ -20,8 +20,10 @@ void* hb_array_first(hb_array_T* array);
|
|
|
20
20
|
void* hb_array_last(hb_array_T* array);
|
|
21
21
|
|
|
22
22
|
bool hb_array_append(hb_array_T* array, void* item);
|
|
23
|
+
bool hb_array_append_lazy(hb_array_T** array, void* item, struct hb_allocator* allocator);
|
|
23
24
|
void hb_array_set(const hb_array_T* array, size_t index, void* item);
|
|
24
25
|
void hb_array_free(hb_array_T** array);
|
|
26
|
+
void hb_array_replace_contents(hb_array_T* array, hb_array_T** source);
|
|
25
27
|
void hb_array_remove(hb_array_T* array, size_t index);
|
|
26
28
|
|
|
27
29
|
size_t hb_array_index_of(hb_array_T* array, void* item);
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
// NOTE: This file is generated by the templates/template.rb script and should not
|
|
2
|
-
// be modified manually. See
|
|
2
|
+
// be modified manually. See templates/src/include/lib/hb_foreach.h.erb
|
|
3
3
|
|
|
4
4
|
#ifndef HB_FOREACH_H
|
|
5
5
|
#define HB_FOREACH_H
|
data/src/include/lib/hb_string.h
CHANGED
|
@@ -59,6 +59,12 @@ static inline bool hb_string_equals_case_insensitive(hb_string_T a, hb_string_T
|
|
|
59
59
|
return strncasecmp(a.data, b.data, a.length) == 0;
|
|
60
60
|
}
|
|
61
61
|
|
|
62
|
+
static inline bool hb_string_contains_character(hb_string_T string, char character) {
|
|
63
|
+
if (hb_string_is_empty(string)) { return false; }
|
|
64
|
+
|
|
65
|
+
return memchr(string.data, character, string.length) != NULL;
|
|
66
|
+
}
|
|
67
|
+
|
|
62
68
|
static inline bool hb_string_starts_with(hb_string_T string, hb_string_T expected_prefix) {
|
|
63
69
|
if (hb_string_is_empty(string) || hb_string_is_empty(expected_prefix)) { return false; }
|
|
64
70
|
if (string.length < expected_prefix.length) { return false; }
|
|
@@ -72,6 +78,7 @@ hb_string_T hb_string_trim_start(hb_string_T string);
|
|
|
72
78
|
hb_string_T hb_string_trim_end(hb_string_T string);
|
|
73
79
|
hb_string_T hb_string_trim(hb_string_T string);
|
|
74
80
|
bool hb_string_is_blank(hb_string_T string);
|
|
81
|
+
bool hb_string_equals_collapsing_whitespace(hb_string_T a, hb_string_T b);
|
|
75
82
|
hb_string_T hb_string_copy(hb_string_T string, hb_allocator_T* allocator);
|
|
76
83
|
|
|
77
84
|
char* hb_string_to_c_string_using_malloc(hb_string_T string);
|
|
@@ -7,6 +7,6 @@
|
|
|
7
7
|
#include "parser.h"
|
|
8
8
|
|
|
9
9
|
bool parser_lookahead_is_valid_dot_notation_open_tag(parser_T* parser);
|
|
10
|
-
void parser_consume_dot_notation_segments(parser_T* parser, token_T* tag_name, hb_array_T
|
|
10
|
+
void parser_consume_dot_notation_segments(parser_T* parser, token_T* tag_name, hb_array_T** errors);
|
|
11
11
|
|
|
12
12
|
#endif
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
// NOTE: This file is generated by the templates/template.rb script and should not
|
|
2
|
+
// be modified manually. See templates/src/include/parser/foreign_content_elements.h.erb
|
|
3
|
+
|
|
4
|
+
#ifndef HERB_FOREIGN_CONTENT_ELEMENTS_H
|
|
5
|
+
#define HERB_FOREIGN_CONTENT_ELEMENTS_H
|
|
6
|
+
|
|
7
|
+
#include "parser.h"
|
|
8
|
+
|
|
9
|
+
#include <stdbool.h>
|
|
10
|
+
|
|
11
|
+
typedef struct {
|
|
12
|
+
const char* name;
|
|
13
|
+
foreign_content_kind_T kind;
|
|
14
|
+
bool has_end_tag;
|
|
15
|
+
bool html_only;
|
|
16
|
+
} foreign_content_element_T;
|
|
17
|
+
|
|
18
|
+
static const foreign_content_element_T FOREIGN_CONTENT_ELEMENTS[] = {
|
|
19
|
+
{ "script", FOREIGN_CONTENT_RAW_TEXT, true, false },
|
|
20
|
+
{ "style", FOREIGN_CONTENT_RAW_TEXT, true, false },
|
|
21
|
+
{ "iframe", FOREIGN_CONTENT_RAW_TEXT, true, false },
|
|
22
|
+
{ "xmp", FOREIGN_CONTENT_RAW_TEXT, true, false },
|
|
23
|
+
{ "noembed", FOREIGN_CONTENT_RAW_TEXT, true, false },
|
|
24
|
+
{ "noframes", FOREIGN_CONTENT_RAW_TEXT, true, false },
|
|
25
|
+
{ "plaintext", FOREIGN_CONTENT_RAW_TEXT, false, true },
|
|
26
|
+
{ "textarea", FOREIGN_CONTENT_RCDATA, true, false },
|
|
27
|
+
{ "title", FOREIGN_CONTENT_RCDATA, true, true },
|
|
28
|
+
};
|
|
29
|
+
|
|
30
|
+
#define FOREIGN_CONTENT_ELEMENTS_COUNT (sizeof(FOREIGN_CONTENT_ELEMENTS) / sizeof(FOREIGN_CONTENT_ELEMENTS[0]))
|
|
31
|
+
|
|
32
|
+
#endif
|
data/src/include/parser/parser.h
CHANGED
|
@@ -6,47 +6,29 @@
|
|
|
6
6
|
#include "../lib/hb_allocator.h"
|
|
7
7
|
#include "../lib/hb_array.h"
|
|
8
8
|
#include "../lib/hb_clock.h"
|
|
9
|
+
#include "parser_options.h"
|
|
9
10
|
|
|
10
|
-
#
|
|
11
|
+
#define HERB_MAX_FOREIGN_CONTENT_ELEMENTS 16
|
|
11
12
|
|
|
12
13
|
typedef enum {
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
// FOREIGN_CONTENT_TEMPLATE
|
|
18
|
-
} foreign_content_type_T;
|
|
14
|
+
FOREIGN_CONTENT_NONE = 0,
|
|
15
|
+
FOREIGN_CONTENT_RAW_TEXT,
|
|
16
|
+
FOREIGN_CONTENT_RCDATA,
|
|
17
|
+
} foreign_content_kind_T;
|
|
19
18
|
|
|
20
19
|
typedef enum { PARSER_STATE_DATA, PARSER_STATE_FOREIGN_CONTENT } parser_state_T;
|
|
21
20
|
|
|
22
|
-
typedef struct PARSER_OPTIONS_STRUCT {
|
|
23
|
-
bool track_whitespace;
|
|
24
|
-
bool analyze;
|
|
25
|
-
bool strict;
|
|
26
|
-
bool action_view_helpers;
|
|
27
|
-
bool transform_conditionals;
|
|
28
|
-
bool render_nodes;
|
|
29
|
-
bool strict_locals;
|
|
30
|
-
bool prism_program;
|
|
31
|
-
bool prism_nodes;
|
|
32
|
-
bool prism_nodes_deep;
|
|
33
|
-
bool dot_notation_tags;
|
|
34
|
-
bool html;
|
|
35
|
-
uint32_t start_line;
|
|
36
|
-
uint32_t start_column;
|
|
37
|
-
uint32_t timeout_ms;
|
|
38
|
-
uint32_t max_errors;
|
|
39
|
-
uint32_t* error_count;
|
|
40
|
-
uint64_t deadline_ms;
|
|
41
|
-
} parser_options_T;
|
|
42
|
-
|
|
43
21
|
typedef struct MATCH_TAGS_CONTEXT_STRUCT {
|
|
44
22
|
hb_array_T* errors;
|
|
45
23
|
const parser_options_T* options;
|
|
46
24
|
hb_allocator_T* allocator;
|
|
47
25
|
} match_tags_context_T;
|
|
48
26
|
|
|
49
|
-
|
|
27
|
+
static inline void lexer_apply_erb_openers(lexer_T* lexer, const parser_options_T* options) {
|
|
28
|
+
if (options == NULL || options->erb_openers == NULL) { return; }
|
|
29
|
+
|
|
30
|
+
lexer->erb_openers = (erb_openers_T) { .items = options->erb_openers, .count = options->erb_opener_count };
|
|
31
|
+
}
|
|
50
32
|
|
|
51
33
|
static inline bool parser_options_past_deadline(const parser_options_T* options) {
|
|
52
34
|
if (options == NULL || options->timeout_ms == 0) { return false; }
|
|
@@ -77,7 +59,11 @@ typedef struct PARSER_STRUCT {
|
|
|
77
59
|
token_T* current_token;
|
|
78
60
|
hb_array_T* open_tags_stack;
|
|
79
61
|
parser_state_T state;
|
|
80
|
-
|
|
62
|
+
foreign_content_kind_T foreign_content_kind;
|
|
63
|
+
hb_string_T foreign_content_tag_name;
|
|
64
|
+
size_t svg_depth;
|
|
65
|
+
bool xml_document;
|
|
66
|
+
uint32_t foreign_content_absent_from[HERB_MAX_FOREIGN_CONTENT_ELEMENTS];
|
|
81
67
|
parser_options_T options;
|
|
82
68
|
size_t consecutive_error_count;
|
|
83
69
|
bool in_recovery_mode;
|
|
@@ -15,7 +15,7 @@ token_T* parser_pop_open_tag(const parser_T* parser);
|
|
|
15
15
|
|
|
16
16
|
void parser_append_unexpected_error_impl(
|
|
17
17
|
parser_T* parser,
|
|
18
|
-
hb_array_T
|
|
18
|
+
hb_array_T** errors,
|
|
19
19
|
const char* description,
|
|
20
20
|
token_type_T first_token,
|
|
21
21
|
...
|
|
@@ -25,11 +25,11 @@ void parser_append_unexpected_error_impl(
|
|
|
25
25
|
|
|
26
26
|
void parser_append_unexpected_error_string(
|
|
27
27
|
parser_T* parser,
|
|
28
|
-
hb_array_T
|
|
28
|
+
hb_array_T** errors,
|
|
29
29
|
const char* description,
|
|
30
30
|
const char* expected
|
|
31
31
|
);
|
|
32
|
-
void parser_append_unexpected_token_error(parser_T* parser, token_type_T expected_type, hb_array_T
|
|
32
|
+
void parser_append_unexpected_token_error(parser_T* parser, token_type_T expected_type, hb_array_T** errors);
|
|
33
33
|
|
|
34
34
|
void parser_append_literal_node_from_buffer(
|
|
35
35
|
const parser_T* parser,
|
|
@@ -40,32 +40,34 @@ void parser_append_literal_node_from_buffer(
|
|
|
40
40
|
|
|
41
41
|
bool parser_in_svg_context(const parser_T* parser);
|
|
42
42
|
|
|
43
|
-
|
|
43
|
+
foreign_content_kind_T parser_get_foreign_content_kind(hb_string_T tag_name);
|
|
44
44
|
bool parser_is_foreign_content_tag(hb_string_T tag_name);
|
|
45
|
-
|
|
45
|
+
bool parser_foreign_content_has_end_tag(hb_string_T tag_name);
|
|
46
|
+
bool parser_foreign_content_is_html_only(hb_string_T tag_name);
|
|
47
|
+
int parser_foreign_content_element_index(hb_string_T tag_name);
|
|
46
48
|
|
|
47
|
-
void parser_enter_foreign_content(parser_T* parser,
|
|
49
|
+
void parser_enter_foreign_content(parser_T* parser, foreign_content_kind_T kind, hb_string_T tag_name);
|
|
48
50
|
void parser_exit_foreign_content(parser_T* parser);
|
|
49
51
|
|
|
50
|
-
bool
|
|
52
|
+
bool parser_is_foreign_content_closing_tag_name(const parser_T* parser, hb_string_T tag_name);
|
|
51
53
|
|
|
52
54
|
token_T* parser_advance(parser_T* parser);
|
|
53
55
|
token_T* parser_consume_if_present(parser_T* parser, token_type_T type);
|
|
54
|
-
token_T* parser_consume_expected(parser_T* parser, token_type_T type, hb_array_T
|
|
56
|
+
token_T* parser_consume_expected(parser_T* parser, token_type_T type, hb_array_T** array);
|
|
55
57
|
|
|
56
58
|
AST_HTML_ELEMENT_NODE_T* parser_handle_missing_close_tag(
|
|
57
59
|
parser_T* parser,
|
|
58
60
|
AST_HTML_OPEN_TAG_NODE_T* open_tag,
|
|
59
61
|
hb_array_T* body,
|
|
60
|
-
hb_array_T
|
|
62
|
+
hb_array_T** errors
|
|
61
63
|
);
|
|
62
64
|
void parser_handle_mismatched_tags(
|
|
63
65
|
const parser_T* parser,
|
|
64
66
|
const AST_HTML_CLOSE_TAG_NODE_T* close_tag,
|
|
65
|
-
hb_array_T
|
|
67
|
+
hb_array_T** errors
|
|
66
68
|
);
|
|
67
69
|
|
|
68
|
-
void parser_synchronize(parser_T* parser, hb_array_T
|
|
70
|
+
void parser_synchronize(parser_T* parser, hb_array_T** errors);
|
|
69
71
|
|
|
70
72
|
bool parser_can_close_ancestor(const parser_T* parser, hb_string_T tag_name);
|
|
71
73
|
size_t parser_find_ancestor_depth(const parser_T* parser, hb_string_T tag_name);
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
// NOTE: This file is generated by the templates/template.rb script and should not
|
|
2
|
+
// be modified manually. See templates/src/include/parser/parser_options.h.erb
|
|
3
|
+
|
|
4
|
+
#ifndef HERB_PARSER_OPTIONS_H
|
|
5
|
+
#define HERB_PARSER_OPTIONS_H
|
|
6
|
+
|
|
7
|
+
#include "../lib/hb_string.h"
|
|
8
|
+
|
|
9
|
+
#include <stdbool.h>
|
|
10
|
+
#include <stddef.h>
|
|
11
|
+
#include <stdint.h>
|
|
12
|
+
|
|
13
|
+
typedef struct PARSER_OPTIONS_STRUCT {
|
|
14
|
+
bool action_view_helpers;
|
|
15
|
+
bool analyze;
|
|
16
|
+
bool dot_notation_tags;
|
|
17
|
+
const hb_string_T* erb_openers;
|
|
18
|
+
size_t erb_opener_count;
|
|
19
|
+
bool herb_directives;
|
|
20
|
+
bool html;
|
|
21
|
+
bool iteration_nodes;
|
|
22
|
+
uint32_t max_errors;
|
|
23
|
+
bool prism_nodes;
|
|
24
|
+
bool prism_nodes_deep;
|
|
25
|
+
bool prism_program;
|
|
26
|
+
bool render_nodes;
|
|
27
|
+
bool strict;
|
|
28
|
+
bool strict_locals;
|
|
29
|
+
uint32_t timeout_ms;
|
|
30
|
+
bool track_locations;
|
|
31
|
+
bool track_whitespace;
|
|
32
|
+
bool transform_conditionals;
|
|
33
|
+
uint64_t deadline_ms;
|
|
34
|
+
uint32_t* error_count;
|
|
35
|
+
uint32_t start_column;
|
|
36
|
+
uint32_t start_line;
|
|
37
|
+
} parser_options_T;
|
|
38
|
+
|
|
39
|
+
extern const parser_options_T HERB_DEFAULT_PARSER_OPTIONS;
|
|
40
|
+
|
|
41
|
+
#endif
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
// NOTE: This file is generated by the templates/template.rb script and should not
|
|
2
|
+
// be modified manually. See templates/src/include/util/html_elements.h.erb
|
|
3
|
+
|
|
4
|
+
#ifndef HERB_HTML_ELEMENTS_H
|
|
5
|
+
#define HERB_HTML_ELEMENTS_H
|
|
6
|
+
|
|
7
|
+
#include "../lib/hb_string.h"
|
|
8
|
+
|
|
9
|
+
// https://developer.mozilla.org/en-US/docs/Glossary/Void_element
|
|
10
|
+
static hb_string_T void_tags[] = HB_STRING_LIST(
|
|
11
|
+
"area",
|
|
12
|
+
"base",
|
|
13
|
+
"basefont",
|
|
14
|
+
"bgsound",
|
|
15
|
+
"br",
|
|
16
|
+
"col",
|
|
17
|
+
"embed",
|
|
18
|
+
"frame",
|
|
19
|
+
"hr",
|
|
20
|
+
"img",
|
|
21
|
+
"input",
|
|
22
|
+
"keygen",
|
|
23
|
+
"link",
|
|
24
|
+
"meta",
|
|
25
|
+
"param",
|
|
26
|
+
"source",
|
|
27
|
+
"track",
|
|
28
|
+
"wbr"
|
|
29
|
+
);
|
|
30
|
+
|
|
31
|
+
// https://html.spec.whatwg.org/multipage/common-microsyntaxes.html#boolean-attributes
|
|
32
|
+
static hb_string_T boolean_attributes[] = HB_STRING_LIST(
|
|
33
|
+
"allowfullscreen",
|
|
34
|
+
"async",
|
|
35
|
+
"autofocus",
|
|
36
|
+
"autoplay",
|
|
37
|
+
"checked",
|
|
38
|
+
"compact",
|
|
39
|
+
"controls",
|
|
40
|
+
"declare",
|
|
41
|
+
"default",
|
|
42
|
+
"defer",
|
|
43
|
+
"disabled",
|
|
44
|
+
"formnovalidate",
|
|
45
|
+
"hidden",
|
|
46
|
+
"inert",
|
|
47
|
+
"ismap",
|
|
48
|
+
"itemscope",
|
|
49
|
+
"loop",
|
|
50
|
+
"multiple",
|
|
51
|
+
"muted",
|
|
52
|
+
"nomodule",
|
|
53
|
+
"nohref",
|
|
54
|
+
"noresize",
|
|
55
|
+
"noshade",
|
|
56
|
+
"novalidate",
|
|
57
|
+
"nowrap",
|
|
58
|
+
"open",
|
|
59
|
+
"playsinline",
|
|
60
|
+
"readonly",
|
|
61
|
+
"required",
|
|
62
|
+
"reversed",
|
|
63
|
+
"scoped",
|
|
64
|
+
"seamless",
|
|
65
|
+
"selected",
|
|
66
|
+
"sortable",
|
|
67
|
+
"truespeed",
|
|
68
|
+
"typemustmatch"
|
|
69
|
+
);
|
|
70
|
+
|
|
71
|
+
// https://html.spec.whatwg.org/multipage/rendering.html#the-page
|
|
72
|
+
static hb_string_T whitespace_preserving_tags[] = HB_STRING_LIST(
|
|
73
|
+
"iframe",
|
|
74
|
+
"listing",
|
|
75
|
+
"noembed",
|
|
76
|
+
"noframes",
|
|
77
|
+
"plaintext",
|
|
78
|
+
"pre",
|
|
79
|
+
"script",
|
|
80
|
+
"style",
|
|
81
|
+
"textarea",
|
|
82
|
+
"xmp"
|
|
83
|
+
);
|
|
84
|
+
|
|
85
|
+
#endif
|
|
@@ -7,6 +7,7 @@
|
|
|
7
7
|
struct hb_allocator;
|
|
8
8
|
|
|
9
9
|
bool is_void_element(hb_string_T tag_name);
|
|
10
|
+
bool is_whitespace_preserving_element(hb_string_T tag_name);
|
|
10
11
|
bool is_boolean_attribute(hb_string_T attribute_name);
|
|
11
12
|
bool has_optional_end_tag(hb_string_T tag_name);
|
|
12
13
|
bool should_implicitly_close(hb_string_T open_tag_name, hb_string_T next_tag_name);
|
data/src/include/version.h
CHANGED
|
@@ -19,8 +19,22 @@ bool lexer_peek_for_doctype(const lexer_T* lexer, uint32_t offset) {
|
|
|
19
19
|
return lexer_peek_for(lexer, offset, hb_string("<!DOCTYPE"), true);
|
|
20
20
|
}
|
|
21
21
|
|
|
22
|
+
static bool is_xml_name_character(char character) {
|
|
23
|
+
return isalnum(character) || character == '-' || character == '_' || character == ':' || character == '.';
|
|
24
|
+
}
|
|
25
|
+
|
|
22
26
|
bool lexer_peek_for_xml_declaration(const lexer_T* lexer, uint32_t offset) {
|
|
23
|
-
|
|
27
|
+
hb_string_T pattern = hb_string("<?xml");
|
|
28
|
+
|
|
29
|
+
if (!lexer_peek_for(lexer, offset, pattern, true)) { return false; }
|
|
30
|
+
|
|
31
|
+
return !is_xml_name_character(lexer_peek(lexer, offset + pattern.length));
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
bool lexer_peek_for_xml_processing_instruction(const lexer_T* lexer, uint32_t offset) {
|
|
35
|
+
if (lexer_peek(lexer, offset) != '<' || lexer_peek(lexer, offset + 1) != '?') { return false; }
|
|
36
|
+
|
|
37
|
+
return isalpha(lexer_peek(lexer, offset + 2));
|
|
24
38
|
}
|
|
25
39
|
|
|
26
40
|
bool lexer_peek_for_cdata_start(const lexer_T* lexer, uint32_t offset) {
|
data/src/lexer/token.c
CHANGED
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
#include "../include/lib/hb_string.h"
|
|
6
6
|
#include "../include/location/position.h"
|
|
7
7
|
#include "../include/location/range.h"
|
|
8
|
+
#include "../include/util/utf8.h"
|
|
8
9
|
#include "../include/util/util.h"
|
|
9
10
|
|
|
10
11
|
#include <stdarg.h>
|
|
@@ -25,6 +26,7 @@ token_T* token_init(hb_string_T value, const token_type_T type, lexer_T* lexer)
|
|
|
25
26
|
}
|
|
26
27
|
|
|
27
28
|
token->value = value;
|
|
29
|
+
token->owns_value = false;
|
|
28
30
|
|
|
29
31
|
token->type = type;
|
|
30
32
|
token->range = (range_T) { .from = lexer->previous_position, .to = lexer->current_position };
|
|
@@ -53,6 +55,7 @@ hb_string_T token_type_to_string(const token_type_T type) {
|
|
|
53
55
|
case TOKEN_HTML_DOCTYPE: return hb_string("TOKEN_HTML_DOCTYPE");
|
|
54
56
|
case TOKEN_XML_DECLARATION: return hb_string("TOKEN_XML_DECLARATION");
|
|
55
57
|
case TOKEN_XML_DECLARATION_END: return hb_string("TOKEN_XML_DECLARATION_END");
|
|
58
|
+
case TOKEN_XML_PROCESSING_INSTRUCTION_START: return hb_string("TOKEN_XML_PROCESSING_INSTRUCTION_START");
|
|
56
59
|
case TOKEN_CDATA_START: return hb_string("TOKEN_CDATA_START");
|
|
57
60
|
case TOKEN_CDATA_END: return hb_string("TOKEN_CDATA_END");
|
|
58
61
|
case TOKEN_HTML_TAG_START: return hb_string("TOKEN_HTML_TAG_START");
|
|
@@ -94,6 +97,7 @@ hb_string_T token_type_to_friendly_string(const token_type_T type) {
|
|
|
94
97
|
case TOKEN_HTML_DOCTYPE: return hb_string("`<!DOCTYPE`");
|
|
95
98
|
case TOKEN_XML_DECLARATION: return hb_string("`<?xml`");
|
|
96
99
|
case TOKEN_XML_DECLARATION_END: return hb_string("`?>`");
|
|
100
|
+
case TOKEN_XML_PROCESSING_INSTRUCTION_START: return hb_string("`<?`");
|
|
97
101
|
case TOKEN_CDATA_START: return hb_string("`<![CDATA[`");
|
|
98
102
|
case TOKEN_CDATA_END: return hb_string("`]]>`");
|
|
99
103
|
case TOKEN_HTML_TAG_START: return hb_string("`<`");
|
|
@@ -215,7 +219,8 @@ token_T* token_copy(token_T* token, hb_allocator_T* allocator) {
|
|
|
215
219
|
|
|
216
220
|
if (!new_token) { return NULL; }
|
|
217
221
|
|
|
218
|
-
new_token->value = token->value;
|
|
222
|
+
new_token->value = token->owns_value ? hb_string_copy(token->value, allocator) : token->value;
|
|
223
|
+
new_token->owns_value = token->owns_value;
|
|
219
224
|
|
|
220
225
|
new_token->type = token->type;
|
|
221
226
|
new_token->range = token->range;
|
|
@@ -224,6 +229,81 @@ token_T* token_copy(token_T* token, hb_allocator_T* allocator) {
|
|
|
224
229
|
return new_token;
|
|
225
230
|
}
|
|
226
231
|
|
|
232
|
+
static position_T token_position_after(position_T position, hb_string_T value, uint32_t offset) {
|
|
233
|
+
uint32_t index = 0;
|
|
234
|
+
|
|
235
|
+
while (index < offset && index < value.length) {
|
|
236
|
+
if (is_newline(value.data[index])) {
|
|
237
|
+
position.line++;
|
|
238
|
+
position.column = 0;
|
|
239
|
+
index++;
|
|
240
|
+
|
|
241
|
+
continue;
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
position.column++;
|
|
245
|
+
index += utf8_sequence_length(hb_string_slice(value, index));
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
return position;
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
static token_T* token_from_slice(
|
|
252
|
+
const token_T* token,
|
|
253
|
+
hb_string_T value,
|
|
254
|
+
uint32_t offset,
|
|
255
|
+
position_T start,
|
|
256
|
+
position_T end,
|
|
257
|
+
hb_allocator_T* allocator
|
|
258
|
+
) {
|
|
259
|
+
token_T* slice = hb_allocator_alloc(allocator, sizeof(token_T));
|
|
260
|
+
|
|
261
|
+
if (!slice) { return NULL; }
|
|
262
|
+
|
|
263
|
+
slice->value = token->owns_value ? hb_string_copy(value, allocator) : value;
|
|
264
|
+
slice->owns_value = token->owns_value;
|
|
265
|
+
|
|
266
|
+
slice->type = token->type;
|
|
267
|
+
slice->range = (range_T) { .from = token->range.from + offset, .to = token->range.from + offset + value.length };
|
|
268
|
+
|
|
269
|
+
location_from_positions(&slice->location, start, end);
|
|
270
|
+
|
|
271
|
+
return slice;
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
bool token_split(
|
|
275
|
+
const token_T* token,
|
|
276
|
+
const uint32_t offset,
|
|
277
|
+
hb_allocator_T* allocator,
|
|
278
|
+
token_T** head,
|
|
279
|
+
token_T** tail
|
|
280
|
+
) {
|
|
281
|
+
if (!token || !head || !tail) { return false; }
|
|
282
|
+
if (offset == 0 || offset >= token->value.length) { return false; }
|
|
283
|
+
if (utf8_is_valid_continuation_byte((unsigned char) token->value.data[offset])) { return false; }
|
|
284
|
+
|
|
285
|
+
const position_T split = token_position_after(token->location.start, token->value, offset);
|
|
286
|
+
|
|
287
|
+
token_T* head_token =
|
|
288
|
+
token_from_slice(token, hb_string_range(token->value, 0, offset), 0, token->location.start, split, allocator);
|
|
289
|
+
|
|
290
|
+
if (!head_token) { return false; }
|
|
291
|
+
|
|
292
|
+
token_T* tail_token =
|
|
293
|
+
token_from_slice(token, hb_string_slice(token->value, offset), offset, split, token->location.end, allocator);
|
|
294
|
+
|
|
295
|
+
if (!tail_token) {
|
|
296
|
+
token_free(head_token, allocator);
|
|
297
|
+
|
|
298
|
+
return false;
|
|
299
|
+
}
|
|
300
|
+
|
|
301
|
+
*head = head_token;
|
|
302
|
+
*tail = tail_token;
|
|
303
|
+
|
|
304
|
+
return true;
|
|
305
|
+
}
|
|
306
|
+
|
|
227
307
|
bool token_value_empty(const token_T* token) {
|
|
228
308
|
return token == NULL || hb_string_is_empty(token->value);
|
|
229
309
|
}
|
|
@@ -237,5 +317,7 @@ bool token_is_escaped_erb_tag_opening(const token_T* token) {
|
|
|
237
317
|
void token_free(token_T* token, hb_allocator_T* allocator) {
|
|
238
318
|
if (!token) { return; }
|
|
239
319
|
|
|
320
|
+
if (token->owns_value) { hb_allocator_dealloc(allocator, (void*) token->value.data); }
|
|
321
|
+
|
|
240
322
|
hb_allocator_dealloc(allocator, token);
|
|
241
323
|
}
|