coradoc 2.0.4 → 2.0.6

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 (127) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop_todo.yml +96 -51
  3. data/coradoc-adoc/lib/coradoc/asciidoc/model/break.rb +7 -0
  4. data/coradoc-adoc/lib/coradoc/asciidoc/model/document.rb +2 -2
  5. data/coradoc-adoc/lib/coradoc/asciidoc/model/include.rb +2 -2
  6. data/coradoc-adoc/lib/coradoc/asciidoc/model.rb +6 -4
  7. data/coradoc-adoc/lib/coradoc/asciidoc/parser/base.rb +1 -0
  8. data/coradoc-adoc/lib/coradoc/asciidoc/parser/block.rb +8 -7
  9. data/coradoc-adoc/lib/coradoc/asciidoc/parser/content.rb +13 -3
  10. data/coradoc-adoc/lib/coradoc/asciidoc/parser/inline.rb +15 -15
  11. data/coradoc-adoc/lib/coradoc/asciidoc/parser/list.rb +2 -2
  12. data/coradoc-adoc/lib/coradoc/asciidoc/parser/section.rb +1 -0
  13. data/coradoc-adoc/lib/coradoc/asciidoc/serializer/serializers/document.rb +4 -1
  14. data/coradoc-adoc/lib/coradoc/asciidoc/transform/from_core_model.rb +84 -13
  15. data/coradoc-adoc/lib/coradoc/asciidoc/transform/to_core_model.rb +106 -27
  16. data/coradoc-adoc/lib/coradoc/asciidoc/transform/to_core_model_registrations.rb +50 -19
  17. data/coradoc-adoc/lib/coradoc/asciidoc/transformer/misc_rules.rb +5 -0
  18. data/coradoc-adoc/lib/coradoc/asciidoc/transformer/structural_rules.rb +9 -8
  19. data/coradoc-adoc/lib/coradoc/asciidoc/transformer.rb +22 -5
  20. data/coradoc-adoc/lib/coradoc/asciidoc.rb +7 -2
  21. data/coradoc-adoc/spec/coradoc/asciidoc/integration_pipeline_spec.rb +342 -0
  22. data/coradoc-adoc/spec/coradoc/asciidoc/list_continuation_spec.rb +1 -1
  23. data/coradoc-adoc/spec/coradoc/asciidoc/round_trip_spec.rb +0 -2
  24. data/coradoc-adoc/spec/coradoc/asciidoc/transform/from_core_model_spec.rb +3 -2
  25. data/coradoc-adoc/spec/coradoc/developer_experience_spec.rb +0 -2
  26. data/coradoc-adoc/spec/transform/from_core_model_spec.rb +3 -3
  27. data/coradoc-adoc/spec/transform/to_core_model_spec.rb +1 -0
  28. data/coradoc-html/lib/coradoc/html/converters/base.rb +41 -17
  29. data/coradoc-html/lib/coradoc/html/converters/example.rb +1 -2
  30. data/coradoc-html/lib/coradoc/html/converters/listing.rb +1 -2
  31. data/coradoc-html/lib/coradoc/html/converters/literal.rb +1 -2
  32. data/coradoc-html/lib/coradoc/html/converters/open.rb +1 -2
  33. data/coradoc-html/lib/coradoc/html/converters/quote.rb +2 -3
  34. data/coradoc-html/lib/coradoc/html/converters/sidebar.rb +1 -2
  35. data/coradoc-html/lib/coradoc/html/converters/source.rb +1 -2
  36. data/coradoc-html/lib/coradoc/html/converters/source_code.rb +1 -2
  37. data/coradoc-html/lib/coradoc/html/converters/term.rb +1 -2
  38. data/coradoc-html/lib/coradoc/html/converters/verse.rb +2 -3
  39. data/coradoc-html/lib/coradoc/html/input/converters/aside.rb +1 -1
  40. data/coradoc-html/lib/coradoc/html/input/converters/audio.rb +1 -1
  41. data/coradoc-html/lib/coradoc/html/input/converters/blockquote.rb +2 -3
  42. data/coradoc-html/lib/coradoc/html/input/converters/div.rb +1 -2
  43. data/coradoc-html/lib/coradoc/html/input/converters/figure.rb +2 -3
  44. data/coradoc-html/lib/coradoc/html/input/converters/hr.rb +1 -1
  45. data/coradoc-html/lib/coradoc/html/input/converters/p.rb +2 -1
  46. data/coradoc-html/lib/coradoc/html/input/converters/pre.rb +14 -10
  47. data/coradoc-html/lib/coradoc/html/input/converters/video.rb +1 -1
  48. data/coradoc-html/lib/coradoc/html/renderer.rb +50 -2
  49. data/coradoc-html/lib/coradoc/html/spa.rb +2 -2
  50. data/coradoc-html/lib/coradoc/html/static.rb +2 -2
  51. data/coradoc-html/lib/coradoc/html/templates/core_model/definition_list.liquid +11 -0
  52. data/coradoc-html/lib/coradoc/html/theme/modern/javascript_generator.rb +2 -2
  53. data/coradoc-html/lib/coradoc/html/theme/modern/serializers/document_serializer.rb +7 -11
  54. data/coradoc-html/lib/coradoc/html/theme/modern_renderer.rb +6 -7
  55. data/coradoc-html/lib/coradoc/html.rb +5 -15
  56. data/coradoc-html/spec/input/converters/converters_spec.rb +6 -8
  57. data/coradoc-markdown/lib/coradoc/markdown/model/attribute_list.rb +0 -3
  58. data/coradoc-markdown/lib/coradoc/markdown/model/definition_list.rb +0 -3
  59. data/coradoc-markdown/lib/coradoc/markdown/model/extension.rb +0 -2
  60. data/coradoc-markdown/lib/coradoc/markdown/model/highlight.rb +0 -1
  61. data/coradoc-markdown/lib/coradoc/markdown/model/math.rb +0 -1
  62. data/coradoc-markdown/lib/coradoc/markdown/model/strikethrough.rb +0 -1
  63. data/coradoc-markdown/lib/coradoc/markdown/parser/ast_processor.rb +2 -2
  64. data/coradoc-markdown/lib/coradoc/markdown/parser/block_parser.rb +2 -2
  65. data/coradoc-markdown/lib/coradoc/markdown/parser/inline_parser.rb +3 -3
  66. data/coradoc-markdown/lib/coradoc/markdown/parser.rb +9 -3
  67. data/coradoc-markdown/lib/coradoc/markdown/toc_generator.rb +6 -4
  68. data/coradoc-markdown/lib/coradoc/markdown/transform/from_core_model.rb +27 -6
  69. data/coradoc-markdown/lib/coradoc/markdown/transform/to_core_model.rb +5 -9
  70. data/coradoc-markdown/lib/coradoc/markdown/transformer.rb +2 -1
  71. data/coradoc-markdown/spec/transform/to_core_model_spec.rb +6 -8
  72. data/exe/coradoc +1 -0
  73. data/lib/coradoc/coradoc.rb +6 -7
  74. data/lib/coradoc/core_model/annotation_block.rb +0 -2
  75. data/lib/coradoc/core_model/block.rb +92 -32
  76. data/lib/coradoc/core_model/builder/block_builder.rb +20 -2
  77. data/lib/coradoc/core_model/builder/detection.rb +0 -8
  78. data/lib/coradoc/core_model/builder.rb +6 -7
  79. data/lib/coradoc/core_model/example_block.rb +12 -0
  80. data/lib/coradoc/core_model/listing_block.rb +15 -0
  81. data/lib/coradoc/core_model/literal_block.rb +12 -0
  82. data/lib/coradoc/core_model/open_block.rb +12 -0
  83. data/lib/coradoc/core_model/pass_block.rb +12 -0
  84. data/lib/coradoc/core_model/quote_block.rb +14 -0
  85. data/lib/coradoc/core_model/reviewer_block.rb +12 -0
  86. data/lib/coradoc/core_model/sidebar_block.rb +12 -0
  87. data/lib/coradoc/core_model/source_block.rb +22 -0
  88. data/lib/coradoc/core_model/structural_element.rb +4 -0
  89. data/lib/coradoc/core_model/verse_block.rb +14 -0
  90. data/lib/coradoc/core_model.rb +10 -0
  91. data/lib/coradoc/document_manipulator.rb +3 -1
  92. data/lib/coradoc/processor_registry.rb +0 -2
  93. data/lib/coradoc/version.rb +1 -1
  94. metadata +13 -34
  95. data/coradoc-markdown/coverage/.last_run.json +0 -5
  96. data/coradoc-markdown/coverage/.resultset.json +0 -6322
  97. data/coradoc-markdown/coverage/.resultset.json.lock +0 -0
  98. data/coradoc-markdown/coverage/assets/0.13.2/DataTables-1.10.20/images/sort_asc.png +0 -0
  99. data/coradoc-markdown/coverage/assets/0.13.2/DataTables-1.10.20/images/sort_asc_disabled.png +0 -0
  100. data/coradoc-markdown/coverage/assets/0.13.2/DataTables-1.10.20/images/sort_both.png +0 -0
  101. data/coradoc-markdown/coverage/assets/0.13.2/DataTables-1.10.20/images/sort_desc.png +0 -0
  102. data/coradoc-markdown/coverage/assets/0.13.2/DataTables-1.10.20/images/sort_desc_disabled.png +0 -0
  103. data/coradoc-markdown/coverage/assets/0.13.2/application.css +0 -1
  104. data/coradoc-markdown/coverage/assets/0.13.2/application.js +0 -7
  105. data/coradoc-markdown/coverage/assets/0.13.2/colorbox/border.png +0 -0
  106. data/coradoc-markdown/coverage/assets/0.13.2/colorbox/controls.png +0 -0
  107. data/coradoc-markdown/coverage/assets/0.13.2/colorbox/loading.gif +0 -0
  108. data/coradoc-markdown/coverage/assets/0.13.2/colorbox/loading_background.png +0 -0
  109. data/coradoc-markdown/coverage/assets/0.13.2/favicon_green.png +0 -0
  110. data/coradoc-markdown/coverage/assets/0.13.2/favicon_red.png +0 -0
  111. data/coradoc-markdown/coverage/assets/0.13.2/favicon_yellow.png +0 -0
  112. data/coradoc-markdown/coverage/assets/0.13.2/images/ui-bg_flat_0_aaaaaa_40x100.png +0 -0
  113. data/coradoc-markdown/coverage/assets/0.13.2/images/ui-bg_flat_75_ffffff_40x100.png +0 -0
  114. data/coradoc-markdown/coverage/assets/0.13.2/images/ui-bg_glass_55_fbf9ee_1x400.png +0 -0
  115. data/coradoc-markdown/coverage/assets/0.13.2/images/ui-bg_glass_65_ffffff_1x400.png +0 -0
  116. data/coradoc-markdown/coverage/assets/0.13.2/images/ui-bg_glass_75_dadada_1x400.png +0 -0
  117. data/coradoc-markdown/coverage/assets/0.13.2/images/ui-bg_glass_75_e6e6e6_1x400.png +0 -0
  118. data/coradoc-markdown/coverage/assets/0.13.2/images/ui-bg_glass_95_fef1ec_1x400.png +0 -0
  119. data/coradoc-markdown/coverage/assets/0.13.2/images/ui-bg_highlight-soft_75_cccccc_1x100.png +0 -0
  120. data/coradoc-markdown/coverage/assets/0.13.2/images/ui-icons_222222_256x240.png +0 -0
  121. data/coradoc-markdown/coverage/assets/0.13.2/images/ui-icons_2e83ff_256x240.png +0 -0
  122. data/coradoc-markdown/coverage/assets/0.13.2/images/ui-icons_454545_256x240.png +0 -0
  123. data/coradoc-markdown/coverage/assets/0.13.2/images/ui-icons_888888_256x240.png +0 -0
  124. data/coradoc-markdown/coverage/assets/0.13.2/images/ui-icons_cd0a0a_256x240.png +0 -0
  125. data/coradoc-markdown/coverage/assets/0.13.2/loading.gif +0 -0
  126. data/coradoc-markdown/coverage/assets/0.13.2/magnify.png +0 -0
  127. data/coradoc-markdown/coverage/index.html +0 -66032
