coradoc-adoc 2.0.0

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 (217) hide show
  1. checksums.yaml +7 -0
  2. data/.rspec +3 -0
  3. data/lib/coradoc/asciidoc/model/admonition.rb +37 -0
  4. data/lib/coradoc/asciidoc/model/anchorable.rb +64 -0
  5. data/lib/coradoc/asciidoc/model/attached.rb +26 -0
  6. data/lib/coradoc/asciidoc/model/attribute.rb +22 -0
  7. data/lib/coradoc/asciidoc/model/attribute_list/matchers.rb +45 -0
  8. data/lib/coradoc/asciidoc/model/attribute_list.rb +230 -0
  9. data/lib/coradoc/asciidoc/model/attribute_list_attribute.rb +11 -0
  10. data/lib/coradoc/asciidoc/model/audio.rb +44 -0
  11. data/lib/coradoc/asciidoc/model/author.rb +36 -0
  12. data/lib/coradoc/asciidoc/model/base.rb +141 -0
  13. data/lib/coradoc/asciidoc/model/bibliography.rb +37 -0
  14. data/lib/coradoc/asciidoc/model/bibliography_entry.rb +38 -0
  15. data/lib/coradoc/asciidoc/model/block/core.rb +139 -0
  16. data/lib/coradoc/asciidoc/model/block/example.rb +14 -0
  17. data/lib/coradoc/asciidoc/model/block/listing.rb +14 -0
  18. data/lib/coradoc/asciidoc/model/block/literal.rb +14 -0
  19. data/lib/coradoc/asciidoc/model/block/open.rb +14 -0
  20. data/lib/coradoc/asciidoc/model/block/pass.rb +14 -0
  21. data/lib/coradoc/asciidoc/model/block/quote.rb +14 -0
  22. data/lib/coradoc/asciidoc/model/block/reviewer_comment.rb +14 -0
  23. data/lib/coradoc/asciidoc/model/block/side.rb +14 -0
  24. data/lib/coradoc/asciidoc/model/block/source_code.rb +14 -0
  25. data/lib/coradoc/asciidoc/model/block.rb +21 -0
  26. data/lib/coradoc/asciidoc/model/break.rb +33 -0
  27. data/lib/coradoc/asciidoc/model/comment_block.rb +33 -0
  28. data/lib/coradoc/asciidoc/model/comment_line.rb +30 -0
  29. data/lib/coradoc/asciidoc/model/content_list.rb +334 -0
  30. data/lib/coradoc/asciidoc/model/document.rb +197 -0
  31. data/lib/coradoc/asciidoc/model/document_attributes.rb +43 -0
  32. data/lib/coradoc/asciidoc/model/glossaries.rb +11 -0
  33. data/lib/coradoc/asciidoc/model/header.rb +57 -0
  34. data/lib/coradoc/asciidoc/model/highlight.rb +11 -0
  35. data/lib/coradoc/asciidoc/model/image/block_image/attribute_list.rb +23 -0
  36. data/lib/coradoc/asciidoc/model/image/block_image.rb +25 -0
  37. data/lib/coradoc/asciidoc/model/image/core/attribute_list.rb +43 -0
  38. data/lib/coradoc/asciidoc/model/image/core.rb +72 -0
  39. data/lib/coradoc/asciidoc/model/image/inline_image.rb +17 -0
  40. data/lib/coradoc/asciidoc/model/image.rb +14 -0
  41. data/lib/coradoc/asciidoc/model/include.rb +66 -0
  42. data/lib/coradoc/asciidoc/model/inline/anchor.rb +41 -0
  43. data/lib/coradoc/asciidoc/model/inline/attribute_reference.rb +25 -0
  44. data/lib/coradoc/asciidoc/model/inline/base.rb +15 -0
  45. data/lib/coradoc/asciidoc/model/inline/bold.rb +38 -0
  46. data/lib/coradoc/asciidoc/model/inline/cross_reference.rb +29 -0
  47. data/lib/coradoc/asciidoc/model/inline/cross_reference_arg.rb +15 -0
  48. data/lib/coradoc/asciidoc/model/inline/footnote.rb +34 -0
  49. data/lib/coradoc/asciidoc/model/inline/hard_line_break.rb +24 -0
  50. data/lib/coradoc/asciidoc/model/inline/highlight.rb +36 -0
  51. data/lib/coradoc/asciidoc/model/inline/italic.rb +38 -0
  52. data/lib/coradoc/asciidoc/model/inline/link.rb +46 -0
  53. data/lib/coradoc/asciidoc/model/inline/monospace.rb +39 -0
  54. data/lib/coradoc/asciidoc/model/inline/quotation.rb +25 -0
  55. data/lib/coradoc/asciidoc/model/inline/small.rb +25 -0
  56. data/lib/coradoc/asciidoc/model/inline/span.rb +38 -0
  57. data/lib/coradoc/asciidoc/model/inline/stem.rb +24 -0
  58. data/lib/coradoc/asciidoc/model/inline/strikethrough.rb +39 -0
  59. data/lib/coradoc/asciidoc/model/inline/subscript.rb +33 -0
  60. data/lib/coradoc/asciidoc/model/inline/superscript.rb +33 -0
  61. data/lib/coradoc/asciidoc/model/inline/underline.rb +25 -0
  62. data/lib/coradoc/asciidoc/model/inline.rb +31 -0
  63. data/lib/coradoc/asciidoc/model/line_break.rb +11 -0
  64. data/lib/coradoc/asciidoc/model/list/core.rb +61 -0
  65. data/lib/coradoc/asciidoc/model/list/definition.rb +27 -0
  66. data/lib/coradoc/asciidoc/model/list/definition_item.rb +43 -0
  67. data/lib/coradoc/asciidoc/model/list/item.rb +72 -0
  68. data/lib/coradoc/asciidoc/model/list/nestable.rb +14 -0
  69. data/lib/coradoc/asciidoc/model/list/ordered.rb +34 -0
  70. data/lib/coradoc/asciidoc/model/list/unordered.rb +34 -0
  71. data/lib/coradoc/asciidoc/model/list.rb +29 -0
  72. data/lib/coradoc/asciidoc/model/named_attribute.rb +12 -0
  73. data/lib/coradoc/asciidoc/model/paragraph.rb +59 -0
  74. data/lib/coradoc/asciidoc/model/rejected_positional_attribute.rb +12 -0
  75. data/lib/coradoc/asciidoc/model/resolvable.rb +71 -0
  76. data/lib/coradoc/asciidoc/model/resolver.rb +430 -0
  77. data/lib/coradoc/asciidoc/model/reviewer_note.rb +54 -0
  78. data/lib/coradoc/asciidoc/model/revision.rb +47 -0
  79. data/lib/coradoc/asciidoc/model/section.rb +109 -0
  80. data/lib/coradoc/asciidoc/model/serialization/asciidoc_adapter.rb +28 -0
  81. data/lib/coradoc/asciidoc/model/serialization/asciidoc_mapping.rb +42 -0
  82. data/lib/coradoc/asciidoc/model/serialization/asciidoc_mapping_rule.rb +41 -0
  83. data/lib/coradoc/asciidoc/model/serialization/asciidoc_transform.rb +211 -0
  84. data/lib/coradoc/asciidoc/model/serialization/errors.rb +57 -0
  85. data/lib/coradoc/asciidoc/model/serialization.rb +39 -0
  86. data/lib/coradoc/asciidoc/model/spacing.rb +282 -0
  87. data/lib/coradoc/asciidoc/model/table.rb +44 -0
  88. data/lib/coradoc/asciidoc/model/table_cell.rb +122 -0
  89. data/lib/coradoc/asciidoc/model/table_row.rb +26 -0
  90. data/lib/coradoc/asciidoc/model/tag.rb +36 -0
  91. data/lib/coradoc/asciidoc/model/term.rb +48 -0
  92. data/lib/coradoc/asciidoc/model/text_element.rb +66 -0
  93. data/lib/coradoc/asciidoc/model/title.rb +85 -0
  94. data/lib/coradoc/asciidoc/model/video/attribute_list.rb +43 -0
  95. data/lib/coradoc/asciidoc/model/video.rb +49 -0
  96. data/lib/coradoc/asciidoc/model.rb +75 -0
  97. data/lib/coradoc/asciidoc/parse_error.rb +161 -0
  98. data/lib/coradoc/asciidoc/parser/admonition.rb +26 -0
  99. data/lib/coradoc/asciidoc/parser/attribute_list.rb +110 -0
  100. data/lib/coradoc/asciidoc/parser/base.rb +159 -0
  101. data/lib/coradoc/asciidoc/parser/bibliography.rb +31 -0
  102. data/lib/coradoc/asciidoc/parser/block.rb +186 -0
  103. data/lib/coradoc/asciidoc/parser/block_assembler.rb +183 -0
  104. data/lib/coradoc/asciidoc/parser/cache.rb +155 -0
  105. data/lib/coradoc/asciidoc/parser/citation.rb +32 -0
  106. data/lib/coradoc/asciidoc/parser/content.rb +76 -0
  107. data/lib/coradoc/asciidoc/parser/document_attributes.rb +27 -0
  108. data/lib/coradoc/asciidoc/parser/fix_files.rb +76 -0
  109. data/lib/coradoc/asciidoc/parser/header.rb +31 -0
  110. data/lib/coradoc/asciidoc/parser/inline.rb +199 -0
  111. data/lib/coradoc/asciidoc/parser/list.rb +130 -0
  112. data/lib/coradoc/asciidoc/parser/metadata_detector.rb +164 -0
  113. data/lib/coradoc/asciidoc/parser/paragraph.rb +64 -0
  114. data/lib/coradoc/asciidoc/parser/section.rb +62 -0
  115. data/lib/coradoc/asciidoc/parser/stem.rb +19 -0
  116. data/lib/coradoc/asciidoc/parser/table.rb +166 -0
  117. data/lib/coradoc/asciidoc/parser/term.rb +70 -0
  118. data/lib/coradoc/asciidoc/parser/text.rb +156 -0
  119. data/lib/coradoc/asciidoc/parser.rb +10 -0
  120. data/lib/coradoc/asciidoc/serializer/adoc_serializer.rb +86 -0
  121. data/lib/coradoc/asciidoc/serializer/element_registry.rb +95 -0
  122. data/lib/coradoc/asciidoc/serializer/fallback_serializer.rb +21 -0
  123. data/lib/coradoc/asciidoc/serializer/formatter.rb +144 -0
  124. data/lib/coradoc/asciidoc/serializer/registrations.rb +108 -0
  125. data/lib/coradoc/asciidoc/serializer/serialization_context.rb +238 -0
  126. data/lib/coradoc/asciidoc/serializer/serializers/admonition.rb +19 -0
  127. data/lib/coradoc/asciidoc/serializer/serializers/attribute.rb +23 -0
  128. data/lib/coradoc/asciidoc/serializer/serializers/attribute_list.rb +40 -0
  129. data/lib/coradoc/asciidoc/serializer/serializers/attribute_list_attribute.rb +18 -0
  130. data/lib/coradoc/asciidoc/serializer/serializers/audio.rb +33 -0
  131. data/lib/coradoc/asciidoc/serializer/serializers/author.rb +20 -0
  132. data/lib/coradoc/asciidoc/serializer/serializers/base.rb +152 -0
  133. data/lib/coradoc/asciidoc/serializer/serializers/bibliography.rb +35 -0
  134. data/lib/coradoc/asciidoc/serializer/serializers/bibliography_entry.rb +24 -0
  135. data/lib/coradoc/asciidoc/serializer/serializers/block/core.rb +70 -0
  136. data/lib/coradoc/asciidoc/serializer/serializers/block/example.rb +17 -0
  137. data/lib/coradoc/asciidoc/serializer/serializers/block/listing.rb +22 -0
  138. data/lib/coradoc/asciidoc/serializer/serializers/block/literal.rb +17 -0
  139. data/lib/coradoc/asciidoc/serializer/serializers/block/open.rb +22 -0
  140. data/lib/coradoc/asciidoc/serializer/serializers/block/pass.rb +17 -0
  141. data/lib/coradoc/asciidoc/serializer/serializers/block/quote.rb +17 -0
  142. data/lib/coradoc/asciidoc/serializer/serializers/block/reviewer_comment.rb +17 -0
  143. data/lib/coradoc/asciidoc/serializer/serializers/block/side.rb +22 -0
  144. data/lib/coradoc/asciidoc/serializer/serializers/block/source_code.rb +22 -0
  145. data/lib/coradoc/asciidoc/serializer/serializers/block.rb +23 -0
  146. data/lib/coradoc/asciidoc/serializer/serializers/break.rb +18 -0
  147. data/lib/coradoc/asciidoc/serializer/serializers/comment_block.rb +22 -0
  148. data/lib/coradoc/asciidoc/serializer/serializers/comment_line.rb +22 -0
  149. data/lib/coradoc/asciidoc/serializer/serializers/document.rb +65 -0
  150. data/lib/coradoc/asciidoc/serializer/serializers/document_attributes.rb +21 -0
  151. data/lib/coradoc/asciidoc/serializer/serializers/header.rb +24 -0
  152. data/lib/coradoc/asciidoc/serializer/serializers/highlight.rb +23 -0
  153. data/lib/coradoc/asciidoc/serializer/serializers/image/core.rb +30 -0
  154. data/lib/coradoc/asciidoc/serializer/serializers/image.rb +14 -0
  155. data/lib/coradoc/asciidoc/serializer/serializers/include.rb +19 -0
  156. data/lib/coradoc/asciidoc/serializer/serializers/inline/anchor.rb +20 -0
  157. data/lib/coradoc/asciidoc/serializer/serializers/inline/attribute_reference.rb +20 -0
  158. data/lib/coradoc/asciidoc/serializer/serializers/inline/bold.rb +26 -0
  159. data/lib/coradoc/asciidoc/serializer/serializers/inline/cross_reference.rb +30 -0
  160. data/lib/coradoc/asciidoc/serializer/serializers/inline/cross_reference_arg.rb +20 -0
  161. data/lib/coradoc/asciidoc/serializer/serializers/inline/footnote.rb +24 -0
  162. data/lib/coradoc/asciidoc/serializer/serializers/inline/hard_line_break.rb +20 -0
  163. data/lib/coradoc/asciidoc/serializer/serializers/inline/highlight.rb +26 -0
  164. data/lib/coradoc/asciidoc/serializer/serializers/inline/italic.rb +26 -0
  165. data/lib/coradoc/asciidoc/serializer/serializers/inline/link.rb +38 -0
  166. data/lib/coradoc/asciidoc/serializer/serializers/inline/monospace.rb +26 -0
  167. data/lib/coradoc/asciidoc/serializer/serializers/inline/quotation.rb +21 -0
  168. data/lib/coradoc/asciidoc/serializer/serializers/inline/small.rb +20 -0
  169. data/lib/coradoc/asciidoc/serializer/serializers/inline/span.rb +35 -0
  170. data/lib/coradoc/asciidoc/serializer/serializers/inline/stem.rb +23 -0
  171. data/lib/coradoc/asciidoc/serializer/serializers/inline/strikethrough.rb +29 -0
  172. data/lib/coradoc/asciidoc/serializer/serializers/inline/subscript.rb +29 -0
  173. data/lib/coradoc/asciidoc/serializer/serializers/inline/superscript.rb +26 -0
  174. data/lib/coradoc/asciidoc/serializer/serializers/inline/underline.rb +20 -0
  175. data/lib/coradoc/asciidoc/serializer/serializers/inline.rb +32 -0
  176. data/lib/coradoc/asciidoc/serializer/serializers/line_break.rb +18 -0
  177. data/lib/coradoc/asciidoc/serializer/serializers/list/core.rb +47 -0
  178. data/lib/coradoc/asciidoc/serializer/serializers/list/definition.rb +35 -0
  179. data/lib/coradoc/asciidoc/serializer/serializers/list/definition_item.rb +38 -0
  180. data/lib/coradoc/asciidoc/serializer/serializers/list/item.rb +120 -0
  181. data/lib/coradoc/asciidoc/serializer/serializers/list/ordered.rb +24 -0
  182. data/lib/coradoc/asciidoc/serializer/serializers/list/unordered.rb +29 -0
  183. data/lib/coradoc/asciidoc/serializer/serializers/list.rb +19 -0
  184. data/lib/coradoc/asciidoc/serializer/serializers/named_attribute.rb +22 -0
  185. data/lib/coradoc/asciidoc/serializer/serializers/paragraph.rb +65 -0
  186. data/lib/coradoc/asciidoc/serializer/serializers/reviewer_note.rb +28 -0
  187. data/lib/coradoc/asciidoc/serializer/serializers/revision.rb +26 -0
  188. data/lib/coradoc/asciidoc/serializer/serializers/section.rb +37 -0
  189. data/lib/coradoc/asciidoc/serializer/serializers/table.rb +24 -0
  190. data/lib/coradoc/asciidoc/serializer/serializers/table_cell.rb +75 -0
  191. data/lib/coradoc/asciidoc/serializer/serializers/table_row.rb +24 -0
  192. data/lib/coradoc/asciidoc/serializer/serializers/tag.rb +19 -0
  193. data/lib/coradoc/asciidoc/serializer/serializers/term.rb +20 -0
  194. data/lib/coradoc/asciidoc/serializer/serializers/text_element.rb +23 -0
  195. data/lib/coradoc/asciidoc/serializer/serializers/title.rb +55 -0
  196. data/lib/coradoc/asciidoc/serializer/serializers/video.rb +33 -0
  197. data/lib/coradoc/asciidoc/serializer/spacing_strategy.rb +70 -0
  198. data/lib/coradoc/asciidoc/serializer.rb +75 -0
  199. data/lib/coradoc/asciidoc/transform/from_core_model.rb +502 -0
  200. data/lib/coradoc/asciidoc/transform/from_core_model_registrations.rb +126 -0
  201. data/lib/coradoc/asciidoc/transform/registry.rb +146 -0
  202. data/lib/coradoc/asciidoc/transform/to_core_model.rb +564 -0
  203. data/lib/coradoc/asciidoc/transform/to_core_model_registrations.rb +257 -0
  204. data/lib/coradoc/asciidoc/transform.rb +13 -0
  205. data/lib/coradoc/asciidoc/transformer/block_rules.rb +101 -0
  206. data/lib/coradoc/asciidoc/transformer/header_rules.rb +91 -0
  207. data/lib/coradoc/asciidoc/transformer/inline_rules.rb +179 -0
  208. data/lib/coradoc/asciidoc/transformer/list_rules.rb +131 -0
  209. data/lib/coradoc/asciidoc/transformer/misc_rules.rb +196 -0
  210. data/lib/coradoc/asciidoc/transformer/structural_rules.rb +216 -0
  211. data/lib/coradoc/asciidoc/transformer/text_rules.rb +107 -0
  212. data/lib/coradoc/asciidoc/transformer.rb +406 -0
  213. data/lib/coradoc/asciidoc/version.rb +7 -0
  214. data/lib/coradoc/asciidoc.rb +148 -0
  215. data/lib/coradoc/util/asciidoc.rb +71 -0
  216. data/lib/coradoc/util.rb +8 -0
  217. metadata +343 -0
