html-to-markdown 3.4.0 → 3.6.0.pre.rc.23

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 (188) hide show
  1. checksums.yaml +4 -4
  2. data/LICENSE +21 -0
  3. data/README.md +347 -0
  4. data/Steepfile +10 -2
  5. data/ext/html_to_markdown_rb/Cargo.toml +3 -2
  6. data/ext/html_to_markdown_rb/extconf.rb +5 -5
  7. data/ext/html_to_markdown_rb/native/Cargo.lock +962 -0
  8. data/ext/html_to_markdown_rb/native/Cargo.toml +6 -11
  9. data/ext/html_to_markdown_rb/native/extconf.rb +14 -0
  10. data/ext/html_to_markdown_rb/src/lib.rs +1715 -646
  11. data/lib/html_to_markdown/native.rb +913 -37
  12. data/lib/html_to_markdown/version.rb +3 -3
  13. data/lib/html_to_markdown.rb +9 -4
  14. data/lib/html_to_markdown_rb.so +0 -0
  15. data/sig/types.rbs +59 -292
  16. metadata +32 -179
  17. data/ext/html_to_markdown_rb/Makefile +0 -592
  18. data/lib/bin/html-to-markdown +0 -0
  19. data/vendor/Cargo.toml +0 -33
  20. data/vendor/html-to-markdown-rs/Cargo.toml +0 -54
  21. data/vendor/html-to-markdown-rs/README.md +0 -278
  22. data/vendor/html-to-markdown-rs/examples/basic.rs +0 -24
  23. data/vendor/html-to-markdown-rs/examples/table.rs +0 -25
  24. data/vendor/html-to-markdown-rs/examples/test_deser.rs +0 -12
  25. data/vendor/html-to-markdown-rs/examples/test_escape.rs +0 -58
  26. data/vendor/html-to-markdown-rs/examples/test_inline_formatting.rs +0 -113
  27. data/vendor/html-to-markdown-rs/examples/test_lists.rs +0 -39
  28. data/vendor/html-to-markdown-rs/examples/test_semantic_tags.rs +0 -89
  29. data/vendor/html-to-markdown-rs/examples/test_tables.rs +0 -100
  30. data/vendor/html-to-markdown-rs/examples/test_task_lists.rs +0 -61
  31. data/vendor/html-to-markdown-rs/examples/test_whitespace.rs +0 -34
  32. data/vendor/html-to-markdown-rs/src/convert_api.rs +0 -349
  33. data/vendor/html-to-markdown-rs/src/converter/block/blockquote.rs +0 -178
  34. data/vendor/html-to-markdown-rs/src/converter/block/container.rs +0 -114
  35. data/vendor/html-to-markdown-rs/src/converter/block/div.rs +0 -149
  36. data/vendor/html-to-markdown-rs/src/converter/block/heading.rs +0 -428
  37. data/vendor/html-to-markdown-rs/src/converter/block/horizontal_rule.rs +0 -103
  38. data/vendor/html-to-markdown-rs/src/converter/block/line_break.rs +0 -89
  39. data/vendor/html-to-markdown-rs/src/converter/block/mod.rs +0 -10
  40. data/vendor/html-to-markdown-rs/src/converter/block/paragraph.rs +0 -140
  41. data/vendor/html-to-markdown-rs/src/converter/block/preformatted.rs +0 -298
  42. data/vendor/html-to-markdown-rs/src/converter/block/table/builder.rs +0 -453
  43. data/vendor/html-to-markdown-rs/src/converter/block/table/caption.rs +0 -44
  44. data/vendor/html-to-markdown-rs/src/converter/block/table/cell.rs +0 -276
  45. data/vendor/html-to-markdown-rs/src/converter/block/table/cells.rs +0 -336
  46. data/vendor/html-to-markdown-rs/src/converter/block/table/layout.rs +0 -58
  47. data/vendor/html-to-markdown-rs/src/converter/block/table/mod.rs +0 -266
  48. data/vendor/html-to-markdown-rs/src/converter/block/table/scanner.rs +0 -146
  49. data/vendor/html-to-markdown-rs/src/converter/block/table/utils.rs +0 -34
  50. data/vendor/html-to-markdown-rs/src/converter/block/unknown.rs +0 -138
  51. data/vendor/html-to-markdown-rs/src/converter/context.rs +0 -208
  52. data/vendor/html-to-markdown-rs/src/converter/dom_context.rs +0 -337
  53. data/vendor/html-to-markdown-rs/src/converter/form/elements.rs +0 -770
  54. data/vendor/html-to-markdown-rs/src/converter/form/mod.rs +0 -82
  55. data/vendor/html-to-markdown-rs/src/converter/format/djot.rs +0 -64
  56. data/vendor/html-to-markdown-rs/src/converter/format/markdown.rs +0 -59
  57. data/vendor/html-to-markdown-rs/src/converter/format/mod.rs +0 -43
  58. data/vendor/html-to-markdown-rs/src/converter/handlers/blockquote.rs +0 -173
  59. data/vendor/html-to-markdown-rs/src/converter/handlers/code_block.rs +0 -434
  60. data/vendor/html-to-markdown-rs/src/converter/handlers/graphic.rs +0 -234
  61. data/vendor/html-to-markdown-rs/src/converter/handlers/image.rs +0 -282
  62. data/vendor/html-to-markdown-rs/src/converter/handlers/link.rs +0 -316
  63. data/vendor/html-to-markdown-rs/src/converter/handlers/mod.rs +0 -26
  64. data/vendor/html-to-markdown-rs/src/converter/inline/code.rs +0 -306
  65. data/vendor/html-to-markdown-rs/src/converter/inline/emphasis.rs +0 -345
  66. data/vendor/html-to-markdown-rs/src/converter/inline/link.rs +0 -428
  67. data/vendor/html-to-markdown-rs/src/converter/inline/mod.rs +0 -237
  68. data/vendor/html-to-markdown-rs/src/converter/inline/ruby.rs +0 -337
  69. data/vendor/html-to-markdown-rs/src/converter/inline/semantic/marks.rs +0 -566
  70. data/vendor/html-to-markdown-rs/src/converter/inline/semantic/mod.rs +0 -86
  71. data/vendor/html-to-markdown-rs/src/converter/inline/semantic/typography.rs +0 -558
  72. data/vendor/html-to-markdown-rs/src/converter/list/definition.rs +0 -232
  73. data/vendor/html-to-markdown-rs/src/converter/list/item.rs +0 -332
  74. data/vendor/html-to-markdown-rs/src/converter/list/mod.rs +0 -70
  75. data/vendor/html-to-markdown-rs/src/converter/list/ordered.rs +0 -201
  76. data/vendor/html-to-markdown-rs/src/converter/list/unordered.rs +0 -195
  77. data/vendor/html-to-markdown-rs/src/converter/list/utils.rs +0 -314
  78. data/vendor/html-to-markdown-rs/src/converter/main.rs +0 -710
  79. data/vendor/html-to-markdown-rs/src/converter/main_helpers.rs +0 -452
  80. data/vendor/html-to-markdown-rs/src/converter/media/embedded.rs +0 -393
  81. data/vendor/html-to-markdown-rs/src/converter/media/graphic.rs +0 -4
  82. data/vendor/html-to-markdown-rs/src/converter/media/image.rs +0 -183
  83. data/vendor/html-to-markdown-rs/src/converter/media/mod.rs +0 -87
  84. data/vendor/html-to-markdown-rs/src/converter/media/svg.rs +0 -280
  85. data/vendor/html-to-markdown-rs/src/converter/metadata.rs +0 -220
  86. data/vendor/html-to-markdown-rs/src/converter/mod.rs +0 -156
  87. data/vendor/html-to-markdown-rs/src/converter/plain_text.rs +0 -516
  88. data/vendor/html-to-markdown-rs/src/converter/preprocessing_helpers.rs +0 -201
  89. data/vendor/html-to-markdown-rs/src/converter/reference_collector.rs +0 -69
  90. data/vendor/html-to-markdown-rs/src/converter/semantic/attributes.rs +0 -269
  91. data/vendor/html-to-markdown-rs/src/converter/semantic/definition_list.rs +0 -266
  92. data/vendor/html-to-markdown-rs/src/converter/semantic/figure.rs +0 -391
  93. data/vendor/html-to-markdown-rs/src/converter/semantic/mod.rs +0 -112
  94. data/vendor/html-to-markdown-rs/src/converter/semantic/sectioning.rs +0 -85
  95. data/vendor/html-to-markdown-rs/src/converter/semantic/summary.rs +0 -324
  96. data/vendor/html-to-markdown-rs/src/converter/text/mod.rs +0 -8
  97. data/vendor/html-to-markdown-rs/src/converter/text/processing.rs +0 -56
  98. data/vendor/html-to-markdown-rs/src/converter/text_node.rs +0 -269
  99. data/vendor/html-to-markdown-rs/src/converter/utility/attributes.rs +0 -151
  100. data/vendor/html-to-markdown-rs/src/converter/utility/caching.rs +0 -74
  101. data/vendor/html-to-markdown-rs/src/converter/utility/content.rs +0 -271
  102. data/vendor/html-to-markdown-rs/src/converter/utility/mod.rs +0 -17
  103. data/vendor/html-to-markdown-rs/src/converter/utility/preprocessing.rs +0 -1002
  104. data/vendor/html-to-markdown-rs/src/converter/utility/serialization.rs +0 -126
  105. data/vendor/html-to-markdown-rs/src/converter/utility/siblings.rs +0 -97
  106. data/vendor/html-to-markdown-rs/src/converter/visitor_hooks.rs +0 -189
  107. data/vendor/html-to-markdown-rs/src/error.rs +0 -43
  108. data/vendor/html-to-markdown-rs/src/exports.rs +0 -24
  109. data/vendor/html-to-markdown-rs/src/inline_images.rs +0 -336
  110. data/vendor/html-to-markdown-rs/src/lib.rs +0 -139
  111. data/vendor/html-to-markdown-rs/src/metadata/collector.rs +0 -457
  112. data/vendor/html-to-markdown-rs/src/metadata/config.rs +0 -394
  113. data/vendor/html-to-markdown-rs/src/metadata/extraction.rs +0 -398
  114. data/vendor/html-to-markdown-rs/src/metadata/mod.rs +0 -288
  115. data/vendor/html-to-markdown-rs/src/metadata/types.rs +0 -477
  116. data/vendor/html-to-markdown-rs/src/options/conversion.rs +0 -559
  117. data/vendor/html-to-markdown-rs/src/options/inline_image.rs +0 -111
  118. data/vendor/html-to-markdown-rs/src/options/mod.rs +0 -20
  119. data/vendor/html-to-markdown-rs/src/options/preprocessing.rs +0 -201
  120. data/vendor/html-to-markdown-rs/src/options/validation.rs +0 -416
  121. data/vendor/html-to-markdown-rs/src/prelude.rs +0 -1
  122. data/vendor/html-to-markdown-rs/src/rcdom.rs +0 -487
  123. data/vendor/html-to-markdown-rs/src/text.rs +0 -358
  124. data/vendor/html-to-markdown-rs/src/types/document.rs +0 -191
  125. data/vendor/html-to-markdown-rs/src/types/mod.rs +0 -17
  126. data/vendor/html-to-markdown-rs/src/types/result.rs +0 -54
  127. data/vendor/html-to-markdown-rs/src/types/structure_builder.rs +0 -791
  128. data/vendor/html-to-markdown-rs/src/types/structure_collector.rs +0 -483
  129. data/vendor/html-to-markdown-rs/src/types/tables.rs +0 -52
  130. data/vendor/html-to-markdown-rs/src/types/warnings.rs +0 -33
  131. data/vendor/html-to-markdown-rs/src/validation.rs +0 -158
  132. data/vendor/html-to-markdown-rs/src/visitor/default_impl.rs +0 -63
  133. data/vendor/html-to-markdown-rs/src/visitor/mod.rs +0 -41
  134. data/vendor/html-to-markdown-rs/src/visitor/traits.rs +0 -370
  135. data/vendor/html-to-markdown-rs/src/visitor/types.rs +0 -319
  136. data/vendor/html-to-markdown-rs/src/visitor_helpers/helpers/callbacks/mod.rs +0 -1
  137. data/vendor/html-to-markdown-rs/src/visitor_helpers/helpers/content.rs +0 -126
  138. data/vendor/html-to-markdown-rs/src/visitor_helpers/helpers/mod.rs +0 -27
  139. data/vendor/html-to-markdown-rs/src/visitor_helpers/helpers/state.rs +0 -110
  140. data/vendor/html-to-markdown-rs/src/visitor_helpers/helpers/traversal.rs +0 -250
  141. data/vendor/html-to-markdown-rs/src/visitor_helpers.rs +0 -597
  142. data/vendor/html-to-markdown-rs/src/wrapper/sync.rs +0 -413
  143. data/vendor/html-to-markdown-rs/src/wrapper/utils.rs +0 -290
  144. data/vendor/html-to-markdown-rs/src/wrapper.rs +0 -9
  145. data/vendor/html-to-markdown-rs/tests/br_in_inline_test.rs +0 -87
  146. data/vendor/html-to-markdown-rs/tests/commonmark_compliance_test.rs +0 -297
  147. data/vendor/html-to-markdown-rs/tests/djot_output_test.rs +0 -153
  148. data/vendor/html-to-markdown-rs/tests/exclude_selectors_test.rs +0 -132
  149. data/vendor/html-to-markdown-rs/tests/integration_test.rs +0 -631
  150. data/vendor/html-to-markdown-rs/tests/issue_121_regressions.rs +0 -49
  151. data/vendor/html-to-markdown-rs/tests/issue_127_regressions.rs +0 -58
  152. data/vendor/html-to-markdown-rs/tests/issue_128_regressions.rs +0 -17
  153. data/vendor/html-to-markdown-rs/tests/issue_131_regressions.rs +0 -41
  154. data/vendor/html-to-markdown-rs/tests/issue_134_regressions.rs +0 -40
  155. data/vendor/html-to-markdown-rs/tests/issue_139_regressions.rs +0 -26
  156. data/vendor/html-to-markdown-rs/tests/issue_140_regressions.rs +0 -185
  157. data/vendor/html-to-markdown-rs/tests/issue_143_regressions.rs +0 -100
  158. data/vendor/html-to-markdown-rs/tests/issue_145_regressions.rs +0 -133
  159. data/vendor/html-to-markdown-rs/tests/issue_146_regressions.rs +0 -144
  160. data/vendor/html-to-markdown-rs/tests/issue_176_regressions.rs +0 -62
  161. data/vendor/html-to-markdown-rs/tests/issue_190_regressions.rs +0 -128
  162. data/vendor/html-to-markdown-rs/tests/issue_199_regressions.rs +0 -20
  163. data/vendor/html-to-markdown-rs/tests/issue_200_regressions.rs +0 -62
  164. data/vendor/html-to-markdown-rs/tests/issue_212_regressions.rs +0 -68
  165. data/vendor/html-to-markdown-rs/tests/issue_216_217_regressions.rs +0 -87
  166. data/vendor/html-to-markdown-rs/tests/issue_336_regressions.rs +0 -74
  167. data/vendor/html-to-markdown-rs/tests/issue_339_regressions.rs +0 -92
  168. data/vendor/html-to-markdown-rs/tests/issue_347_regressions.rs +0 -154
  169. data/vendor/html-to-markdown-rs/tests/issue_348_visitor_plain.rs +0 -93
  170. data/vendor/html-to-markdown-rs/tests/json_ld_script_extraction.rs +0 -44
  171. data/vendor/html-to-markdown-rs/tests/lists_test.rs +0 -199
  172. data/vendor/html-to-markdown-rs/tests/plain_output_test.rs +0 -273
  173. data/vendor/html-to-markdown-rs/tests/preprocessing_tests.rs +0 -61
  174. data/vendor/html-to-markdown-rs/tests/reference_links_test.rs +0 -169
  175. data/vendor/html-to-markdown-rs/tests/sectioning_elements_test.rs +0 -137
  176. data/vendor/html-to-markdown-rs/tests/skip_images_test.rs +0 -522
  177. data/vendor/html-to-markdown-rs/tests/tables_test.rs +0 -743
  178. data/vendor/html-to-markdown-rs/tests/test_custom_elements.rs +0 -41
  179. data/vendor/html-to-markdown-rs/tests/test_issue_187.rs +0 -204
  180. data/vendor/html-to-markdown-rs/tests/test_issue_218.rs +0 -68
  181. data/vendor/html-to-markdown-rs/tests/test_issue_277.rs +0 -77
  182. data/vendor/html-to-markdown-rs/tests/test_max_depth.rs +0 -82
  183. data/vendor/html-to-markdown-rs/tests/test_nested_simple.rs +0 -45
  184. data/vendor/html-to-markdown-rs/tests/test_script_style_stripping.rs +0 -396
  185. data/vendor/html-to-markdown-rs/tests/test_spa_bisect.rs +0 -34
  186. data/vendor/html-to-markdown-rs/tests/visitor_code_integration_test.rs +0 -121
  187. data/vendor/html-to-markdown-rs/tests/visitor_integration_test.rs +0 -1190
  188. data/vendor/html-to-markdown-rs/tests/xml_tables_test.rs +0 -372
