herb 0.10.3-x86-linux-gnu → 0.11.0-x86-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.
Files changed (788) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +16 -6
  3. data/README.md +36 -119
  4. data/Rakefile +2 -11
  5. data/config/action_view_helpers/actioncable/action_cable_helper/action_cable_meta_tag.yml +12 -8
  6. data/config/action_view_helpers/actionpack/content_security_policy/content_security_policy?.yml +9 -6
  7. data/config/action_view_helpers/actionpack/content_security_policy/content_security_policy_nonce.yml +9 -6
  8. data/config/action_view_helpers/actionpack/polymorphic_routes/polymorphic_path.yml +20 -12
  9. data/config/action_view_helpers/actionpack/polymorphic_routes/polymorphic_url.yml +30 -18
  10. data/config/action_view_helpers/actionpack/request_forgery_protection/form_authenticity_token.yml +15 -9
  11. data/config/action_view_helpers/actionpack/request_forgery_protection/protect_against_forgery?.yml +9 -6
  12. data/config/action_view_helpers/actiontext/content_helper/render_action_text_content.yml +15 -9
  13. data/config/action_view_helpers/actiontext/content_helper/sanitize_action_text_content.yml +15 -9
  14. data/config/action_view_helpers/actiontext/tag_helper/rich_textarea_tag.yml +34 -22
  15. data/config/action_view_helpers/actionview/active_model_helper/error_message.yml +9 -6
  16. data/config/action_view_helpers/actionview/active_model_helper/error_wrapping.yml +9 -6
  17. data/config/action_view_helpers/actionview/active_model_helper/object.yml +9 -6
  18. data/config/action_view_helpers/actionview/asset_tag_helper/apply_stylesheet_media_default.yml +9 -6
  19. data/config/action_view_helpers/actionview/asset_tag_helper/audio_tag.yml +40 -27
  20. data/config/action_view_helpers/actionview/asset_tag_helper/auto_discovery_link_tag.yml +37 -23
  21. data/config/action_view_helpers/actionview/asset_tag_helper/auto_include_nonce.yml +9 -6
  22. data/config/action_view_helpers/actionview/asset_tag_helper/auto_include_nonce_for_scripts.yml +9 -6
  23. data/config/action_view_helpers/actionview/asset_tag_helper/auto_include_nonce_for_styles.yml +9 -6
  24. data/config/action_view_helpers/actionview/asset_tag_helper/favicon_link_tag.yml +32 -22
  25. data/config/action_view_helpers/actionview/asset_tag_helper/image_decoding.yml +9 -6
  26. data/config/action_view_helpers/actionview/asset_tag_helper/image_loading.yml +9 -6
  27. data/config/action_view_helpers/actionview/asset_tag_helper/image_tag.yml +67 -46
  28. data/config/action_view_helpers/actionview/asset_tag_helper/javascript_include_tag.yml +58 -39
  29. data/config/action_view_helpers/actionview/asset_tag_helper/picture_tag.yml +22 -14
  30. data/config/action_view_helpers/actionview/asset_tag_helper/preload_link_tag.yml +45 -30
  31. data/config/action_view_helpers/actionview/asset_tag_helper/preload_links_header.yml +9 -6
  32. data/config/action_view_helpers/actionview/asset_tag_helper/stylesheet_link_tag.yml +49 -30
  33. data/config/action_view_helpers/actionview/asset_tag_helper/video_tag.yml +53 -35
  34. data/config/action_view_helpers/actionview/asset_url_helper/asset_path.yml +16 -10
  35. data/config/action_view_helpers/actionview/asset_url_helper/asset_url.yml +16 -10
  36. data/config/action_view_helpers/actionview/asset_url_helper/audio_path.yml +16 -10
  37. data/config/action_view_helpers/actionview/asset_url_helper/audio_url.yml +16 -10
  38. data/config/action_view_helpers/actionview/asset_url_helper/compute_asset_extname.yml +9 -6
  39. data/config/action_view_helpers/actionview/asset_url_helper/compute_asset_host.yml +9 -6
  40. data/config/action_view_helpers/actionview/asset_url_helper/compute_asset_path.yml +9 -6
  41. data/config/action_view_helpers/actionview/asset_url_helper/font_path.yml +16 -10
  42. data/config/action_view_helpers/actionview/asset_url_helper/font_url.yml +16 -10
  43. data/config/action_view_helpers/actionview/asset_url_helper/image_path.yml +16 -10
  44. data/config/action_view_helpers/actionview/asset_url_helper/image_url.yml +16 -10
  45. data/config/action_view_helpers/actionview/asset_url_helper/javascript_path.yml +16 -10
  46. data/config/action_view_helpers/actionview/asset_url_helper/javascript_url.yml +16 -10
  47. data/config/action_view_helpers/actionview/asset_url_helper/public_compute_asset_path.yml +9 -6
  48. data/config/action_view_helpers/actionview/asset_url_helper/stylesheet_path.yml +16 -10
  49. data/config/action_view_helpers/actionview/asset_url_helper/stylesheet_url.yml +16 -10
  50. data/config/action_view_helpers/actionview/asset_url_helper/video_path.yml +16 -10
  51. data/config/action_view_helpers/actionview/asset_url_helper/video_url.yml +16 -10
  52. data/config/action_view_helpers/actionview/atom_feed_helper/atom_feed.yml +52 -27
  53. data/config/action_view_helpers/actionview/cache_helper/cache.yml +25 -15
  54. data/config/action_view_helpers/actionview/cache_helper/cache_fragment_name.yml +9 -6
  55. data/config/action_view_helpers/actionview/cache_helper/cache_if.yml +20 -12
  56. data/config/action_view_helpers/actionview/cache_helper/cache_unless.yml +20 -12
  57. data/config/action_view_helpers/actionview/cache_helper/caching_predicate.yml +9 -6
  58. data/config/action_view_helpers/actionview/cache_helper/digest_path_from_template.yml +9 -6
  59. data/config/action_view_helpers/actionview/cache_helper/fragment_for.yml +9 -6
  60. data/config/action_view_helpers/actionview/cache_helper/fragment_name_with_digest.yml +9 -6
  61. data/config/action_view_helpers/actionview/cache_helper/read_fragment_for.yml +9 -6
  62. data/config/action_view_helpers/actionview/cache_helper/uncacheable.yml +9 -6
  63. data/config/action_view_helpers/actionview/cache_helper/write_fragment_for.yml +9 -6
  64. data/config/action_view_helpers/actionview/capture_helper/capture.yml +9 -6
  65. data/config/action_view_helpers/actionview/capture_helper/content_for.yml +20 -12
  66. data/config/action_view_helpers/actionview/capture_helper/content_for_predicate.yml +15 -9
  67. data/config/action_view_helpers/actionview/capture_helper/provide.yml +15 -9
  68. data/config/action_view_helpers/actionview/capture_helper/with_output_buffer.yml +9 -6
  69. data/config/action_view_helpers/actionview/content_exfiltration_prevention_helper/prepend_content_exfiltration_prevention.yml +9 -6
  70. data/config/action_view_helpers/actionview/content_exfiltration_prevention_helper/prevent_content_exfiltration.yml +9 -6
  71. data/config/action_view_helpers/actionview/controller_helper/action_name.yml +9 -6
  72. data/config/action_view_helpers/actionview/controller_helper/assign_controller.yml +9 -6
  73. data/config/action_view_helpers/actionview/controller_helper/controller.yml +9 -6
  74. data/config/action_view_helpers/actionview/controller_helper/controller_name.yml +9 -6
  75. data/config/action_view_helpers/actionview/controller_helper/controller_path.yml +9 -6
  76. data/config/action_view_helpers/actionview/controller_helper/cookies.yml +9 -6
  77. data/config/action_view_helpers/actionview/controller_helper/flash.yml +9 -6
  78. data/config/action_view_helpers/actionview/controller_helper/headers.yml +9 -6
  79. data/config/action_view_helpers/actionview/controller_helper/logger.yml +9 -6
  80. data/config/action_view_helpers/actionview/controller_helper/params.yml +9 -6
  81. data/config/action_view_helpers/actionview/controller_helper/request.yml +9 -6
  82. data/config/action_view_helpers/actionview/controller_helper/request_forgery_protection_token.yml +9 -6
  83. data/config/action_view_helpers/actionview/controller_helper/response.yml +9 -6
  84. data/config/action_view_helpers/actionview/controller_helper/session.yml +9 -6
  85. data/config/action_view_helpers/actionview/csp_helper/csp_meta_tag.yml +18 -11
  86. data/config/action_view_helpers/actionview/csrf_helper/csrf_meta_tags.yml +16 -10
  87. data/config/action_view_helpers/actionview/date_helper/date_select.yml +85 -51
  88. data/config/action_view_helpers/actionview/date_helper/datetime_select.yml +65 -39
  89. data/config/action_view_helpers/actionview/date_helper/distance_of_time_in_words.yml +30 -18
  90. data/config/action_view_helpers/actionview/date_helper/relative_time_in_words.yml +35 -21
  91. data/config/action_view_helpers/actionview/date_helper/select_date.yml +50 -30
  92. data/config/action_view_helpers/actionview/date_helper/select_datetime.yml +65 -39
  93. data/config/action_view_helpers/actionview/date_helper/select_day.yml +40 -24
  94. data/config/action_view_helpers/actionview/date_helper/select_hour.yml +50 -30
  95. data/config/action_view_helpers/actionview/date_helper/select_minute.yml +40 -24
  96. data/config/action_view_helpers/actionview/date_helper/select_month.yml +60 -36
  97. data/config/action_view_helpers/actionview/date_helper/select_second.yml +35 -21
  98. data/config/action_view_helpers/actionview/date_helper/select_time.yml +55 -33
  99. data/config/action_view_helpers/actionview/date_helper/select_year.yml +45 -27
  100. data/config/action_view_helpers/actionview/date_helper/time_ago_in_words.yml +21 -13
  101. data/config/action_view_helpers/actionview/date_helper/time_select.yml +60 -36
  102. data/config/action_view_helpers/actionview/date_helper/time_tag.yml +32 -20
  103. data/config/action_view_helpers/actionview/debug_helper/debug.yml +15 -9
  104. data/config/action_view_helpers/actionview/form_builder/button.yml +60 -0
  105. data/config/action_view_helpers/actionview/form_builder/submit.yml +48 -0
  106. data/config/action_view_helpers/actionview/form_helper/apply_form_for_options.yml +9 -6
  107. data/config/action_view_helpers/actionview/form_helper/checkbox.yml +41 -25
  108. data/config/action_view_helpers/actionview/form_helper/color_field.yml +25 -15
  109. data/config/action_view_helpers/actionview/form_helper/date_field.yml +35 -21
  110. data/config/action_view_helpers/actionview/form_helper/datetime_field.yml +41 -25
  111. data/config/action_view_helpers/actionview/form_helper/email_field.yml +25 -15
  112. data/config/action_view_helpers/actionview/form_helper/emitted_hidden_id.yml +9 -6
  113. data/config/action_view_helpers/actionview/form_helper/fields.yml +37 -18
  114. data/config/action_view_helpers/actionview/form_helper/fields_for.yml +33 -15
  115. data/config/action_view_helpers/actionview/form_helper/file_field.yml +45 -27
  116. data/config/action_view_helpers/actionview/form_helper/form_for.yml +45 -24
  117. data/config/action_view_helpers/actionview/form_helper/form_with.yml +56 -30
  118. data/config/action_view_helpers/actionview/form_helper/form_with_generates_ids.yml +9 -6
  119. data/config/action_view_helpers/actionview/form_helper/form_with_generates_remote_forms.yml +9 -6
  120. data/config/action_view_helpers/actionview/form_helper/hidden_field.yml +25 -15
  121. data/config/action_view_helpers/actionview/form_helper/label.yml +52 -27
  122. data/config/action_view_helpers/actionview/form_helper/month_field.yml +25 -15
  123. data/config/action_view_helpers/actionview/form_helper/multipart.yml +9 -6
  124. data/config/action_view_helpers/actionview/form_helper/multiple_file_field_include_hidden.yml +9 -6
  125. data/config/action_view_helpers/actionview/form_helper/number_field.yml +45 -27
  126. data/config/action_view_helpers/actionview/form_helper/password_field.yml +25 -15
  127. data/config/action_view_helpers/actionview/form_helper/radio_button.yml +30 -18
  128. data/config/action_view_helpers/actionview/form_helper/range_field.yml +45 -27
  129. data/config/action_view_helpers/actionview/form_helper/search_field.yml +25 -15
  130. data/config/action_view_helpers/actionview/form_helper/telephone_field.yml +26 -16
  131. data/config/action_view_helpers/actionview/form_helper/text_field.yml +25 -15
  132. data/config/action_view_helpers/actionview/form_helper/textarea.yml +31 -19
  133. data/config/action_view_helpers/actionview/form_helper/time_field.yml +40 -24
  134. data/config/action_view_helpers/actionview/form_helper/url_field.yml +25 -15
  135. data/config/action_view_helpers/actionview/form_helper/week_field.yml +25 -15
  136. data/config/action_view_helpers/actionview/form_options_helper/collection_checkboxes.yml +58 -31
  137. data/config/action_view_helpers/actionview/form_options_helper/collection_radio_buttons.yml +57 -30
  138. data/config/action_view_helpers/actionview/form_options_helper/collection_select.yml +65 -39
  139. data/config/action_view_helpers/actionview/form_options_helper/grouped_collection_select.yml +65 -39
  140. data/config/action_view_helpers/actionview/form_options_helper/grouped_options_for_select.yml +35 -21
  141. data/config/action_view_helpers/actionview/form_options_helper/option_groups_from_collection_for_select.yml +40 -24
  142. data/config/action_view_helpers/actionview/form_options_helper/options_for_select.yml +20 -12
  143. data/config/action_view_helpers/actionview/form_options_helper/options_from_collection_for_select.yml +30 -18
  144. data/config/action_view_helpers/actionview/form_options_helper/select.yml +60 -36
  145. data/config/action_view_helpers/actionview/form_options_helper/time_zone_options_for_select.yml +25 -15
  146. data/config/action_view_helpers/actionview/form_options_helper/time_zone_select.yml +50 -30
  147. data/config/action_view_helpers/actionview/form_options_helper/weekday_options_for_select.yml +30 -18
  148. data/config/action_view_helpers/actionview/form_options_helper/weekday_select.yml +30 -18
  149. data/config/action_view_helpers/actionview/form_tag_helper/button_tag.yml +39 -21
  150. data/config/action_view_helpers/actionview/form_tag_helper/checkbox_tag.yml +33 -21
  151. data/config/action_view_helpers/actionview/form_tag_helper/color_field_tag.yml +26 -17
  152. data/config/action_view_helpers/actionview/form_tag_helper/date_field_tag.yml +27 -17
  153. data/config/action_view_helpers/actionview/form_tag_helper/datetime_field_tag.yml +28 -18
  154. data/config/action_view_helpers/actionview/form_tag_helper/default_enforce_utf8.yml +9 -6
  155. data/config/action_view_helpers/actionview/form_tag_helper/email_field_tag.yml +27 -17
  156. data/config/action_view_helpers/actionview/form_tag_helper/embed_authenticity_token_in_remote_forms.yml +9 -6
  157. data/config/action_view_helpers/actionview/form_tag_helper/field_id.yml +30 -18
  158. data/config/action_view_helpers/actionview/form_tag_helper/field_name.yml +30 -18
  159. data/config/action_view_helpers/actionview/form_tag_helper/field_set_tag.yml +23 -15
  160. data/config/action_view_helpers/actionview/form_tag_helper/file_field_tag.yml +35 -22
  161. data/config/action_view_helpers/actionview/form_tag_helper/form_tag.yml +38 -24
  162. data/config/action_view_helpers/actionview/form_tag_helper/hidden_field_tag.yml +27 -17
  163. data/config/action_view_helpers/actionview/form_tag_helper/image_submit_tag.yml +31 -21
  164. data/config/action_view_helpers/actionview/form_tag_helper/label_tag.yml +33 -17
  165. data/config/action_view_helpers/actionview/form_tag_helper/month_field_tag.yml +27 -17
  166. data/config/action_view_helpers/actionview/form_tag_helper/number_field_tag.yml +47 -29
  167. data/config/action_view_helpers/actionview/form_tag_helper/password_field_tag.yml +27 -17
  168. data/config/action_view_helpers/actionview/form_tag_helper/radio_button_tag.yml +32 -20
  169. data/config/action_view_helpers/actionview/form_tag_helper/range_field_tag.yml +47 -29
  170. data/config/action_view_helpers/actionview/form_tag_helper/search_field_tag.yml +27 -17
  171. data/config/action_view_helpers/actionview/form_tag_helper/select_tag.yml +47 -29
  172. data/config/action_view_helpers/actionview/form_tag_helper/submit_tag.yml +33 -21
  173. data/config/action_view_helpers/actionview/form_tag_helper/telephone_field_tag.yml +28 -18
  174. data/config/action_view_helpers/actionview/form_tag_helper/text_field_tag.yml +27 -17
  175. data/config/action_view_helpers/actionview/form_tag_helper/textarea_tag.yml +31 -20
  176. data/config/action_view_helpers/actionview/form_tag_helper/time_field_tag.yml +27 -17
  177. data/config/action_view_helpers/actionview/form_tag_helper/url_field_tag.yml +27 -17
  178. data/config/action_view_helpers/actionview/form_tag_helper/utf8_enforcer_tag.yml +9 -6
  179. data/config/action_view_helpers/actionview/form_tag_helper/week_field_tag.yml +28 -18
  180. data/config/action_view_helpers/actionview/javascript_helper/escape_javascript.yml +16 -10
  181. data/config/action_view_helpers/actionview/javascript_helper/javascript_cdata_section.yml +9 -6
  182. data/config/action_view_helpers/actionview/javascript_helper/javascript_tag.yml +41 -27
  183. data/config/action_view_helpers/actionview/number_helper/number_to_currency.yml +29 -18
  184. data/config/action_view_helpers/actionview/number_helper/number_to_human.yml +25 -15
  185. data/config/action_view_helpers/actionview/number_helper/number_to_human_size.yml +20 -12
  186. data/config/action_view_helpers/actionview/number_helper/number_to_percentage.yml +20 -12
  187. data/config/action_view_helpers/actionview/number_helper/number_to_phone.yml +33 -20
  188. data/config/action_view_helpers/actionview/number_helper/number_with_delimiter.yml +21 -13
  189. data/config/action_view_helpers/actionview/number_helper/number_with_precision.yml +25 -15
  190. data/config/action_view_helpers/actionview/output_safety_helper/raw.yml +15 -9
  191. data/config/action_view_helpers/actionview/output_safety_helper/safe_join.yml +20 -12
  192. data/config/action_view_helpers/actionview/output_safety_helper/to_sentence.yml +24 -15
  193. data/config/action_view_helpers/actionview/record_identifier/dom_class.yml +20 -12
  194. data/config/action_view_helpers/actionview/record_identifier/dom_id.yml +20 -12
  195. data/config/action_view_helpers/actionview/record_identifier/dom_target.yml +15 -9
  196. data/config/action_view_helpers/actionview/record_identifier/model_name_from_record_or_class.yml +9 -6
  197. data/config/action_view_helpers/actionview/rendering_helper/render.yml +108 -22
  198. data/config/action_view_helpers/actionview/sanitize_helper/sanitize.yml +25 -15
  199. data/config/action_view_helpers/actionview/sanitize_helper/sanitize_css.yml +15 -9
  200. data/config/action_view_helpers/actionview/sanitize_helper/sanitizer_vendor.yml +9 -6
  201. data/config/action_view_helpers/actionview/sanitize_helper/strip_links.yml +15 -9
  202. data/config/action_view_helpers/actionview/sanitize_helper/strip_tags.yml +15 -9
  203. data/config/action_view_helpers/actionview/tag_helper/cdata_section.yml +15 -9
  204. data/config/action_view_helpers/actionview/tag_helper/content_tag.yml +59 -38
  205. data/config/action_view_helpers/actionview/tag_helper/escape_once.yml +15 -9
  206. data/config/action_view_helpers/actionview/tag_helper/tag.yml +54 -31
  207. data/config/action_view_helpers/actionview/tag_helper/token_list.yml +16 -10
  208. data/config/action_view_helpers/actionview/text_helper/concat.yml +15 -9
  209. data/config/action_view_helpers/actionview/text_helper/current_cycle.yml +15 -9
  210. data/config/action_view_helpers/actionview/text_helper/cycle.yml +23 -14
  211. data/config/action_view_helpers/actionview/text_helper/excerpt.yml +33 -20
  212. data/config/action_view_helpers/actionview/text_helper/highlight.yml +37 -18
  213. data/config/action_view_helpers/actionview/text_helper/pluralize.yml +30 -18
  214. data/config/action_view_helpers/actionview/text_helper/reset_cycle.yml +15 -9
  215. data/config/action_view_helpers/actionview/text_helper/safe_concat.yml +9 -6
  216. data/config/action_view_helpers/actionview/text_helper/simple_format.yml +33 -20
  217. data/config/action_view_helpers/actionview/text_helper/truncate.yml +38 -23
  218. data/config/action_view_helpers/actionview/text_helper/word_wrap.yml +25 -15
  219. data/config/action_view_helpers/actionview/translation_helper/debug_missing_translation.yml +9 -6
  220. data/config/action_view_helpers/actionview/translation_helper/localize.yml +26 -16
  221. data/config/action_view_helpers/actionview/translation_helper/translate.yml +31 -19
  222. data/config/action_view_helpers/actionview/url_helper/button_to.yml +57 -33
  223. data/config/action_view_helpers/actionview/url_helper/button_to_generates_button_tag.yml +9 -6
  224. data/config/action_view_helpers/actionview/url_helper/current_page?.yml +25 -15
  225. data/config/action_view_helpers/actionview/url_helper/link_to.yml +76 -53
  226. data/config/action_view_helpers/actionview/url_helper/link_to_if.yml +54 -20
  227. data/config/action_view_helpers/actionview/url_helper/link_to_unless.yml +54 -20
  228. data/config/action_view_helpers/actionview/url_helper/link_to_unless_current.yml +49 -17
  229. data/config/action_view_helpers/actionview/url_helper/mail_to.yml +60 -34
  230. data/config/action_view_helpers/actionview/url_helper/phone_to.yml +40 -22
  231. data/config/action_view_helpers/actionview/url_helper/sms_to.yml +45 -25
  232. data/config/action_view_helpers/actionview/url_helper/url_for.yml +15 -9
  233. data/config/action_view_helpers/importmap-rails/importmap_tags_helper/javascript_import_module_tag.yml +32 -0
  234. data/config/action_view_helpers/importmap-rails/importmap_tags_helper/javascript_importmap_module_preload_tags.yml +39 -0
  235. data/config/action_view_helpers/importmap-rails/importmap_tags_helper/javascript_importmap_tags.yml +35 -0
  236. data/config/action_view_helpers/importmap-rails/importmap_tags_helper/javascript_inline_importmap_tag.yml +32 -0
  237. data/config/action_view_helpers/importmap-rails/importmap_tags_helper/javascript_module_preload_tag.yml +35 -0
  238. data/config/action_view_helpers/turbo-rails/drive_helper/turbo_exempts_page_from_cache.yml +9 -6
  239. data/config/action_view_helpers/turbo-rails/drive_helper/turbo_exempts_page_from_cache_tag.yml +12 -8
  240. data/config/action_view_helpers/turbo-rails/drive_helper/turbo_exempts_page_from_preview.yml +9 -6
  241. data/config/action_view_helpers/turbo-rails/drive_helper/turbo_exempts_page_from_preview_tag.yml +12 -8
  242. data/config/action_view_helpers/turbo-rails/drive_helper/turbo_page_requires_reload.yml +9 -6
  243. data/config/action_view_helpers/turbo-rails/drive_helper/turbo_page_requires_reload_tag.yml +12 -8
  244. data/config/action_view_helpers/turbo-rails/drive_helper/turbo_refresh_method_tag.yml +17 -11
  245. data/config/action_view_helpers/turbo-rails/drive_helper/turbo_refresh_scroll_tag.yml +17 -11
  246. data/config/action_view_helpers/turbo-rails/drive_helper/turbo_refreshes_with.yml +20 -12
  247. data/config/action_view_helpers/turbo-rails/frames_helper/turbo_frame_tag.yml +54 -33
  248. data/config/action_view_helpers/turbo-rails/includes_helper/turbo_include_tags.yml +9 -6
  249. data/config/action_view_helpers/turbo-rails/streams_action_helper/turbo_stream_action_tag.yml +32 -20
  250. data/config/action_view_helpers/turbo-rails/streams_action_helper/turbo_stream_refresh_tag.yml +18 -11
  251. data/config/action_view_helpers/turbo-rails/streams_helper/turbo_stream.yml +9 -6
  252. data/config/action_view_helpers/turbo-rails/streams_helper/turbo_stream_from.yml +28 -18
  253. data/config/html_elements.yml +597 -0
  254. data/config/options.yml +1 -0
  255. data/config/slots/components.yml +52 -0
  256. data/config/state/kind.yml +61 -0
  257. data/config/state/operators.yml +27 -0
  258. data/config/state/predicates.yml +39 -0
  259. data/config/state/transforms.yml +18 -0
  260. data/config/view_context_methods/actionview/base/annotate_rendered_view_with_filenames.yml +4 -4
  261. data/config/view_context_methods/actionview/base/assign.yml +4 -4
  262. data/config/view_context_methods/actionview/base/assigns.yml +4 -4
  263. data/config/view_context_methods/actionview/base/automatically_disable_submit_tag.yml +4 -4
  264. data/config/view_context_methods/actionview/base/compiled_method_container.yml +4 -4
  265. data/config/view_context_methods/actionview/base/config.yml +4 -4
  266. data/config/view_context_methods/actionview/base/default_form_builder.yml +4 -4
  267. data/config/view_context_methods/actionview/base/default_formats.yml +4 -4
  268. data/config/view_context_methods/actionview/base/field_error_proc.yml +4 -4
  269. data/config/view_context_methods/actionview/base/formats.yml +4 -4
  270. data/config/view_context_methods/actionview/base/in_rendering_context.yml +4 -4
  271. data/config/view_context_methods/actionview/base/locale.yml +4 -4
  272. data/config/view_context_methods/actionview/base/lookup_context.yml +4 -4
  273. data/config/view_context_methods/actionview/base/output_buffer.yml +4 -4
  274. data/config/view_context_methods/actionview/base/prefix_partial_path_with_controller_namespace.yml +4 -4
  275. data/config/view_context_methods/actionview/base/remove_hidden_field_autocomplete.yml +4 -4
  276. data/config/view_context_methods/actionview/base/streaming_completion_on_exception.yml +4 -4
  277. data/config/view_context_methods/actionview/base/view_flow.yml +4 -4
  278. data/config/view_context_methods/actionview/base/view_paths.yml +4 -4
  279. data/config/view_context_methods/actionview/base/view_renderer.yml +4 -4
  280. data/config/view_context_methods/actionview/template/local_assigns.yml +4 -4
  281. data/config/view_context_methods/activemodel/conversion/convert_to_model.yml +4 -4
  282. data/config/view_context_methods/activesupport/benchmarkable/benchmark.yml +4 -4
  283. data/config.yml +1240 -790
  284. data/exe/herb +2 -0
  285. data/ext/herb/error_helpers.c +355 -17
  286. data/ext/herb/error_helpers.h +1 -1
  287. data/ext/herb/extconf.rb +4 -2
  288. data/ext/herb/extension.c +137 -89
  289. data/ext/herb/extension_helpers.c +81 -42
  290. data/ext/herb/extension_helpers.h +4 -1
  291. data/ext/herb/nodes.c +826 -358
  292. data/ext/herb/nodes.h +3 -2
  293. data/ext/herb/parser_options_helpers.c +151 -0
  294. data/ext/herb/parser_options_helpers.h +14 -0
  295. data/herb.gemspec +2 -2
  296. data/lib/herb/3.2/herb.so +0 -0
  297. data/lib/herb/3.3/herb.so +0 -0
  298. data/lib/herb/3.4/herb.so +0 -0
  299. data/lib/herb/4.0/herb.so +0 -0
  300. data/lib/herb/action_view/helper_registry.rb +1358 -62
  301. data/lib/herb/analysis/partial_declaration.rb +140 -0
  302. data/lib/herb/analysis/partial_index.rb +189 -0
  303. data/lib/herb/analysis/partial_resolution.rb +161 -0
  304. data/lib/herb/analysis/partial_resolver.rb +144 -0
  305. data/lib/herb/analysis/project_index.rb +152 -0
  306. data/lib/herb/{action_view → analysis}/render_analyzer.rb +287 -77
  307. data/lib/herb/analysis/render_graph/ancestor_chain.rb +27 -0
  308. data/lib/herb/analysis/render_graph/builder.rb +376 -0
  309. data/lib/herb/analysis/render_graph/call_frame.rb +9 -0
  310. data/lib/herb/analysis/render_graph/call_site_location.rb +23 -0
  311. data/lib/herb/analysis/render_graph/inferred_signature.rb +21 -0
  312. data/lib/herb/analysis/render_graph/partial_call_site.rb +40 -0
  313. data/lib/herb/analysis/render_graph/partial_context.rb +46 -0
  314. data/lib/herb/analysis/render_graph/template_roots.rb +31 -0
  315. data/lib/herb/analysis/render_graph.rb +285 -0
  316. data/lib/herb/analysis/ruby_locals_index/local.rb +25 -0
  317. data/lib/herb/analysis/ruby_locals_index/named_reference.rb +22 -0
  318. data/lib/herb/analysis/ruby_locals_index/offset_table.rb +44 -0
  319. data/lib/herb/analysis/ruby_locals_index/reference_collector.rb +80 -0
  320. data/lib/herb/analysis/ruby_locals_index/state_locals.rb +49 -0
  321. data/lib/herb/analysis/ruby_locals_index.rb +165 -0
  322. data/lib/herb/analysis/ruby_reference.rb +67 -0
  323. data/lib/herb/analysis/template_dependencies/dependency_collector.rb +179 -0
  324. data/lib/herb/analysis/template_dependencies/node_dependency_collector.rb +309 -0
  325. data/lib/herb/analysis/template_dependencies.rb +562 -0
  326. data/lib/herb/ast/erb_render_node.rb +26 -94
  327. data/lib/herb/ast/helpers.rb +90 -10
  328. data/lib/herb/ast/herb_directive_node.rb +18 -0
  329. data/lib/herb/ast/node.rb +32 -2
  330. data/lib/herb/ast/nodes.rb +1342 -105
  331. data/lib/herb/backend.rb +73 -0
  332. data/lib/herb/bootstrap.rb +3 -7
  333. data/lib/herb/cli.rb +550 -32
  334. data/lib/herb/colors.rb +14 -0
  335. data/lib/herb/configuration.rb +71 -35
  336. data/lib/herb/defaults.yml +2 -1
  337. data/lib/herb/dev/assets.rb +57 -0
  338. data/lib/herb/dev/classifier.rb +84 -0
  339. data/lib/herb/dev/embedded.rb +27 -0
  340. data/lib/herb/dev/pipeline.rb +305 -0
  341. data/lib/herb/dev/protocol.rb +221 -0
  342. data/lib/herb/dev/runner.rb +175 -175
  343. data/lib/herb/dev/server.rb +89 -26
  344. data/lib/herb/dev/server_entry.rb +41 -6
  345. data/lib/herb/dev/watcher.rb +181 -0
  346. data/lib/herb/dev.rb +163 -0
  347. data/lib/herb/diagnostic/formatter.rb +88 -0
  348. data/lib/herb/diagnostic.rb +172 -0
  349. data/lib/herb/diff/operation.rb +36 -0
  350. data/lib/herb/diff/result.rb +62 -0
  351. data/lib/herb/diff.rb +10 -0
  352. data/lib/herb/engine/collector.rb +62 -0
  353. data/lib/herb/engine/compiler.rb +346 -108
  354. data/lib/herb/engine/component_tags/constant_resolver.rb +28 -0
  355. data/lib/herb/engine/component_tags/partial_resolver.rb +54 -0
  356. data/lib/herb/engine/component_tags/resolver.rb +32 -0
  357. data/lib/herb/engine/component_tags/visitor.rb +231 -0
  358. data/lib/herb/engine/css_inliner/inliner.rb +101 -0
  359. data/lib/herb/engine/css_inliner/visitor.rb +174 -0
  360. data/lib/herb/engine/errors.rb +122 -0
  361. data/lib/herb/engine/helpers.rb +82 -0
  362. data/lib/herb/engine/inline_render/inliner.rb +122 -0
  363. data/lib/herb/engine/inline_render/visitor.rb +267 -0
  364. data/lib/herb/engine/runtime/entry.rb +62 -0
  365. data/lib/herb/engine/runtime/error_page.rb +362 -0
  366. data/lib/herb/engine/runtime/html_safe_assertions.rb +217 -0
  367. data/lib/herb/engine/runtime/journal/summary.rb +227 -0
  368. data/lib/herb/engine/runtime/journal.rb +379 -0
  369. data/lib/herb/engine/runtime/middleware.rb +212 -0
  370. data/lib/herb/engine/runtime/observations.rb +73 -0
  371. data/lib/herb/engine/runtime/report.rb +204 -0
  372. data/lib/herb/engine/runtime/session.rb +437 -0
  373. data/lib/herb/engine/runtime.rb +21 -0
  374. data/lib/herb/engine/scoped_style/channel.rb +66 -0
  375. data/lib/herb/engine/scoped_style/collector.rb +74 -0
  376. data/lib/herb/engine/scoped_style/visitor.rb +533 -0
  377. data/lib/herb/engine/slots/annotation.rb +98 -0
  378. data/lib/herb/engine/slots/bindings.rb +61 -0
  379. data/lib/herb/engine/slots/callee.rb +118 -0
  380. data/lib/herb/engine/slots/component_definitions.rb +67 -0
  381. data/lib/herb/engine/slots/components/async.rb +24 -0
  382. data/lib/herb/engine/slots/components/base.rb +132 -0
  383. data/lib/herb/engine/slots/components/deferred.rb +81 -0
  384. data/lib/herb/engine/slots/components/fallback.rb +27 -0
  385. data/lib/herb/engine/slots/components/fragment.rb +99 -0
  386. data/lib/herb/engine/slots/components/lazy.rb +24 -0
  387. data/lib/herb/engine/slots/components.rb +52 -0
  388. data/lib/herb/engine/slots/dependencies/channel.rb +72 -0
  389. data/lib/herb/engine/slots/dependencies.rb +269 -0
  390. data/lib/herb/engine/slots/dynamics_compiler.rb +854 -0
  391. data/lib/herb/engine/slots/identifier.rb +35 -0
  392. data/lib/herb/engine/slots/manifest/channel.rb +74 -0
  393. data/lib/herb/engine/slots/manifest/collector.rb +75 -0
  394. data/lib/herb/engine/slots/markers.rb +128 -0
  395. data/lib/herb/engine/slots/render_bindings.rb +141 -0
  396. data/lib/herb/engine/slots/schema_compiler.rb +94 -0
  397. data/lib/herb/engine/slots/state_anchor.rb +94 -0
  398. data/lib/herb/engine/slots/state_compiler.rb +1326 -0
  399. data/lib/herb/engine/slots/state_directives.rb +854 -0
  400. data/lib/herb/engine/slots/state_kinds.rb +54 -0
  401. data/lib/herb/engine/slots/state_operators.rb +36 -0
  402. data/lib/herb/engine/slots/state_overrides.rb +79 -0
  403. data/lib/herb/engine/slots/state_predicates.rb +65 -0
  404. data/lib/herb/engine/slots/state_transforms.rb +42 -0
  405. data/lib/herb/engine/slots/statics.rb +185 -0
  406. data/lib/herb/engine/slots/subtree.rb +82 -0
  407. data/lib/herb/engine/slots/subtree_compiler.rb +255 -0
  408. data/lib/herb/engine/slots/types.rb +42 -0
  409. data/lib/herb/engine/slots/visitor.rb +2256 -0
  410. data/lib/herb/engine/validators/accessibility_validator.rb +3 -3
  411. data/lib/herb/engine/validators/base.rb +36 -0
  412. data/lib/herb/engine/validators/generator_template_validator.rb +39 -0
  413. data/lib/herb/engine/validators/nesting_validator.rb +3 -3
  414. data/lib/herb/engine/validators/render_validator.rb +13 -33
  415. data/lib/herb/engine/validators/security_validator.rb +3 -17
  416. data/lib/herb/engine/validators.rb +43 -0
  417. data/lib/herb/engine/visitors/auto_close_omitted_tags_visitor.rb +48 -0
  418. data/lib/herb/engine/visitors/content_for_visitor.rb +127 -0
  419. data/lib/herb/engine/{debug_visitor.rb → visitors/debug_visitor.rb} +121 -93
  420. data/lib/herb/engine/visitors/html_safe_assertions_visitor.rb +281 -0
  421. data/lib/herb/engine/visitors/instrumentation_visitor.rb +290 -0
  422. data/lib/herb/engine/visitors/optimize_visitor.rb +728 -0
  423. data/lib/herb/engine/visitors/remove_comments_visitor.rb +106 -0
  424. data/lib/herb/engine/visitors/source_attribution_visitor.rb +177 -0
  425. data/lib/herb/engine.rb +218 -257
  426. data/lib/herb/ensure_installed.rb +43 -0
  427. data/lib/herb/errors.rb +646 -157
  428. data/lib/herb/fingerprint.rb +82 -0
  429. data/lib/herb/html/elements.rb +18 -0
  430. data/lib/herb/html/util.rb +21 -2
  431. data/lib/herb/lex_result.rb +0 -10
  432. data/lib/herb/locate.rb +163 -0
  433. data/lib/herb/location.rb +20 -0
  434. data/lib/herb/parse_result.rb +17 -11
  435. data/lib/herb/parser_options.rb +65 -46
  436. data/lib/herb/position.rb +19 -0
  437. data/lib/herb/prism_inspect.rb +1 -4
  438. data/lib/herb/project.rb +31 -18
  439. data/lib/herb/range.rb +5 -0
  440. data/lib/herb/result.rb +2 -2
  441. data/lib/herb/ruby_program.rb +110 -0
  442. data/lib/herb/source_path.rb +232 -0
  443. data/lib/herb/token.rb +14 -3
  444. data/lib/herb/version.rb +1 -1
  445. data/lib/herb/visitor/context/origin.rb +52 -0
  446. data/lib/herb/visitor/context/replacements.rb +59 -0
  447. data/lib/herb/visitor/context.rb +169 -0
  448. data/lib/herb/visitor/context_aware.rb +45 -0
  449. data/lib/herb/visitor/diagnostics.rb +148 -0
  450. data/lib/herb/visitor/experimental.rb +33 -0
  451. data/lib/herb/visitor/parser_option_requirements.rb +151 -0
  452. data/lib/herb/visitor/stack.rb +192 -0
  453. data/lib/herb/visitor.rb +47 -1
  454. data/lib/herb/warnings.rb +25 -0
  455. data/lib/herb.rb +74 -63
  456. data/sig/herb/action_view/helper_registry.rbs +82 -10
  457. data/sig/herb/analysis/partial_declaration.rbs +80 -0
  458. data/sig/herb/analysis/partial_index.rbs +66 -0
  459. data/sig/herb/analysis/partial_resolution.rbs +57 -0
  460. data/sig/herb/analysis/partial_resolver.rbs +76 -0
  461. data/sig/herb/analysis/project_index.rbs +57 -0
  462. data/sig/herb/{action_view → analysis}/render_analyzer.rbs +25 -4
  463. data/sig/herb/analysis/render_graph/ancestor_chain.rbs +22 -0
  464. data/sig/herb/analysis/render_graph/builder.rbs +180 -0
  465. data/sig/herb/analysis/render_graph/call_frame.rbs +26 -0
  466. data/sig/herb/analysis/render_graph/call_site_location.rbs +28 -0
  467. data/sig/herb/analysis/render_graph/inferred_signature.rbs +27 -0
  468. data/sig/herb/analysis/render_graph/partial_call_site.rbs +36 -0
  469. data/sig/herb/analysis/render_graph/partial_context.rbs +31 -0
  470. data/sig/herb/analysis/render_graph/template_roots.rbs +32 -0
  471. data/sig/herb/analysis/render_graph.rbs +83 -0
  472. data/sig/herb/analysis/ruby_locals_index/local.rbs +21 -0
  473. data/sig/herb/analysis/ruby_locals_index/named_reference.rbs +20 -0
  474. data/sig/herb/analysis/ruby_locals_index/offset_table.rbs +26 -0
  475. data/sig/herb/analysis/ruby_locals_index/reference_collector.rbs +40 -0
  476. data/sig/herb/analysis/ruby_locals_index/state_locals.rbs +19 -0
  477. data/sig/herb/analysis/ruby_locals_index.rbs +62 -0
  478. data/sig/herb/analysis/ruby_reference.rbs +28 -0
  479. data/sig/herb/analysis/template_dependencies/dependency_collector.rbs +52 -0
  480. data/sig/herb/analysis/template_dependencies/node_dependency_collector.rbs +81 -0
  481. data/sig/herb/analysis/template_dependencies.rbs +125 -0
  482. data/sig/herb/ast/erb_render_node.rbs +10 -2
  483. data/sig/herb/ast/helpers.rbs +31 -1
  484. data/sig/herb/ast/herb_directive_node.rbs +13 -0
  485. data/sig/herb/ast/node.rbs +9 -0
  486. data/sig/herb/ast/nodes.rbs +662 -89
  487. data/sig/herb/backend.rbs +52 -0
  488. data/sig/herb/colors.rbs +3 -0
  489. data/sig/herb/configuration.rbs +27 -3
  490. data/sig/herb/dev/assets.rbs +27 -0
  491. data/sig/herb/dev/classifier.rbs +57 -0
  492. data/sig/herb/dev/embedded.rbs +21 -0
  493. data/sig/herb/dev/pipeline.rbs +118 -0
  494. data/sig/herb/dev/protocol.rbs +78 -0
  495. data/sig/herb/dev/runner.rbs +61 -23
  496. data/sig/herb/dev/server.rbs +49 -22
  497. data/sig/herb/dev/server_entry.rbs +46 -21
  498. data/sig/herb/dev/watcher.rbs +84 -0
  499. data/sig/herb/dev.rbs +58 -0
  500. data/sig/herb/diagnostic/formatter.rbs +28 -0
  501. data/sig/herb/diagnostic.rbs +88 -0
  502. data/sig/herb/diff/operation.rbs +36 -0
  503. data/sig/herb/diff/result.rbs +36 -0
  504. data/sig/herb/diff.rbs +6 -0
  505. data/sig/herb/engine/collector.rbs +48 -0
  506. data/sig/herb/engine/compiler.rbs +62 -23
  507. data/sig/herb/engine/component_tags/constant_resolver.rbs +19 -0
  508. data/sig/herb/engine/component_tags/partial_resolver.rbs +30 -0
  509. data/sig/herb/engine/component_tags/resolver.rbs +25 -0
  510. data/sig/herb/engine/component_tags/visitor.rbs +69 -0
  511. data/sig/herb/engine/css_inliner/inliner.rbs +65 -0
  512. data/sig/herb/engine/css_inliner/visitor.rbs +87 -0
  513. data/sig/herb/engine/errors.rbs +68 -0
  514. data/sig/herb/engine/helpers.rbs +28 -0
  515. data/sig/herb/engine/inline_render/inliner.rbs +39 -0
  516. data/sig/herb/engine/inline_render/visitor.rbs +104 -0
  517. data/sig/herb/engine/runtime/entry.rbs +43 -0
  518. data/sig/herb/engine/runtime/error_page.rbs +115 -0
  519. data/sig/herb/engine/runtime/html_safe_assertions.rbs +99 -0
  520. data/sig/herb/engine/runtime/journal/summary.rbs +172 -0
  521. data/sig/herb/engine/runtime/journal.rbs +126 -0
  522. data/sig/herb/engine/runtime/middleware.rbs +96 -0
  523. data/sig/herb/engine/runtime/observations.rbs +38 -0
  524. data/sig/herb/engine/runtime/report.rbs +97 -0
  525. data/sig/herb/engine/runtime/session.rbs +233 -0
  526. data/sig/herb/engine/runtime.rbs +14 -0
  527. data/sig/herb/engine/scoped_style/channel.rbs +45 -0
  528. data/sig/herb/engine/scoped_style/collector.rbs +45 -0
  529. data/sig/herb/engine/scoped_style/visitor.rbs +220 -0
  530. data/sig/herb/engine/slots/annotation.rbs +72 -0
  531. data/sig/herb/engine/slots/bindings.rbs +34 -0
  532. data/sig/herb/engine/slots/callee.rbs +62 -0
  533. data/sig/herb/engine/slots/component_definitions.rbs +19 -0
  534. data/sig/herb/engine/slots/components/async.rbs +20 -0
  535. data/sig/herb/engine/slots/components/base.rbs +60 -0
  536. data/sig/herb/engine/slots/components/deferred.rbs +29 -0
  537. data/sig/herb/engine/slots/components/fallback.rbs +21 -0
  538. data/sig/herb/engine/slots/components/fragment.rbs +34 -0
  539. data/sig/herb/engine/slots/components/lazy.rbs +20 -0
  540. data/sig/herb/engine/slots/components.rbs +30 -0
  541. data/sig/herb/engine/slots/dependencies/channel.rbs +51 -0
  542. data/sig/herb/engine/slots/dependencies.rbs +94 -0
  543. data/sig/herb/engine/slots/dynamics_compiler.rbs +349 -0
  544. data/sig/herb/engine/slots/identifier.rbs +19 -0
  545. data/sig/herb/engine/slots/manifest/channel.rbs +49 -0
  546. data/sig/herb/engine/slots/manifest/collector.rbs +45 -0
  547. data/sig/herb/engine/slots/markers.rbs +85 -0
  548. data/sig/herb/engine/slots/render_bindings.rbs +69 -0
  549. data/sig/herb/engine/slots/schema_compiler.rbs +62 -0
  550. data/sig/herb/engine/slots/state_anchor.rbs +41 -0
  551. data/sig/herb/engine/slots/state_compiler.rbs +258 -0
  552. data/sig/herb/engine/slots/state_directives.rbs +278 -0
  553. data/sig/herb/engine/slots/state_kinds.rbs +24 -0
  554. data/sig/herb/engine/slots/state_operators.rbs +19 -0
  555. data/sig/herb/engine/slots/state_overrides.rbs +33 -0
  556. data/sig/herb/engine/slots/state_predicates.rbs +16 -0
  557. data/sig/herb/engine/slots/state_transforms.rbs +15 -0
  558. data/sig/herb/engine/slots/statics.rbs +67 -0
  559. data/sig/herb/engine/slots/subtree.rbs +49 -0
  560. data/sig/herb/engine/slots/subtree_compiler.rbs +130 -0
  561. data/sig/herb/engine/slots/types.rbs +46 -0
  562. data/sig/herb/engine/slots/visitor.rbs +599 -0
  563. data/sig/herb/engine/validators/accessibility_validator.rbs +1 -1
  564. data/sig/herb/engine/validators/base.rbs +28 -0
  565. data/sig/herb/engine/validators/generator_template_validator.rbs +19 -0
  566. data/sig/herb/engine/validators/nesting_validator.rbs +1 -1
  567. data/sig/herb/engine/validators/render_validator.rbs +2 -6
  568. data/sig/herb/engine/validators/security_validator.rbs +1 -3
  569. data/sig/herb/engine/validators.rbs +21 -0
  570. data/sig/herb/engine/visitors/auto_close_omitted_tags_visitor.rbs +26 -0
  571. data/sig/herb/engine/visitors/content_for_visitor.rbs +52 -0
  572. data/sig/herb/engine/{debug_visitor.rbs → visitors/debug_visitor.rbs} +26 -15
  573. data/sig/herb/engine/visitors/html_safe_assertions_visitor.rbs +100 -0
  574. data/sig/herb/engine/visitors/instrumentation_visitor.rbs +111 -0
  575. data/sig/herb/engine/visitors/optimize_visitor.rbs +246 -0
  576. data/sig/herb/engine/visitors/remove_comments_visitor.rbs +66 -0
  577. data/sig/herb/engine/visitors/source_attribution_visitor.rbs +90 -0
  578. data/sig/herb/engine.rbs +47 -41
  579. data/sig/herb/ensure_installed.rbs +9 -0
  580. data/sig/herb/errors.rbs +293 -0
  581. data/sig/herb/fingerprint.rbs +37 -0
  582. data/sig/herb/html/elements.rbs +19 -0
  583. data/sig/herb/html/util.rbs +15 -1
  584. data/sig/herb/lex_result.rbs +0 -6
  585. data/sig/herb/locate.rbs +89 -0
  586. data/sig/herb/location.rbs +12 -0
  587. data/sig/herb/parse_result.rbs +10 -8
  588. data/sig/herb/parser_options.rbs +47 -21
  589. data/sig/herb/position.rbs +11 -0
  590. data/sig/herb/range.rbs +3 -0
  591. data/sig/herb/ruby_program.rbs +51 -0
  592. data/sig/herb/source_path.rbs +132 -0
  593. data/sig/herb/token.rbs +5 -2
  594. data/sig/herb/visitor/context/origin.rbs +51 -0
  595. data/sig/herb/visitor/context/replacements.rbs +39 -0
  596. data/sig/herb/visitor/context.rbs +83 -0
  597. data/sig/herb/visitor/context_aware.rbs +32 -0
  598. data/sig/herb/visitor/diagnostics.rbs +82 -0
  599. data/sig/herb/visitor/experimental.rbs +23 -0
  600. data/sig/herb/visitor/parser_option_requirements.rbs +76 -0
  601. data/sig/herb/visitor/stack.rbs +91 -0
  602. data/sig/herb/visitor.rbs +22 -0
  603. data/sig/herb/warnings.rbs +10 -0
  604. data/sig/herb.rbs +27 -10
  605. data/sig/serialized_ast_errors.rbs +58 -1
  606. data/sig/serialized_ast_nodes.rbs +58 -2
  607. data/src/analyze/action_view/attribute_extraction_helpers.c +73 -36
  608. data/src/analyze/action_view/generated_handlers.c +37 -1
  609. data/src/analyze/action_view/generated_handlers.h +2 -1
  610. data/src/analyze/action_view/helper_registry.c +1353 -58
  611. data/src/analyze/action_view/registry.c +10 -17
  612. data/src/analyze/action_view/stylesheet_link_tag.c +40 -0
  613. data/src/analyze/action_view/tag_helper_node_builders.c +57 -0
  614. data/src/analyze/action_view/tag_helpers.c +423 -93
  615. data/src/analyze/analyze.c +301 -64
  616. data/src/analyze/analyze_helpers.c +420 -23
  617. data/src/analyze/builders.c +79 -51
  618. data/src/analyze/conditional_elements.c +13 -8
  619. data/src/analyze/conditional_open_tags.c +11 -5
  620. data/src/analyze/control_type.c +16 -1
  621. data/src/analyze/herb_directives.c +701 -0
  622. data/src/analyze/invalid_structures.c +11 -7
  623. data/src/analyze/iteration_nodes.c +306 -0
  624. data/src/analyze/missing_end.c +116 -32
  625. data/src/analyze/parse_errors.c +8 -3
  626. data/src/analyze/postfix_conditionals.c +98 -63
  627. data/src/analyze/prism_annotate.c +13 -4
  628. data/src/analyze/render_nodes.c +345 -123
  629. data/src/analyze/strict_locals.c +30 -26
  630. data/src/analyze/ternary_conditionals.c +95 -70
  631. data/src/analyze/transform.c +43 -1
  632. data/src/ast/ast_node.c +3 -13
  633. data/src/ast/ast_nodes.c +911 -112
  634. data/src/ast/ast_pretty_print.c +161 -2
  635. data/src/diff/herb_diff.c +8 -0
  636. data/src/diff/herb_diff_attributes.c +1 -0
  637. data/src/diff/herb_diff_children.c +4 -3
  638. data/src/diff/herb_diff_helpers.c +7 -1
  639. data/src/diff/herb_diff_nodes.c +186 -71
  640. data/src/diff/herb_hash_tree.c +99 -1
  641. data/src/errors.c +1096 -128
  642. data/src/extract.c +30 -8
  643. data/src/herb.c +30 -11
  644. data/src/include/analyze/action_view/attribute_extraction_helpers.h +1 -1
  645. data/src/include/analyze/action_view/helper_registry.h +28 -4
  646. data/src/include/analyze/action_view/tag_helper_handler.h +1 -1
  647. data/src/include/analyze/action_view/tag_helper_node_builders.h +7 -0
  648. data/src/include/analyze/analyze.h +11 -0
  649. data/src/include/analyze/builders.h +16 -0
  650. data/src/include/analyze/helpers.h +23 -2
  651. data/src/include/analyze/herb_directive_kinds.h +41 -0
  652. data/src/include/analyze/herb_directives.h +14 -0
  653. data/src/include/analyze/iteration_nodes.h +11 -0
  654. data/src/include/analyze/prism_annotate.h +3 -3
  655. data/src/include/analyze/ternary_conditionals.h +2 -0
  656. data/src/include/ast/ast_node.h +1 -5
  657. data/src/include/ast/ast_nodes.h +76 -2
  658. data/src/include/ast/ast_pretty_print.h +1 -1
  659. data/src/include/diff/herb_diff.h +11 -0
  660. data/src/include/errors.h +156 -39
  661. data/src/include/extract.h +11 -0
  662. data/src/include/herb.h +6 -0
  663. data/src/include/lexer/erb_openers.h +29 -0
  664. data/src/include/lexer/lexer_peek_helpers.h +8 -1
  665. data/src/include/lexer/lexer_struct.h +4 -0
  666. data/src/include/lexer/token.h +3 -0
  667. data/src/include/lexer/token_struct.h +8 -6
  668. data/src/include/lib/hb_allocator.h +2 -1
  669. data/src/include/lib/hb_array.h +2 -0
  670. data/src/include/lib/hb_foreach.h +1 -1
  671. data/src/include/lib/hb_string.h +7 -0
  672. data/src/include/parser/dot_notation.h +1 -1
  673. data/src/include/parser/foreign_content_elements.h +32 -0
  674. data/src/include/parser/parser.h +16 -30
  675. data/src/include/parser/parser_helpers.h +13 -11
  676. data/src/include/parser/parser_options.h +41 -0
  677. data/src/include/prism/ruby_parser.h +6 -0
  678. data/src/include/util/html_elements.h +85 -0
  679. data/src/include/util/html_util.h +1 -0
  680. data/src/include/version.h +1 -1
  681. data/src/lexer/lexer_peek_helpers.c +15 -1
  682. data/src/lexer/token.c +83 -1
  683. data/src/lexer.c +196 -12
  684. data/src/lib/hb_allocator.c +2 -0
  685. data/src/lib/hb_array.c +26 -0
  686. data/src/lib/hb_string.c +26 -0
  687. data/src/main.c +1 -1
  688. data/src/parser/dot_notation.c +4 -3
  689. data/src/parser/match_tags.c +66 -1
  690. data/src/parser/parser_helpers.c +69 -37
  691. data/src/parser.c +606 -383
  692. data/src/parser_options_defaults.c +30 -0
  693. data/src/prism/prism_helpers.c +3 -0
  694. data/src/prism/ruby_parser.c +49 -0
  695. data/src/util/html_util.c +11 -58
  696. data/src/visitor.c +77 -1
  697. data/templates/ext/herb/error_helpers.c.erb +1 -1
  698. data/templates/ext/herb/nodes.c.erb +18 -13
  699. data/templates/ext/herb/nodes.h.erb +2 -1
  700. data/templates/ext/herb/parser_options_helpers.c.erb +69 -0
  701. data/templates/ext/herb/parser_options_helpers.h.erb +11 -0
  702. data/templates/java/nodes.c.erb +20 -16
  703. data/templates/java/nodes.h.erb +3 -2
  704. data/templates/java/org/herb/ParserOptions.java.erb +24 -0
  705. data/templates/java/org/herb/ast/HelperRegistry.java.erb +67 -31
  706. data/templates/java/org/herb/ast/HelperType.java.erb +29 -0
  707. data/templates/java/org/herb/ast/Nodes.java.erb +11 -7
  708. data/templates/java/parser_options_helpers.c.erb +45 -0
  709. data/templates/java/parser_options_helpers.h.erb +10 -0
  710. data/templates/javascript/packages/client/src/state-kinds.ts.erb +49 -0
  711. data/templates/javascript/packages/client/src/state-operators.ts.erb +15 -0
  712. data/templates/javascript/packages/client/src/state-predicates.ts.erb +27 -0
  713. data/templates/javascript/packages/client/src/state-transforms.ts.erb +19 -0
  714. data/templates/javascript/packages/core/src/action-view-helpers.ts.erb +47 -0
  715. data/templates/javascript/packages/core/src/built-in-components.ts.erb +67 -0
  716. data/templates/javascript/packages/core/src/errors.ts.erb +9 -3
  717. data/templates/javascript/packages/core/src/foreign-content-elements.ts.erb +18 -0
  718. data/templates/javascript/packages/core/src/html-constants.ts.erb +32 -0
  719. data/templates/javascript/packages/core/src/html-elements.ts.erb +41 -0
  720. data/templates/javascript/packages/core/src/node-type-guards.ts.erb +11 -7
  721. data/templates/javascript/packages/core/src/nodes.ts.erb +82 -19
  722. data/templates/javascript/packages/core/src/parser-options.ts.erb +41 -0
  723. data/templates/javascript/packages/core/src/visitor.ts.erb +1 -1
  724. data/templates/javascript/packages/node/extension/error_helpers.cpp.erb +3 -3
  725. data/templates/javascript/packages/node/extension/nodes.cpp.erb +17 -12
  726. data/templates/javascript/packages/node/extension/nodes.h.erb +3 -3
  727. data/templates/javascript/packages/node/extension/parser_options_helpers.cpp.erb +41 -0
  728. data/templates/javascript/packages/node/extension/parser_options_helpers.h.erb +12 -0
  729. data/templates/lib/herb/action_view/helper_registry.rb.erb +77 -3
  730. data/templates/lib/herb/ast/nodes.rb.erb +16 -6
  731. data/templates/lib/herb/engine/slots/component_definitions.rb.erb +38 -0
  732. data/templates/lib/herb/engine/slots/state_kinds.rb.erb +37 -0
  733. data/templates/lib/herb/engine/slots/state_operators.rb.erb +26 -0
  734. data/templates/lib/herb/engine/slots/state_predicates.rb.erb +39 -0
  735. data/templates/lib/herb/engine/slots/state_transforms.rb.erb +27 -0
  736. data/templates/lib/herb/errors.rb.erb +34 -6
  737. data/templates/lib/herb/html/elements.rb.erb +12 -0
  738. data/templates/lib/herb/parser_options.rb.erb +32 -0
  739. data/templates/lib/herb/visitor.rb.erb +7 -1
  740. data/templates/rust/herb-printer/src/printer_visitor.rs.erb +14 -0
  741. data/templates/rust/src/action_view_helpers.rs.erb +38 -0
  742. data/templates/rust/src/ast/nodes.rs.erb +24 -31
  743. data/templates/rust/src/errors.rs.erb +1 -1
  744. data/templates/rust/src/nodes.rs.erb +58 -26
  745. data/templates/rust/src/parser_options.rs.erb +16 -0
  746. data/templates/rust/src/prism/generated_deserialize.rs.erb +109 -0
  747. data/templates/rust/src/prism/generated_prettyprint.rs.erb +153 -0
  748. data/templates/rust/src/union_types.rs.erb +7 -1
  749. data/templates/rust/src/visitor.rs.erb +1 -1
  750. data/templates/src/analyze/action_view/helper_registry.c.erb +22 -0
  751. data/templates/src/analyze/missing_end.c.erb +13 -5
  752. data/templates/src/ast/ast_nodes.c.erb +41 -2
  753. data/templates/src/diff/herb_diff_nodes.c.erb +44 -8
  754. data/templates/src/errors.c.erb +8 -3
  755. data/templates/src/include/analyze/action_view/helper_registry.h.erb +19 -0
  756. data/templates/src/include/analyze/herb_directive_kinds.h.erb +25 -0
  757. data/templates/src/include/errors.h.erb +3 -1
  758. data/templates/src/include/parser/foreign_content_elements.h.erb +23 -0
  759. data/templates/src/include/parser/parser_options.h.erb +21 -0
  760. data/templates/src/include/util/html_elements.h.erb +28 -0
  761. data/templates/src/parser_options_defaults.c.erb +9 -0
  762. data/templates/template.rb +564 -9
  763. data/templates/wasm/error_helpers.cpp.erb +4 -4
  764. data/templates/wasm/nodes.cpp.erb +12 -12
  765. data/templates/wasm/nodes.h.erb +3 -3
  766. data/templates/wasm/parser_options_helpers.cpp.erb +25 -0
  767. data/templates/wasm/parser_options_helpers.h.erb +12 -0
  768. metadata +306 -27
  769. data/config/action_view_helpers/actionview/form_helper/button.yml +0 -38
  770. data/config/action_view_helpers/actionview/form_helper/submit.yml +0 -35
  771. data/lib/herb/ast.rb +0 -7
  772. data/lib/herb/diff_operation.rb +0 -34
  773. data/lib/herb/diff_result.rb +0 -59
  774. data/lib/herb/engine/error_formatter.rb +0 -432
  775. data/lib/herb/engine/parser_error_overlay.rb +0 -773
  776. data/lib/herb/engine/validation_error_overlay.rb +0 -182
  777. data/lib/herb/engine/validation_errors.rb +0 -65
  778. data/lib/herb/engine/validator.rb +0 -80
  779. data/sig/herb/ast.rbs +0 -6
  780. data/sig/herb/diff_operation.rbs +0 -34
  781. data/sig/herb/diff_result.rbs +0 -34
  782. data/sig/herb/engine/debug.rbs +0 -38
  783. data/sig/herb/engine/error_formatter.rbs +0 -47
  784. data/sig/herb/engine/parser_error_overlay.rbs +0 -41
  785. data/sig/herb/engine/validation_error_overlay.rbs +0 -35
  786. data/sig/herb/engine/validation_errors.rbs +0 -45
  787. data/sig/herb/engine/validator.rbs +0 -41
  788. 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;