@@ -0,0 +1,131 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Coradoc
4
+ module AsciiDoc
5
+ class Transformer < Parslet::Transform
6
+ # Module containing list transformation rules
7
+ module ListRules
8
+ def self.apply(transformer_class)
9
+ transformer_class.class_eval do
10
+ # List item
11
+ rule(list_item: subtree(:list_item)) do
12
+ marker = list_item[:marker]
13
+ id = list_item[:id]
14
+ text = list_item[:text]
15
+ text = list_item[:text].to_s if list_item[:text].instance_of?(Parslet::Slice)
16
+ attached = list_item[:attached]
17
+ nested = list_item[:nested]
18
+ line_break = list_item[:line_break]
19
+
20
+ # Convert nested array to proper List object if needed
21
+ if nested.is_a?(Array) && nested.any?
22
+ first_marker = nested.first.is_a?(Model::List::Item) ? nested.first.marker : marker
23
+ nested = if first_marker.to_s.start_with?('.', '1', 'a', 'A', 'i', 'I')
24
+ Model::List::Ordered.new(items: nested)
25
+ else
26
+ Model::List::Unordered.new(items: nested)
27
+ end
28
+ end
29
+
30
+ Model::List::Item.new(
31
+ content: text, id:, marker:, attached:, nested:, line_break:
32
+ )
33
+ end
34
+
35
+ # List passthrough
36
+ rule(list: simple(:list)) do
37
+ list
38
+ end
39
+
40
+ # Unordered list
41
+ rule(unordered: sequence(:list_items)) do
42
+ Model::List::Unordered.new(items: list_items)
43
+ end
44
+
45
+ rule(
46
+ attribute_list: simple(:attribute_list),
47
+ unordered: sequence(:list_items)
48
+ ) do
49
+ Model::List::Unordered.new(items: list_items, attrs: attribute_list)
50
+ end
51
+
52
+ # Ordered list
53
+ rule(ordered: sequence(:list_items)) do
54
+ Model::List::Ordered.new(items: list_items)
55
+ end
56
+
57
+ rule(
58
+ attribute_list: simple(:attribute_list),
59
+ ordered: sequence(:list_items)
60
+ ) do
61
+ Model::List::Ordered.new(items: list_items, attrs: attribute_list)
62
+ end
63
+
64
+ # Definition list term
65
+ rule(dlist_term: simple(:term), delimiter: simple(:_delim)) do
66
+ term.to_s
67
+ end
68
+
69
+ # Definition list item
70
+ rule(
71
+ definition_list_item: {
72
+ terms: sequence(:terms),
73
+ definition: simple(:contents)
74
+ }
75
+ ) do
76
+ Model::List::DefinitionItem.new(terms: terms, contents: contents)
77
+ end
78
+
79
+ # Definition list item with hash terms (single term case)
80
+ rule(
81
+ definition_list_item: subtree(:item_data)
82
+ ) do
83
+ terms_data = item_data[:terms]
84
+ definition = item_data[:definition]
85
+
86
+ # Extract terms
87
+ terms = if terms_data.is_a?(Array)
88
+ terms_data.map do |t|
89
+ if t.is_a?(Hash) && t[:dlist_term]
90
+ t[:dlist_term].to_s
91
+ else
92
+ t.to_s
93
+ end
94
+ end
95
+ else
96
+ [terms_data.to_s]
97
+ end
98
+
99
+ # Extract definition
100
+ if definition.is_a?(Parslet::Slice)
101
+ end
102
+ contents = definition.to_s
103
+
104
+ Model::List::DefinitionItem.new(terms: terms, contents: contents)
105
+ end
106
+
107
+ rule(definition_list: sequence(:list_items)) do
108
+ Model::List::Definition.new(items: list_items)
109
+ end
110
+
111
+ # Definition list with attribute_list (e.g., [%key])
112
+ rule(
113
+ attribute_list: simple(:attribute_list),
114
+ definition_list: sequence(:list_items)
115
+ ) do
116
+ Model::List::Definition.new(items: list_items, attrs: attribute_list)
117
+ end
118
+
119
+ # List containing definition_list
120
+ rule(
121
+ attribute_list: simple(:attribute_list),
122
+ definition_list: sequence(:list_items)
123
+ ) do
124
+ Model::List::Definition.new(items: list_items, attrs: attribute_list)
125
+ end
126
+ end
127
+ end
128
+ end
129
+ end
130
+ end
131
+ end
@@ -0,0 +1,196 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Coradoc
4
+ module AsciiDoc
5
+ class Transformer < Parslet::Transform
6
+ # Module containing miscellaneous transformation rules
7
+ module MiscRules
8
+ def self.apply(transformer_class)
9
+ transformer_class.class_eval do
10
+ # Comments
11
+ rule(comment_line: {
12
+ comment_text: simple(:comment_text),
13
+ line_break: simple(:line_break)
14
+ }) do
15
+ Model::CommentLine.new(text: comment_text, line_break: line_break)
16
+ end
17
+
18
+ rule(comment_block: { comment_text: simple(:comment_text) }) do
19
+ Model::CommentBlock.new(text: comment_text)
20
+ end
21
+
22
+ # Page break
23
+ rule(page_break: simple(:page_break)) do
24
+ Model::Break::PageBreak.new
25
+ end
26
+
27
+ # Tag
28
+ rule(tag: subtree(:tag)) do
29
+ Model::Tag.new(
30
+ name: tag[:name],
31
+ attrs: tag[:attribute_list],
32
+ line_break: tag[:line_break],
33
+ prefix: tag[:prefix]
34
+ )
35
+ end
36
+
37
+ # AttributeList
38
+ rule(
39
+ named: {
40
+ named_key: simple(:key),
41
+ named_value: simple(:value)
42
+ }
43
+ ) do
44
+ Model::Attribute.new(key: key.to_s, value: value.to_s)
45
+ end
46
+
47
+ rule(positional: simple(:positional)) do
48
+ positional.to_s
49
+ end
50
+
51
+ rule(attribute_array: nil) do
52
+ Model::AttributeList.new
53
+ end
54
+
55
+ rule(attribute_array: sequence(:attributes)) do
56
+ attr_list = Model::AttributeList.new
57
+ attributes.each do |a|
58
+ if a.is_a?(String)
59
+ attr_list.add_positional(a)
60
+ elsif a.is_a?(Model::Attribute)
61
+ attr_list.add_named(a.key, a.value)
62
+ end
63
+ end
64
+ attr_list
65
+ end
66
+
67
+ # Attribute with line_break
68
+ rule(
69
+ key: simple(:key),
70
+ value: simple(:value),
71
+ line_break: simple(:line_break)
72
+ ) do
73
+ Model::Attribute.new(
74
+ key: key.to_s,
75
+ value: value.to_s,
76
+ line_break: line_break.to_s
77
+ )
78
+ end
79
+
80
+ # Attribute without line_break
81
+ rule(
82
+ key: simple(:key),
83
+ value: simple(:value)
84
+ ) do
85
+ Model::Attribute.new(
86
+ key: key.to_s,
87
+ value: value.to_s
88
+ )
89
+ end
90
+
91
+ # Document attributes
92
+ rule(document_attributes: sequence(:document_attribute)) do
93
+ Model::DocumentAttributes.new(data: document_attribute)
94
+ end
95
+
96
+ # Include
97
+ rule(
98
+ include: {
99
+ path: simple(:path),
100
+ attribute_list: simple(:attribute_list),
101
+ line_break: simple(:line_break)
102
+ }
103
+ ) do
104
+ Model::Include.new(
105
+ path: path.to_s,
106
+ attributes: attribute_list,
107
+ line_break: line_break
108
+ )
109
+ end
110
+
111
+ # Audio
112
+ rule(
113
+ audio: {
114
+ path: simple(:path),
115
+ attribute_list: simple(:attribute_list),
116
+ line_break: simple(:line_break)
117
+ }
118
+ ) do
119
+ Model::Audio.new(
120
+ src: path.to_s,
121
+ attributes: attribute_list,
122
+ line_break: line_break
123
+ )
124
+ end
125
+
126
+ # Video
127
+ rule(
128
+ video: {
129
+ path: simple(:path),
130
+ attribute_list: simple(:attribute_list),
131
+ line_break: simple(:line_break)
132
+ }
133
+ ) do
134
+ Model::Video.new(
135
+ src: path.to_s,
136
+ attributes: attribute_list,
137
+ line_break: line_break
138
+ )
139
+ end
140
+
141
+ # Reviewer Note
142
+ rule(reviewer_note: subtree(:reviewer_note)) do
143
+ reviewer_attributes_hash = reviewer_note[:reviewer_attributes]
144
+ lines = reviewer_note[:lines] || []
145
+
146
+ attrs = {}
147
+ if reviewer_attributes_hash.is_a?(Model::AttributeList)
148
+ reviewer_attributes_hash.named.each do |attr|
149
+ attrs[attr.name.to_sym] = attr.value.is_a?(Array) ? attr.value.first : attr.value
150
+ end
151
+ elsif reviewer_attributes_hash.is_a?(Hash) && reviewer_attributes_hash[:attribute_list]
152
+ attr_list = Transformer.new.apply(reviewer_attributes_hash[:attribute_list])
153
+ if attr_list.is_a?(Model::AttributeList)
154
+ attr_list.named.each do |attr|
155
+ attrs[attr.name.to_sym] = attr.value.is_a?(Array) ? attr.value.first : attr.value
156
+ end
157
+ end
158
+ end
159
+
160
+ content = lines.map do |line|
161
+ if line.is_a?(Hash) && line.key?(:text)
162
+ text_content = line[:text]
163
+ line_break = line[:line_break]
164
+
165
+ transformed_text = if text_content.is_a?(Array)
166
+ text_content.map do |item|
167
+ if item.is_a?(Hash)
168
+ Transformer.new.apply(item)
169
+ else
170
+ item
171
+ end
172
+ end
173
+ else
174
+ text_content
175
+ end
176
+
177
+ Model::TextElement.new(content: transformed_text, line_break: line_break)
178
+ else
179
+ line
180
+ end
181
+ end
182
+
183
+ Model::ReviewerNote.new(
184
+ reviewer: attrs[:reviewer],
185
+ date: attrs[:date],
186
+ from: attrs[:from],
187
+ to: attrs[:to],
188
+ content: content
189
+ )
190
+ end
191
+ end
192
+ end
193
+ end
194
+ end
195
+ end
196
+ end
@@ -0,0 +1,216 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Coradoc
4
+ module AsciiDoc
5
+ class Transformer < Parslet::Transform
6
+ # Module containing table and structural element transformation rules
7
+ module StructuralRules
8
+ def self.apply(transformer_class)
9
+ transformer_class.class_eval do
10
+ # Table cell with format specification
11
+ rule(cell_format: simple(:format), text: simple(:text)) do
12
+ Transformer.build_table_cell(format, text)
13
+ end
14
+
15
+ rule(cell_format: simple(:format), text: sequence(:text)) do
16
+ Transformer.build_table_cell(format, text)
17
+ end
18
+
19
+ rule(cell_format: subtree(:format), text: simple(:text)) do
20
+ Transformer.build_table_cell(format, text)
21
+ end
22
+
23
+ rule(cell_format: subtree(:format), text: sequence(:text)) do
24
+ Transformer.build_table_cell(format, text)
25
+ end
26
+
27
+ # Table cell without format specification (plain content)
28
+ # NOTE: These rules should ONLY match within table context
29
+ # The generic text rules are handled by text_rules.rb
30
+ # rule(text: simple(:text)) do
31
+ # Model::TableCell.new(content: text.to_s)
32
+ # end
33
+ #
34
+ # rule(text: sequence(:text)) do
35
+ # Model::TableCell.new(content: text.map(&:to_s).join)
36
+ # end
37
+
38
+ # Single cell in a sequence - unwrap to TableCell
39
+ rule(cell: simple(:cell)) do
40
+ cell
41
+ end
42
+
43
+ # Unwrap single row
44
+ rule(row: simple(:row)) do
45
+ row
46
+ end
47
+
48
+ # Table row with cells
49
+ rule(cells: sequence(:cells)) do
50
+ Model::TableRow.new(columns: cells)
51
+ end
52
+
53
+ # Passthrough for attribute_list containing transformed attribute_array
54
+ rule(attribute_list: { attribute_array: simple(:attrs) }) do
55
+ attrs
56
+ end
57
+
58
+ # Passthrough for already-transformed Table
59
+ rule(table: simple(:table)) do
60
+ table
61
+ end
62
+
63
+ # Table with rows (new parser output - rows captured explicitly)
64
+ rule(
65
+ delim_char: simple(:delim_char),
66
+ rows: sequence(:rows)
67
+ ) do
68
+ Model::Table.new(rows: Transformer.regroup_table_rows(rows))
69
+ end
70
+
71
+ # Table with rows and title
72
+ rule(
73
+ title: simple(:title),
74
+ delim_char: simple(:delim_char),
75
+ rows: sequence(:rows)
76
+ ) do
77
+ Model::Table.new(title: title.to_s, rows: Transformer.regroup_table_rows(rows))
78
+ end
79
+
80
+ # Table with rows and id
81
+ rule(
82
+ id: simple(:id),
83
+ delim_char: simple(:delim_char),
84
+ rows: sequence(:rows)
85
+ ) do
86
+ Model::Table.new(id: id.to_s, rows: Transformer.regroup_table_rows(rows))
87
+ end
88
+
89
+ # Table with rows, id, and attributes
90
+ rule(
91
+ id: simple(:id),
92
+ attribute_list: simple(:attrs),
93
+ delim_char: simple(:delim_char),
94
+ rows: sequence(:rows)
95
+ ) do
96
+ Model::Table.new(id: id.to_s, rows: Transformer.regroup_table_rows(rows, attrs), attrs: attrs)
97
+ end
98
+
99
+ # Table with rows, title, and attributes
100
+ rule(
101
+ title: simple(:title),
102
+ attribute_list: simple(:attrs),
103
+ delim_char: simple(:delim_char),
104
+ rows: sequence(:rows)
105
+ ) do
106
+ Model::Table.new(title: title.to_s, rows: Transformer.regroup_table_rows(rows, attrs), attrs: attrs)
107
+ end
108
+
109
+ # Table with rows and attributes only
110
+ rule(
111
+ attribute_list: simple(:attrs),
112
+ delim_char: simple(:delim_char),
113
+ rows: sequence(:rows)
114
+ ) do
115
+ Model::Table.new(rows: Transformer.regroup_table_rows(rows, attrs), attrs: attrs)
116
+ end
117
+
118
+ # Table with rows, id, title, and attributes (full set)
119
+ rule(
120
+ id: simple(:id),
121
+ title: simple(:title),
122
+ attribute_list: simple(:attrs),
123
+ delim_char: simple(:delim_char),
124
+ rows: sequence(:rows)
125
+ ) do
126
+ Model::Table.new(id: id.to_s, title: title.to_s, rows: Transformer.regroup_table_rows(rows, attrs),
127
+ attrs: attrs)
128
+ end
129
+
130
+ # Table with id and title (no attributes)
131
+ rule(
132
+ id: simple(:id),
133
+ title: simple(:title),
134
+ delim_char: simple(:delim_char),
135
+ rows: sequence(:rows)
136
+ ) do
137
+ Model::Table.new(id: id.to_s, title: title.to_s, rows: Transformer.regroup_table_rows(rows))
138
+ end
139
+
140
+ # Title
141
+ rule(
142
+ level: simple(:level),
143
+ text: simple(:text),
144
+ line_break: simple(:line_break)
145
+ ) do
146
+ Model::Title.new(
147
+ content: text,
148
+ level_int: level.size - 1,
149
+ line_break: line_break
150
+ )
151
+ end
152
+
153
+ rule(
154
+ name: simple(:name),
155
+ level: simple(:level),
156
+ text: simple(:text),
157
+ line_break: simple(:line_break)
158
+ ) do
159
+ Model::Title.new(
160
+ content: text,
161
+ level_int: level.size - 1,
162
+ line_break: line_break,
163
+ id: name
164
+ )
165
+ end
166
+
167
+ # Section
168
+ rule(section: subtree(:section)) do
169
+ id = section[:id] || nil
170
+ title = section[:title] || nil
171
+
172
+ id = title.id if title.is_a?(Model::Title) && title.id && !id
173
+
174
+ attribute_list = section[:attribute_list] || nil
175
+ contents = section[:contents] || []
176
+ sections = section[:sections]
177
+ Model::Section.new(
178
+ title: title,
179
+ id: id,
180
+ attribute_list: attribute_list,
181
+ contents: contents,
182
+ sections: sections
183
+ )
184
+ end
185
+
186
+ rule(section: simple(:section)) do
187
+ section
188
+ end
189
+
190
+ # Document
191
+ rule(document: subtree(:document)) do
192
+ elements = document.is_a?(Array) ? document : [document]
193
+ Coradoc::AsciiDoc::Model::Document.from_ast(elements)
194
+ end
195
+
196
+ # Glossaries
197
+ rule(glossaries: sequence(:glossaries)) do
198
+ Model::Glossaries.new(items: glossaries)
199
+ end
200
+
201
+ # Bibliography entry
202
+ rule(bibliography_entry: subtree(:bib_entry)) do
203
+ anchor_name = bib_entry[:anchor_name]
204
+ document_id = bib_entry[:document_id]
205
+ ref_text = bib_entry[:ref_text]
206
+ line_break = bib_entry[:line_break]
207
+ Model::BibliographyEntry.new(
208
+ anchor_name:, document_id:, ref_text:, line_break:
209
+ )
210
+ end
211
+ end
212
+ end
213
+ end
214
+ end
215
+ end
216
+ end
@@ -0,0 +1,107 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Coradoc
4
+ module AsciiDoc
5
+ class Transformer < Parslet::Transform
6
+ # Module containing text and paragraph transformation rules
7
+ module TextRules
8
+ def self.apply(transformer_class)
9
+ transformer_class.class_eval do
10
+ # Text Model
11
+ rule(text: simple(:text)) do
12
+ Model::TextElement.new(content: text.to_s)
13
+ end
14
+
15
+ rule(text_string: subtree(:text_string)) do
16
+ text_string.to_s
17
+ end
18
+
19
+ rule(text: simple(:text), line_break: simple(:line_break)) do
20
+ Model::TextElement.new(content: text.to_s, line_break: line_break)
21
+ end
22
+
23
+ rule(text: sequence(:text), line_break: simple(:line_break)) do
24
+ Model::TextElement.new(content: text, line_break: line_break)
25
+ end
26
+
27
+ rule(id: simple(:id), text: simple(:text)) do
28
+ Model::TextElement.new(content: text.to_s, id: id.to_s)
29
+ end
30
+
31
+ rule(text: sequence(:text)) do
32
+ Model::TextElement.new(content: text)
33
+ end
34
+
35
+ rule(
36
+ id: simple(:id),
37
+ text: simple(:text),
38
+ line_break: simple(:line_break)
39
+ ) do
40
+ Model::TextElement.new(
41
+ content: text.to_s,
42
+ id: id.to_s,
43
+ line_break: line_break
44
+ )
45
+ end
46
+
47
+ rule(
48
+ id: simple(:id),
49
+ text: sequence(:text),
50
+ line_break: simple(:line_break)
51
+ ) do
52
+ Model::TextElement.new(
53
+ content: text,
54
+ id: id.to_s,
55
+ line_break: line_break
56
+ )
57
+ end
58
+
59
+ # Line break
60
+ rule(line_break: simple(:line_break)) do
61
+ Model::LineBreak.new(line_break:)
62
+ end
63
+
64
+ # Unparsed text
65
+ rule(unparsed: simple(:text)) do
66
+ text.to_s
67
+ end
68
+
69
+ # Paragraph
70
+ rule(paragraph: subtree(:paragraph)) do
71
+ lines = paragraph[:lines] || []
72
+ content = lines.map do |line|
73
+ if line.is_a?(Hash) && line.key?(:text)
74
+ text_content = line[:text]
75
+ line_break = line[:line_break]
76
+
77
+ transformed_text = if text_content.is_a?(Array)
78
+ text_content.map do |item|
79
+ if item.is_a?(Hash)
80
+ Transformer.new.apply(item)
81
+ else
82
+ item
83
+ end
84
+ end
85
+ else
86
+ text_content
87
+ end
88
+
89
+ Model::TextElement.new(content: transformed_text, line_break: line_break)
90
+ else
91
+ line
92
+ end
93
+ end
94
+
95
+ Model::Paragraph.new(
96
+ content: content,
97
+ id: paragraph[:id],
98
+ attributes: paragraph[:attribute_list],
99
+ title: paragraph[:title]
100
+ )
101
+ end
102
+ end
103
+ end
104
+ end
105
+ end
106
+ end
107
+ end