@@ -1,59 +1,935 @@
1
1
  # This file is auto-generated by alef — DO NOT EDIT.
2
- # alef:hash:b54e7bb2ab55cc6c25c9cac0e62ec66c35fd2d1956ef9ba5e3dc9e7ba5e666a5
2
+ # alef:hash:fbc32dea2062047854006aa7a5d861ef8fc29be3d8b519a3e56646eb14f1b2e9
3
3
  # To regenerate: alef generate
4
4
  # To verify freshness: alef verify --exit-code
5
- # Issues & docs: https://github.com/kreuzberg-dev/alef
6
5
  # frozen_string_literal: true
7
6
 
8
- require 'json'
9
- require 'html_to_markdown_rb'
7
+ require "json"
8
+ require "sorbet-runtime"
9
+ require "html_to_markdown_rb"
10
10
  module HtmlToMarkdown
11
- # Re-export all public module functions from the native extension
12
- HtmlToMarkdownRs.methods(false).each do |m|
13
- define_singleton_method(m) { |*args, **kwargs, &blk| HtmlToMarkdownRs.public_send(m, *args, **kwargs, &blk) }
11
+ # Re-export public types from the native extension (curated list, excludes Update/Builder types)
12
+ ConversionOptions = HtmlToMarkdownRs.const_get(:ConversionOptions)
13
+ ConversionResult = HtmlToMarkdownRs.const_get(:ConversionResult)
14
+ DocumentMetadata = HtmlToMarkdownRs.const_get(:DocumentMetadata)
15
+ DocumentNode = HtmlToMarkdownRs.const_get(:DocumentNode)
16
+ DocumentStructure = HtmlToMarkdownRs.const_get(:DocumentStructure)
17
+ GridCell = HtmlToMarkdownRs.const_get(:GridCell)
18
+ HeaderMetadata = HtmlToMarkdownRs.const_get(:HeaderMetadata)
19
+ HtmlMetadata = HtmlToMarkdownRs.const_get(:HtmlMetadata)
20
+ ImageDimensions = HtmlToMarkdownRs.const_get(:ImageDimensions)
21
+ ImageMetadata = HtmlToMarkdownRs.const_get(:ImageMetadata)
22
+ LinkMetadata = HtmlToMarkdownRs.const_get(:LinkMetadata)
23
+ MetadataEntry = HtmlToMarkdownRs.const_get(:MetadataEntry)
24
+ NodeContext = HtmlToMarkdownRs.const_get(:NodeContext)
25
+ PreprocessingOptions = HtmlToMarkdownRs.const_get(:PreprocessingOptions)
26
+ ProcessingWarning = HtmlToMarkdownRs.const_get(:ProcessingWarning)
27
+ StructuredData = HtmlToMarkdownRs.const_get(:StructuredData)
28
+ TableData = HtmlToMarkdownRs.const_get(:TableData)
29
+ TableGrid = HtmlToMarkdownRs.const_get(:TableGrid)
30
+ TextAnnotation = HtmlToMarkdownRs.const_get(:TextAnnotation)
31
+ # Re-export public module functions from the native extension (curated list)
32
+ define_singleton_method(:convert) { |*args, **kwargs, &blk| HtmlToMarkdownRs.public_send(:convert, *args, **kwargs, &blk) }
33
+ end
34
+ module HtmlToMarkdown
35
+ # The semantic content type of a document node.
36
+ #
37
+ # Uses internally tagged representation (`"node_type": "heading"`) for JSON serialization.
38
+ module NodeContent
39
+ extend T::Helpers
40
+ extend T::Sig
41
+
42
+ interface!
43
+
44
+ # Dispatch from a Hash to the appropriate variant constructor.
45
+ # @param hash [Hash] with discriminator field and variant-specific fields
46
+ # @return [variant_class] an instance of the appropriate variant
47
+ sig { params(hash: T::Hash[T.untyped, T.untyped]).returns(T.untyped) }
48
+ def self.from_hash(hash)
49
+ discriminator = hash[:node_type] || hash["node_type"]
50
+ case discriminator
51
+ when "heading" then NodeContentHeading.from_hash(hash)
52
+ when "paragraph" then NodeContentParagraph.from_hash(hash)
53
+ when "list" then NodeContentList.from_hash(hash)
54
+ when "list_item" then NodeContentListItem.from_hash(hash)
55
+ when "table" then NodeContentTable.from_hash(hash)
56
+ when "image" then NodeContentImage.from_hash(hash)
57
+ when "code" then NodeContentCode.from_hash(hash)
58
+ when "quote" then NodeContentQuote.from_hash(hash)
59
+ when "definition_list" then NodeContentDefinitionList.from_hash(hash)
60
+ when "definition_item" then NodeContentDefinitionItem.from_hash(hash)
61
+ when "raw_block" then NodeContentRawBlock.from_hash(hash)
62
+ when "metadata_block" then NodeContentMetadataBlock.from_hash(hash)
63
+ when "group" then NodeContentGroup.from_hash(hash)
64
+ else raise "Unknown discriminator: #{discriminator}"
65
+ end
66
+ end
67
+ end
68
+ ## A heading element (h1-h6).
69
+ NodeContentHeading = Data.define(:level, :text) do
70
+ include NodeContent
71
+ extend T::Sig
72
+
73
+ # Heading level (1-6).
74
+ sig { returns(Integer) }
75
+ def level = super # rubocop:disable Lint/UselessMethodDefinition
76
+ # The heading text content.
77
+ sig { returns(String) }
78
+ def text = super # rubocop:disable Lint/UselessMethodDefinition
79
+ sig { returns(T::Boolean) }
80
+ def heading? = true
81
+ sig { returns(T::Boolean) }
82
+ def paragraph? = false
83
+ sig { returns(T::Boolean) }
84
+ def list? = false
85
+ sig { returns(T::Boolean) }
86
+ def list_item? = false
87
+ sig { returns(T::Boolean) }
88
+ def table? = false
89
+ sig { returns(T::Boolean) }
90
+ def image? = false
91
+ sig { returns(T::Boolean) }
92
+ def code? = false
93
+ sig { returns(T::Boolean) }
94
+ def quote? = false
95
+ sig { returns(T::Boolean) }
96
+ def definition_list? = false
97
+ sig { returns(T::Boolean) }
98
+ def definition_item? = false
99
+ sig { returns(T::Boolean) }
100
+ def raw_block? = false
101
+ sig { returns(T::Boolean) }
102
+ def metadata_block? = false
103
+ sig { returns(T::Boolean) }
104
+ def group? = false
105
+ # @param hash [Hash] deserialized from the native extension
106
+ # @return [self]
107
+ sig { params(hash: T::Hash[T.untyped, T.untyped]).returns(T.attached_class) }
108
+ def self.from_hash(hash)
109
+ new(level: hash[:level] || hash["level"], text: hash[:text] || hash["text"])
110
+ end
111
+ end
112
+ ## A paragraph of text.
113
+ NodeContentParagraph = Data.define(:text) do
114
+ include NodeContent
115
+ extend T::Sig
116
+
117
+ # The paragraph text content.
118
+ sig { returns(String) }
119
+ def text = super # rubocop:disable Lint/UselessMethodDefinition
120
+ sig { returns(T::Boolean) }
121
+ def heading? = false
122
+ sig { returns(T::Boolean) }
123
+ def paragraph? = true
124
+ sig { returns(T::Boolean) }
125
+ def list? = false
126
+ sig { returns(T::Boolean) }
127
+ def list_item? = false
128
+ sig { returns(T::Boolean) }
129
+ def table? = false
130
+ sig { returns(T::Boolean) }
131
+ def image? = false
132
+ sig { returns(T::Boolean) }
133
+ def code? = false
134
+ sig { returns(T::Boolean) }
135
+ def quote? = false
136
+ sig { returns(T::Boolean) }
137
+ def definition_list? = false
138
+ sig { returns(T::Boolean) }
139
+ def definition_item? = false
140
+ sig { returns(T::Boolean) }
141
+ def raw_block? = false
142
+ sig { returns(T::Boolean) }
143
+ def metadata_block? = false
144
+ sig { returns(T::Boolean) }
145
+ def group? = false
146
+ # @param hash [Hash] deserialized from the native extension
147
+ # @return [self]
148
+ sig { params(hash: T::Hash[T.untyped, T.untyped]).returns(T.attached_class) }
149
+ def self.from_hash(hash)
150
+ new(text: hash[:text] || hash["text"])
151
+ end
152
+ end
153
+ ## A list container (ordered or unordered). Children are `ListItem` nodes.
154
+ NodeContentList = Data.define(:ordered) do
155
+ include NodeContent
156
+ extend T::Sig
157
+
158
+ # Whether this is an ordered list.
159
+ sig { returns(T::Boolean) }
160
+ def ordered = super # rubocop:disable Lint/UselessMethodDefinition
161
+ sig { returns(T::Boolean) }
162
+ def heading? = false
163
+ sig { returns(T::Boolean) }
164
+ def paragraph? = false
165
+ sig { returns(T::Boolean) }
166
+ def list? = true
167
+ sig { returns(T::Boolean) }
168
+ def list_item? = false
169
+ sig { returns(T::Boolean) }
170
+ def table? = false
171
+ sig { returns(T::Boolean) }
172
+ def image? = false
173
+ sig { returns(T::Boolean) }
174
+ def code? = false
175
+ sig { returns(T::Boolean) }
176
+ def quote? = false
177
+ sig { returns(T::Boolean) }
178
+ def definition_list? = false
179
+ sig { returns(T::Boolean) }
180
+ def definition_item? = false
181
+ sig { returns(T::Boolean) }
182
+ def raw_block? = false
183
+ sig { returns(T::Boolean) }
184
+ def metadata_block? = false
185
+ sig { returns(T::Boolean) }
186
+ def group? = false
187
+ # @param hash [Hash] deserialized from the native extension
188
+ # @return [self]
189
+ sig { params(hash: T::Hash[T.untyped, T.untyped]).returns(T.attached_class) }
190
+ def self.from_hash(hash)
191
+ new(ordered: hash[:ordered] || hash["ordered"])
192
+ end
193
+ end
194
+ ## A single list item.
195
+ NodeContentListItem = Data.define(:text) do
196
+ include NodeContent
197
+ extend T::Sig
198
+
199
+ # The list item text content.
200
+ sig { returns(String) }
201
+ def text = super # rubocop:disable Lint/UselessMethodDefinition
202
+ sig { returns(T::Boolean) }
203
+ def heading? = false
204
+ sig { returns(T::Boolean) }
205
+ def paragraph? = false
206
+ sig { returns(T::Boolean) }
207
+ def list? = false
208
+ sig { returns(T::Boolean) }
209
+ def list_item? = true
210
+ sig { returns(T::Boolean) }
211
+ def table? = false
212
+ sig { returns(T::Boolean) }
213
+ def image? = false
214
+ sig { returns(T::Boolean) }
215
+ def code? = false
216
+ sig { returns(T::Boolean) }
217
+ def quote? = false
218
+ sig { returns(T::Boolean) }
219
+ def definition_list? = false
220
+ sig { returns(T::Boolean) }
221
+ def definition_item? = false
222
+ sig { returns(T::Boolean) }
223
+ def raw_block? = false
224
+ sig { returns(T::Boolean) }
225
+ def metadata_block? = false
226
+ sig { returns(T::Boolean) }
227
+ def group? = false
228
+ # @param hash [Hash] deserialized from the native extension
229
+ # @return [self]
230
+ sig { params(hash: T::Hash[T.untyped, T.untyped]).returns(T.attached_class) }
231
+ def self.from_hash(hash)
232
+ new(text: hash[:text] || hash["text"])
233
+ end
234
+ end
235
+ ## A table with structured cell data.
236
+ NodeContentTable = Data.define(:grid) do
237
+ include NodeContent
238
+ extend T::Sig
239
+
240
+ # The table grid structure.
241
+ sig { returns(TableGrid) }
242
+ def grid = super # rubocop:disable Lint/UselessMethodDefinition
243
+ sig { returns(T::Boolean) }
244
+ def heading? = false
245
+ sig { returns(T::Boolean) }
246
+ def paragraph? = false
247
+ sig { returns(T::Boolean) }
248
+ def list? = false
249
+ sig { returns(T::Boolean) }
250
+ def list_item? = false
251
+ sig { returns(T::Boolean) }
252
+ def table? = true
253
+ sig { returns(T::Boolean) }
254
+ def image? = false
255
+ sig { returns(T::Boolean) }
256
+ def code? = false
257
+ sig { returns(T::Boolean) }
258
+ def quote? = false
259
+ sig { returns(T::Boolean) }
260
+ def definition_list? = false
261
+ sig { returns(T::Boolean) }
262
+ def definition_item? = false
263
+ sig { returns(T::Boolean) }
264
+ def raw_block? = false
265
+ sig { returns(T::Boolean) }
266
+ def metadata_block? = false
267
+ sig { returns(T::Boolean) }
268
+ def group? = false
269
+ # @param hash [Hash] deserialized from the native extension
270
+ # @return [self]
271
+ sig { params(hash: T::Hash[T.untyped, T.untyped]).returns(T.attached_class) }
272
+ def self.from_hash(hash)
273
+ new(grid: hash[:grid] || hash["grid"])
274
+ end
275
+ end
276
+ ## An image element.
277
+ NodeContentImage = Data.define(:description, :src, :image_index) do
278
+ include NodeContent
279
+ extend T::Sig
280
+
281
+ # Alt text or caption.
282
+ sig { returns(T.nilable(String)) }
283
+ def description = super # rubocop:disable Lint/UselessMethodDefinition
284
+ # Image source URL.
285
+ sig { returns(T.nilable(String)) }
286
+ def src = super # rubocop:disable Lint/UselessMethodDefinition
287
+ # Index into `ConversionResult.images` when image extraction is enabled.
288
+ sig { returns(T.nilable(Integer)) }
289
+ def image_index = super # rubocop:disable Lint/UselessMethodDefinition
290
+ sig { returns(T::Boolean) }
291
+ def heading? = false
292
+ sig { returns(T::Boolean) }
293
+ def paragraph? = false
294
+ sig { returns(T::Boolean) }
295
+ def list? = false
296
+ sig { returns(T::Boolean) }
297
+ def list_item? = false
298
+ sig { returns(T::Boolean) }
299
+ def table? = false
300
+ sig { returns(T::Boolean) }
301
+ def image? = true
302
+ sig { returns(T::Boolean) }
303
+ def code? = false
304
+ sig { returns(T::Boolean) }
305
+ def quote? = false
306
+ sig { returns(T::Boolean) }
307
+ def definition_list? = false
308
+ sig { returns(T::Boolean) }
309
+ def definition_item? = false
310
+ sig { returns(T::Boolean) }
311
+ def raw_block? = false
312
+ sig { returns(T::Boolean) }
313
+ def metadata_block? = false
314
+ sig { returns(T::Boolean) }
315
+ def group? = false
316
+ # @param hash [Hash] deserialized from the native extension
317
+ # @return [self]
318
+ sig { params(hash: T::Hash[T.untyped, T.untyped]).returns(T.attached_class) }
319
+ def self.from_hash(hash)
320
+ new(description: hash[:description] || hash["description"], src: hash[:src] || hash["src"], image_index: hash[:image_index] || hash["image_index"])
321
+ end
322
+ end
323
+ ## A code block or inline code.
324
+ NodeContentCode = Data.define(:text, :language) do
325
+ include NodeContent
326
+ extend T::Sig
327
+
328
+ # The code text content.
329
+ sig { returns(String) }
330
+ def text = super # rubocop:disable Lint/UselessMethodDefinition
331
+ # Programming language (from class="language-*" or similar).
332
+ sig { returns(T.nilable(String)) }
333
+ def language = super # rubocop:disable Lint/UselessMethodDefinition
334
+ sig { returns(T::Boolean) }
335
+ def heading? = false
336
+ sig { returns(T::Boolean) }
337
+ def paragraph? = false
338
+ sig { returns(T::Boolean) }
339
+ def list? = false
340
+ sig { returns(T::Boolean) }
341
+ def list_item? = false
342
+ sig { returns(T::Boolean) }
343
+ def table? = false
344
+ sig { returns(T::Boolean) }
345
+ def image? = false
346
+ sig { returns(T::Boolean) }
347
+ def code? = true
348
+ sig { returns(T::Boolean) }
349
+ def quote? = false
350
+ sig { returns(T::Boolean) }
351
+ def definition_list? = false
352
+ sig { returns(T::Boolean) }
353
+ def definition_item? = false
354
+ sig { returns(T::Boolean) }
355
+ def raw_block? = false
356
+ sig { returns(T::Boolean) }
357
+ def metadata_block? = false
358
+ sig { returns(T::Boolean) }
359
+ def group? = false
360
+ # @param hash [Hash] deserialized from the native extension
361
+ # @return [self]
362
+ sig { params(hash: T::Hash[T.untyped, T.untyped]).returns(T.attached_class) }
363
+ def self.from_hash(hash)
364
+ new(text: hash[:text] || hash["text"], language: hash[:language] || hash["language"])
365
+ end
366
+ end
367
+ ## A block quote container.
368
+ NodeContentQuote = Data.define do
369
+ include NodeContent
370
+ extend T::Sig
371
+
372
+ sig { returns(T::Boolean) }
373
+ def heading? = false
374
+ sig { returns(T::Boolean) }
375
+ def paragraph? = false
376
+ sig { returns(T::Boolean) }
377
+ def list? = false
378
+ sig { returns(T::Boolean) }
379
+ def list_item? = false
380
+ sig { returns(T::Boolean) }
381
+ def table? = false
382
+ sig { returns(T::Boolean) }
383
+ def image? = false
384
+ sig { returns(T::Boolean) }
385
+ def code? = false
386
+ sig { returns(T::Boolean) }
387
+ def quote? = true
388
+ sig { returns(T::Boolean) }
389
+ def definition_list? = false
390
+ sig { returns(T::Boolean) }
391
+ def definition_item? = false
392
+ sig { returns(T::Boolean) }
393
+ def raw_block? = false
394
+ sig { returns(T::Boolean) }
395
+ def metadata_block? = false
396
+ sig { returns(T::Boolean) }
397
+ def group? = false
398
+ # @param hash [Hash] deserialized from the native extension
399
+ # @return [self]
400
+ sig { params(hash: T::Hash[T.untyped, T.untyped]).returns(T.attached_class) }
401
+ def self.from_hash(hash)
402
+ new
403
+ end
404
+ end
405
+ ## A definition list container.
406
+ NodeContentDefinitionList = Data.define do
407
+ include NodeContent
408
+ extend T::Sig
409
+
410
+ sig { returns(T::Boolean) }
411
+ def heading? = false
412
+ sig { returns(T::Boolean) }
413
+ def paragraph? = false
414
+ sig { returns(T::Boolean) }
415
+ def list? = false
416
+ sig { returns(T::Boolean) }
417
+ def list_item? = false
418
+ sig { returns(T::Boolean) }
419
+ def table? = false
420
+ sig { returns(T::Boolean) }
421
+ def image? = false
422
+ sig { returns(T::Boolean) }
423
+ def code? = false
424
+ sig { returns(T::Boolean) }
425
+ def quote? = false
426
+ sig { returns(T::Boolean) }
427
+ def definition_list? = true
428
+ sig { returns(T::Boolean) }
429
+ def definition_item? = false
430
+ sig { returns(T::Boolean) }
431
+ def raw_block? = false
432
+ sig { returns(T::Boolean) }
433
+ def metadata_block? = false
434
+ sig { returns(T::Boolean) }
435
+ def group? = false
436
+ # @param hash [Hash] deserialized from the native extension
437
+ # @return [self]
438
+ sig { params(hash: T::Hash[T.untyped, T.untyped]).returns(T.attached_class) }
439
+ def self.from_hash(hash)
440
+ new
441
+ end
14
442
  end