@@ -10,9 +10,8 @@ module Coradoc
10
10
  title_content = extract_title(node)
11
11
  content = treat_children_coradoc(node, state)
12
12
 
13
- # Use CoreModel::Block with delimiter_type "====" for example/figure
14
- Coradoc::CoreModel::Block.new(
15
- delimiter_type: '====',
13
+ # Use CoreModel::ExampleBlock for example/figure
14
+ Coradoc::CoreModel::ExampleBlock.new(
16
15
  title: extract_text_from_content(title_content),
17
16
  children: content,
18
17
  id: id
@@ -8,7 +8,7 @@ module Coradoc
8
8
  def to_coradoc(_node, _state = {})
9
9
  Coradoc::CoreModel::Block.new(
10
10
  element_type: 'thematic_break',
11
- delimiter_type: "'''"
11
+ block_semantic_type: :horizontal_rule
12
12
  )
13
13
  end
14
14
  end
@@ -13,7 +13,8 @@ module Coradoc
13
13
  content = strip_fullwidth_spaces(content)
14
14
 
15
15
  Coradoc::CoreModel::Block.new(
16
- delimiter_type: 'paragraph',
16
+ block_semantic_type: :paragraph,
17
+ element_type: 'paragraph',
17
18
  children: content,
18
19
  id: id
19
20
  )
@@ -10,16 +10,20 @@ module Coradoc
10
10
  lang = language(node)
11
11
  content = extract_text_content(node)
12
12
 
13
- delimiter_type = lang ? '----' : '....'
14
- element_type = lang ? 'source' : 'literal'
15
-
16
- Coradoc::CoreModel::Block.new(
17
- element_type: element_type,
18
- delimiter_type: delimiter_type,
19
- content: content,
20
- id: id,
21
- language: lang
22
- )
13
+ if lang
14
+ Coradoc::CoreModel::SourceBlock.new(
15
+ element_type: 'source',
16
+ content: content,
17
+ id: id,
18
+ language: lang
19
+ )
20
+ else
21
+ Coradoc::CoreModel::LiteralBlock.new(
22
+ element_type: 'literal',
23
+ content: content,
24
+ id: id
25
+ )
26
+ end
23
27
  end
24
28
 
25
29
  private
@@ -16,7 +16,7 @@ module Coradoc
16
16
  # with element_attributes to store video-specific data
17
17
  Coradoc::CoreModel::Block.new(
18
18
  element_type: 'video',
19
- delimiter_type: 'video',
19
+ block_semantic_type: :video,
20
20
  content: src,
21
21
  title: title,
22
22
  id: id,
@@ -42,13 +42,23 @@ module Coradoc
42
42
  'Coradoc::CoreModel::BibliographyEntry' => 'bibliography_entry',
43
43
  'Coradoc::CoreModel::StructuralElement' => 'structural_element',
44
44
  'Coradoc::CoreModel::Block' => 'block',
45
+ 'Coradoc::CoreModel::SourceBlock' => 'source_block',
46
+ 'Coradoc::CoreModel::ExampleBlock' => 'example_block',
47
+ 'Coradoc::CoreModel::QuoteBlock' => 'quote_block',
48
+ 'Coradoc::CoreModel::SidebarBlock' => 'sidebar_block',
49
+ 'Coradoc::CoreModel::LiteralBlock' => 'literal_block',
50
+ 'Coradoc::CoreModel::PassBlock' => 'pass_block',
51
+ 'Coradoc::CoreModel::ListingBlock' => 'listing_block',
52
+ 'Coradoc::CoreModel::OpenBlock' => 'open_block',
53
+ 'Coradoc::CoreModel::VerseBlock' => 'verse_block',
54
+ 'Coradoc::CoreModel::ReviewerBlock' => 'reviewer_block',
55
+ 'Coradoc::CoreModel::AnnotationBlock' => 'annotation_block',
45
56
  'Coradoc::CoreModel::ListBlock' => 'list_block',
46
57
  'Coradoc::CoreModel::ListItem' => 'list_item',
47
58
  'Coradoc::CoreModel::Table' => 'table',
48
59
  'Coradoc::CoreModel::TableRow' => 'table_row',
49
60
  'Coradoc::CoreModel::TableCell' => 'table_cell',
50
61
  'Coradoc::CoreModel::Image' => 'image',
51
- 'Coradoc::CoreModel::AnnotationBlock' => 'annotation_block',
52
62
  'Coradoc::CoreModel::InlineElement' => 'inline_element',
53
63
  'Coradoc::CoreModel::Paragraph' => 'paragraph',
54
64
  'Coradoc::CoreModel::Term' => 'term',
@@ -125,6 +135,37 @@ module Coradoc
125
135
  end
126
136
  end
127
137
 
138
+ # Render a CoreModel element as a complete HTML5 document
139
+ #
140
+ # Wraps the fragment output of #render in a proper HTML5 document
141
+ # with DOCTYPE, charset, and viewport meta tags.
142
+ #
143
+ # @param element [Coradoc::CoreModel::Base] The element to render
144
+ # @param options [Hash] Document-level options
145
+ # @option options [String] :lang Document language (default: "en")
146
+ # @option options [String] :title Document title (default: extracted from element)
147
+ # @return [String] Complete HTML5 document
148
+ def render_html5(element, options = {})
149
+ body_html = render(element)
150
+
151
+ lang = options[:lang] || 'en'
152
+ title = options[:title] || extract_title(element) || 'Untitled Document'
153
+
154
+ <<~HTML
155
+ <!DOCTYPE html>
156
+ <html lang="#{lang}">
157
+ <head>
158
+ <meta charset="UTF-8">
159
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
160
+ <title>#{escape_html(title)}</title>
161
+ </head>
162
+ <body>
163
+ #{body_html}
164
+ </body>
165
+ </html>
166
+ HTML
167
+ end
168
+
128
169
  # Get list of all available template names
129
170
  #
130
171
  # @return [Array<String>] List of template names (without .liquid extension)
@@ -318,7 +359,7 @@ module Coradoc
318
359
  assigns = {}
319
360
 
320
361
  # Common attributes that most CoreModel types have
321
- %w[id title content children element_type language lines
362
+ %w[id title content children element_type block_semantic_type language lines
322
363
  delimiter_type delimiter_length metadata_entries element_attributes
323
364
  text href alt src level entries items rows cells
324
365
  anchor term definition abbreviations].each do |key|
@@ -353,6 +394,13 @@ module Coradoc
353
394
  .gsub(/"/, '&quot;')
354
395
  .gsub(/'/, '&#39;')
355
396
  end
397
+
398
+ def extract_title(element)
399
+ return nil unless element
400
+ return element.title if element.is_a?(Coradoc::CoreModel::StructuralElement) && element.title
401
+
402
+ nil
403
+ end
356
404
  end
357
405
 
358
406
  # Backwards compatibility alias
@@ -1,9 +1,9 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative 'converter_base'
4
-
5
3
  module Coradoc
6
4
  module Html
5
+ autoload :ConverterBase, "#{__dir__}/converter_base"
6
+
7
7
  # SPA (Single Page Application) HTML converter
8
8
  #
9
9
  # Converts Coradoc::CoreModel::StructuralElement to a modern Vue.js + Tailwind CSS
@@ -1,9 +1,9 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative 'converter_base'
4
-
5
3
  module Coradoc
6
4
  module Html
5
+ autoload :ConverterBase, "#{__dir__}/converter_base"
6
+
7
7
  # Static HTML converter
8
8
  #
9
9
  # Converts CoreModel documents to static HTML5 output.
@@ -0,0 +1,11 @@
1
+ {%- comment -%}
2
+ Definition list template
3
+ {%- endcomment -%}
4
+ <dl id="{{ id }}" class="definition-list">
5
+ {%- for item in items -%}
6
+ <dt>{{ item.term }}</dt>
7
+ {%- for def in item.definitions -%}
8
+ <dd>{{ def }}</dd>
9
+ {%- endfor -%}
10
+ {%- endfor -%}
11
+ </dl>
@@ -6,6 +6,8 @@ module Coradoc
6
6
  class ModernRenderer
7
7
  # Generate Vue.js application code
8
8
  module JavascriptGenerator
9
+ autoload :VueTemplates, "#{__dir__}/vue_template_generator"
10
+
9
11
  class << self
10
12
  # Generate Vue application
11
13
  #
@@ -17,7 +19,6 @@ module Coradoc
17
19
  templates = load_templates
18
20
 
19
21
  # Get enhanced document template
20
- require_relative 'components/ui_components'
21
22
  document_template = UIComponents.enhanced_document_template(config)
22
23
 
23
24
  <<~JS
@@ -293,7 +294,6 @@ module Coradoc
293
294
  #
294
295
  # @return [Hash] Hash of templates
295
296
  def load_templates
296
- require_relative 'vue_template_generator'
297
297
  {
298
298
  paragraph: VueTemplates.template_for('paragraph'),
299
299
  admonition: VueTemplates.template_for('admonition'),
@@ -128,17 +128,13 @@ module Coradoc
128
128
  # @param block [Coradoc::CoreModel::Block] Block to serialize
129
129
  # @return [Hash] Serialized block
130
130
  def serialize_core_model_block(block)
131
- block_type = case block.element_type
132
- when 'paragraph' then 'paragraph'
133
- when 'block'
134
- case block.delimiter_type
135
- when '----' then 'source'
136
- when '____' then 'quote'
137
- when '====' then 'example'
138
- else 'block'
139
- end
140
- else
141
- 'block'
131
+ semantic = block.block_semantic_type&.to_sym
132
+ block_type = case semantic
133
+ when :paragraph then 'paragraph'
134
+ when :source_code then 'source'
135
+ when :quote, :verse then 'quote'
136
+ when :example then 'example'
137
+ else 'block'
142
138
  end
143
139
 
144
140
  {
@@ -13,6 +13,12 @@ module Coradoc
13
13
  # @example Generate modern HTML output
14
14
  # html = Coradoc::Output::Html.convert_to_html5(document, theme: :modern)
15
15
  class ModernRenderer < Base
16
+ autoload :Serializers, "#{__dir__}/modern/serializers/document_serializer"
17
+ autoload :JavascriptGenerator, "#{__dir__}/modern/javascript_generator"
18
+ autoload :TailwindConfigBuilder, "#{__dir__}/modern/tailwind_config_builder"
19
+ autoload :CSSGenerator, "#{__dir__}/modern/css_generator"
20
+ autoload :UIComponents, "#{__dir__}/modern/components/ui_components"
21
+
16
22
  # Register this theme
17
23
  Registry.register(:modern, self)
18
24
 
@@ -111,7 +117,6 @@ module Coradoc
111
117
  #
112
118
  # @return [Hash] Serialized document data
113
119
  def serialize_document
114
- require_relative 'modern/serializers/document_serializer'
115
120
  Serializers::DocumentSerializer.serialize(@document)
116
121
  end
117
122
 
@@ -121,7 +126,6 @@ module Coradoc
121
126
  # @param config [Hash] Theme configuration
122
127
  # @return [String] Vue application JavaScript
123
128
  def generate_vue_app(document_data, config)
124
- require_relative 'modern/javascript_generator'
125
129
  JavascriptGenerator.generate(document_data, config)
126
130
  end
127
131
 
@@ -130,7 +134,6 @@ module Coradoc
130
134
  # @param config [Hash] Theme configuration
131
135
  # @return [String] Tailwind configuration script
132
136
  def generate_tailwind_config(config)
133
- require_relative 'modern/tailwind_config_builder'
134
137
  TailwindConfigBuilder.build(config)
135
138
  end
136
139
 
@@ -139,10 +142,6 @@ module Coradoc
139
142
  # @param config [Hash] Theme configuration
140
143
  # @return [String] Custom CSS
141
144
  def generate_custom_css(config)
142
- require_relative 'modern/css_generator'
143
- require_relative 'modern/components/ui_components'
144
-
145
- # Use enhanced CSS from UIComponents module
146
145
  UIComponents.enhanced_css(config)
147
146
  end
148
147
 
@@ -7,21 +7,6 @@ require 'coradoc/html/output'
7
7
 
8
8
  module Coradoc
9
9
  module Html
10
- # Register HTML format with coradoc when loaded
11
- def self.register_with_coradoc
12
- return if @registered
13
-
14
- # Register with the main coradoc registry
15
- Coradoc.register_format(:html, self,
16
- aliases: %w[html htm],
17
- extensions: %w[.html .htm])
18
-
19
- @registered = true
20
- end
21
-
22
- # Call registration when this module is included/required
23
- register_with_coradoc
24
-
25
10
  module Converters
26
11
  # Autoload HTML converters - they will be loaded when accessed
27
12
  autoload :Base, 'coradoc/html/converters/base'
@@ -263,3 +248,8 @@ module Coradoc
263
248
  end
264
249
  end
265
250
  end
251
+
252
+ # Register after all module methods are defined
253
+ Coradoc.register_format(:html, Coradoc::Html,
254
+ aliases: %w[html htm],
255
+ extensions: %w[.html .htm])
@@ -123,7 +123,7 @@ RSpec.describe Coradoc::Input::Html::Converters do
123
123
  result = converter.to_coradoc(node, {})
124
124
 
125
125
  expect(result).to be_a(Coradoc::CoreModel::Block)
126
- expect(result.delimiter_type).to eq('paragraph')
126
+ expect(result.block_semantic_type).to eq('paragraph')
127
127
  end
128
128
 
129
129
  it 'preserves id attribute' do
@@ -447,7 +447,7 @@ RSpec.describe Coradoc::Input::Html::Converters do
447
447
  result = converter_module.process_coradoc(node, {})
448
448
 
449
449
  # Extract text content from the block (use children for mixed content)
450
- content = result.respond_to?(:children) && result.children.any? ? result.children : result.content
450
+ content = result.is_a?(Coradoc::CoreModel::Base) && result.children&.any? ? result.children : result.content
451
451
  text = extract_text_from_content(content)
452
452
  expect(text).to include('Simple text')
453
453
  end
@@ -459,7 +459,7 @@ RSpec.describe Coradoc::Input::Html::Converters do
459
459
 
460
460
  result = converter_module.process_coradoc(node, {})
461
461
 
462
- content = result.respond_to?(:children) && result.children.any? ? result.children : result.content
462
+ content = result.is_a?(Coradoc::CoreModel::Base) && result.children&.any? ? result.children : result.content
463
463
  text = extract_text_from_content(content)
464
464
  expect(text).to include('Before')
465
465
  expect(text).to include('Bold')
@@ -477,15 +477,13 @@ RSpec.describe Coradoc::Input::Html::Converters do
477
477
  when Coradoc::CoreModel::InlineElement
478
478
  # Extract from both content and nested_elements
479
479
  text_parts = [extract_text_from_content(c.content)]
480
- text_parts << extract_text_from_content(c.nested_elements) if c.respond_to?(:nested_elements) && c.nested_elements
480
+ text_parts << extract_text_from_content(c.nested_elements) if c.nested_elements
481
481
  text_parts.join
482
482
  when Coradoc::CoreModel::Base
483
- if c.respond_to?(:children) && c.children.is_a?(Array)
483
+ if c.children.is_a?(Array)
484
484
  extract_text_from_content(c.children)
485
- elsif c.respond_to?(:content)
486
- extract_text_from_content(c.content)
487
485
  else
488
- ''
486
+ extract_text_from_content(c.content)
489
487
  end
490
488
  when Array
491
489
  extract_text_from_content(c)
@@ -1,8 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative 'base'
4
- require_relative '../parser_util'
5
-
6
3
  module Coradoc
7
4
  module Markdown
8
5
  # Represents an Inline Attribute List (IAL) or Attribute List Definition (ALD)
@@ -1,8 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative 'definition_term'
4
- require_relative 'definition_item'
5
-
6
3
  module Coradoc
7
4
  module Markdown
8
5
  # DefinitionList model representing a Kramdown definition list.
@@ -1,7 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative 'base'
4
-
5
3
  module Coradoc
6
4
  module Markdown
7
5
  # Represents a kramdown extension
@@ -1,6 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative 'base'
4
3
 
5
4
  module Coradoc
6
5
  module Markdown
@@ -1,6 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative 'base'
4
3
 
5
4
  module Coradoc
6
5
  module Markdown
@@ -1,6 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative 'base'
4
3
 
5
4
  module Coradoc
6
5
  module Markdown
@@ -1,10 +1,10 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative 'inline_parser'
4
-
5
3
  module Coradoc
6
4
  module Markdown
7
5
  module Parser
6
+ autoload :InlineParser, "#{__dir__}/inline_parser"
7
+
8
8
  # Post-processes the AST produced by BlockParser.
9
9
  #
10
10
  # This processor handles:
@@ -1,10 +1,10 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative 'parslet_extras'
4
-
5
3
  module Coradoc
6
4
  module Markdown
7
5
  module Parser
6
+ autoload :ParsletExtras, "#{__dir__}/parslet_extras"
7
+
8
8
  class BlockParser < Parslet::Parser
9
9
  using ParsletExtras
10
10
 
@@ -1,11 +1,11 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative 'parslet_extras'
4
- require_relative 'html_entities'
5
-
6
3
  module Coradoc
7
4
  module Markdown
8
5
  module Parser
6
+ autoload :ParsletExtras, "#{__dir__}/parslet_extras"
7
+ autoload :HtmlEntities, "#{__dir__}/html_entities"
8
+
9
9
  class InlineParser < Parslet::Parser
10
10
  using ParsletExtras
11
11
 
@@ -1,5 +1,11 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative 'block_parser'
4
- require_relative 'inline_parser'
5
- require_relative 'ast_processor'
3
+ module Coradoc
4
+ module Markdown
5
+ module Parser
6
+ autoload :BlockParser, "#{__dir__}/block_parser"
7
+ autoload :InlineParser, "#{__dir__}/inline_parser"
8
+ autoload :AstProcessor, "#{__dir__}/ast_processor"
9
+ end
10
+ end
11
+ end
@@ -1,11 +1,13 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative 'model/base'
4
- require_relative 'model/heading'
5
- require_relative 'model/document'
6
-
7
3
  module Coradoc
8
4
  module Markdown
5
+ module Model
6
+ autoload :Base, "#{__dir__}/model/base"
7
+ autoload :Heading, "#{__dir__}/model/heading"
8
+ autoload :Document, "#{__dir__}/model/document"
9
+ end
10
+
9
11
  # Table of Contents Generator
10
12
  #
11
13
  # Generates a table of contents from document headings.
@@ -127,22 +127,43 @@ module Coradoc
127
127
  end
128
128
 
129
129
  def transform_delimited_block(block)
130
- delimiter = block.delimiter_type
130
+ semantic = resolve_markdown_semantic(block)
131
131
 
132
- case delimiter
133
- when '```', '~'
132
+ case semantic
133
+ when :source_code, :listing
134
134
  transform_code_block(block)
135
- when '>'
135
+ when :quote, :verse
136
136
  transform_blockquote(block)
137
- when '---', '***', '___'
137
+ when :horizontal_rule
138
138
  transform_horizontal_rule(block)
139
- when '++++'
139
+ when :pass
140
140
  Coradoc::Markdown::Extension.nomarkdown(block.content.to_s)
141
+ when :literal
142
+ transform_code_block(block)
141
143
  else
142
144
  transform_paragraph(block)
143
145
  end
144
146
  end
145
147
 
148
+ def resolve_markdown_semantic(block)
149
+ # Polymorphic dispatch: typed classes override semantic_type
150
+ semantic = block.resolve_semantic_type
151
+ return semantic if semantic
152
+
153
+ # Backward compat: derive from delimiter_type
154
+ markdown_delimiter_to_semantic(block.delimiter_type)
155
+ end
156
+
157
+ def markdown_delimiter_to_semantic(delimiter)
158
+ case delimiter
159
+ when '```', '~' then :source_code
160
+ when '>' then :quote
161
+ when '---', '***', '___' then :horizontal_rule
162
+ when '++++' then :pass
163
+ else nil
164
+ end
165
+ end
166
+
146
167
  def transform_code_block(block)
147
168
  Coradoc::Markdown::CodeBlock.new(
148
169
  code: block.content.to_s,
@@ -103,18 +103,16 @@ module Coradoc
103
103
  end
104
104
 
105
105
  def transform_code_block(block)
106
- Coradoc::CoreModel::Block.new(
106
+ Coradoc::CoreModel::SourceBlock.new(
107
107
  element_type: 'block',
108
- delimiter_type: '```',
109
108
  content: block.code.to_s,
110
109
  language: block.language
111
110
  )
112
111
  end
113
112
 
114
113
  def transform_blockquote(blockquote)
115
- Coradoc::CoreModel::Block.new(
114
+ Coradoc::CoreModel::QuoteBlock.new(
116
115
  element_type: 'block',
117
- delimiter_type: '>',
118
116
  content: blockquote.content.to_s
119
117
  )
120
118
  end
@@ -184,7 +182,7 @@ module Coradoc
184
182
  def transform_horizontal_rule(_rule)
185
183
  Coradoc::CoreModel::Block.new(
186
184
  element_type: 'block',
187
- delimiter_type: '---'
185
+ block_semantic_type: :horizontal_rule
188
186
  )
189
187
  end
190
188
 
@@ -228,9 +226,8 @@ module Coradoc
228
226
  content: math.content.to_s
229
227
  )
230
228
  else
231
- Coradoc::CoreModel::Block.new(
229
+ Coradoc::CoreModel::PassBlock.new(
232
230
  element_type: 'block',
233
- delimiter_type: '++++',
234
231
  content: math.content.to_s,
235
232
  language: 'latexmath'
236
233
  )
@@ -247,9 +244,8 @@ module Coradoc
247
244
  content: ext.content.to_s
248
245
  )
249
246
  when :nomarkdown
250
- Coradoc::CoreModel::Block.new(
247
+ Coradoc::CoreModel::PassBlock.new(
251
248
  element_type: 'block',
252
- delimiter_type: '++++',
253
249
  content: ext.content.to_s
254
250
  )
255
251
  else
@@ -1,10 +1,11 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require 'parslet'
4
- require_relative 'parser_util'
5
4
 
6
5
  module Coradoc
7
6
  module Markdown
7
+ autoload :ParserUtil, "#{__dir__}/parser_util"
8
+
8
9
  # Transformer converts Parslet AST into Markdown Document Model objects.
9
10
  #
10
11
  # This transformer takes the raw output from the BlockParser/InlineParser
@@ -71,9 +71,8 @@ RSpec.describe Coradoc::Markdown::Transform::ToCoreModel do
71
71
  )
72
72
  end
73
73
 
74
- it 'transforms to CoreModel::Block with code delimiter' do
75
- expect(transform).to be_a(Coradoc::CoreModel::Block)
76
- expect(transform.delimiter_type).to eq('```')
74
+ it 'transforms to CoreModel::SourceBlock with code content' do
75
+ expect(transform).to be_a(Coradoc::CoreModel::SourceBlock)
77
76
  expect(transform.content).to eq("def hello\n puts 'world'\nend")
78
77
  expect(transform.language).to eq('ruby')
79
78
  end
@@ -84,9 +83,8 @@ RSpec.describe Coradoc::Markdown::Transform::ToCoreModel do
84
83
  Coradoc::Markdown::Blockquote.new(content: 'Quoted text')
85
84
  end
86
85
 
87
- it 'transforms to CoreModel::Block with blockquote delimiter' do
88
- expect(transform).to be_a(Coradoc::CoreModel::Block)
89
- expect(transform.delimiter_type).to eq('>')
86
+ it 'transforms to CoreModel::QuoteBlock with blockquote content' do
87
+ expect(transform).to be_a(Coradoc::CoreModel::QuoteBlock)
90
88
  expect(transform.content).to eq('Quoted text')
91
89
  end
92
90
  end
@@ -222,9 +220,9 @@ RSpec.describe Coradoc::Markdown::Transform::ToCoreModel do
222
220
  Coradoc::Markdown::HorizontalRule.new
223
221
  end
224
222
 
225
- it 'transforms to CoreModel::Block with hr delimiter' do
223
+ it 'transforms to CoreModel::Block with horizontal rule semantic type' do
226
224
  expect(transform).to be_a(Coradoc::CoreModel::Block)
227
- expect(transform.delimiter_type).to eq('---')
225
+ expect(transform.block_semantic_type).to eq('horizontal_rule')
228
226
  end
229
227
  end
230
228