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,22 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Coradoc
4
+ module AsciiDoc
5
+ module Serializer
6
+ module Serializers
7
+ class NamedAttribute < Base
8
+ def to_adoc(model, _options = {})
9
+ if model.value.length == 1
10
+ "#{model.name}=#{model.value.first}"
11
+ else
12
+ "#{model.name}=\"#{model.value.join(' ')}\""
13
+ end
14
+ end
15
+ end
16
+ end
17
+
18
+ # Self-register this serializer
19
+ ElementRegistry.register(Coradoc::AsciiDoc::Model::NamedAttribute, Serializers::NamedAttribute)
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,65 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Coradoc
4
+ module AsciiDoc
5
+ module Serializer
6
+ module Serializers
7
+ # Serializer for Paragraph models
8
+ class Paragraph < Base
9
+ def to_adoc(model, options_or_context = {})
10
+ context = normalize_context(options_or_context)
11
+
12
+ _title = model.title.nil? ? '' : ".#{serialize_child(model.title, context)}\n"
13
+ _anchor = gen_anchor(model, context)
14
+ attrs = if model.attributes.nil? || model.attributes.empty?
15
+ ''
16
+ else
17
+ "#{AdocSerializer.serialize(
18
+ model.attributes, context
19
+ )}\n"
20
+ end
21
+
22
+ result = if model.tdsinglepara
23
+ "#{_title}#{_anchor}" <<
24
+ serialize_content(model.content)
25
+ else
26
+ "#{_title}#{_anchor}#{attrs}" <<
27
+ serialize_content(model.content)
28
+ end
29
+
30
+ # Ensure paragraph ends with blank line for proper separation
31
+ # unless this is the last element in a document (determined by context)
32
+ # But not for tdsinglepara (table cell single paragraph)
33
+ unless model.tdsinglepara || context.last_element
34
+ if model.trailing_newlines.nil?
35
+ # Semantic mode: Use default "\n\n" ending
36
+ result = "#{result.chomp}\n\n" unless result.end_with?("\n\n")
37
+ else
38
+ # Exact mode: Use captured trailing newlines from original
39
+ result += model.trailing_newlines
40
+ end
41
+ end
42
+
43
+ result
44
+ end
45
+
46
+ private
47
+
48
+ def gen_anchor(model, context)
49
+ return '' if model.anchor.nil? || model.id.nil? || model.id.empty?
50
+
51
+ anchor_str = AdocSerializer.serialize(model.anchor, context)
52
+ if anchor_str.empty?
53
+ ''
54
+ else
55
+ "#{anchor_str}\n"
56
+ end
57
+ end
58
+ end
59
+ end
60
+
61
+ # Self-register this serializer
62
+ ElementRegistry.register(Coradoc::AsciiDoc::Model::Paragraph, Serializers::Paragraph)
63
+ end
64
+ end
65
+ end
@@ -0,0 +1,28 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Coradoc
4
+ module AsciiDoc
5
+ module Serializer
6
+ module Serializers
7
+ class ReviewerNote < Base
8
+ def to_adoc(model, _options = {})
9
+ attrs = []
10
+ attrs << "reviewer=#{model.reviewer}" if model.reviewer
11
+ attrs << "date=#{model.date}" if model.date
12
+ attrs << "from=#{model.from}" if model.from
13
+ attrs << "to=#{model.to}" if model.to
14
+
15
+ result = "[#{attrs.join(',')}]\n"
16
+ result += "****\n"
17
+ result += serialize_children(model.content) if model.content
18
+ result += "****\n"
19
+ result
20
+ end
21
+ end
22
+ end
23
+
24
+ # Self-register this serializer
25
+ ElementRegistry.register(Coradoc::AsciiDoc::Model::ReviewerNote, Serializers::ReviewerNote)
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,26 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Coradoc
4
+ module AsciiDoc
5
+ module Serializer
6
+ module Serializers
7
+ class Revision < Base
8
+ def to_adoc(model, _options = {})
9
+ if model.date.nil? && model.remark.nil?
10
+ "v#{model.number}\n"
11
+ elsif model.remark.nil?
12
+ "#{model.number}, #{model.date}\n"
13
+ elsif model.date.nil?
14
+ "#{model.number}: #{model.remark}\n"
15
+ else
16
+ "#{model.number}, #{model.date}: #{model.remark}\n"
17
+ end
18
+ end
19
+ end
20
+ end
21
+
22
+ # Self-register this serializer
23
+ ElementRegistry.register(Coradoc::AsciiDoc::Model::Revision, Serializers::Revision)
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,37 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Coradoc
4
+ module AsciiDoc
5
+ module Serializer
6
+ module Serializers
7
+ class Section < Base
8
+ def to_adoc(model, options_or_context = {})
9
+ context = normalize_context(options_or_context)
10
+ parts = []
11
+
12
+ parts << "\n"
13
+ parts << "#{serialize_child(model.anchor, context)}\n" if model.anchor
14
+ parts << "#{model.attrs.map { |a| serialize_child(a, context) }.join(',')}\n" unless model.attrs.empty?
15
+ parts << serialize_child(model.title, context) if model.title
16
+
17
+ # Process contents
18
+ content_str = serialize_children(model.contents, context)
19
+
20
+ # A block of " +\n"s isn't parsed correctly. It needs to start
21
+ # with something.
22
+ content_str = "&nbsp;#{content_str}" if content_str.start_with?(" +\n")
23
+
24
+ parts << content_str
25
+ parts << serialize_children(model.sections, context)
26
+ parts << "\n"
27
+
28
+ parts.join
29
+ end
30
+ end
31
+ end
32
+
33
+ # Self-register this serializer
34
+ ElementRegistry.register(Coradoc::AsciiDoc::Model::Section, Serializers::Section)
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,24 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Coradoc
4
+ module AsciiDoc
5
+ module Serializer
6
+ module Serializers
7
+ class Table < Base
8
+ def to_adoc(model, _options = {})
9
+ @model = model
10
+ _anchor = @model.anchor.nil? ? '' : "#{serialize_child(@model.anchor)}\n"
11
+ _attrs = @model.attrs.to_s.empty? ? '' : "#{serialize_child(@model.attrs)}\n"
12
+ _title = @model.title.nil? || @model.title.empty? ? '' : ".#{serialize_child(@model.title)}\n"
13
+ _content = @model.rows.map { |row| serialize_child(row) }.join
14
+
15
+ "\n\n#{_anchor}#{_attrs}#{_title}|===\n#{_content}|===\n"
16
+ end
17
+ end
18
+ end
19
+
20
+ # Self-register this serializer
21
+ ElementRegistry.register(Coradoc::AsciiDoc::Model::Table, Serializers::Table)
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,75 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Coradoc
4
+ module AsciiDoc
5
+ module Serializer
6
+ module Serializers
7
+ class TableCell < Base
8
+ def to_adoc(model, _options = {})
9
+ @model = model
10
+ _anchor = @model.gen_anchor(inline: true)
11
+
12
+ # Handle content - if it's a single string, strip unicode; otherwise serialize children
13
+ if @model.content.is_a?(String)
14
+ _content = Coradoc.strip_unicode(@model.content) if defined?(Coradoc.strip_unicode)
15
+ _content ||= @model.content
16
+ elsif @model.content.is_a?(Array) && @model.content.size == 1 && @model.content.first.is_a?(String)
17
+ _content = Coradoc.strip_unicode(@model.content.first) if defined?(Coradoc.strip_unicode)
18
+ _content ||= @model.content.first.to_s
19
+ else
20
+ _content = serialize_children(@model.content)
21
+ end
22
+
23
+ # Build format specification: [colspan][.rowspan][halign][valign][style][*]
24
+ format_spec = build_format_specification
25
+
26
+ "#{format_spec}| #{_anchor}#{_content}"
27
+ end
28
+
29
+ private
30
+
31
+ # Build AsciiDoc cell format specification
32
+ # Format: [colspan][.rowspan][halign][valign][style][*]
33
+ def build_format_specification
34
+ spec = ''
35
+
36
+ # Colspan (digits)
37
+ spec += @model.colspan.to_s if @model.colspan && @model.colspan > 1
38
+
39
+ # Rowspan (.digits)
40
+ spec += ".#{@model.rowspan}" if @model.rowspan && @model.rowspan > 1
41
+
42
+ # Horizontal alignment (< ^ >)
43
+ spec += @model.halign if @model.halign && %w[< ^ >].include?(@model.halign)
44
+
45
+ # Vertical alignment (.< .^ .>)
46
+ spec += ".#{@model.valign}" if @model.valign && %w[< ^ >].include?(@model.valign)
47
+
48
+ # Style (d s e m a l v)
49
+ spec += @model.style if @model.style && %w[d s e m a l v].include?(@model.style)
50
+
51
+ # Repeat marker
52
+ spec += '*' if @model.repeat
53
+
54
+ # Fall back to legacy attributes if new attributes are empty
55
+ spec = build_legacy_format_spec if spec.empty? && (@model.colrowattr || @model.alignattr || @model.style)
56
+
57
+ spec
58
+ end
59
+
60
+ # Build format spec from legacy attributes (backward compatibility)
61
+ def build_legacy_format_spec
62
+ spec = ''
63
+ spec += @model.colrowattr.to_s
64
+ spec += @model.alignattr.to_s
65
+ # NOTE: style was included in colrowattr in old format
66
+ spec
67
+ end
68
+ end
69
+ end
70
+
71
+ # Self-register this serializer
72
+ ElementRegistry.register(Coradoc::AsciiDoc::Model::TableCell, Serializers::TableCell)
73
+ end
74
+ end
75
+ end
@@ -0,0 +1,24 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Coradoc
4
+ module AsciiDoc
5
+ module Serializer
6
+ module Serializers
7
+ class TableRow < Base
8
+ def to_adoc(model, _options = {})
9
+ @model = model
10
+ delim = @model.asciidoc? ? "\n" : ' '
11
+ result = "#{@model.columns.map(&:to_adoc).join(delim)}\n"
12
+
13
+ # Add extra newline for header or asciidoc rows
14
+ result += "\n" if @model.header || @model.asciidoc?
15
+ result
16
+ end
17
+ end
18
+ end
19
+
20
+ # Self-register this serializer
21
+ ElementRegistry.register(Coradoc::AsciiDoc::Model::TableRow, Serializers::TableRow)
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Coradoc
4
+ module AsciiDoc
5
+ module Serializer
6
+ module Serializers
7
+ class Tag < Base
8
+ def to_adoc(model, _options = {})
9
+ attrs_str = model.attrs.to_adoc unless model.attrs.nil?
10
+ "// #{model.prefix}::#{model.name}#{attrs_str}#{model.line_break}"
11
+ end
12
+ end
13
+ end
14
+
15
+ # Self-register this serializer
16
+ ElementRegistry.register(Coradoc::AsciiDoc::Model::Tag, Serializers::Tag)
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,20 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Coradoc
4
+ module AsciiDoc
5
+ module Serializer
6
+ module Serializers
7
+ class Term < Base
8
+ def to_adoc(model, _options = {})
9
+ return "#{model.type}:[#{model.term}]#{model.line_break}" if model.lang.to_s == 'en'
10
+
11
+ "[#{model.type}]##{model.term}##{model.line_break}"
12
+ end
13
+ end
14
+ end
15
+
16
+ # Self-register this serializer
17
+ ElementRegistry.register(Coradoc::AsciiDoc::Model::Term, Serializers::Term)
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,23 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Coradoc
4
+ module AsciiDoc
5
+ module Serializer
6
+ module Serializers
7
+ # Serializer for TextElement models
8
+ class TextElement < Base
9
+ def to_adoc(model, _options = {})
10
+ result = ''
11
+ result += "[[#{model.id}]] " if model.id
12
+ result += serialize_content(model.content)
13
+ result += model.line_break.to_s
14
+ result
15
+ end
16
+ end
17
+ end
18
+
19
+ # Self-register this serializer
20
+ ElementRegistry.register(Coradoc::AsciiDoc::Model::TextElement, Serializers::TextElement)
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,55 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Coradoc
4
+ module AsciiDoc
5
+ module Serializer
6
+ module Serializers
7
+ class Title < Base
8
+ def to_adoc(model, options_or_context = {})
9
+ context = normalize_context(options_or_context)
10
+ @model = model
11
+ _anchor = model.anchor.nil? ? '' : "#{serialize_child(model.anchor, context)}\n"
12
+ _content = serialize_children(model.content, context)
13
+
14
+ # For ATX style headings, use # markers
15
+ if model.style == 'atx'
16
+ atx_markers = '#' * (model.level_int + 1)
17
+ "#{_anchor}#{atx_markers} #{_content}#{model.line_break}"
18
+ else
19
+ # Default setext style
20
+ "#{_anchor}#{style_str}#{level_str} #{_content}#{model.line_break}"
21
+ end
22
+ end
23
+
24
+ private
25
+
26
+ def level_str
27
+ return '' if @model.level_int.nil?
28
+
29
+ if @model.level_int <= 5
30
+ '=' * (@model.level_int + 1)
31
+ else
32
+ '======'
33
+ end
34
+ end
35
+
36
+ def style_str
37
+ return '' if @model.level_int.nil?
38
+
39
+ # Don't include style in output for atx since it's implicit
40
+ return '' if @model.style == 'atx'
41
+
42
+ _style = [@model.style].compact.reject { |s| s == 'atx' }
43
+ _style << "level=#{@model.level_int}" if @model.level_int > 5
44
+ _style = _style.join(',')
45
+
46
+ _style.empty? ? '' : "[#{_style}]\n"
47
+ end
48
+ end
49
+ end
50
+
51
+ # Self-register this serializer
52
+ ElementRegistry.register(Coradoc::AsciiDoc::Model::Title, Serializers::Title)
53
+ end
54
+ end
55
+ end
@@ -0,0 +1,33 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Coradoc
4
+ module AsciiDoc
5
+ module Serializer
6
+ module Serializers
7
+ class Video < Base
8
+ def to_adoc(model, _options = {})
9
+ @model = model
10
+ _anchor = gen_anchor
11
+ _title = model.title.nil? || model.title.empty? ? '' : ".#{model.title}\n"
12
+ _attrs = model.attributes.to_adoc
13
+ [_anchor, _title, 'video::', model.src, _attrs].join + model.line_break
14
+ end
15
+
16
+ private
17
+
18
+ attr_reader :model
19
+
20
+ def gen_anchor
21
+ return '' unless @model.anchor
22
+
23
+ anchor_str = @model.anchor.to_adoc
24
+ anchor_str.empty? ? '' : "#{anchor_str}\n"
25
+ end
26
+ end
27
+ end
28
+
29
+ # Self-register this serializer
30
+ ElementRegistry.register(Coradoc::AsciiDoc::Model::Video, Serializers::Video)
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,70 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Coradoc
4
+ module AsciiDoc
5
+ module Serializer
6
+ # Handles spacing logic for AsciiDoc serialization.
7
+ # Determines appropriate spacing between different element types.
8
+ class SpacingStrategy
9
+ class << self
10
+ # Apply spacing to elements based on their types
11
+ # @param elements [Array] Elements to add spacing between
12
+ # @param options [Hash] Spacing options
13
+ # @return [String] Elements with appropriate spacing
14
+ def apply(elements, _options = {})
15
+ return '' if elements.nil? || elements.empty?
16
+ return elements.first.to_s if elements.size == 1
17
+
18
+ result = []
19
+ elements.each_with_index do |element, index|
20
+ result << element.to_s
21
+
22
+ # Add spacing between current and next element
23
+ next unless index < elements.size - 1
24
+
25
+ next_element = elements[index + 1]
26
+ spacing = spacing_between(element, next_element)
27
+ result << spacing if spacing
28
+ end
29
+
30
+ result.join
31
+ end
32
+
33
+ # Determine spacing between two elements
34
+ # @param current [Object] Current element
35
+ # @param next_elem [Object] Next element
36
+ # @return [String, nil] Spacing string or nil
37
+ def spacing_between(current, next_elem)
38
+ # Block-level elements typically need double newline spacing
39
+ if block_level?(current) && block_level?(next_elem)
40
+ "\n\n"
41
+ # Inline elements don't need extra spacing
42
+ elsif inline_level?(current) && inline_level?(next_elem)
43
+ nil
44
+ # Mixed block/inline needs single newline
45
+ elsif block_level?(current) || block_level?(next_elem)
46
+ "\n"
47
+ end
48
+ end
49
+
50
+ def block_level?(element)
51
+ return false if element.nil?
52
+ return true if element.is_a?(String)
53
+
54
+ element.block_level?
55
+ end
56
+
57
+ # Check if element is inline-level
58
+ # @param element [Object] Element to check
59
+ # @return [Boolean] True if inline-level
60
+ def inline_level?(element)
61
+ return false if element.nil?
62
+ return true if element.is_a?(String)
63
+
64
+ element.inline?
65
+ end
66
+ end
67
+ end
68
+ end
69
+ end
70
+ end
@@ -0,0 +1,75 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Coradoc
4
+ module AsciiDoc
5
+ # Serializer module for converting AsciiDoc models to AsciiDoc text
6
+ module Serializer
7
+ autoload :AdocSerializer, "#{__dir__}/serializer/adoc_serializer"
8
+ autoload :ElementRegistry, "#{__dir__}/serializer/element_registry"
9
+ autoload :FallbackSerializer, "#{__dir__}/serializer/fallback_serializer"
10
+ autoload :Formatter, "#{__dir__}/serializer/formatter"
11
+ autoload :SpacingStrategy, "#{__dir__}/serializer/spacing_strategy"
12
+
13
+ class << self
14
+ # Serialize a model to AsciiDoc format
15
+ # @param model [Coradoc::AsciiDoc::Model::Base, Array, String] Model to serialize
16
+ # @param options [Hash] Serialization options
17
+ # @return [String] AsciiDoc representation
18
+ def serialize(model, options = {})
19
+ AdocSerializer.serialize(model, options)
20
+ end
21
+ end
22
+ end
23
+ end
24
+ end
25
+
26
+ # Set up Serializers module with autoloads
27
+ module Coradoc
28
+ module AsciiDoc
29
+ module Serializer
30
+ module Serializers
31
+ # Autoload core serializers (flat structure)
32
+ autoload :Base, 'coradoc/asciidoc/serializer/serializers/base'
33
+ autoload :Admonition, 'coradoc/asciidoc/serializer/serializers/admonition'
34
+ autoload :Attribute, 'coradoc/asciidoc/serializer/serializers/attribute'
35
+ autoload :AttributeList, 'coradoc/asciidoc/serializer/serializers/attribute_list'
36
+ autoload :AttributeListAttribute, 'coradoc/asciidoc/serializer/serializers/attribute_list_attribute'
37
+ autoload :Audio, 'coradoc/asciidoc/serializer/serializers/audio'
38
+ autoload :Author, 'coradoc/asciidoc/serializer/serializers/author'
39
+ autoload :Bibliography, 'coradoc/asciidoc/serializer/serializers/bibliography'
40
+ autoload :BibliographyEntry, 'coradoc/asciidoc/serializer/serializers/bibliography_entry'
41
+ autoload :Break, 'coradoc/asciidoc/serializer/serializers/break'
42
+ autoload :CommentBlock, 'coradoc/asciidoc/serializer/serializers/comment_block'
43
+ autoload :CommentLine, 'coradoc/asciidoc/serializer/serializers/comment_line'
44
+ autoload :Document, 'coradoc/asciidoc/serializer/serializers/document'
45
+ autoload :DocumentAttributes, 'coradoc/asciidoc/serializer/serializers/document_attributes'
46
+ autoload :Header, 'coradoc/asciidoc/serializer/serializers/header'
47
+ autoload :Highlight, 'coradoc/asciidoc/serializer/serializers/highlight'
48
+ autoload :Include, 'coradoc/asciidoc/serializer/serializers/include'
49
+ autoload :LineBreak, 'coradoc/asciidoc/serializer/serializers/line_break'
50
+ autoload :NamedAttribute, 'coradoc/asciidoc/serializer/serializers/named_attribute'
51
+ autoload :Paragraph, 'coradoc/asciidoc/serializer/serializers/paragraph'
52
+ autoload :ReviewerNote, 'coradoc/asciidoc/serializer/serializers/reviewer_note'
53
+ autoload :Revision, 'coradoc/asciidoc/serializer/serializers/revision'
54
+ autoload :Section, 'coradoc/asciidoc/serializer/serializers/section'
55
+ autoload :Tag, 'coradoc/asciidoc/serializer/serializers/tag'
56
+ autoload :TableCell, 'coradoc/asciidoc/serializer/serializers/table_cell'
57
+ autoload :TableRow, 'coradoc/asciidoc/serializer/serializers/table_row'
58
+ autoload :Table, 'coradoc/asciidoc/serializer/serializers/table'
59
+ autoload :Term, 'coradoc/asciidoc/serializer/serializers/term'
60
+ autoload :TextElement, 'coradoc/asciidoc/serializer/serializers/text_element'
61
+ autoload :Title, 'coradoc/asciidoc/serializer/serializers/title'
62
+ autoload :Video, 'coradoc/asciidoc/serializer/serializers/video'
63
+
64
+ # Autoload submodules (each manages its own autoloads)
65
+ autoload :Block, 'coradoc/asciidoc/serializer/serializers/block'
66
+ autoload :Image, 'coradoc/asciidoc/serializer/serializers/image'
67
+ autoload :Inline, 'coradoc/asciidoc/serializer/serializers/inline'
68
+ autoload :List, 'coradoc/asciidoc/serializer/serializers/list'
69
+ end
70
+ end
71
+ end
72
+ end
73
+
74
+ # Load registrations last (triggers autoload of all serializers)
75
+ require_relative 'serializer/registrations'