443
+ ## A definition list entry with term and description.
444
+ NodeContentDefinitionItem = Data.define(:term, :definition) do
445
+ include NodeContent
446
+ extend T::Sig
15
447
 
16
- # Re-export all constants (classes, structs, etc.) from the native extension
17
- HtmlToMarkdownRs.constants.each do |c|
18
- const_set(c, HtmlToMarkdownRs.const_get(c)) unless const_defined?(c)
448
+ # The term being defined.
449
+ sig { returns(String) }
450
+ def term = super # rubocop:disable Lint/UselessMethodDefinition
451
+ # The definition text.
452
+ sig { returns(String) }
453
+ def definition = super # rubocop:disable Lint/UselessMethodDefinition
454
+ sig { returns(T::Boolean) }
455
+ def heading? = false
456
+ sig { returns(T::Boolean) }
457
+ def paragraph? = false
458
+ sig { returns(T::Boolean) }
459
+ def list? = false
460
+ sig { returns(T::Boolean) }
461
+ def list_item? = false
462
+ sig { returns(T::Boolean) }
463
+ def table? = false
464
+ sig { returns(T::Boolean) }
465
+ def image? = false
466
+ sig { returns(T::Boolean) }
467
+ def code? = false
468
+ sig { returns(T::Boolean) }
469
+ def quote? = false
470
+ sig { returns(T::Boolean) }
471
+ def definition_list? = false
472
+ sig { returns(T::Boolean) }
473
+ def definition_item? = true
474
+ sig { returns(T::Boolean) }
475
+ def raw_block? = false
476
+ sig { returns(T::Boolean) }
477
+ def metadata_block? = false
478
+ sig { returns(T::Boolean) }
479
+ def group? = false
480
+ # @param hash [Hash] deserialized from the native extension
481
+ # @return [self]
482
+ sig { params(hash: T::Hash[T.untyped, T.untyped]).returns(T.attached_class) }
483
+ def self.from_hash(hash)
484
+ new(term: hash[:term] || hash["term"], definition: hash[:definition] || hash["definition"])
485
+ end
486
+ end
487
+ ## A raw block preserved as-is (e.g. `<script>`, `<style>` content).
488
+ NodeContentRawBlock = Data.define(:format, :content) do
489
+ include NodeContent
490
+ extend T::Sig
491
+
492
+ # The format of the raw content (e.g. "html", "css", "javascript").
493
+ sig { returns(String) }
494
+ def format = super # rubocop:disable Lint/UselessMethodDefinition
495
+ # The raw content.
496
+ sig { returns(String) }
497
+ def content = super # rubocop:disable Lint/UselessMethodDefinition
498
+ sig { returns(T::Boolean) }
499
+ def heading? = false
500
+ sig { returns(T::Boolean) }
501
+ def paragraph? = false
502
+ sig { returns(T::Boolean) }
503
+ def list? = false
504
+ sig { returns(T::Boolean) }
505
+ def list_item? = false
506
+ sig { returns(T::Boolean) }
507
+ def table? = false
508
+ sig { returns(T::Boolean) }
509
+ def image? = false
510
+ sig { returns(T::Boolean) }
511
+ def code? = false
512
+ sig { returns(T::Boolean) }
513
+ def quote? = false
514
+ sig { returns(T::Boolean) }
515
+ def definition_list? = false
516
+ sig { returns(T::Boolean) }
517
+ def definition_item? = false
518
+ sig { returns(T::Boolean) }
519
+ def raw_block? = true
520
+ sig { returns(T::Boolean) }
521
+ def metadata_block? = false
522
+ sig { returns(T::Boolean) }
523
+ def group? = false
524
+ # @param hash [Hash] deserialized from the native extension
525
+ # @return [self]
526
+ sig { params(hash: T::Hash[T.untyped, T.untyped]).returns(T.attached_class) }
527
+ def self.from_hash(hash)
528
+ new(format: hash[:format] || hash["format"], content: hash[:content] || hash["content"])
529
+ end
530
+ end
531
+ ## A block of key-value metadata pairs (from `<head>` meta tags).
532
+ NodeContentMetadataBlock = Data.define(:entries) do
533
+ include NodeContent
534
+ extend T::Sig
535
+
536
+ # Key-value metadata pairs.
537
+ sig { returns(T::Array[MetadataEntry]) }
538
+ def entries = super # rubocop:disable Lint/UselessMethodDefinition
539
+ sig { returns(T::Boolean) }
540
+ def heading? = false
541
+ sig { returns(T::Boolean) }
542
+ def paragraph? = false
543
+ sig { returns(T::Boolean) }
544
+ def list? = false
545
+ sig { returns(T::Boolean) }
546
+ def list_item? = false
547
+ sig { returns(T::Boolean) }
548
+ def table? = false
549
+ sig { returns(T::Boolean) }
550
+ def image? = false
551
+ sig { returns(T::Boolean) }
552
+ def code? = false
553
+ sig { returns(T::Boolean) }
554
+ def quote? = false
555
+ sig { returns(T::Boolean) }
556
+ def definition_list? = false
557
+ sig { returns(T::Boolean) }
558
+ def definition_item? = false
559
+ sig { returns(T::Boolean) }
560
+ def raw_block? = false
561
+ sig { returns(T::Boolean) }
562
+ def metadata_block? = true
563
+ sig { returns(T::Boolean) }
564
+ def group? = false
565
+ # @param hash [Hash] deserialized from the native extension
566
+ # @return [self]
567
+ sig { params(hash: T::Hash[T.untyped, T.untyped]).returns(T.attached_class) }
568
+ def self.from_hash(hash)
569
+ new(entries: hash[:entries] || hash["entries"])
570
+ end
571
+ end
572
+ ## A section grouping container (auto-generated from heading hierarchy).
573
+ NodeContentGroup = Data.define(:label, :heading_level, :heading_text) do
574
+ include NodeContent
575
+ extend T::Sig
576
+
577
+ # Optional section label.
578
+ sig { returns(T.nilable(String)) }
579
+ def label = super # rubocop:disable Lint/UselessMethodDefinition
580
+ # The heading level that created this group.
581
+ sig { returns(T.nilable(Integer)) }
582
+ def heading_level = super # rubocop:disable Lint/UselessMethodDefinition
583
+ # The heading text that created this group.
584
+ sig { returns(T.nilable(String)) }
585
+ def heading_text = super # rubocop:disable Lint/UselessMethodDefinition
586
+ sig { returns(T::Boolean) }
587
+ def heading? = false
588
+ sig { returns(T::Boolean) }
589
+ def paragraph? = false
590
+ sig { returns(T::Boolean) }
591
+ def list? = false
592
+ sig { returns(T::Boolean) }
593
+ def list_item? = false
594
+ sig { returns(T::Boolean) }
595
+ def table? = false
596
+ sig { returns(T::Boolean) }
597
+ def image? = false
598
+ sig { returns(T::Boolean) }
599
+ def code? = false
600
+ sig { returns(T::Boolean) }
601
+ def quote? = false
602
+ sig { returns(T::Boolean) }
603
+ def definition_list? = false
604
+ sig { returns(T::Boolean) }
605
+ def definition_item? = false
606
+ sig { returns(T::Boolean) }
607
+ def raw_block? = false
608
+ sig { returns(T::Boolean) }
609
+ def metadata_block? = false
610
+ sig { returns(T::Boolean) }
611
+ def group? = true
612
+ # @param hash [Hash] deserialized from the native extension
613
+ # @return [self]
614
+ sig { params(hash: T::Hash[T.untyped, T.untyped]).returns(T.attached_class) }
615
+ def self.from_hash(hash)
616
+ new(label: hash[:label] || hash["label"], heading_level: hash[:heading_level] || hash["heading_level"], heading_text: hash[:heading_text] || hash["heading_text"])
617
+ end
19
618
  end
