herb 0.10.4 → 0.11.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (789) 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 +1243 -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 +859 -374
  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/action_view/helper_registry.rb +1358 -62
  297. data/lib/herb/analysis/partial_declaration.rb +140 -0
  298. data/lib/herb/analysis/partial_index.rb +189 -0
  299. data/lib/herb/analysis/partial_resolution.rb +161 -0
  300. data/lib/herb/analysis/partial_resolver.rb +144 -0
  301. data/lib/herb/analysis/project_index.rb +152 -0
  302. data/lib/herb/{action_view → analysis}/render_analyzer.rb +287 -77
  303. data/lib/herb/analysis/render_graph/ancestor_chain.rb +27 -0
  304. data/lib/herb/analysis/render_graph/builder.rb +376 -0
  305. data/lib/herb/analysis/render_graph/call_frame.rb +9 -0
  306. data/lib/herb/analysis/render_graph/call_site_location.rb +23 -0
  307. data/lib/herb/analysis/render_graph/inferred_signature.rb +21 -0
  308. data/lib/herb/analysis/render_graph/partial_call_site.rb +40 -0
  309. data/lib/herb/analysis/render_graph/partial_context.rb +46 -0
  310. data/lib/herb/analysis/render_graph/template_roots.rb +31 -0
  311. data/lib/herb/analysis/render_graph.rb +285 -0
  312. data/lib/herb/analysis/ruby_locals_index/local.rb +25 -0
  313. data/lib/herb/analysis/ruby_locals_index/named_reference.rb +22 -0
  314. data/lib/herb/analysis/ruby_locals_index/offset_table.rb +44 -0
  315. data/lib/herb/analysis/ruby_locals_index/reference_collector.rb +80 -0
  316. data/lib/herb/analysis/ruby_locals_index/state_locals.rb +49 -0
  317. data/lib/herb/analysis/ruby_locals_index.rb +165 -0
  318. data/lib/herb/analysis/ruby_reference.rb +67 -0
  319. data/lib/herb/analysis/template_dependencies/dependency_collector.rb +179 -0
  320. data/lib/herb/analysis/template_dependencies/node_dependency_collector.rb +309 -0
  321. data/lib/herb/analysis/template_dependencies.rb +562 -0
  322. data/lib/herb/ast/erb_render_node.rb +26 -94
  323. data/lib/herb/ast/helpers.rb +90 -10
  324. data/lib/herb/ast/herb_directive_node.rb +18 -0
  325. data/lib/herb/ast/node.rb +32 -2
  326. data/lib/herb/ast/nodes.rb +1368 -105
  327. data/lib/herb/backend.rb +73 -0
  328. data/lib/herb/bootstrap.rb +8 -8
  329. data/lib/herb/cli.rb +550 -32
  330. data/lib/herb/colors.rb +14 -0
  331. data/lib/herb/configuration.rb +71 -35
  332. data/lib/herb/defaults.yml +2 -1
  333. data/lib/herb/dev/assets.rb +57 -0
  334. data/lib/herb/dev/classifier.rb +84 -0
  335. data/lib/herb/dev/embedded.rb +27 -0
  336. data/lib/herb/dev/pipeline.rb +305 -0
  337. data/lib/herb/dev/protocol.rb +221 -0
  338. data/lib/herb/dev/runner.rb +180 -175
  339. data/lib/herb/dev/server.rb +89 -26
  340. data/lib/herb/dev/server_entry.rb +41 -6
  341. data/lib/herb/dev/watcher.rb +181 -0
  342. data/lib/herb/dev.rb +163 -0
  343. data/lib/herb/diagnostic/formatter.rb +88 -0
  344. data/lib/herb/diagnostic.rb +172 -0
  345. data/lib/herb/diff/operation.rb +36 -0
  346. data/lib/herb/diff/result.rb +62 -0
  347. data/lib/herb/diff.rb +10 -0
  348. data/lib/herb/engine/collector.rb +62 -0
  349. data/lib/herb/engine/compiler.rb +387 -113
  350. data/lib/herb/engine/component_tags/constant_resolver.rb +28 -0
  351. data/lib/herb/engine/component_tags/partial_resolver.rb +54 -0
  352. data/lib/herb/engine/component_tags/resolver.rb +32 -0
  353. data/lib/herb/engine/component_tags/visitor.rb +231 -0
  354. data/lib/herb/engine/css_inliner/inliner.rb +101 -0
  355. data/lib/herb/engine/css_inliner/visitor.rb +174 -0
  356. data/lib/herb/engine/errors.rb +122 -0
  357. data/lib/herb/engine/helpers.rb +82 -0
  358. data/lib/herb/engine/inline_render/inliner.rb +122 -0
  359. data/lib/herb/engine/inline_render/visitor.rb +267 -0
  360. data/lib/herb/engine/runtime/entry.rb +62 -0
  361. data/lib/herb/engine/runtime/error_page.rb +362 -0
  362. data/lib/herb/engine/runtime/html_safe_assertions.rb +217 -0
  363. data/lib/herb/engine/runtime/journal/summary.rb +227 -0
  364. data/lib/herb/engine/runtime/journal.rb +379 -0
  365. data/lib/herb/engine/runtime/middleware.rb +212 -0
  366. data/lib/herb/engine/runtime/observations.rb +73 -0
  367. data/lib/herb/engine/runtime/report.rb +204 -0
  368. data/lib/herb/engine/runtime/session.rb +437 -0
  369. data/lib/herb/engine/runtime.rb +21 -0
  370. data/lib/herb/engine/scoped_style/channel.rb +66 -0
  371. data/lib/herb/engine/scoped_style/collector.rb +74 -0
  372. data/lib/herb/engine/scoped_style/visitor.rb +533 -0
  373. data/lib/herb/engine/slots/annotation.rb +98 -0
  374. data/lib/herb/engine/slots/bindings.rb +61 -0
  375. data/lib/herb/engine/slots/callee.rb +118 -0
  376. data/lib/herb/engine/slots/component_definitions.rb +67 -0
  377. data/lib/herb/engine/slots/components/async.rb +24 -0
  378. data/lib/herb/engine/slots/components/base.rb +132 -0
  379. data/lib/herb/engine/slots/components/deferred.rb +81 -0
  380. data/lib/herb/engine/slots/components/fallback.rb +27 -0
  381. data/lib/herb/engine/slots/components/fragment.rb +99 -0
  382. data/lib/herb/engine/slots/components/lazy.rb +24 -0
  383. data/lib/herb/engine/slots/components.rb +52 -0
  384. data/lib/herb/engine/slots/dependencies/channel.rb +72 -0
  385. data/lib/herb/engine/slots/dependencies.rb +269 -0
  386. data/lib/herb/engine/slots/dynamics_compiler.rb +864 -0
  387. data/lib/herb/engine/slots/identifier.rb +35 -0
  388. data/lib/herb/engine/slots/manifest/channel.rb +74 -0
  389. data/lib/herb/engine/slots/manifest/collector.rb +75 -0
  390. data/lib/herb/engine/slots/markers.rb +152 -0
  391. data/lib/herb/engine/slots/render_bindings.rb +141 -0
  392. data/lib/herb/engine/slots/schema_compiler.rb +94 -0
  393. data/lib/herb/engine/slots/state_anchor.rb +94 -0
  394. data/lib/herb/engine/slots/state_compiler.rb +1325 -0
  395. data/lib/herb/engine/slots/state_directives.rb +854 -0
  396. data/lib/herb/engine/slots/state_kinds.rb +54 -0
  397. data/lib/herb/engine/slots/state_operators.rb +36 -0
  398. data/lib/herb/engine/slots/state_overrides.rb +79 -0
  399. data/lib/herb/engine/slots/state_predicates.rb +65 -0
  400. data/lib/herb/engine/slots/state_transforms.rb +42 -0
  401. data/lib/herb/engine/slots/statics.rb +185 -0
  402. data/lib/herb/engine/slots/subtree.rb +82 -0
  403. data/lib/herb/engine/slots/subtree_compiler.rb +255 -0
  404. data/lib/herb/engine/slots/types.rb +42 -0
  405. data/lib/herb/engine/slots/visitor.rb +2267 -0
  406. data/lib/herb/engine/validators/accessibility_validator.rb +3 -3
  407. data/lib/herb/engine/validators/base.rb +36 -0
  408. data/lib/herb/engine/validators/generator_template_validator.rb +39 -0
  409. data/lib/herb/engine/validators/nesting_validator.rb +3 -3
  410. data/lib/herb/engine/validators/render_validator.rb +13 -33
  411. data/lib/herb/engine/validators/security_validator.rb +3 -17
  412. data/lib/herb/engine/validators.rb +43 -0
  413. data/lib/herb/engine/visitors/auto_close_omitted_tags_visitor.rb +48 -0
  414. data/lib/herb/engine/visitors/content_for_visitor.rb +127 -0
  415. data/lib/herb/engine/{debug_visitor.rb → visitors/debug_visitor.rb} +121 -93
  416. data/lib/herb/engine/visitors/html_safe_assertions_visitor.rb +281 -0
  417. data/lib/herb/engine/visitors/instrumentation_visitor.rb +290 -0
  418. data/lib/herb/engine/visitors/optimize_visitor.rb +728 -0
  419. data/lib/herb/engine/visitors/remove_comments_visitor.rb +106 -0
  420. data/lib/herb/engine/visitors/source_attribution_visitor.rb +177 -0
  421. data/lib/herb/engine.rb +218 -259
  422. data/lib/herb/ensure_installed.rb +43 -0
  423. data/lib/herb/errors.rb +646 -157
  424. data/lib/herb/fingerprint.rb +82 -0
  425. data/lib/herb/html/elements.rb +18 -0
  426. data/lib/herb/html/util.rb +21 -2
  427. data/lib/herb/lex_result.rb +0 -10
  428. data/lib/herb/locate.rb +163 -0
  429. data/lib/herb/location.rb +20 -0
  430. data/lib/herb/parse_result.rb +17 -11
  431. data/lib/herb/parser_options.rb +65 -46
  432. data/lib/herb/position.rb +19 -0
  433. data/lib/herb/prism_inspect.rb +1 -4
  434. data/lib/herb/project.rb +28 -15
  435. data/lib/herb/range.rb +5 -0
  436. data/lib/herb/result.rb +2 -2
  437. data/lib/herb/ruby_program.rb +110 -0
  438. data/lib/herb/source_path.rb +232 -0
  439. data/lib/herb/token.rb +14 -3
  440. data/lib/herb/version.rb +1 -1
  441. data/lib/herb/visitor/context/origin.rb +52 -0
  442. data/lib/herb/visitor/context/replacements.rb +59 -0
  443. data/lib/herb/visitor/context.rb +169 -0
  444. data/lib/herb/visitor/context_aware.rb +45 -0
  445. data/lib/herb/visitor/diagnostics.rb +148 -0
  446. data/lib/herb/visitor/experimental.rb +33 -0
  447. data/lib/herb/visitor/parser_option_requirements.rb +151 -0
  448. data/lib/herb/visitor/stack.rb +192 -0
  449. data/lib/herb/visitor.rb +47 -1
  450. data/lib/herb/warnings.rb +25 -0
  451. data/lib/herb.rb +74 -63
  452. data/sig/herb/action_view/helper_registry.rbs +82 -10
  453. data/sig/herb/analysis/partial_declaration.rbs +80 -0
  454. data/sig/herb/analysis/partial_index.rbs +66 -0
  455. data/sig/herb/analysis/partial_resolution.rbs +57 -0
  456. data/sig/herb/analysis/partial_resolver.rbs +76 -0
  457. data/sig/herb/analysis/project_index.rbs +57 -0
  458. data/sig/herb/{action_view → analysis}/render_analyzer.rbs +25 -4
  459. data/sig/herb/analysis/render_graph/ancestor_chain.rbs +22 -0
  460. data/sig/herb/analysis/render_graph/builder.rbs +180 -0
  461. data/sig/herb/analysis/render_graph/call_frame.rbs +26 -0
  462. data/sig/herb/analysis/render_graph/call_site_location.rbs +28 -0
  463. data/sig/herb/analysis/render_graph/inferred_signature.rbs +27 -0
  464. data/sig/herb/analysis/render_graph/partial_call_site.rbs +36 -0
  465. data/sig/herb/analysis/render_graph/partial_context.rbs +31 -0
  466. data/sig/herb/analysis/render_graph/template_roots.rbs +32 -0
  467. data/sig/herb/analysis/render_graph.rbs +83 -0
  468. data/sig/herb/analysis/ruby_locals_index/local.rbs +21 -0
  469. data/sig/herb/analysis/ruby_locals_index/named_reference.rbs +20 -0
  470. data/sig/herb/analysis/ruby_locals_index/offset_table.rbs +26 -0
  471. data/sig/herb/analysis/ruby_locals_index/reference_collector.rbs +40 -0
  472. data/sig/herb/analysis/ruby_locals_index/state_locals.rbs +19 -0
  473. data/sig/herb/analysis/ruby_locals_index.rbs +62 -0
  474. data/sig/herb/analysis/ruby_reference.rbs +28 -0
  475. data/sig/herb/analysis/template_dependencies/dependency_collector.rbs +52 -0
  476. data/sig/herb/analysis/template_dependencies/node_dependency_collector.rbs +81 -0
  477. data/sig/herb/analysis/template_dependencies.rbs +125 -0
  478. data/sig/herb/ast/erb_render_node.rbs +10 -2
  479. data/sig/herb/ast/helpers.rbs +31 -1
  480. data/sig/herb/ast/herb_directive_node.rbs +13 -0
  481. data/sig/herb/ast/node.rbs +9 -0
  482. data/sig/herb/ast/nodes.rbs +668 -89
  483. data/sig/herb/backend.rbs +52 -0
  484. data/sig/herb/bootstrap.rbs +2 -0
  485. data/sig/herb/colors.rbs +3 -0
  486. data/sig/herb/configuration.rbs +27 -3
  487. data/sig/herb/dev/assets.rbs +27 -0
  488. data/sig/herb/dev/classifier.rbs +57 -0
  489. data/sig/herb/dev/embedded.rbs +21 -0
  490. data/sig/herb/dev/pipeline.rbs +118 -0
  491. data/sig/herb/dev/protocol.rbs +78 -0
  492. data/sig/herb/dev/runner.rbs +64 -23
  493. data/sig/herb/dev/server.rbs +49 -22
  494. data/sig/herb/dev/server_entry.rbs +46 -21
  495. data/sig/herb/dev/watcher.rbs +84 -0
  496. data/sig/herb/dev.rbs +58 -0
  497. data/sig/herb/diagnostic/formatter.rbs +28 -0
  498. data/sig/herb/diagnostic.rbs +88 -0
  499. data/sig/herb/diff/operation.rbs +36 -0
  500. data/sig/herb/diff/result.rbs +36 -0
  501. data/sig/herb/diff.rbs +6 -0
  502. data/sig/herb/engine/collector.rbs +48 -0
  503. data/sig/herb/engine/compiler.rbs +74 -24
  504. data/sig/herb/engine/component_tags/constant_resolver.rbs +19 -0
  505. data/sig/herb/engine/component_tags/partial_resolver.rbs +30 -0
  506. data/sig/herb/engine/component_tags/resolver.rbs +25 -0
  507. data/sig/herb/engine/component_tags/visitor.rbs +69 -0
  508. data/sig/herb/engine/css_inliner/inliner.rbs +65 -0
  509. data/sig/herb/engine/css_inliner/visitor.rbs +87 -0
  510. data/sig/herb/engine/errors.rbs +68 -0
  511. data/sig/herb/engine/helpers.rbs +28 -0
  512. data/sig/herb/engine/inline_render/inliner.rbs +39 -0
  513. data/sig/herb/engine/inline_render/visitor.rbs +104 -0
  514. data/sig/herb/engine/runtime/entry.rbs +43 -0
  515. data/sig/herb/engine/runtime/error_page.rbs +115 -0
  516. data/sig/herb/engine/runtime/html_safe_assertions.rbs +99 -0
  517. data/sig/herb/engine/runtime/journal/summary.rbs +172 -0
  518. data/sig/herb/engine/runtime/journal.rbs +126 -0
  519. data/sig/herb/engine/runtime/middleware.rbs +96 -0
  520. data/sig/herb/engine/runtime/observations.rbs +38 -0
  521. data/sig/herb/engine/runtime/report.rbs +97 -0
  522. data/sig/herb/engine/runtime/session.rbs +233 -0
  523. data/sig/herb/engine/runtime.rbs +14 -0
  524. data/sig/herb/engine/scoped_style/channel.rbs +45 -0
  525. data/sig/herb/engine/scoped_style/collector.rbs +45 -0
  526. data/sig/herb/engine/scoped_style/visitor.rbs +220 -0
  527. data/sig/herb/engine/slots/annotation.rbs +72 -0
  528. data/sig/herb/engine/slots/bindings.rbs +34 -0
  529. data/sig/herb/engine/slots/callee.rbs +62 -0
  530. data/sig/herb/engine/slots/component_definitions.rbs +19 -0
  531. data/sig/herb/engine/slots/components/async.rbs +20 -0
  532. data/sig/herb/engine/slots/components/base.rbs +60 -0
  533. data/sig/herb/engine/slots/components/deferred.rbs +29 -0
  534. data/sig/herb/engine/slots/components/fallback.rbs +21 -0
  535. data/sig/herb/engine/slots/components/fragment.rbs +34 -0
  536. data/sig/herb/engine/slots/components/lazy.rbs +20 -0
  537. data/sig/herb/engine/slots/components.rbs +30 -0
  538. data/sig/herb/engine/slots/dependencies/channel.rbs +51 -0
  539. data/sig/herb/engine/slots/dependencies.rbs +94 -0
  540. data/sig/herb/engine/slots/dynamics_compiler.rbs +352 -0
  541. data/sig/herb/engine/slots/identifier.rbs +19 -0
  542. data/sig/herb/engine/slots/manifest/channel.rbs +49 -0
  543. data/sig/herb/engine/slots/manifest/collector.rbs +45 -0
  544. data/sig/herb/engine/slots/markers.rbs +99 -0
  545. data/sig/herb/engine/slots/render_bindings.rbs +69 -0
  546. data/sig/herb/engine/slots/schema_compiler.rbs +62 -0
  547. data/sig/herb/engine/slots/state_anchor.rbs +41 -0
  548. data/sig/herb/engine/slots/state_compiler.rbs +258 -0
  549. data/sig/herb/engine/slots/state_directives.rbs +278 -0
  550. data/sig/herb/engine/slots/state_kinds.rbs +24 -0
  551. data/sig/herb/engine/slots/state_operators.rbs +19 -0
  552. data/sig/herb/engine/slots/state_overrides.rbs +33 -0
  553. data/sig/herb/engine/slots/state_predicates.rbs +16 -0
  554. data/sig/herb/engine/slots/state_transforms.rbs +15 -0
  555. data/sig/herb/engine/slots/statics.rbs +67 -0
  556. data/sig/herb/engine/slots/subtree.rbs +49 -0
  557. data/sig/herb/engine/slots/subtree_compiler.rbs +130 -0
  558. data/sig/herb/engine/slots/types.rbs +46 -0
  559. data/sig/herb/engine/slots/visitor.rbs +603 -0
  560. data/sig/herb/engine/validators/accessibility_validator.rbs +1 -1
  561. data/sig/herb/engine/validators/base.rbs +28 -0
  562. data/sig/herb/engine/validators/generator_template_validator.rbs +19 -0
  563. data/sig/herb/engine/validators/nesting_validator.rbs +1 -1
  564. data/sig/herb/engine/validators/render_validator.rbs +2 -6
  565. data/sig/herb/engine/validators/security_validator.rbs +1 -3
  566. data/sig/herb/engine/validators.rbs +21 -0
  567. data/sig/herb/engine/visitors/auto_close_omitted_tags_visitor.rbs +26 -0
  568. data/sig/herb/engine/visitors/content_for_visitor.rbs +52 -0
  569. data/sig/herb/engine/{debug_visitor.rbs → visitors/debug_visitor.rbs} +26 -15
  570. data/sig/herb/engine/visitors/html_safe_assertions_visitor.rbs +100 -0
  571. data/sig/herb/engine/visitors/instrumentation_visitor.rbs +111 -0
  572. data/sig/herb/engine/visitors/optimize_visitor.rbs +246 -0
  573. data/sig/herb/engine/visitors/remove_comments_visitor.rbs +66 -0
  574. data/sig/herb/engine/visitors/source_attribution_visitor.rbs +90 -0
  575. data/sig/herb/engine.rbs +47 -41
  576. data/sig/herb/ensure_installed.rbs +9 -0
  577. data/sig/herb/errors.rbs +293 -0
  578. data/sig/herb/fingerprint.rbs +37 -0
  579. data/sig/herb/html/elements.rbs +19 -0
  580. data/sig/herb/html/util.rbs +15 -1
  581. data/sig/herb/lex_result.rbs +0 -6
  582. data/sig/herb/locate.rbs +89 -0
  583. data/sig/herb/location.rbs +12 -0
  584. data/sig/herb/parse_result.rbs +10 -8
  585. data/sig/herb/parser_options.rbs +47 -21
  586. data/sig/herb/position.rbs +11 -0
  587. data/sig/herb/range.rbs +3 -0
  588. data/sig/herb/ruby_program.rbs +51 -0
  589. data/sig/herb/source_path.rbs +132 -0
  590. data/sig/herb/token.rbs +5 -2
  591. data/sig/herb/visitor/context/origin.rbs +51 -0
  592. data/sig/herb/visitor/context/replacements.rbs +39 -0
  593. data/sig/herb/visitor/context.rbs +83 -0
  594. data/sig/herb/visitor/context_aware.rbs +32 -0
  595. data/sig/herb/visitor/diagnostics.rbs +82 -0
  596. data/sig/herb/visitor/experimental.rbs +23 -0
  597. data/sig/herb/visitor/parser_option_requirements.rbs +76 -0
  598. data/sig/herb/visitor/stack.rbs +91 -0
  599. data/sig/herb/visitor.rbs +22 -0
  600. data/sig/herb/warnings.rbs +10 -0
  601. data/sig/herb.rbs +27 -10
  602. data/sig/serialized_ast_errors.rbs +58 -1
  603. data/sig/serialized_ast_nodes.rbs +59 -2
  604. data/src/analyze/action_view/attribute_extraction_helpers.c +73 -36
  605. data/src/analyze/action_view/generated_handlers.c +37 -1
  606. data/src/analyze/action_view/generated_handlers.h +2 -1
  607. data/src/analyze/action_view/helper_registry.c +1353 -58
  608. data/src/analyze/action_view/registry.c +10 -17
  609. data/src/analyze/action_view/stylesheet_link_tag.c +40 -0
  610. data/src/analyze/action_view/tag_helper_node_builders.c +63 -3
  611. data/src/analyze/action_view/tag_helpers.c +497 -111
  612. data/src/analyze/analyze.c +306 -89
  613. data/src/analyze/analyze_helpers.c +502 -243
  614. data/src/analyze/analyzed_ruby.c +2 -0
  615. data/src/analyze/builders.c +80 -51
  616. data/src/analyze/conditional_elements.c +13 -8
  617. data/src/analyze/conditional_open_tags.c +11 -5
  618. data/src/analyze/control_type.c +30 -5
  619. data/src/analyze/herb_directives.c +701 -0
  620. data/src/analyze/invalid_structures.c +11 -7
  621. data/src/analyze/iteration_nodes.c +306 -0
  622. data/src/analyze/missing_end.c +116 -32
  623. data/src/analyze/parse_errors.c +8 -3
  624. data/src/analyze/postfix_conditionals.c +98 -63
  625. data/src/analyze/prism_annotate.c +45 -13
  626. data/src/analyze/render_nodes.c +345 -123
  627. data/src/analyze/strict_locals.c +30 -26
  628. data/src/analyze/ternary_conditionals.c +95 -70
  629. data/src/analyze/transform.c +43 -1
  630. data/src/ast/ast_node.c +3 -13
  631. data/src/ast/ast_nodes.c +914 -113
  632. data/src/ast/ast_pretty_print.c +166 -3
  633. data/src/diff/herb_diff.c +8 -0
  634. data/src/diff/herb_diff_attributes.c +1 -0
  635. data/src/diff/herb_diff_children.c +4 -3
  636. data/src/diff/herb_diff_helpers.c +7 -1
  637. data/src/diff/herb_diff_nodes.c +186 -71
  638. data/src/diff/herb_hash_tree.c +99 -1
  639. data/src/errors.c +1096 -128
  640. data/src/extract.c +227 -144
  641. data/src/herb.c +30 -11
  642. data/src/include/analyze/action_view/attribute_extraction_helpers.h +1 -1
  643. data/src/include/analyze/action_view/helper_registry.h +28 -4
  644. data/src/include/analyze/action_view/tag_helper_handler.h +1 -1
  645. data/src/include/analyze/action_view/tag_helper_node_builders.h +7 -0
  646. data/src/include/analyze/analyze.h +11 -22
  647. data/src/include/analyze/analyzed_ruby.h +25 -0
  648. data/src/include/analyze/builders.h +16 -0
  649. data/src/include/analyze/helpers.h +25 -24
  650. data/src/include/analyze/herb_directive_kinds.h +41 -0
  651. data/src/include/analyze/herb_directives.h +14 -0
  652. data/src/include/analyze/iteration_nodes.h +11 -0
  653. data/src/include/analyze/prism_annotate.h +3 -3
  654. data/src/include/analyze/ternary_conditionals.h +2 -0
  655. data/src/include/ast/ast_node.h +1 -5
  656. data/src/include/ast/ast_nodes.h +78 -3
  657. data/src/include/ast/ast_pretty_print.h +1 -1
  658. data/src/include/diff/herb_diff.h +11 -0
  659. data/src/include/errors.h +156 -39
  660. data/src/include/extract.h +11 -0
  661. data/src/include/herb.h +6 -0
  662. data/src/include/lexer/erb_openers.h +29 -0
  663. data/src/include/lexer/lexer.h +1 -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/herb_prism_node.h +6 -1
  678. data/src/include/prism/ruby_parser.h +6 -0
  679. data/src/include/util/html_elements.h +85 -0
  680. data/src/include/util/html_util.h +1 -0
  681. data/src/include/version.h +1 -1
  682. data/src/lexer/lexer_peek_helpers.c +15 -1
  683. data/src/lexer/token.c +83 -1
  684. data/src/lexer.c +228 -12
  685. data/src/lib/hb_allocator.c +2 -0
  686. data/src/lib/hb_array.c +26 -0
  687. data/src/lib/hb_string.c +26 -0
  688. data/src/main.c +1 -1
  689. data/src/parser/dot_notation.c +4 -3
  690. data/src/parser/match_tags.c +66 -1
  691. data/src/parser/parser_helpers.c +69 -37
  692. data/src/parser.c +606 -383
  693. data/src/parser_options_defaults.c +30 -0
  694. data/src/prism/prism_helpers.c +94 -0
  695. data/src/prism/ruby_parser.c +49 -0
  696. data/src/util/html_util.c +11 -58
  697. data/src/visitor.c +77 -1
  698. data/templates/ext/herb/error_helpers.c.erb +1 -1
  699. data/templates/ext/herb/nodes.c.erb +19 -14
  700. data/templates/ext/herb/nodes.h.erb +2 -1
  701. data/templates/ext/herb/parser_options_helpers.c.erb +69 -0
  702. data/templates/ext/herb/parser_options_helpers.h.erb +11 -0
  703. data/templates/java/nodes.c.erb +21 -17
  704. data/templates/java/nodes.h.erb +3 -2
  705. data/templates/java/org/herb/ParserOptions.java.erb +24 -0
  706. data/templates/java/org/herb/ast/HelperRegistry.java.erb +67 -31
  707. data/templates/java/org/herb/ast/HelperType.java.erb +29 -0
  708. data/templates/java/org/herb/ast/Nodes.java.erb +11 -7
  709. data/templates/java/parser_options_helpers.c.erb +45 -0
  710. data/templates/java/parser_options_helpers.h.erb +10 -0
  711. data/templates/javascript/packages/client/src/state-kinds.ts.erb +49 -0
  712. data/templates/javascript/packages/client/src/state-operators.ts.erb +15 -0
  713. data/templates/javascript/packages/client/src/state-predicates.ts.erb +27 -0
  714. data/templates/javascript/packages/client/src/state-transforms.ts.erb +19 -0
  715. data/templates/javascript/packages/core/src/action-view-helpers.ts.erb +47 -0
  716. data/templates/javascript/packages/core/src/built-in-components.ts.erb +67 -0
  717. data/templates/javascript/packages/core/src/errors.ts.erb +9 -3
  718. data/templates/javascript/packages/core/src/foreign-content-elements.ts.erb +18 -0
  719. data/templates/javascript/packages/core/src/html-constants.ts.erb +32 -0
  720. data/templates/javascript/packages/core/src/html-elements.ts.erb +41 -0
  721. data/templates/javascript/packages/core/src/node-type-guards.ts.erb +11 -7
  722. data/templates/javascript/packages/core/src/nodes.ts.erb +103 -20
  723. data/templates/javascript/packages/core/src/parser-options.ts.erb +41 -0
  724. data/templates/javascript/packages/core/src/visitor.ts.erb +1 -1
  725. data/templates/javascript/packages/node/extension/error_helpers.cpp.erb +3 -3
  726. data/templates/javascript/packages/node/extension/nodes.cpp.erb +18 -13
  727. data/templates/javascript/packages/node/extension/nodes.h.erb +3 -3
  728. data/templates/javascript/packages/node/extension/parser_options_helpers.cpp.erb +41 -0
  729. data/templates/javascript/packages/node/extension/parser_options_helpers.h.erb +12 -0
  730. data/templates/lib/herb/action_view/helper_registry.rb.erb +77 -3
  731. data/templates/lib/herb/ast/nodes.rb.erb +16 -6
  732. data/templates/lib/herb/engine/slots/component_definitions.rb.erb +38 -0
  733. data/templates/lib/herb/engine/slots/state_kinds.rb.erb +37 -0
  734. data/templates/lib/herb/engine/slots/state_operators.rb.erb +26 -0
  735. data/templates/lib/herb/engine/slots/state_predicates.rb.erb +39 -0
  736. data/templates/lib/herb/engine/slots/state_transforms.rb.erb +27 -0
  737. data/templates/lib/herb/errors.rb.erb +34 -6
  738. data/templates/lib/herb/html/elements.rb.erb +12 -0
  739. data/templates/lib/herb/parser_options.rb.erb +32 -0
  740. data/templates/lib/herb/visitor.rb.erb +7 -1
  741. data/templates/rust/herb-printer/src/printer_visitor.rs.erb +14 -0
  742. data/templates/rust/src/action_view_helpers.rs.erb +38 -0
  743. data/templates/rust/src/ast/nodes.rs.erb +21 -31
  744. data/templates/rust/src/errors.rs.erb +1 -1
  745. data/templates/rust/src/nodes.rs.erb +58 -26
  746. data/templates/rust/src/parser_options.rs.erb +16 -0
  747. data/templates/rust/src/prism/generated_deserialize.rs.erb +109 -0
  748. data/templates/rust/src/prism/generated_prettyprint.rs.erb +153 -0
  749. data/templates/rust/src/union_types.rs.erb +7 -1
  750. data/templates/rust/src/visitor.rs.erb +1 -1
  751. data/templates/src/analyze/action_view/helper_registry.c.erb +22 -0
  752. data/templates/src/analyze/missing_end.c.erb +13 -5
  753. data/templates/src/ast/ast_nodes.c.erb +41 -2
  754. data/templates/src/diff/herb_diff_nodes.c.erb +44 -8
  755. data/templates/src/errors.c.erb +8 -3
  756. data/templates/src/include/analyze/action_view/helper_registry.h.erb +19 -0
  757. data/templates/src/include/analyze/herb_directive_kinds.h.erb +25 -0
  758. data/templates/src/include/errors.h.erb +3 -1
  759. data/templates/src/include/parser/foreign_content_elements.h.erb +23 -0
  760. data/templates/src/include/parser/parser_options.h.erb +21 -0
  761. data/templates/src/include/util/html_elements.h.erb +28 -0
  762. data/templates/src/parser_options_defaults.c.erb +9 -0
  763. data/templates/template.rb +564 -9
  764. data/templates/wasm/error_helpers.cpp.erb +4 -4
  765. data/templates/wasm/nodes.cpp.erb +17 -27
  766. data/templates/wasm/nodes.h.erb +3 -3
  767. data/templates/wasm/parser_options_helpers.cpp.erb +25 -0
  768. data/templates/wasm/parser_options_helpers.h.erb +12 -0
  769. metadata +306 -27
  770. data/config/action_view_helpers/actionview/form_helper/button.yml +0 -38
  771. data/config/action_view_helpers/actionview/form_helper/submit.yml +0 -35
  772. data/lib/herb/ast.rb +0 -7
  773. data/lib/herb/diff_operation.rb +0 -34
  774. data/lib/herb/diff_result.rb +0 -59
  775. data/lib/herb/engine/error_formatter.rb +0 -432
  776. data/lib/herb/engine/parser_error_overlay.rb +0 -773
  777. data/lib/herb/engine/validation_error_overlay.rb +0 -182
  778. data/lib/herb/engine/validation_errors.rb +0 -65
  779. data/lib/herb/engine/validator.rb +0 -80
  780. data/sig/herb/ast.rbs +0 -6
  781. data/sig/herb/diff_operation.rbs +0 -34
  782. data/sig/herb/diff_result.rbs +0 -34
  783. data/sig/herb/engine/debug.rbs +0 -38
  784. data/sig/herb/engine/error_formatter.rbs +0 -47
  785. data/sig/herb/engine/parser_error_overlay.rbs +0 -41
  786. data/sig/herb/engine/validation_error_overlay.rbs +0 -35
  787. data/sig/herb/engine/validation_errors.rbs +0 -45
  788. data/sig/herb/engine/validator.rbs +0 -41
  789. data/sig/herb_c_extension.rbs +0 -10
@@ -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
@@ -2,12 +2,17 @@
2
2
  #define HERB_PRISM_NODE_H
3
3
 
4
4
  #include <prism.h>
5
+ #include <stdint.h>
5
6
 
6
7
  typedef struct {
7
8
  pm_node_t* node;
8
9
  pm_parser_t* parser;
10
+ uint32_t source_start;
11
+ uint32_t source_end;
9
12
  } herb_prism_node_T;
10
13
 
11
- #define HERB_PRISM_NODE_EMPTY ((herb_prism_node_T) { .node = NULL, .parser = NULL })
14
+ #define HERB_PRISM_NODE_EMPTY ((herb_prism_node_T) { .node = NULL, .parser = NULL, .source_start = 0, .source_end = 0 })
15
+
16
+ void herb_prism_node_serialize(herb_prism_node_T prism_node, pm_buffer_t* buffer);
12
17
 
13
18
  #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.4"
4
+ #define HERB_VERSION "0.11.1"
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
  }