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,26 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Coradoc
4
+ module AsciiDoc
5
+ module Serializer
6
+ module Serializers
7
+ module Inline
8
+ # Serializer for Italic inline formatting
9
+ class Italic < Base
10
+ def to_adoc(model, _options = {})
11
+ content = serialize_content(model.content)
12
+ content = Coradoc::Util::AsciiDoc.escape_characters(content, escape_chars: ['_'])
13
+
14
+ return '' if content.empty?
15
+
16
+ model.unconstrained ? "__#{content}__" : "_#{content}_"
17
+ end
18
+ end
19
+ end
20
+
21
+ # Self-register this serializer
22
+ ElementRegistry.register(Coradoc::AsciiDoc::Model::Inline::Italic, Inline::Italic)
23
+ end
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,38 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'uri'
4
+
5
+ module Coradoc
6
+ module AsciiDoc
7
+ module Serializer
8
+ module Serializers
9
+ module Inline
10
+ class Link < Base
11
+ def to_adoc(model, _options = {})
12
+ link = model.path.dup
13
+ link = "link:#{link}" unless model.path&.match?(URI::DEFAULT_PARSER.make_regexp)
14
+
15
+ name_empty = model.name.nil? || model.name.empty?
16
+ title_empty = model.title.nil? || model.title.empty?
17
+ valid_empty_name_link = link.start_with?(%r{https?://})
18
+
19
+ link << if name_empty && !title_empty
20
+ "[#{model.title}]"
21
+ elsif !name_empty
22
+ "[#{model.name}]"
23
+ elsif valid_empty_name_link && !model.right_constrain
24
+ ''
25
+ else
26
+ '[]'
27
+ end
28
+ link
29
+ end
30
+ end
31
+ end
32
+
33
+ # Self-register this serializer
34
+ ElementRegistry.register(Coradoc::AsciiDoc::Model::Inline::Link, Inline::Link)
35
+ end
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,26 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Coradoc
4
+ module AsciiDoc
5
+ module Serializer
6
+ module Serializers
7
+ module Inline
8
+ # Serializer for Monospace inline formatting
9
+ class Monospace < Base
10
+ def to_adoc(model, _options = {})
11
+ content = serialize_content(model.content)
12
+ content = Coradoc::Util::AsciiDoc.escape_characters(content, escape_chars: ['`'])
13
+
14
+ return '' if content.empty?
15
+
16
+ model.unconstrained ? "``#{content}``" : "`#{content}`"
17
+ end
18
+ end
19
+ end
20
+
21
+ # Self-register this serializer
22
+ ElementRegistry.register(Coradoc::AsciiDoc::Model::Inline::Monospace, Inline::Monospace)
23
+ end
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,21 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Coradoc
4
+ module AsciiDoc
5
+ module Serializer
6
+ module Serializers
7
+ module Inline
8
+ class Quotation < Base
9
+ def to_adoc(model, _options = {})
10
+ _content = serialize_content(model.content)
11
+ "#{_content[/^\s*/]}\"#{_content.strip}\"#{_content[/(?<!\s)\s*+$/]}"
12
+ end
13
+ end
14
+ end
15
+
16
+ # Self-register this serializer
17
+ ElementRegistry.register(Coradoc::AsciiDoc::Model::Inline::Quotation, Inline::Quotation)
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,20 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Coradoc
4
+ module AsciiDoc
5
+ module Serializer
6
+ module Serializers
7
+ module Inline
8
+ class Small < Base
9
+ def to_adoc(model, _options = {})
10
+ "[.small]##{model.text}#"
11
+ end
12
+ end
13
+ end
14
+
15
+ # Self-register this serializer
16
+ ElementRegistry.register(Coradoc::AsciiDoc::Model::Inline::Small, Inline::Small)
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,35 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Coradoc
4
+ module AsciiDoc
5
+ module Serializer
6
+ module Serializers
7
+ module Inline
8
+ class Span < Base
9
+ def to_adoc(model, _options = {})
10
+ if model.attributes
11
+ attr_string = model.attributes.to_adoc
12
+ if model.unconstrained
13
+ "#{attr_string}###{model.text}##"
14
+ else
15
+ "#{attr_string}##{model.text}#"
16
+ end
17
+ elsif model.role
18
+ if model.unconstrained
19
+ "[.#{model.role}]###{model.text}##"
20
+ else
21
+ "[.#{model.role}]##{model.text}#"
22
+ end
23
+ else
24
+ model.text.to_s
25
+ end
26
+ end
27
+ end
28
+ end
29
+
30
+ # Self-register this serializer
31
+ ElementRegistry.register(Coradoc::AsciiDoc::Model::Inline::Span, Inline::Span)
32
+ end
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,23 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Coradoc
4
+ module AsciiDoc
5
+ module Serializer
6
+ module Serializers
7
+ module Inline
8
+ # Serializer for STEM inline formulas
9
+ class Stem < Base
10
+ def to_adoc(model, _options = {})
11
+ content = serialize_content(model.content)
12
+ type = model.type || 'stem'
13
+ "#{type}:[#{content}]"
14
+ end
15
+ end
16
+ end
17
+
18
+ # Self-register this serializer
19
+ ElementRegistry.register(Coradoc::AsciiDoc::Model::Inline::Stem, Inline::Stem)
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,29 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Coradoc
4
+ module AsciiDoc
5
+ module Serializer
6
+ module Serializers
7
+ module Inline
8
+ # Serializer for Strikethrough inline formatting
9
+ class Strikethrough < Base
10
+ def to_adoc(model, _options = {})
11
+ content = serialize_content(model.content || model.text)
12
+
13
+ return '' if content.empty?
14
+
15
+ if model.unconstrained
16
+ "[.line-through]#[.line-through]##{content}[.line-through]#[.line-through]#"
17
+ else
18
+ "[.line-through]##{content}#"
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end
24
+
25
+ # Self-register this serializer
26
+ ElementRegistry.register(Coradoc::AsciiDoc::Model::Inline::Strikethrough, Serializers::Inline::Strikethrough)
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,29 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Coradoc
4
+ module AsciiDoc
5
+ module Serializer
6
+ module Serializers
7
+ module Inline
8
+ # Serializer for Subscript inline formatting
9
+ class Subscript < Base
10
+ def to_adoc(model, _options = {})
11
+ content = serialize_content(model.content)
12
+ content = Coradoc::Util::AsciiDoc.escape_characters(
13
+ content,
14
+ pass_through: %w[~]
15
+ )
16
+
17
+ return '' if content.empty?
18
+
19
+ "~#{content}~"
20
+ end
21
+ end
22
+ end
23
+
24
+ # Self-register this serializer
25
+ ElementRegistry.register(Coradoc::AsciiDoc::Model::Inline::Subscript, Inline::Subscript)
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,26 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Coradoc
4
+ module AsciiDoc
5
+ module Serializer
6
+ module Serializers
7
+ module Inline
8
+ # Serializer for Superscript inline formatting
9
+ class Superscript < Base
10
+ def to_adoc(model, _options = {})
11
+ content = serialize_content(model.content)
12
+ # Superscript uses ^ delimiters, no need to escape
13
+
14
+ return '' if content.empty?
15
+
16
+ "^#{content}^"
17
+ end
18
+ end
19
+ end
20
+
21
+ # Self-register this serializer
22
+ ElementRegistry.register(Coradoc::AsciiDoc::Model::Inline::Superscript, Inline::Superscript)
23
+ end
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,20 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Coradoc
4
+ module AsciiDoc
5
+ module Serializer
6
+ module Serializers
7
+ module Inline
8
+ class Underline < Base
9
+ def to_adoc(model, _options = {})
10
+ "[.underline]##{model.text}#"
11
+ end
12
+ end
13
+ end
14
+
15
+ # Self-register this serializer
16
+ ElementRegistry.register(Coradoc::AsciiDoc::Model::Inline::Underline, Inline::Underline)
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,32 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Coradoc
4
+ module AsciiDoc
5
+ module Serializer
6
+ module Serializers
7
+ # Autoload inline serializers
8
+ module Inline
9
+ autoload :Anchor, 'coradoc/asciidoc/serializer/serializers/inline/anchor'
10
+ autoload :AttributeReference, 'coradoc/asciidoc/serializer/serializers/inline/attribute_reference'
11
+ autoload :Bold, 'coradoc/asciidoc/serializer/serializers/inline/bold'
12
+ autoload :CrossReference, 'coradoc/asciidoc/serializer/serializers/inline/cross_reference'
13
+ autoload :CrossReferenceArg, 'coradoc/asciidoc/serializer/serializers/inline/cross_reference_arg'
14
+ autoload :Footnote, 'coradoc/asciidoc/serializer/serializers/inline/footnote'
15
+ autoload :HardLineBreak, 'coradoc/asciidoc/serializer/serializers/inline/hard_line_break'
16
+ autoload :Highlight, 'coradoc/asciidoc/serializer/serializers/inline/highlight'
17
+ autoload :Italic, 'coradoc/asciidoc/serializer/serializers/inline/italic'
18
+ autoload :Link, 'coradoc/asciidoc/serializer/serializers/inline/link'
19
+ autoload :Monospace, 'coradoc/asciidoc/serializer/serializers/inline/monospace'
20
+ autoload :Quotation, 'coradoc/asciidoc/serializer/serializers/inline/quotation'
21
+ autoload :Small, 'coradoc/asciidoc/serializer/serializers/inline/small'
22
+ autoload :Span, 'coradoc/asciidoc/serializer/serializers/inline/span'
23
+ autoload :Stem, 'coradoc/asciidoc/serializer/serializers/inline/stem'
24
+ autoload :Strikethrough, 'coradoc/asciidoc/serializer/serializers/inline/strikethrough'
25
+ autoload :Subscript, 'coradoc/asciidoc/serializer/serializers/inline/subscript'
26
+ autoload :Superscript, 'coradoc/asciidoc/serializer/serializers/inline/superscript'
27
+ autoload :Underline, 'coradoc/asciidoc/serializer/serializers/inline/underline'
28
+ end
29
+ end
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,18 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Coradoc
4
+ module AsciiDoc
5
+ module Serializer
6
+ module Serializers
7
+ class LineBreak < Base
8
+ def to_adoc(model, _options = {})
9
+ model.line_break
10
+ end
11
+ end
12
+ end
13
+
14
+ # Self-register this serializer
15
+ ElementRegistry.register(Coradoc::AsciiDoc::Model::LineBreak, Serializers::LineBreak)
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,47 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Coradoc
4
+ module AsciiDoc
5
+ module Serializer
6
+ module Serializers
7
+ module List
8
+ class Core < Base
9
+ def to_adoc(model, _options = {})
10
+ @model = model
11
+ _anchor = @model.anchor.nil? ? '' : serialize_child(@model.anchor).to_s
12
+ _attrs = @model.attrs.to_adoc(show_empty: false).to_s
13
+ content = +"\n"
14
+
15
+ @model.items.each do |item|
16
+ c = serialize_child(item)
17
+ next if c.empty?
18
+
19
+ # If there's a list inside a list directly, we want to
20
+ # skip adding an empty list item.
21
+ # See: https://github.com/metanorma/coradoc/issues/96
22
+ unless item.is_a?(Coradoc::AsciiDoc::Model::List::Core)
23
+ # Use item's own marker if available, otherwise fall back to list prefix
24
+ item_marker = item.marker || prefix
25
+ content << item_marker.to_s
26
+ content << ' ' if c[0] != ' '
27
+ end
28
+ content << c
29
+ end
30
+
31
+ "\n#{_anchor}#{_attrs}" + content
32
+ end
33
+
34
+ private
35
+
36
+ def prefix
37
+ @model.prefix
38
+ end
39
+ end
40
+ end
41
+
42
+ # Self-register this serializer
43
+ ElementRegistry.register(Coradoc::AsciiDoc::Model::List::Core, List::Core)
44
+ end
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,35 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Coradoc
4
+ module AsciiDoc
5
+ module Serializer
6
+ module Serializers
7
+ module List
8
+ class Definition < Base
9
+ def to_adoc(model, _options = {})
10
+ @model = model
11
+ content = +"\n"
12
+ @model.items.each do |item|
13
+ # Pass delimiter to item serialization
14
+ serialized = serialize_child_with_options(item, delimiter: @model.delimiter)
15
+ content << serialized
16
+ end
17
+ content
18
+ end
19
+
20
+ private
21
+
22
+ def serialize_child_with_options(child, options = {})
23
+ serializer_class = ElementRegistry.lookup(child.class)
24
+ serializer = serializer_class.new
25
+ serializer.to_adoc(child, options)
26
+ end
27
+ end
28
+ end
29
+
30
+ # Self-register this serializer
31
+ ElementRegistry.register(Coradoc::AsciiDoc::Model::List::Definition, List::Definition)
32
+ end
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,38 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Coradoc
4
+ module AsciiDoc
5
+ module Serializer
6
+ module Serializers
7
+ module List
8
+ class DefinitionItem < Base
9
+ def to_adoc(model, options_or_context = {})
10
+ context = normalize_context(options_or_context)
11
+ delimiter = context.option(:delimiter, '')
12
+ _anchor = model.anchor.nil? ? '' : serialize_child(model.anchor, context)
13
+ content = +''
14
+
15
+ if model.terms && model.terms.size == 1
16
+ t = serialize_child(model.terms.first, context)
17
+ content << "#{_anchor}#{t}#{delimiter} "
18
+ elsif model.terms && model.terms.size > 1
19
+ # NOTE: When multiple terms exist, anchors are rendered on each term line
20
+ # separately. Single term anchors are inlined with the definition.
21
+ model.terms.each do |term|
22
+ t = serialize_child(term, context)
23
+ content << "#{t}#{delimiter}\n"
24
+ end
25
+ end
26
+
27
+ d = model.contents ? serialize_children(model.contents, context) : ''
28
+ content << "#{d}\n"
29
+ end
30
+ end
31
+ end
32
+
33
+ # Self-register this serializer
34
+ ElementRegistry.register(Coradoc::AsciiDoc::Model::List::DefinitionItem, List::DefinitionItem)
35
+ end
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,120 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Coradoc
4
+ module AsciiDoc
5
+ module Serializer
6
+ module Serializers
7
+ module List
8
+ class Item < Base
9
+ HARDBREAK_MARKERS = %i[hardbreak init].freeze
10
+ STRIP_UNICODE_BEGIN_MARKERS = (HARDBREAK_MARKERS.dup + [false]).freeze
11
+ STRIP_UNICODE_END_MARKERS = [:hardbreak, :end, false].freeze
12
+
13
+ def to_adoc(model, _options = {})
14
+ @model = model
15
+ _anchor = gen_anchor(inline: true)
16
+ _content = Array(model.content).dup.flatten.compact
17
+ out = ''
18
+ prev_inline = :init
19
+
20
+ # Collapse meaningless <DIV>s
21
+ while _content.map(&:class) == [Coradoc::AsciiDoc::Model::Section] &&
22
+ _content.first.safe_to_collapse?
23
+
24
+ _content = Array(_content.first.contents)
25
+ end
26
+
27
+ _content.each_with_index do |subitem, idx|
28
+ subcontent = case subitem
29
+ when String
30
+ subitem
31
+ when Coradoc::AsciiDoc::Model::Base, Lutaml::Model::Serializable
32
+ subitem.to_adoc
33
+ else
34
+ raise ArgumentError,
35
+ "Cannot serialize list item content of type #{subitem.class.name}. " \
36
+ 'Expected String, Coradoc::AsciiDoc::Model::Base, or ' \
37
+ "Lutaml::Model::Serializable. Got: #{subitem.inspect[0..100]}"
38
+ end
39
+
40
+ inline = inline?(subitem)
41
+ next_inline = idx + 1 == _content.length ? :end : inline?(_content[idx + 1])
42
+
43
+ # Only try to postprocess elements that are text,
44
+ # otherwise we could strip markup.
45
+ if subitem.is_a?(Coradoc::AsciiDoc::Model::TextElement)
46
+ if STRIP_UNICODE_BEGIN_MARKERS.include?(prev_inline)
47
+ subcontent = Coradoc.strip_unicode(subcontent,
48
+ only: :begin)
49
+ end
50
+ if STRIP_UNICODE_END_MARKERS.include?(next_inline)
51
+ subcontent = Coradoc.strip_unicode(subcontent,
52
+ only: :end)
53
+ end
54
+ end
55
+
56
+ case inline
57
+ when true
58
+ out += if prev_inline == false
59
+ "\n+\n#{subcontent}"
60
+ else
61
+ subcontent
62
+ end
63
+ when false
64
+ out += case prev_inline
65
+ when :hardbreak
66
+ subcontent.strip
67
+ when :init
68
+ "{empty}\n+\n#{subcontent.strip}"
69
+ else
70
+ "\n+\n#{subcontent.strip}"
71
+ end
72
+ when :hardbreak
73
+ if HARDBREAK_MARKERS.include?(prev_inline)
74
+ # can't have two hard breaks in a row
75
+ # can't start with a hard break
76
+ else
77
+ out += "\n+\n"
78
+ end
79
+ end
80
+
81
+ prev_inline = inline
82
+ end
83
+ out += '{empty}' if prev_inline == :hardbreak
84
+ out = '{empty}' if out.empty?
85
+
86
+ attach = model.attached.map do |elem|
87
+ "+\n#{elem.to_adoc}"
88
+ end.join
89
+ nest = model.nested.nil? || (model.nested.is_a?(Array) && model.nested.empty?) ? '' : model.nested.to_adoc
90
+ out = " #{_anchor}#{out}#{model.line_break}"
91
+ out + attach + nest
92
+ end
93
+
94
+ private
95
+
96
+ def inline?(elem)
97
+ return true if elem.is_a?(String)
98
+ return false unless elem.is_a?(Coradoc::AsciiDoc::Model::Base)
99
+
100
+ elem.inline?
101
+ end
102
+
103
+ def gen_anchor(inline: false)
104
+ return '' unless @model.anchor
105
+
106
+ if inline
107
+ @model.anchor.to_adoc.to_s
108
+ else
109
+ "#{@model.anchor.to_adoc}\n"
110
+ end
111
+ end
112
+ end
113
+ end
114
+
115
+ # Self-register this serializer
116
+ ElementRegistry.register(Coradoc::AsciiDoc::Model::List::Item, List::Item)
117
+ end
118
+ end
119
+ end
120
+ end
@@ -0,0 +1,24 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Coradoc
4
+ module AsciiDoc
5
+ module Serializer
6
+ module Serializers
7
+ module List
8
+ class Ordered < Core
9
+ private
10
+
11
+ def prefix
12
+ return @model.marker if @model.marker
13
+
14
+ '.' * [@model.ol_count, 1].max
15
+ end
16
+ end
17
+ end
18
+
19
+ # Self-register this serializer
20
+ ElementRegistry.register(Coradoc::AsciiDoc::Model::List::Ordered, List::Ordered)
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,29 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Coradoc
4
+ module AsciiDoc
5
+ module Serializer
6
+ module Serializers
7
+ module List
8
+ class Unordered < Core
9
+ private
10
+
11
+ def prefix
12
+ # Use the marker from the first list item if available
13
+ return @model.items.first.marker if @model.items.first&.marker
14
+
15
+ # Otherwise use the list-level marker if set
16
+ return @model.marker if @model.marker
17
+
18
+ # Default to asterisk markers
19
+ '*' * [@model.ol_count, 1].max
20
+ end
21
+ end
22
+ end
23
+
24
+ # Self-register this serializer
25
+ ElementRegistry.register(Coradoc::AsciiDoc::Model::List::Unordered, List::Unordered)
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Coradoc
4
+ module AsciiDoc
5
+ module Serializer
6
+ module Serializers
7
+ # Autoload list serializers
8
+ module List
9
+ autoload :Core, 'coradoc/asciidoc/serializer/serializers/list/core'
10
+ autoload :Definition, 'coradoc/asciidoc/serializer/serializers/list/definition'
11
+ autoload :DefinitionItem, 'coradoc/asciidoc/serializer/serializers/list/definition_item'
12
+ autoload :Item, 'coradoc/asciidoc/serializer/serializers/list/item'
13
+ autoload :Ordered, 'coradoc/asciidoc/serializer/serializers/list/ordered'
14
+ autoload :Unordered, 'coradoc/asciidoc/serializer/serializers/list/unordered'
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end