20
619
  end
21
620
 
22
- # Add accessor methods to Hash-based internally-tagged enum instances
23
- class Hash
24
- # Support internally-tagged enum accessors like format.excel, format.email, etc.
25
- # Also support direct field access like format.sheet_count
26
- # rubocop:disable Metrics/CyclomaticComplexity
27
- def method_missing(method_name, *args, &block)
28
- # Try symbol key first (how Magnus converts JSON keys)
29
- return self[method_name] if key?(method_name)
621
+ module HtmlToMarkdown
622
+ # The type of an inline text annotation.
623
+ #
624
+ # Uses internally tagged representation (`"annotation_type": "bold"`) for JSON serialization.
625
+ module AnnotationKind
626
+ extend T::Helpers
627
+ extend T::Sig
628
+
629
+ interface!
630
+
631
+ # Dispatch from a Hash to the appropriate variant constructor.
632
+ # @param hash [Hash] with discriminator field and variant-specific fields
633
+ # @return [variant_class] an instance of the appropriate variant
634
+ sig { params(hash: T::Hash[T.untyped, T.untyped]).returns(T.untyped) }
635
+ def self.from_hash(hash)
636
+ discriminator = hash[:annotation_type] || hash["annotation_type"]
637
+ case discriminator
638
+ when "bold" then AnnotationKindBold.from_hash(hash)
639
+ when "italic" then AnnotationKindItalic.from_hash(hash)
640
+ when "underline" then AnnotationKindUnderline.from_hash(hash)
641
+ when "strikethrough" then AnnotationKindStrikethrough.from_hash(hash)
642
+ when "code" then AnnotationKindCode.from_hash(hash)
643
+ when "subscript" then AnnotationKindSubscript.from_hash(hash)
644
+ when "superscript" then AnnotationKindSuperscript.from_hash(hash)
645
+ when "highlight" then AnnotationKindHighlight.from_hash(hash)
646
+ when "link" then AnnotationKindLink.from_hash(hash)
647
+ else raise "Unknown discriminator: #{discriminator}"
648
+ end
649
+ end
650
+ end
651
+ ## Bold / strong emphasis.
652
+ AnnotationKindBold = Data.define do
653
+ include AnnotationKind
654
+ extend T::Sig
655
+
656
+ sig { returns(T::Boolean) }
657
+ def bold? = true
658
+ sig { returns(T::Boolean) }
659
+ def italic? = false
660
+ sig { returns(T::Boolean) }
661
+ def underline? = false
662
+ sig { returns(T::Boolean) }
663
+ def strikethrough? = false
664
+ sig { returns(T::Boolean) }
665
+ def code? = false
666
+ sig { returns(T::Boolean) }
667
+ def subscript? = false
668
+ sig { returns(T::Boolean) }
669
+ def superscript? = false
670
+ sig { returns(T::Boolean) }
671
+ def highlight? = false
672
+ sig { returns(T::Boolean) }
673
+ def link? = false
674
+ # @param hash [Hash] deserialized from the native extension
675
+ # @return [self]
676
+ sig { params(hash: T::Hash[T.untyped, T.untyped]).returns(T.attached_class) }
677
+ def self.from_hash(hash)
678
+ new
679
+ end
680
+ end
681
+ ## Italic / emphasis.
682
+ AnnotationKindItalic = Data.define do
683
+ include AnnotationKind
684
+ extend T::Sig
685
+
686
+ sig { returns(T::Boolean) }
687
+ def bold? = false
688
+ sig { returns(T::Boolean) }
689
+ def italic? = true
690
+ sig { returns(T::Boolean) }
691
+ def underline? = false
692
+ sig { returns(T::Boolean) }
693
+ def strikethrough? = false
694
+ sig { returns(T::Boolean) }
695
+ def code? = false
696
+ sig { returns(T::Boolean) }
697
+ def subscript? = false
698
+ sig { returns(T::Boolean) }
699
+ def superscript? = false
700
+ sig { returns(T::Boolean) }
701
+ def highlight? = false
702
+ sig { returns(T::Boolean) }
703
+ def link? = false
704
+ # @param hash [Hash] deserialized from the native extension
705
+ # @return [self]
706
+ sig { params(hash: T::Hash[T.untyped, T.untyped]).returns(T.attached_class) }
707
+ def self.from_hash(hash)
708
+ new
709
+ end
710
+ end
711
+ ## Underline.
712
+ AnnotationKindUnderline = Data.define do
713
+ include AnnotationKind
714
+ extend T::Sig
30
715
 
