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.
- checksums.yaml +4 -4
- data/.rubocop_todo.yml +96 -51
- data/coradoc-adoc/lib/coradoc/asciidoc/model/break.rb +7 -0
- data/coradoc-adoc/lib/coradoc/asciidoc/model/document.rb +2 -2
- data/coradoc-adoc/lib/coradoc/asciidoc/model/include.rb +2 -2
- data/coradoc-adoc/lib/coradoc/asciidoc/model.rb +6 -4
- data/coradoc-adoc/lib/coradoc/asciidoc/parser/base.rb +1 -0
- data/coradoc-adoc/lib/coradoc/asciidoc/parser/block.rb +8 -7
- data/coradoc-adoc/lib/coradoc/asciidoc/parser/content.rb +13 -3
- data/coradoc-adoc/lib/coradoc/asciidoc/parser/inline.rb +15 -15
- data/coradoc-adoc/lib/coradoc/asciidoc/parser/list.rb +2 -2
- data/coradoc-adoc/lib/coradoc/asciidoc/parser/section.rb +1 -0
- data/coradoc-adoc/lib/coradoc/asciidoc/serializer/serializers/document.rb +4 -1
- data/coradoc-adoc/lib/coradoc/asciidoc/transform/from_core_model.rb +84 -13
- data/coradoc-adoc/lib/coradoc/asciidoc/transform/to_core_model.rb +106 -27
- data/coradoc-adoc/lib/coradoc/asciidoc/transform/to_core_model_registrations.rb +50 -19
- data/coradoc-adoc/lib/coradoc/asciidoc/transformer/misc_rules.rb +5 -0
- data/coradoc-adoc/lib/coradoc/asciidoc/transformer/structural_rules.rb +9 -8
- data/coradoc-adoc/lib/coradoc/asciidoc/transformer.rb +22 -5
- data/coradoc-adoc/lib/coradoc/asciidoc.rb +7 -2
- data/coradoc-adoc/spec/coradoc/asciidoc/integration_pipeline_spec.rb +342 -0
- data/coradoc-adoc/spec/coradoc/asciidoc/list_continuation_spec.rb +1 -1
- data/coradoc-adoc/spec/coradoc/asciidoc/round_trip_spec.rb +0 -2
- data/coradoc-adoc/spec/coradoc/asciidoc/transform/from_core_model_spec.rb +3 -2
- data/coradoc-adoc/spec/coradoc/developer_experience_spec.rb +0 -2
- data/coradoc-adoc/spec/transform/from_core_model_spec.rb +3 -3
- data/coradoc-adoc/spec/transform/to_core_model_spec.rb +1 -0
- data/coradoc-html/lib/coradoc/html/converters/base.rb +41 -17
- data/coradoc-html/lib/coradoc/html/converters/example.rb +1 -2
- data/coradoc-html/lib/coradoc/html/converters/listing.rb +1 -2
- data/coradoc-html/lib/coradoc/html/converters/literal.rb +1 -2
- data/coradoc-html/lib/coradoc/html/converters/open.rb +1 -2
- data/coradoc-html/lib/coradoc/html/converters/quote.rb +2 -3
- data/coradoc-html/lib/coradoc/html/converters/sidebar.rb +1 -2
- data/coradoc-html/lib/coradoc/html/converters/source.rb +1 -2
- data/coradoc-html/lib/coradoc/html/converters/source_code.rb +1 -2
- data/coradoc-html/lib/coradoc/html/converters/term.rb +1 -2
- data/coradoc-html/lib/coradoc/html/converters/verse.rb +2 -3
- data/coradoc-html/lib/coradoc/html/input/converters/aside.rb +1 -1
- data/coradoc-html/lib/coradoc/html/input/converters/audio.rb +1 -1
- data/coradoc-html/lib/coradoc/html/input/converters/blockquote.rb +2 -3
- data/coradoc-html/lib/coradoc/html/input/converters/div.rb +1 -2
- data/coradoc-html/lib/coradoc/html/input/converters/figure.rb +2 -3
- data/coradoc-html/lib/coradoc/html/input/converters/hr.rb +1 -1
- data/coradoc-html/lib/coradoc/html/input/converters/p.rb +2 -1
- data/coradoc-html/lib/coradoc/html/input/converters/pre.rb +14 -10
- data/coradoc-html/lib/coradoc/html/input/converters/video.rb +1 -1
- data/coradoc-html/lib/coradoc/html/renderer.rb +50 -2
- data/coradoc-html/lib/coradoc/html/spa.rb +2 -2
- data/coradoc-html/lib/coradoc/html/static.rb +2 -2
- data/coradoc-html/lib/coradoc/html/templates/core_model/definition_list.liquid +11 -0
- data/coradoc-html/lib/coradoc/html/theme/modern/javascript_generator.rb +2 -2
- data/coradoc-html/lib/coradoc/html/theme/modern/serializers/document_serializer.rb +7 -11
- data/coradoc-html/lib/coradoc/html/theme/modern_renderer.rb +6 -7
- data/coradoc-html/lib/coradoc/html.rb +5 -15
- data/coradoc-html/spec/input/converters/converters_spec.rb +6 -8
- data/coradoc-markdown/lib/coradoc/markdown/model/attribute_list.rb +0 -3
- data/coradoc-markdown/lib/coradoc/markdown/model/definition_list.rb +0 -3
- data/coradoc-markdown/lib/coradoc/markdown/model/extension.rb +0 -2
- data/coradoc-markdown/lib/coradoc/markdown/model/highlight.rb +0 -1
- data/coradoc-markdown/lib/coradoc/markdown/model/math.rb +0 -1
- data/coradoc-markdown/lib/coradoc/markdown/model/strikethrough.rb +0 -1
- data/coradoc-markdown/lib/coradoc/markdown/parser/ast_processor.rb +2 -2
- data/coradoc-markdown/lib/coradoc/markdown/parser/block_parser.rb +2 -2
- data/coradoc-markdown/lib/coradoc/markdown/parser/inline_parser.rb +3 -3
- data/coradoc-markdown/lib/coradoc/markdown/parser.rb +9 -3
- data/coradoc-markdown/lib/coradoc/markdown/toc_generator.rb +6 -4
- data/coradoc-markdown/lib/coradoc/markdown/transform/from_core_model.rb +27 -6
- data/coradoc-markdown/lib/coradoc/markdown/transform/to_core_model.rb +5 -9
- data/coradoc-markdown/lib/coradoc/markdown/transformer.rb +2 -1
- data/coradoc-markdown/spec/transform/to_core_model_spec.rb +6 -8
- data/exe/coradoc +1 -0
- data/lib/coradoc/coradoc.rb +6 -7
- data/lib/coradoc/core_model/annotation_block.rb +0 -2
- data/lib/coradoc/core_model/block.rb +92 -32
- data/lib/coradoc/core_model/builder/block_builder.rb +20 -2
- data/lib/coradoc/core_model/builder/detection.rb +0 -8
- data/lib/coradoc/core_model/builder.rb +6 -7
- data/lib/coradoc/core_model/example_block.rb +12 -0
- data/lib/coradoc/core_model/listing_block.rb +15 -0
- data/lib/coradoc/core_model/literal_block.rb +12 -0
- data/lib/coradoc/core_model/open_block.rb +12 -0
- data/lib/coradoc/core_model/pass_block.rb +12 -0
- data/lib/coradoc/core_model/quote_block.rb +14 -0
- data/lib/coradoc/core_model/reviewer_block.rb +12 -0
- data/lib/coradoc/core_model/sidebar_block.rb +12 -0
- data/lib/coradoc/core_model/source_block.rb +22 -0
- data/lib/coradoc/core_model/structural_element.rb +4 -0
- data/lib/coradoc/core_model/verse_block.rb +14 -0
- data/lib/coradoc/core_model.rb +10 -0
- data/lib/coradoc/document_manipulator.rb +3 -1
- data/lib/coradoc/processor_registry.rb +0 -2
- data/lib/coradoc/version.rb +1 -1
- metadata +13 -34
- data/coradoc-markdown/coverage/.last_run.json +0 -5
- data/coradoc-markdown/coverage/.resultset.json +0 -6322
- data/coradoc-markdown/coverage/.resultset.json.lock +0 -0
- data/coradoc-markdown/coverage/assets/0.13.2/DataTables-1.10.20/images/sort_asc.png +0 -0
- data/coradoc-markdown/coverage/assets/0.13.2/DataTables-1.10.20/images/sort_asc_disabled.png +0 -0
- data/coradoc-markdown/coverage/assets/0.13.2/DataTables-1.10.20/images/sort_both.png +0 -0
- data/coradoc-markdown/coverage/assets/0.13.2/DataTables-1.10.20/images/sort_desc.png +0 -0
- data/coradoc-markdown/coverage/assets/0.13.2/DataTables-1.10.20/images/sort_desc_disabled.png +0 -0
- data/coradoc-markdown/coverage/assets/0.13.2/application.css +0 -1
- data/coradoc-markdown/coverage/assets/0.13.2/application.js +0 -7
- data/coradoc-markdown/coverage/assets/0.13.2/colorbox/border.png +0 -0
- data/coradoc-markdown/coverage/assets/0.13.2/colorbox/controls.png +0 -0
- data/coradoc-markdown/coverage/assets/0.13.2/colorbox/loading.gif +0 -0
- data/coradoc-markdown/coverage/assets/0.13.2/colorbox/loading_background.png +0 -0
- data/coradoc-markdown/coverage/assets/0.13.2/favicon_green.png +0 -0
- data/coradoc-markdown/coverage/assets/0.13.2/favicon_red.png +0 -0
- data/coradoc-markdown/coverage/assets/0.13.2/favicon_yellow.png +0 -0
- data/coradoc-markdown/coverage/assets/0.13.2/images/ui-bg_flat_0_aaaaaa_40x100.png +0 -0
- data/coradoc-markdown/coverage/assets/0.13.2/images/ui-bg_flat_75_ffffff_40x100.png +0 -0
- data/coradoc-markdown/coverage/assets/0.13.2/images/ui-bg_glass_55_fbf9ee_1x400.png +0 -0
- data/coradoc-markdown/coverage/assets/0.13.2/images/ui-bg_glass_65_ffffff_1x400.png +0 -0
- data/coradoc-markdown/coverage/assets/0.13.2/images/ui-bg_glass_75_dadada_1x400.png +0 -0
- data/coradoc-markdown/coverage/assets/0.13.2/images/ui-bg_glass_75_e6e6e6_1x400.png +0 -0
- data/coradoc-markdown/coverage/assets/0.13.2/images/ui-bg_glass_95_fef1ec_1x400.png +0 -0
- data/coradoc-markdown/coverage/assets/0.13.2/images/ui-bg_highlight-soft_75_cccccc_1x100.png +0 -0
- data/coradoc-markdown/coverage/assets/0.13.2/images/ui-icons_222222_256x240.png +0 -0
- data/coradoc-markdown/coverage/assets/0.13.2/images/ui-icons_2e83ff_256x240.png +0 -0
- data/coradoc-markdown/coverage/assets/0.13.2/images/ui-icons_454545_256x240.png +0 -0
- data/coradoc-markdown/coverage/assets/0.13.2/images/ui-icons_888888_256x240.png +0 -0
- data/coradoc-markdown/coverage/assets/0.13.2/images/ui-icons_cd0a0a_256x240.png +0 -0
- data/coradoc-markdown/coverage/assets/0.13.2/loading.gif +0 -0
- data/coradoc-markdown/coverage/assets/0.13.2/magnify.png +0 -0
- 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::
|
|
14
|
-
Coradoc::CoreModel::
|
|
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
|
|
@@ -10,16 +10,20 @@ module Coradoc
|
|
|
10
10
|
lang = language(node)
|
|
11
11
|
content = extract_text_content(node)
|
|
12
12
|
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
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
|
|
@@ -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(/"/, '"')
|
|
354
395
|
.gsub(/'/, ''')
|
|
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
|
|
@@ -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
|
-
|
|
132
|
-
|
|
133
|
-
when '
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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,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,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
|
-
|
|
4
|
-
|
|
5
|
-
|
|
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
|
-
|
|
130
|
+
semantic = resolve_markdown_semantic(block)
|
|
131
131
|
|
|
132
|
-
case
|
|
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::
|
|
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::
|
|
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
|
-
|
|
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::
|
|
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::
|
|
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::
|
|
75
|
-
expect(transform).to be_a(Coradoc::CoreModel::
|
|
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::
|
|
88
|
-
expect(transform).to be_a(Coradoc::CoreModel::
|
|
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
|
|
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.
|
|
225
|
+
expect(transform.block_semantic_type).to eq('horizontal_rule')
|
|
228
226
|
end
|
|
229
227
|
end
|
|
230
228
|
|