@@ -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, // <!DOCTYPE, <!doctype, <!DoCtYpE, <!dOcTyPe
17
- TOKEN_XML_DECLARATION, // <?xml
18
- TOKEN_XML_DECLARATION_END, // ?>
19
- TOKEN_CDATA_START, // <![CDATA[
20
- TOKEN_CDATA_END, // ]]>
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 (1024 * 16)
11
+ # define HB_ALLOCATOR_DEFAULT_ARENA_SIZE KB(128)
11
12
  #endif
12
13
 
13
14
  typedef enum {
@@ -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 /home/runner/work/herb/herb/templates/src/include/lib/hb_foreach.h.erb
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
@@ -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* errors);
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
@@ -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
- #include <stdint.h>
11
+ #define HERB_MAX_FOREIGN_CONTENT_ELEMENTS 16
11
12
 
12
13
  typedef enum {
13
- FOREIGN_CONTENT_UNKNOWN = 0,
14
- FOREIGN_CONTENT_SCRIPT,
15
- FOREIGN_CONTENT_STYLE,
16
- // FOREIGN_CONTENT_RUBY,
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
- extern const parser_options_T HERB_DEFAULT_PARSER_OPTIONS;
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
- foreign_content_type_T foreign_content_type;
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* errors,
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* errors,
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* errors);
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
- foreign_content_type_T parser_get_foreign_content_type(hb_string_T tag_name);
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
- hb_string_T parser_get_foreign_content_closing_tag(foreign_content_type_T type);
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, foreign_content_type_T type);
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 parser_is_expected_closing_tag_name(hb_string_T tag_name, foreign_content_type_T expected_type);
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* array);
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* errors
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* errors
67
+ hb_array_T** errors
66
68
  );
67
69
 
68
- void parser_synchronize(parser_T* parser, hb_array_T* errors);
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
@@ -1,6 +1,12 @@
1
1
  #ifndef HERB_RUBY_PARSER_H
2
2
  #define HERB_RUBY_PARSER_H
3
3
 
4
+ #include "../lib/hb_string.h"
5
+
6
+ #include <stdbool.h>
7
+
4
8
  void herb_parse_ruby_to_stdout(char* source);
5
9
 
10
+ bool herb_ruby_fragment_is_parseable(hb_string_T source);
11
+
6
12
  #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);
@@ -1,6 +1,6 @@
1
1
  #ifndef HERB_VERSION_H
2
2
  #define HERB_VERSION_H
3
3
 
4
- #define HERB_VERSION "0.10.3"
4
+ #define HERB_VERSION "0.11.0"
5
5
 
6
6
  #endif
@@ -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
- return lexer_peek_for(lexer, offset, hb_string("<?xml"), true);
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
  }