31
- # Try string key
32
- return self[method_name.to_s] if key?(method_name.to_s)
716
+ sig { returns(T::Boolean) }
717
+ def bold? = false
718
+ sig { returns(T::Boolean) }
719
+ def italic? = false
720
+ sig { returns(T::Boolean) }
721
+ def underline? = true
722
+ sig { returns(T::Boolean) }
723
+ def strikethrough? = false
724
+ sig { returns(T::Boolean) }
725
+ def code? = false
726
+ sig { returns(T::Boolean) }
727
+ def subscript? = false
728
+ sig { returns(T::Boolean) }
729
+ def superscript? = false
730
+ sig { returns(T::Boolean) }
731
+ def highlight? = false
732
+ sig { returns(T::Boolean) }
733
+ def link? = false
734
+ # @param hash [Hash] deserialized from the native extension
735
+ # @return [self]
736
+ sig { params(hash: T::Hash[T.untyped, T.untyped]).returns(T.attached_class) }
737
+ def self.from_hash(hash)
738
+ new
739
+ end
740
+ end
741
+ ## Strikethrough / deleted text.
742
+ AnnotationKindStrikethrough = Data.define do
743
+ include AnnotationKind
744
+ extend T::Sig
33
745
 
34
- # Check if this hash has a 'format_type' field (indicating an internally-tagged enum)
35
- format_type = self[:'format_type'] || self['format_type']
36
- return super unless format_type
746
+ sig { returns(T::Boolean) }
747
+ def bold? = false
748
+ sig { returns(T::Boolean) }
749
+ def italic? = false
750
+ sig { returns(T::Boolean) }
751
+ def underline? = false
752
+ sig { returns(T::Boolean) }
753
+ def strikethrough? = true
754
+ sig { returns(T::Boolean) }
755
+ def code? = false
756
+ sig { returns(T::Boolean) }
757
+ def subscript? = false
758
+ sig { returns(T::Boolean) }
759
+ def superscript? = false
760
+ sig { returns(T::Boolean) }
761
+ def highlight? = false
762
+ sig { returns(T::Boolean) }
763
+ def link? = false
764
+ # @param hash [Hash] deserialized from the native extension
765
+ # @return [self]
766
+ sig { params(hash: T::Hash[T.untyped, T.untyped]).returns(T.attached_class) }
767
+ def self.from_hash(hash)
768
+ new
769
+ end
770
+ end
771
+ ## Inline code.
772
+ AnnotationKindCode = Data.define do
773
+ include AnnotationKind
774
+ extend T::Sig
37
775
 
