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,502 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'from_core_model_registrations'
4
+
5
+ module Coradoc
6
+ module AsciiDoc
7
+ module Transform
8
+ # Transforms CoreModel to AsciiDoc models
9
+ class FromCoreModel
10
+ def transform(model)
11
+ self.class.transform(model)
12
+ end
13
+
14
+ class << self
15
+ def transform(model)
16
+ return model.map { |item| transform(item) } if model.is_a?(Array)
17
+ return model unless model.is_a?(Coradoc::CoreModel::Base)
18
+
19
+ transformer = Registry.lookup(model.class)
20
+ return transformer.call(model) if transformer
21
+
22
+ transform_with_case(model)
23
+ end
24
+
25
+ def transform_with_case(model)
26
+ case model
27
+ when Coradoc::CoreModel::StructuralElement
28
+ transform_structural_element(model)
29
+ when Coradoc::CoreModel::AnnotationBlock
30
+ transform_annotation(model)
31
+ when Coradoc::CoreModel::Block
32
+ transform_block(model)
33
+ when Coradoc::CoreModel::Table
34
+ transform_table(model)
35
+ when Coradoc::CoreModel::ListBlock
36
+ transform_list(model)
37
+ when Coradoc::CoreModel::ListItem
38
+ transform_list_item(model)
39
+ when Coradoc::CoreModel::Term
40
+ transform_term(model)
41
+ when Coradoc::CoreModel::InlineElement
42
+ transform_inline(model)
43
+ when Coradoc::CoreModel::Image
44
+ transform_image(model)
45
+ when Coradoc::CoreModel::Footnote
46
+ transform_footnote(model)
47
+ when Coradoc::CoreModel::FootnoteReference
48
+ transform_footnote_reference(model)
49
+ when Coradoc::CoreModel::Abbreviation
50
+ transform_abbreviation(model)
51
+ when Coradoc::CoreModel::DefinitionList
52
+ transform_definition_list(model)
53
+ when Coradoc::CoreModel::DefinitionItem
54
+ transform_definition_item(model)
55
+ when Coradoc::CoreModel::Toc
56
+ transform_toc(model)
57
+ when Coradoc::CoreModel::TocEntry
58
+ transform_toc_entry(model)
59
+ when Coradoc::CoreModel::Bibliography
60
+ transform_bibliography(model)
61
+ when Coradoc::CoreModel::BibliographyEntry
62
+ transform_bibliography_entry(model)
63
+ else
64
+ model
65
+ end
66
+ end
67
+
68
+ def transform_structural_element(element)
69
+ case element.element_type
70
+ when 'document'
71
+ header = if element.title
72
+ Coradoc::AsciiDoc::Model::Header.new(
73
+ title: Coradoc::AsciiDoc::Model::Title.new(
74
+ content: element.title,
75
+ level_int: 0
76
+ )
77
+ )
78
+ else
79
+ Coradoc::AsciiDoc::Model::Header.new(title: '')
80
+ end
81
+
82
+ Coradoc::AsciiDoc::Model::Document.new(
83
+ id: element.id,
84
+ header: header,
85
+ sections: transform(element.children)
86
+ )
87
+ when 'section'
88
+ Coradoc::AsciiDoc::Model::Section.new(
89
+ id: element.id,
90
+ level: element.level,
91
+ title: create_title(element.title, element.level),
92
+ contents: transform(element.children)
93
+ )
94
+ else
95
+ Coradoc::AsciiDoc::Model::Section.new(
96
+ id: element.id,
97
+ title: create_title(element.title, 1),
98
+ contents: transform(element.children)
99
+ )
100
+ end
101
+ end
102
+
103
+ def transform_block(block)
104
+ content = block.renderable_content
105
+
106
+ semantic = resolve_semantic_type(block)
107
+
108
+ case semantic
109
+ when :paragraph
110
+ return Coradoc::AsciiDoc::Model::Paragraph.new(
111
+ id: block.id,
112
+ content: create_text_elements(content)
113
+ )
114
+ when :comment
115
+ return Coradoc::AsciiDoc::Model::CommentBlock.new(
116
+ text: safe_content_to_string(content)
117
+ )
118
+ end
119
+
120
+ content_text = safe_content_to_string(content)
121
+
122
+ case semantic
123
+ when :source_code
124
+ Coradoc::AsciiDoc::Model::Block::SourceCode.new(
125
+ id: block.id,
126
+ title: block.title,
127
+ lines: content_text.split("\n"),
128
+ attributes: build_attributes(block)
129
+ )
130
+ when :quote
131
+ Coradoc::AsciiDoc::Model::Block::Quote.new(
132
+ id: block.id,
133
+ title: block.title,
134
+ lines: content_text.split("\n")
135
+ )
136
+ when :example
137
+ Coradoc::AsciiDoc::Model::Block::Example.new(
138
+ id: block.id,
139
+ title: block.title,
140
+ lines: content_text.split("\n")
141
+ )
142
+ when :sidebar
143
+ Coradoc::AsciiDoc::Model::Block::Side.new(
144
+ id: block.id,
145
+ title: block.title,
146
+ lines: content_text.split("\n")
147
+ )
148
+ when :literal
149
+ Coradoc::AsciiDoc::Model::Block::Literal.new(
150
+ id: block.id,
151
+ title: block.title,
152
+ lines: content_text.split("\n")
153
+ )
154
+ when :open
155
+ Coradoc::AsciiDoc::Model::Block::Open.new(
156
+ id: block.id,
157
+ title: block.title,
158
+ lines: content_text.split("\n")
159
+ )
160
+ when :pass
161
+ Coradoc::AsciiDoc::Model::Block::Pass.new(
162
+ id: block.id,
163
+ title: block.title,
164
+ lines: content_text.split("\n")
165
+ )
166
+ when :listing
167
+ Coradoc::AsciiDoc::Model::Block::Listing.new(
168
+ id: block.id,
169
+ title: block.title,
170
+ lines: content_text.split("\n")
171
+ )
172
+ when :verse
173
+ Coradoc::AsciiDoc::Model::Block::Quote.new(
174
+ id: block.id,
175
+ title: block.title,
176
+ lines: content_text.split("\n")
177
+ )
178
+ when :reviewer
179
+ Coradoc::AsciiDoc::Model::Block::ReviewerComment.new(
180
+ id: block.id,
181
+ title: block.title,
182
+ lines: content_text.split("\n")
183
+ )
184
+ else
185
+ delim = block.delimiter_type.to_s
186
+ delim_char = delim.chars.first
187
+ delim_len = delim.length
188
+
189
+ Coradoc::AsciiDoc::Model::Block::Core.new(
190
+ id: block.id,
191
+ title: block.title,
192
+ delimiter: delim,
193
+ delimiter_char: delim_char,
194
+ delimiter_len: delim_len,
195
+ lines: content_text.split("\n")
196
+ )
197
+ end
198
+ end
199
+
200
+ def transform_table(table)
201
+ rows = Array(table.rows).map do |row|
202
+ columns = Array(row.cells).map do |cell|
203
+ Coradoc::AsciiDoc::Model::TableCell.new(
204
+ content: cell.flat_text
205
+ )
206
+ end
207
+ Coradoc::AsciiDoc::Model::TableRow.new(
208
+ columns: columns
209
+ )
210
+ end
211
+
212
+ Coradoc::AsciiDoc::Model::Table.new(
213
+ id: table.id,
214
+ title: table.title,
215
+ rows: rows
216
+ )
217
+ end
218
+
219
+ def transform_list(list)
220
+ items = Array(list.items).map do |item|
221
+ Coradoc::AsciiDoc::Model::List::Item.new(
222
+ content: item.flat_text,
223
+ marker: item.marker || default_marker(list.marker_type)
224
+ )
225
+ end
226
+
227
+ case list.marker_type
228
+ when 'ordered'
229
+ Coradoc::AsciiDoc::Model::List::Ordered.new(items: items)
230
+ when 'definition'
231
+ Coradoc::AsciiDoc::Model::List::Definition.new(items: items)
232
+ else
233
+ Coradoc::AsciiDoc::Model::List::Unordered.new(items: items)
234
+ end
235
+ end
236
+
237
+ def transform_list_item(item)
238
+ Coradoc::AsciiDoc::Model::List::Item.new(
239
+ content: item.flat_text,
240
+ marker: item.marker
241
+ )
242
+ end
243
+
244
+ def transform_term(term)
245
+ Coradoc::AsciiDoc::Model::Term.new(
246
+ term: term.text,
247
+ type: term.type&.to_s || 'preferred',
248
+ lang: term.lang || 'en'
249
+ )
250
+ end
251
+
252
+ def transform_annotation(annotation)
253
+ Coradoc::AsciiDoc::Model::Admonition.new(
254
+ type: annotation.annotation_type.to_s.upcase,
255
+ content: create_text_elements(annotation.renderable_content)
256
+ )
257
+ end
258
+
259
+ def transform_inline(inline)
260
+ case inline.format_type
261
+ when 'bold'
262
+ Coradoc::AsciiDoc::Model::Inline::Bold.new(content: inline.content)
263
+ when 'italic'
264
+ Coradoc::AsciiDoc::Model::Inline::Italic.new(content: inline.content)
265
+ when 'monospace'
266
+ Coradoc::AsciiDoc::Model::Inline::Monospace.new(content: inline.content)
267
+ when 'highlight'
268
+ Coradoc::AsciiDoc::Model::Inline::Highlight.new(content: inline.content)
269
+ when 'strikethrough'
270
+ Coradoc::AsciiDoc::Model::Inline::Strikethrough.new(content: inline.content)
271
+ when 'subscript'
272
+ Coradoc::AsciiDoc::Model::Inline::Subscript.new(content: inline.content)
273
+ when 'superscript'
274
+ Coradoc::AsciiDoc::Model::Inline::Superscript.new(content: inline.content)
275
+ when 'underline'
276
+ Coradoc::AsciiDoc::Model::Inline::Underline.new(text: inline.content)
277
+ when 'link'
278
+ Coradoc::AsciiDoc::Model::Inline::Link.new(
279
+ path: inline.target,
280
+ name: inline.content
281
+ )
282
+ when 'xref'
283
+ Coradoc::AsciiDoc::Model::Inline::CrossReference.new(href: inline.target)
284
+ when 'footnote'
285
+ Coradoc::AsciiDoc::Model::Inline::Footnote.new(
286
+ id: inline.target,
287
+ text: inline.content
288
+ )
289
+ when 'stem'
290
+ Coradoc::AsciiDoc::Model::Inline::Stem.new(
291
+ type: inline.stem_type || 'latexmath',
292
+ content: inline.content
293
+ )
294
+ else
295
+ Coradoc::AsciiDoc::Model::TextElement.new(content: inline.content)
296
+ end
297
+ end
298
+
299
+ def transform_image(image)
300
+ Coradoc::AsciiDoc::Model::Image::BlockImage.new(
301
+ src: image.src,
302
+ title: image.alt,
303
+ attributes: build_image_attributes(image)
304
+ )
305
+ end
306
+
307
+ def transform_bibliography(bib)
308
+ entries = Array(bib.entries).map do |entry|
309
+ transform_bibliography_entry(entry)
310
+ end
311
+
312
+ Coradoc::AsciiDoc::Model::Bibliography.new(
313
+ id: bib.id,
314
+ title: bib.title,
315
+ entries: entries
316
+ )
317
+ end
318
+
319
+ def transform_bibliography_entry(entry)
320
+ Coradoc::AsciiDoc::Model::BibliographyEntry.new(
321
+ anchor_name: entry.anchor_name,
322
+ document_id: entry.document_id,
323
+ ref_text: entry.ref_text
324
+ )
325
+ end
326
+
327
+ def transform_footnote(footnote)
328
+ Coradoc::AsciiDoc::Model::Inline::Footnote.new(
329
+ id: footnote.id,
330
+ text: footnote.content.to_s
331
+ )
332
+ end
333
+
334
+ def transform_footnote_reference(footnote_ref)
335
+ Coradoc::AsciiDoc::Model::Inline::Footnote.new(
336
+ id: footnote_ref.id
337
+ )
338
+ end
339
+
340
+ def transform_abbreviation(abbreviation)
341
+ Coradoc::AsciiDoc::Model::TextElement.new(
342
+ content: abbreviation.term.to_s +
343
+ (abbreviation.definition ? " (#{abbreviation.definition})" : '')
344
+ )
345
+ end
346
+
347
+ def transform_definition_list(definition_list)
348
+ items = Array(definition_list.items).map do |item|
349
+ transform_definition_item(item)
350
+ end
351
+ Coradoc::AsciiDoc::Model::List::Definition.new(items: items)
352
+ end
353
+
354
+ def transform_definition_item(item)
355
+ term = Coradoc::AsciiDoc::Model::Term.new(term: item.term.to_s)
356
+ contents = Array(item.definitions).map do |defn|
357
+ Coradoc::AsciiDoc::Model::TextElement.new(content: defn.to_s)
358
+ end
359
+ Coradoc::AsciiDoc::Model::List::DefinitionItem.new(
360
+ terms: [term],
361
+ contents: contents
362
+ )
363
+ end
364
+
365
+ def transform_toc(_toc)
366
+ Coradoc::AsciiDoc::Model::TextElement.new(
367
+ content: 'toc::[]'
368
+ )
369
+ end
370
+
371
+ def transform_toc_entry(entry)
372
+ Coradoc::AsciiDoc::Model::TextElement.new(
373
+ content: entry.title.to_s
374
+ )
375
+ end
376
+
377
+ private
378
+
379
+ # Reverse mapping: semantic type → AsciiDoc delimiter generation
380
+ SEMANTIC_TO_ADOC_BLOCK = {
381
+ source_code: :source_code,
382
+ quote: :quote,
383
+ example: :example,
384
+ sidebar: :sidebar,
385
+ literal: :literal,
386
+ pass: :pass,
387
+ open: :open,
388
+ verse: :open,
389
+ paragraph: :paragraph,
390
+ comment: :comment
391
+ }.freeze
392
+
393
+ # Map raw delimiter_type string → semantic type (backward compat)
394
+ DELIMITER_CHAR_TO_SEMANTIC = {
395
+ '-' => :source_code,
396
+ '=' => :example,
397
+ '_' => :quote,
398
+ '*' => :sidebar,
399
+ '.' => :literal,
400
+ '+' => :pass
401
+ }.freeze
402
+
403
+ def resolve_semantic_type(block)
404
+ # Polymorphic dispatch: typed classes override semantic_type
405
+ semantic = block.resolve_semantic_type
406
+ return semantic if semantic
407
+
408
+ # Format-specific fallback from delimiter_type
409
+ delim = block.delimiter_type
410
+ return nil unless delim && !delim.empty?
411
+
412
+ case delim
413
+ when 'comment' then :comment
414
+ when 'paragraph' then :paragraph
415
+ when '[verse]' then :verse
416
+ when '>' then :quote
417
+ when "'''", '---', '___', '***' then :horizontal_rule
418
+ else
419
+ char = delim[0]
420
+ DELIMITER_CHAR_TO_SEMANTIC[char] || nil
421
+ end
422
+ end
423
+
424
+ def safe_content_to_string(content)
425
+ case content
426
+ when String
427
+ content
428
+ when Array
429
+ content.map { |item| safe_content_to_string(item) }.join
430
+ when Lutaml::Model::Serializable
431
+ if content.is_a?(Coradoc::AsciiDoc::Model::Base)
432
+ content.to_adoc
433
+ elsif content.class.attributes.key?(:text)
434
+ content.text.to_s
435
+ else
436
+ ''
437
+ end
438
+ when nil
439
+ ''
440
+ else
441
+ content.is_a?(String) ? content : ''
442
+ end
443
+ end
444
+
445
+ def create_title(text, level)
446
+ return nil if text.nil?
447
+
448
+ Coradoc::AsciiDoc::Model::Title.new(
449
+ content: text,
450
+ level_int: level || 1
451
+ )
452
+ end
453
+
454
+ def create_text_elements(content)
455
+ case content
456
+ when Array
457
+ content.map { |item| create_text_elements(item) }
458
+ when Coradoc::CoreModel::InlineElement
459
+ transform_inline(content)
460
+ when Coradoc::AsciiDoc::Model::Base
461
+ content
462
+ when Lutaml::Model::Serializable
463
+ text = if content.is_a?(Coradoc::AsciiDoc::Model::Base)
464
+ content.to_adoc
465
+ elsif content.class.attributes.key?(:text)
466
+ content.text.to_s
467
+ else
468
+ ''
469
+ end
470
+ Coradoc::AsciiDoc::Model::TextElement.new(content: text)
471
+ when String
472
+ Coradoc::AsciiDoc::Model::TextElement.new(content: content)
473
+ else
474
+ text = content.is_a?(String) ? content : ''
475
+ Coradoc::AsciiDoc::Model::TextElement.new(content: text)
476
+ end
477
+ end
478
+
479
+ def build_attributes(block)
480
+ attrs = {}
481
+ attrs['language'] = block.language if block.language
482
+ attrs
483
+ end
484
+
485
+ def build_image_attributes(image)
486
+ attrs = {}
487
+ attrs['width'] = image.width if image.width
488
+ attrs['height'] = image.height if image.height
489
+ attrs
490
+ end
491
+
492
+ def default_marker(marker_type)
493
+ case marker_type
494
+ when 'ordered' then '.'
495
+ else '*'
496
+ end
497
+ end
498
+ end
499
+ end
500
+ end
501
+ end
502
+ end
@@ -0,0 +1,126 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Coradoc
4
+ module AsciiDoc
5
+ module Transform
6
+ # Registers all default CoreModel -> AsciiDoc transformers
7
+ module FromCoreModelRegistrations
8
+ class << self
9
+ def register_all!
10
+ register_structural_transformers!
11
+ register_block_transformers!
12
+ register_list_transformers!
13
+ register_inline_transformers!
14
+ register_other_transformers!
15
+ end
16
+
17
+ private
18
+
19
+ def register_structural_transformers!
20
+ Registry.register(
21
+ Coradoc::CoreModel::StructuralElement,
22
+ ->(model) { FromCoreModel.transform_structural_element(model) }
23
+ )
24
+ end
25
+
26
+ def register_block_transformers!
27
+ Registry.register_with_priority(
28
+ Coradoc::CoreModel::AnnotationBlock,
29
+ ->(model) { FromCoreModel.transform_annotation(model) },
30
+ priority: 10
31
+ )
32
+
33
+ Registry.register(
34
+ Coradoc::CoreModel::Block,
35
+ ->(model) { FromCoreModel.transform_block(model) }
36
+ )
37
+ end
38
+
39
+ def register_list_transformers!
40
+ Registry.register(
41
+ Coradoc::CoreModel::ListBlock,
42
+ ->(model) { FromCoreModel.transform_list(model) }
43
+ )
44
+
45
+ Registry.register(
46
+ Coradoc::CoreModel::ListItem,
47
+ ->(model) { FromCoreModel.transform_list_item(model) }
48
+ )
49
+
50
+ Registry.register(
51
+ Coradoc::CoreModel::DefinitionList,
52
+ ->(model) { FromCoreModel.transform_definition_list(model) }
53
+ )
54
+
55
+ Registry.register(
56
+ Coradoc::CoreModel::DefinitionItem,
57
+ ->(model) { FromCoreModel.transform_definition_item(model) }
58
+ )
59
+ end
60
+
61
+ def register_inline_transformers!
62
+ Registry.register(
63
+ Coradoc::CoreModel::InlineElement,
64
+ ->(model) { FromCoreModel.transform_inline(model) }
65
+ )
66
+ end
67
+
68
+ def register_other_transformers!
69
+ Registry.register(
70
+ Coradoc::CoreModel::Table,
71
+ ->(model) { FromCoreModel.transform_table(model) }
72
+ )
73
+
74
+ Registry.register(
75
+ Coradoc::CoreModel::Term,
76
+ ->(model) { FromCoreModel.transform_term(model) }
77
+ )
78
+
79
+ Registry.register(
80
+ Coradoc::CoreModel::Image,
81
+ ->(model) { FromCoreModel.transform_image(model) }
82
+ )
83
+
84
+ Registry.register(
85
+ Coradoc::CoreModel::Footnote,
86
+ ->(model) { FromCoreModel.transform_footnote(model) }
87
+ )
88
+
89
+ Registry.register(
90
+ Coradoc::CoreModel::FootnoteReference,
91
+ ->(model) { FromCoreModel.transform_footnote_reference(model) }
92
+ )
93
+
94
+ Registry.register(
95
+ Coradoc::CoreModel::Abbreviation,
96
+ ->(model) { FromCoreModel.transform_abbreviation(model) }
97
+ )
98
+
99
+ Registry.register(
100
+ Coradoc::CoreModel::Toc,
101
+ ->(model) { FromCoreModel.transform_toc(model) }
102
+ )
103
+
104
+ Registry.register(
105
+ Coradoc::CoreModel::TocEntry,
106
+ ->(model) { FromCoreModel.transform_toc_entry(model) }
107
+ )
108
+
109
+ Registry.register(
110
+ Coradoc::CoreModel::Bibliography,
111
+ ->(model) { FromCoreModel.transform_bibliography(model) }
112
+ )
113
+
114
+ Registry.register(
115
+ Coradoc::CoreModel::BibliographyEntry,
116
+ ->(model) { FromCoreModel.transform_bibliography_entry(model) }
117
+ )
118
+ end
119
+ end
120
+ end
121
+ end
122
+ end
123
+ end
124
+
125
+ # Auto-register when this file is loaded
126
+ Coradoc::AsciiDoc::Transform::FromCoreModelRegistrations.register_all!