coradoc-markdown 1.0.0 → 1.0.3
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/lib/coradoc/markdown/model/admonition.rb +35 -0
- data/lib/coradoc/markdown/model/attribute_list.rb +5 -16
- data/lib/coradoc/markdown/model/base.rb +2 -34
- data/lib/coradoc/markdown/model/comment.rb +14 -0
- data/lib/coradoc/markdown/model/cross_reference.rb +10 -0
- data/lib/coradoc/markdown/model/definition_list.rb +0 -12
- data/lib/coradoc/markdown/model/definition_term.rb +16 -6
- data/lib/coradoc/markdown/model/document.rb +9 -0
- data/lib/coradoc/markdown/model/example_block.rb +26 -0
- data/lib/coradoc/markdown/model/extension.rb +9 -18
- data/lib/coradoc/markdown/model/footnote_reference.rb +0 -5
- data/lib/coradoc/markdown/model/hard_line_break.rb +21 -0
- data/lib/coradoc/markdown/model/highlight.rb +0 -5
- data/lib/coradoc/markdown/model/horizontal_rule.rb +1 -6
- data/lib/coradoc/markdown/model/list_item.rb +1 -1
- data/lib/coradoc/markdown/model/literal.rb +21 -0
- data/lib/coradoc/markdown/model/math.rb +0 -14
- data/lib/coradoc/markdown/model/named_value.rb +18 -0
- data/lib/coradoc/markdown/model/open_block.rb +22 -0
- data/lib/coradoc/markdown/model/paragraph.rb +2 -2
- data/lib/coradoc/markdown/model/pass.rb +21 -0
- data/lib/coradoc/markdown/model/sidebar.rb +22 -0
- data/lib/coradoc/markdown/model/strikethrough.rb +0 -5
- data/lib/coradoc/markdown/model/subscript.rb +9 -0
- data/lib/coradoc/markdown/model/superscript.rb +9 -0
- data/lib/coradoc/markdown/model/underline.rb +9 -0
- data/lib/coradoc/markdown/model/verse.rb +27 -0
- data/lib/coradoc/markdown/parser/block_parser.rb +1 -1
- data/lib/coradoc/markdown/parser/frontmatter_parser.rb +23 -0
- data/lib/coradoc/markdown/serializer/builder.rb +57 -0
- data/lib/coradoc/markdown/serializer/config.rb +77 -0
- data/lib/coradoc/markdown/serializer/context.rb +66 -0
- data/lib/coradoc/markdown/serializer/element_serializer.rb +46 -0
- data/lib/coradoc/markdown/serializer/flavor.rb +82 -0
- data/lib/coradoc/markdown/serializer/registrations.rb +111 -0
- data/lib/coradoc/markdown/serializer/registry.rb +62 -0
- data/lib/coradoc/markdown/serializer/runner.rb +84 -0
- data/lib/coradoc/markdown/serializer/serializers/abbreviation.rb +19 -0
- data/lib/coradoc/markdown/serializer/serializers/admonition.rb +20 -0
- data/lib/coradoc/markdown/serializer/serializers/attribute_list.rb +25 -0
- data/lib/coradoc/markdown/serializer/serializers/blockquote.rb +19 -0
- data/lib/coradoc/markdown/serializer/serializers/code.rb +19 -0
- data/lib/coradoc/markdown/serializer/serializers/code_block.rb +19 -0
- data/lib/coradoc/markdown/serializer/serializers/comment.rb +31 -0
- data/lib/coradoc/markdown/serializer/serializers/cross_reference.rb +19 -0
- data/lib/coradoc/markdown/serializer/serializers/definition_list.rb +20 -0
- data/lib/coradoc/markdown/serializer/serializers/document.rb +22 -0
- data/lib/coradoc/markdown/serializer/serializers/emphasis.rb +19 -0
- data/lib/coradoc/markdown/serializer/serializers/example_block.rb +40 -0
- data/lib/coradoc/markdown/serializer/serializers/extension.rb +30 -0
- data/lib/coradoc/markdown/serializer/serializers/footnote.rb +20 -0
- data/lib/coradoc/markdown/serializer/serializers/footnote_reference.rb +19 -0
- data/lib/coradoc/markdown/serializer/serializers/hard_line_break.rb +22 -0
- data/lib/coradoc/markdown/serializer/serializers/heading.rb +19 -0
- data/lib/coradoc/markdown/serializer/serializers/highlight.rb +19 -0
- data/lib/coradoc/markdown/serializer/serializers/horizontal_rule.rb +19 -0
- data/lib/coradoc/markdown/serializer/serializers/image.rb +19 -0
- data/lib/coradoc/markdown/serializer/serializers/link.rb +29 -0
- data/lib/coradoc/markdown/serializer/serializers/list.rb +45 -0
- data/lib/coradoc/markdown/serializer/serializers/literal.rb +21 -0
- data/lib/coradoc/markdown/serializer/serializers/math.rb +23 -0
- data/lib/coradoc/markdown/serializer/serializers/open_block.rb +38 -0
- data/lib/coradoc/markdown/serializer/serializers/paragraph.rb +23 -0
- data/lib/coradoc/markdown/serializer/serializers/pass.rb +21 -0
- data/lib/coradoc/markdown/serializer/serializers/sidebar.rb +20 -0
- data/lib/coradoc/markdown/serializer/serializers/strikethrough.rb +19 -0
- data/lib/coradoc/markdown/serializer/serializers/strong.rb +19 -0
- data/lib/coradoc/markdown/serializer/serializers/subscript.rb +19 -0
- data/lib/coradoc/markdown/serializer/serializers/superscript.rb +19 -0
- data/lib/coradoc/markdown/serializer/serializers/table.rb +37 -0
- data/lib/coradoc/markdown/serializer/serializers/underline.rb +19 -0
- data/lib/coradoc/markdown/serializer/serializers/verse.rb +31 -0
- data/lib/coradoc/markdown/serializer/strategies/admonition/base.rb +30 -0
- data/lib/coradoc/markdown/serializer/strategies/admonition/container.rb +34 -0
- data/lib/coradoc/markdown/serializer/strategies/admonition/gfm_alert.rb +28 -0
- data/lib/coradoc/markdown/serializer/strategies/admonition/github.rb +29 -0
- data/lib/coradoc/markdown/serializer/strategies/admonition/html.rb +25 -0
- data/lib/coradoc/markdown/serializer/strategies/admonition/registry.rb +50 -0
- data/lib/coradoc/markdown/serializer/strategies/autolink/angle.rb +35 -0
- data/lib/coradoc/markdown/serializer/strategies/autolink/bare.rb +23 -0
- data/lib/coradoc/markdown/serializer/strategies/autolink/base.rb +33 -0
- data/lib/coradoc/markdown/serializer/strategies/autolink/none.rb +27 -0
- data/lib/coradoc/markdown/serializer/strategies/autolink/registry.rb +58 -0
- data/lib/coradoc/markdown/serializer/strategies/definition_list/base.rb +37 -0
- data/lib/coradoc/markdown/serializer/strategies/definition_list/flat.rb +48 -0
- data/lib/coradoc/markdown/serializer/strategies/definition_list/nested_html.rb +54 -0
- data/lib/coradoc/markdown/serializer/strategies/definition_list/registry.rb +37 -0
- data/lib/coradoc/markdown/serializer.rb +30 -181
- data/lib/coradoc/markdown/toc_generator.rb +2 -8
- data/lib/coradoc/markdown/transform/block_transformer.rb +163 -0
- data/lib/coradoc/markdown/transform/from_core_model.rb +205 -40
- data/lib/coradoc/markdown/transform/image_transformer.rb +20 -0
- data/lib/coradoc/markdown/transform/inline_transformer.rb +74 -0
- data/lib/coradoc/markdown/transform/list_transformer.rb +52 -0
- data/lib/coradoc/markdown/transform/structural_transformer.rb +94 -0
- data/lib/coradoc/markdown/transform/table_transformer.rb +40 -0
- data/lib/coradoc/markdown/transform/to_core_model.rb +36 -30
- data/lib/coradoc/markdown/transformer.rb +87 -2
- data/lib/coradoc/markdown/version.rb +1 -1
- data/lib/coradoc/markdown.rb +23 -20
- metadata +89 -10
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require_relative '../element_serializer'
|
|
4
|
+
|
|
5
|
+
module Coradoc
|
|
6
|
+
module Markdown
|
|
7
|
+
class Serializer
|
|
8
|
+
module Serializers
|
|
9
|
+
class CodeBlock < ElementSerializer
|
|
10
|
+
handles_type ::Coradoc::Markdown::CodeBlock
|
|
11
|
+
|
|
12
|
+
def call(element, _ctx)
|
|
13
|
+
"```#{element.language}\n#{element.code}\n```"
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
end
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require_relative '../element_serializer'
|
|
4
|
+
|
|
5
|
+
module Coradoc
|
|
6
|
+
module Markdown
|
|
7
|
+
class Serializer
|
|
8
|
+
module Serializers
|
|
9
|
+
# Comments are editorial annotations, not document content. The
|
|
10
|
+
# Markdown Serialization Spec (§Comments) requires that comments
|
|
11
|
+
# be suppressed by default.
|
|
12
|
+
#
|
|
13
|
+
# Behavior:
|
|
14
|
+
# suppress_comments == true → '' (no output)
|
|
15
|
+
# suppress_comments == false → '<!-- text -->'
|
|
16
|
+
class Comment < ElementSerializer
|
|
17
|
+
handles_type ::Coradoc::Markdown::Comment
|
|
18
|
+
|
|
19
|
+
def call(element, ctx)
|
|
20
|
+
return '' if ctx.config.suppress_comments
|
|
21
|
+
|
|
22
|
+
text = element.text.to_s.strip
|
|
23
|
+
return '<!---->' if text.empty?
|
|
24
|
+
|
|
25
|
+
"<!-- #{text} -->"
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
end
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require_relative '../element_serializer'
|
|
4
|
+
|
|
5
|
+
module Coradoc
|
|
6
|
+
module Markdown
|
|
7
|
+
class Serializer
|
|
8
|
+
module Serializers
|
|
9
|
+
class CrossReference < ElementSerializer
|
|
10
|
+
handles_type ::Coradoc::Markdown::CrossReference
|
|
11
|
+
|
|
12
|
+
def call(element, _ctx)
|
|
13
|
+
"[#{element.text}](##{element.target})"
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
end
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require_relative '../element_serializer'
|
|
4
|
+
require_relative '../strategies/definition_list/registry'
|
|
5
|
+
|
|
6
|
+
module Coradoc
|
|
7
|
+
module Markdown
|
|
8
|
+
class Serializer
|
|
9
|
+
module Serializers
|
|
10
|
+
class DefinitionList < ElementSerializer
|
|
11
|
+
handles_type ::Coradoc::Markdown::DefinitionList
|
|
12
|
+
|
|
13
|
+
def call(element, ctx)
|
|
14
|
+
Strategies::DefinitionList::Registry.render(element, ctx)
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
end
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require_relative '../element_serializer'
|
|
4
|
+
|
|
5
|
+
module Coradoc
|
|
6
|
+
module Markdown
|
|
7
|
+
class Serializer
|
|
8
|
+
module Serializers
|
|
9
|
+
class Document < ElementSerializer
|
|
10
|
+
handles_type ::Coradoc::Markdown::Document
|
|
11
|
+
|
|
12
|
+
def call(element, ctx)
|
|
13
|
+
body = element.blocks.map { |block| ctx.serialize(block) }.join("\n\n")
|
|
14
|
+
return body unless element.frontmatter && !element.frontmatter.empty?
|
|
15
|
+
|
|
16
|
+
"---\n#{element.frontmatter}---\n\n#{body}".strip
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
end
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require_relative '../element_serializer'
|
|
4
|
+
|
|
5
|
+
module Coradoc
|
|
6
|
+
module Markdown
|
|
7
|
+
class Serializer
|
|
8
|
+
module Serializers
|
|
9
|
+
class Emphasis < ElementSerializer
|
|
10
|
+
handles_type ::Coradoc::Markdown::Emphasis
|
|
11
|
+
|
|
12
|
+
def call(element, _ctx)
|
|
13
|
+
"*#{element.text}*"
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
end
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require_relative '../element_serializer'
|
|
4
|
+
|
|
5
|
+
module Coradoc
|
|
6
|
+
module Markdown
|
|
7
|
+
class Serializer
|
|
8
|
+
module Serializers
|
|
9
|
+
# Example blocks emit an HTML fallback that preserves the caption
|
|
10
|
+
# as a heading inside `<div class="example">`.
|
|
11
|
+
#
|
|
12
|
+
# When `admonition_style == :container` (VitePress), emits
|
|
13
|
+
# `:::details Caption\n... \n:::` instead.
|
|
14
|
+
class ExampleBlock < ElementSerializer
|
|
15
|
+
handles_type ::Coradoc::Markdown::ExampleBlock
|
|
16
|
+
|
|
17
|
+
def call(element, ctx)
|
|
18
|
+
if ctx.config.admonition_style == :container
|
|
19
|
+
render_container(element)
|
|
20
|
+
else
|
|
21
|
+
render_html(element)
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
private
|
|
26
|
+
|
|
27
|
+
def render_html(element)
|
|
28
|
+
caption_html = element.caption ? %(<h4>Example: #{element.caption}</h4>\n) : ''
|
|
29
|
+
%(<div class="example">\n#{caption_html}<p>#{element.content.to_s}</p>\n</div>)
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
def render_container(element)
|
|
33
|
+
title = element.caption ? " Example: #{element.caption}" : ''
|
|
34
|
+
":::details#{title}\n#{element.content.to_s}\n:::"
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
end
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require_relative '../element_serializer'
|
|
4
|
+
|
|
5
|
+
module Coradoc
|
|
6
|
+
module Markdown
|
|
7
|
+
class Serializer
|
|
8
|
+
module Serializers
|
|
9
|
+
class Extension < ElementSerializer
|
|
10
|
+
handles_type ::Coradoc::Markdown::Extension
|
|
11
|
+
|
|
12
|
+
def call(element, _ctx)
|
|
13
|
+
opts = element.options.empty? ? '' : " #{extension_options_to_s(element.options)}"
|
|
14
|
+
if element.self_closing?
|
|
15
|
+
"{::#{element.name}#{opts} /}"
|
|
16
|
+
else
|
|
17
|
+
"{::#{element.name}#{opts}}#{element.content}{:/}"
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
private
|
|
22
|
+
|
|
23
|
+
def extension_options_to_s(options)
|
|
24
|
+
options.map { |nv| %(#{nv.name}="#{nv.value}") }.join(' ')
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
end
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require_relative '../element_serializer'
|
|
4
|
+
|
|
5
|
+
module Coradoc
|
|
6
|
+
module Markdown
|
|
7
|
+
class Serializer
|
|
8
|
+
module Serializers
|
|
9
|
+
class Footnote < ElementSerializer
|
|
10
|
+
handles_type ::Coradoc::Markdown::Footnote
|
|
11
|
+
|
|
12
|
+
def call(element, _ctx)
|
|
13
|
+
content = element.content.to_s
|
|
14
|
+
"[^#{element.id}]: #{content}"
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
end
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require_relative '../element_serializer'
|
|
4
|
+
|
|
5
|
+
module Coradoc
|
|
6
|
+
module Markdown
|
|
7
|
+
class Serializer
|
|
8
|
+
module Serializers
|
|
9
|
+
class FootnoteReference < ElementSerializer
|
|
10
|
+
handles_type ::Coradoc::Markdown::FootnoteReference
|
|
11
|
+
|
|
12
|
+
def call(element, _ctx)
|
|
13
|
+
"[^#{element.id}]"
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
end
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require_relative '../element_serializer'
|
|
4
|
+
|
|
5
|
+
module Coradoc
|
|
6
|
+
module Markdown
|
|
7
|
+
class Serializer
|
|
8
|
+
module Serializers
|
|
9
|
+
# Hard line break. Output depends on `config.hard_break` (not
|
|
10
|
+
# part of the 5 spec options yet — defaults to CommonMark
|
|
11
|
+
# two-trailing-spaces).
|
|
12
|
+
class HardLineBreak < ElementSerializer
|
|
13
|
+
handles_type ::Coradoc::Markdown::HardLineBreak
|
|
14
|
+
|
|
15
|
+
def call(_element, _ctx)
|
|
16
|
+
" \n"
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
end
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require_relative '../element_serializer'
|
|
4
|
+
|
|
5
|
+
module Coradoc
|
|
6
|
+
module Markdown
|
|
7
|
+
class Serializer
|
|
8
|
+
module Serializers
|
|
9
|
+
class Heading < ElementSerializer
|
|
10
|
+
handles_type ::Coradoc::Markdown::Heading
|
|
11
|
+
|
|
12
|
+
def call(element, _ctx)
|
|
13
|
+
"#{'#' * element.level} #{element.text}"
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
end
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require_relative '../element_serializer'
|
|
4
|
+
|
|
5
|
+
module Coradoc
|
|
6
|
+
module Markdown
|
|
7
|
+
class Serializer
|
|
8
|
+
module Serializers
|
|
9
|
+
class Highlight < ElementSerializer
|
|
10
|
+
handles_type ::Coradoc::Markdown::Highlight
|
|
11
|
+
|
|
12
|
+
def call(element, _ctx)
|
|
13
|
+
"==#{element.text}=="
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
end
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require_relative '../element_serializer'
|
|
4
|
+
|
|
5
|
+
module Coradoc
|
|
6
|
+
module Markdown
|
|
7
|
+
class Serializer
|
|
8
|
+
module Serializers
|
|
9
|
+
class HorizontalRule < ElementSerializer
|
|
10
|
+
handles_type ::Coradoc::Markdown::HorizontalRule
|
|
11
|
+
|
|
12
|
+
def call(element, _ctx)
|
|
13
|
+
element.style || '---'
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
end
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require_relative '../element_serializer'
|
|
4
|
+
|
|
5
|
+
module Coradoc
|
|
6
|
+
module Markdown
|
|
7
|
+
class Serializer
|
|
8
|
+
module Serializers
|
|
9
|
+
class Image < ElementSerializer
|
|
10
|
+
handles_type ::Coradoc::Markdown::Image
|
|
11
|
+
|
|
12
|
+
def call(element, _ctx)
|
|
13
|
+
""
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
end
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require_relative '../element_serializer'
|
|
4
|
+
require_relative '../strategies/autolink/registry'
|
|
5
|
+
|
|
6
|
+
module Coradoc
|
|
7
|
+
module Markdown
|
|
8
|
+
class Serializer
|
|
9
|
+
module Serializers
|
|
10
|
+
class Link < ElementSerializer
|
|
11
|
+
handles_type ::Coradoc::Markdown::Link
|
|
12
|
+
|
|
13
|
+
def call(element, ctx)
|
|
14
|
+
url = element.url.to_s
|
|
15
|
+
text = element.text.to_s
|
|
16
|
+
title_suffix = element.title ? " \"#{element.title}\"" : ''
|
|
17
|
+
|
|
18
|
+
Strategies::Autolink::Registry.render_or_default(
|
|
19
|
+
url: url,
|
|
20
|
+
text: text,
|
|
21
|
+
ctx: ctx,
|
|
22
|
+
default: "[#{text}](#{url}#{title_suffix})"
|
|
23
|
+
)
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
end
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require_relative '../element_serializer'
|
|
4
|
+
|
|
5
|
+
module Coradoc
|
|
6
|
+
module Markdown
|
|
7
|
+
class Serializer
|
|
8
|
+
module Serializers
|
|
9
|
+
class List < ElementSerializer
|
|
10
|
+
handles_type ::Coradoc::Markdown::List
|
|
11
|
+
|
|
12
|
+
def call(element, _ctx)
|
|
13
|
+
marker = element.ordered ? '1.' : '-'
|
|
14
|
+
element.items.flat_map do |item|
|
|
15
|
+
lines = [render_item(item, marker, _ctx)]
|
|
16
|
+
if item.sublist
|
|
17
|
+
lines += call(item.sublist, _ctx).split("\n").map { |l| " #{l}" }
|
|
18
|
+
end
|
|
19
|
+
lines
|
|
20
|
+
end.join("\n")
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
private
|
|
24
|
+
|
|
25
|
+
def render_item(item, marker, ctx)
|
|
26
|
+
text = serialize_item_text(item, ctx)
|
|
27
|
+
if item.checked == true
|
|
28
|
+
"- [x] #{text.sub(/^- \[[ x]\] /, '')}"
|
|
29
|
+
elsif item.checked == false
|
|
30
|
+
"- [ ] #{text.sub(/^- \[[ x]\] /, '')}"
|
|
31
|
+
else
|
|
32
|
+
"#{marker} #{text}"
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
def serialize_item_text(item, ctx)
|
|
37
|
+
return item.text.to_s unless item.children.any?
|
|
38
|
+
|
|
39
|
+
ctx.serialize_inline_join(item.children)
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
end
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require_relative '../element_serializer'
|
|
4
|
+
|
|
5
|
+
module Coradoc
|
|
6
|
+
module Markdown
|
|
7
|
+
class Serializer
|
|
8
|
+
module Serializers
|
|
9
|
+
# Literal block: indented code block (4 leading spaces per line).
|
|
10
|
+
# Distinct from a code block (which carries a language hint).
|
|
11
|
+
class Literal < ElementSerializer
|
|
12
|
+
handles_type ::Coradoc::Markdown::Literal
|
|
13
|
+
|
|
14
|
+
def call(element, _ctx)
|
|
15
|
+
element.content.to_s.lines.map { |line| " #{line}" }.join
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
end
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require_relative '../element_serializer'
|
|
4
|
+
|
|
5
|
+
module Coradoc
|
|
6
|
+
module Markdown
|
|
7
|
+
class Serializer
|
|
8
|
+
module Serializers
|
|
9
|
+
class Math < ElementSerializer
|
|
10
|
+
handles_type ::Coradoc::Markdown::Math
|
|
11
|
+
|
|
12
|
+
def call(element, _ctx)
|
|
13
|
+
if element.inline?
|
|
14
|
+
"$$#{element.content}$$"
|
|
15
|
+
else
|
|
16
|
+
"$$\n#{element.content}\n$$"
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
end
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require_relative '../element_serializer'
|
|
4
|
+
|
|
5
|
+
module Coradoc
|
|
6
|
+
module Markdown
|
|
7
|
+
class Serializer
|
|
8
|
+
module Serializers
|
|
9
|
+
# Open block: emits children inline unless id/classes are present,
|
|
10
|
+
# in which case it wraps them in an HTML `<div>`.
|
|
11
|
+
class OpenBlock < ElementSerializer
|
|
12
|
+
handles_type ::Coradoc::Markdown::OpenBlock
|
|
13
|
+
|
|
14
|
+
def call(element, ctx)
|
|
15
|
+
children_md = element.children.map { |c| ctx.serialize(c) }.join("\n\n")
|
|
16
|
+
return children_md unless needs_wrapper?(element)
|
|
17
|
+
|
|
18
|
+
attrs = wrapper_attrs(element)
|
|
19
|
+
%(<div#{attrs}>\n#{children_md}\n</div>)
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
private
|
|
23
|
+
|
|
24
|
+
def needs_wrapper?(element)
|
|
25
|
+
element.id || (element.classes && element.classes.any?)
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
def wrapper_attrs(element)
|
|
29
|
+
parts = []
|
|
30
|
+
parts << %(id="#{element.id}") if element.id
|
|
31
|
+
element.classes&.each { |c| parts << %(class="#{c}") }
|
|
32
|
+
parts.empty? ? '' : " #{parts.join(' ')}"
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
end
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require_relative '../element_serializer'
|
|
4
|
+
|
|
5
|
+
module Coradoc
|
|
6
|
+
module Markdown
|
|
7
|
+
class Serializer
|
|
8
|
+
module Serializers
|
|
9
|
+
class Paragraph < ElementSerializer
|
|
10
|
+
handles_type ::Coradoc::Markdown::Paragraph
|
|
11
|
+
|
|
12
|
+
def call(element, ctx)
|
|
13
|
+
if element.children.any?
|
|
14
|
+
ctx.serialize_inline_join(element.children)
|
|
15
|
+
else
|
|
16
|
+
element.text.to_s
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
end
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require_relative '../element_serializer'
|
|
4
|
+
|
|
5
|
+
module Coradoc
|
|
6
|
+
module Markdown
|
|
7
|
+
class Serializer
|
|
8
|
+
module Serializers
|
|
9
|
+
# Pass block: emit content inside kramdown's nomarkdown extension
|
|
10
|
+
# so it bypasses Markdown rendering.
|
|
11
|
+
class Pass < ElementSerializer
|
|
12
|
+
handles_type ::Coradoc::Markdown::Pass
|
|
13
|
+
|
|
14
|
+
def call(element, _ctx)
|
|
15
|
+
"{::nomarkdown}#{element.content.to_s}{:/}"
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
end
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require_relative '../element_serializer'
|
|
4
|
+
|
|
5
|
+
module Coradoc
|
|
6
|
+
module Markdown
|
|
7
|
+
class Serializer
|
|
8
|
+
module Serializers
|
|
9
|
+
class Sidebar < ElementSerializer
|
|
10
|
+
handles_type ::Coradoc::Markdown::Sidebar
|
|
11
|
+
|
|
12
|
+
def call(element, _ctx)
|
|
13
|
+
title_html = element.title ? %(<div class="title">#{element.title}</div>\n) : ''
|
|
14
|
+
%(<div class="sidebar">\n#{title_html}#{element.content.to_s}\n</div>)
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
end
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require_relative '../element_serializer'
|
|
4
|
+
|
|
5
|
+
module Coradoc
|
|
6
|
+
module Markdown
|
|
7
|
+
class Serializer
|
|
8
|
+
module Serializers
|
|
9
|
+
class Strikethrough < ElementSerializer
|
|
10
|
+
handles_type ::Coradoc::Markdown::Strikethrough
|
|
11
|
+
|
|
12
|
+
def call(element, _ctx)
|
|
13
|
+
"~~#{element.text}~~"
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
end
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require_relative '../element_serializer'
|
|
4
|
+
|
|
5
|
+
module Coradoc
|
|
6
|
+
module Markdown
|
|
7
|
+
class Serializer
|
|
8
|
+
module Serializers
|
|
9
|
+
class Strong < ElementSerializer
|
|
10
|
+
handles_type ::Coradoc::Markdown::Strong
|
|
11
|
+
|
|
12
|
+
def call(element, _ctx)
|
|
13
|
+
"**#{element.text}**"
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
end
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require_relative '../element_serializer'
|
|
4
|
+
|
|
5
|
+
module Coradoc
|
|
6
|
+
module Markdown
|
|
7
|
+
class Serializer
|
|
8
|
+
module Serializers
|
|
9
|
+
class Subscript < ElementSerializer
|
|
10
|
+
handles_type ::Coradoc::Markdown::Subscript
|
|
11
|
+
|
|
12
|
+
def call(element, _ctx)
|
|
13
|
+
"<sub>#{element.text}</sub>"
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
end
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require_relative '../element_serializer'
|
|
4
|
+
|
|
5
|
+
module Coradoc
|
|
6
|
+
module Markdown
|
|
7
|
+
class Serializer
|
|
8
|
+
module Serializers
|
|
9
|
+
class Superscript < ElementSerializer
|
|
10
|
+
handles_type ::Coradoc::Markdown::Superscript
|
|
11
|
+
|
|
12
|
+
def call(element, _ctx)
|
|
13
|
+
"<sup>#{element.text}</sup>"
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
end
|