38
- # If the method name matches the format_type (snake_case), extract and return the variant's wrapped data
39
- # Internally-tagged enums store variant data in the '_0' field (from alef's struct variant conversion)
40
- # This allows format.excel to return the ExcelMetadata hash with sheet_count, sheet_names, etc.
41
- snake_case_method = method_name.to_s.downcase
42
- if snake_case_method == format_type.to_s.downcase
43
- return self[:'_0'] || self['_0'] || self
776
+ sig { returns(T::Boolean) }
777
+ def bold? = false
778
+ sig { returns(T::Boolean) }
779
+ def italic? = false
780
+ sig { returns(T::Boolean) }
781
+ def underline? = false
782
+ sig { returns(T::Boolean) }
783
+ def strikethrough? = false
784
+ sig { returns(T::Boolean) }
785
+ def code? = true
786
+ sig { returns(T::Boolean) }
787
+ def subscript? = false
788
+ sig { returns(T::Boolean) }
789
+ def superscript? = false
790
+ sig { returns(T::Boolean) }
791
+ def highlight? = false
792
+ sig { returns(T::Boolean) }
793
+ def link? = false
794
+ # @param hash [Hash] deserialized from the native extension
795
+ # @return [self]
796
+ sig { params(hash: T::Hash[T.untyped, T.untyped]).returns(T.attached_class) }
797
+ def self.from_hash(hash)
798
+ new
44
799
  end
800
+ end
801
+ ## Subscript text.
802
+ AnnotationKindSubscript = Data.define do
803
+ include AnnotationKind
804
+ extend T::Sig
45
805
 
46
- super
806
+ sig { returns(T::Boolean) }
807
+ def bold? = false
808
+ sig { returns(T::Boolean) }
809
+ def italic? = false
810
+ sig { returns(T::Boolean) }
811
+ def underline? = false
812
+ sig { returns(T::Boolean) }
813
+ def strikethrough? = false
814
+ sig { returns(T::Boolean) }
815
+ def code? = false
816
+ sig { returns(T::Boolean) }
817
+ def subscript? = true
818
+ sig { returns(T::Boolean) }
819
+ def superscript? = false
820
+ sig { returns(T::Boolean) }
821
+ def highlight? = false
822
+ sig { returns(T::Boolean) }
823
+ def link? = false
824
+ # @param hash [Hash] deserialized from the native extension
825
+ # @return [self]
826
+ sig { params(hash: T::Hash[T.untyped, T.untyped]).returns(T.attached_class) }
827
+ def self.from_hash(hash)
828
+ new
829
+ end
47
830
  end
48
- # rubocop:enable Metrics/CyclomaticComplexity
831
+ ## Superscript text.
832
+ AnnotationKindSuperscript = Data.define do
833
+ include AnnotationKind
834
+ extend T::Sig
49
835
 
50
- def respond_to_missing?(method_name, include_private = false)
51
- return true if key?(method_name) || key?(method_name.to_s)
836
+ sig { returns(T::Boolean) }
837
+ def bold? = false
838
+ sig { returns(T::Boolean) }
839
+ def italic? = false
840
+ sig { returns(T::Boolean) }
841
+ def underline? = false
842
+ sig { returns(T::Boolean) }
843
+ def strikethrough? = false
844
+ sig { returns(T::Boolean) }
845
+ def code? = false
846
+ sig { returns(T::Boolean) }
847
+ def subscript? = false
848
+ sig { returns(T::Boolean) }
849
+ def superscript? = true
850
+ sig { returns(T::Boolean) }
851
+ def highlight? = false
852
+ sig { returns(T::Boolean) }
853
+ def link? = false
854
+ # @param hash [Hash] deserialized from the native extension
855
+ # @return [self]
856
+ sig { params(hash: T::Hash[T.untyped, T.untyped]).returns(T.attached_class) }
857
+ def self.from_hash(hash)
858
+ new
859
+ end
860
+ end
861
+ ## Highlighted / marked text.
862
+ AnnotationKindHighlight = Data.define do
863
+ include AnnotationKind
864
+ extend T::Sig
52
865
 
53
- format_type = self[:'format_type'] || self['format_type']
54
- return false unless format_type
866
+ sig { returns(T::Boolean) }
867
+ def bold? = false
868
+ sig { returns(T::Boolean) }
869
+ def italic? = false
870
+ sig { returns(T::Boolean) }
871
+ def underline? = false
872
+ sig { returns(T::Boolean) }
873
+ def strikethrough? = false
874
+ sig { returns(T::Boolean) }
875
+ def code? = false
876
+ sig { returns(T::Boolean) }
877
+ def subscript? = false
878
+ sig { returns(T::Boolean) }
879
+ def superscript? = false
880
+ sig { returns(T::Boolean) }
881
+ def highlight? = true
882
+ sig { returns(T::Boolean) }
883
+ def link? = false
884
+ # @param hash [Hash] deserialized from the native extension
885
+ # @return [self]
886
+ sig { params(hash: T::Hash[T.untyped, T.untyped]).returns(T.attached_class) }
887
+ def self.from_hash(hash)
888
+ new
889
+ end
890
+ end
891
+ ## A hyperlink sourced from an `<a href="...">` element.
892
+ AnnotationKindLink = Data.define(:url, :title) do
893
+ include AnnotationKind
894
+ extend T::Sig
55
895
 
56
- snake_case_method = method_name.to_s.downcase
57
- snake_case_method == format_type.to_s.downcase || super
896
+ # The URL from the `href` attribute, copied verbatim from the source HTML.
897
+ #
898
+ # No URL decoding or normalization is performed: percent-encoded sequences, relative
899
+ # paths, and protocol-relative URLs (`//example.com`) are all preserved exactly as
900
+ # written in the source. Callers that need an absolute URL must resolve it against the
901
+ # document base URL themselves.
902
+ sig { returns(String) }
903
+ def url = super # rubocop:disable Lint/UselessMethodDefinition
904
+ # The `title` attribute of the `<a>` element, if present.
905
+ #
906
+ # `None` when the `<a>` tag has no `title="..."` attribute. When present, the value
907
+ # is copied verbatim — HTML entities within the title are not decoded.
908
+ sig { returns(T.nilable(String)) }
909
+ def title = super # rubocop:disable Lint/UselessMethodDefinition
910
+ sig { returns(T::Boolean) }
911
+ def bold? = false
912
+ sig { returns(T::Boolean) }
913
+ def italic? = false
914
+ sig { returns(T::Boolean) }
915
+ def underline? = false
916
+ sig { returns(T::Boolean) }
917
+ def strikethrough? = false
918
+ sig { returns(T::Boolean) }
919
+ def code? = false
920
+ sig { returns(T::Boolean) }
921
+ def subscript? = false
922
+ sig { returns(T::Boolean) }
923
+ def superscript? = false
924
+ sig { returns(T::Boolean) }
925
+ def highlight? = false
926
+ sig { returns(T::Boolean) }
927
+ def link? = true
928
+ # @param hash [Hash] deserialized from the native extension
929
+ # @return [self]
930
+ sig { params(hash: T::Hash[T.untyped, T.untyped]).returns(T.attached_class) }
931
+ def self.from_hash(hash)
932
+ new(url: hash[:url] || hash["url"], title: hash[:title] || hash["title"])
933
+ end
58
934
  end
59
935
  end