coradoc-mirror 0.1.4 → 0.1.5

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 (55) hide show
  1. checksums.yaml +4 -4
  2. data/lib/coradoc/mirror/handler_registry.rb +19 -30
  3. data/lib/coradoc/mirror/handlers/code_block.rb +17 -24
  4. data/lib/coradoc/mirror/handlers/inline.rb +14 -0
  5. data/lib/coradoc/mirror/node.rb +39 -0
  6. data/lib/coradoc/mirror/reverse_builder/admonition.rb +20 -0
  7. data/lib/coradoc/mirror/reverse_builder/base.rb +42 -0
  8. data/lib/coradoc/mirror/reverse_builder/biblio_entry.rb +22 -0
  9. data/lib/coradoc/mirror/reverse_builder/bibliography.rb +18 -0
  10. data/lib/coradoc/mirror/reverse_builder/blockquote.rb +20 -0
  11. data/lib/coradoc/mirror/reverse_builder/bullet_list.rb +18 -0
  12. data/lib/coradoc/mirror/reverse_builder/caption.rb +19 -0
  13. data/lib/coradoc/mirror/reverse_builder/code_block.rb +22 -0
  14. data/lib/coradoc/mirror/reverse_builder/definition_list.rb +35 -0
  15. data/lib/coradoc/mirror/reverse_builder/document.rb +22 -0
  16. data/lib/coradoc/mirror/reverse_builder/example.rb +20 -0
  17. data/lib/coradoc/mirror/reverse_builder/figure.rb +35 -0
  18. data/lib/coradoc/mirror/reverse_builder/footnote_entry.rb +18 -0
  19. data/lib/coradoc/mirror/reverse_builder/footnote_marker.rb +24 -0
  20. data/lib/coradoc/mirror/reverse_builder/footnotes.rb +20 -0
  21. data/lib/coradoc/mirror/reverse_builder/frontmatter.rb +21 -0
  22. data/lib/coradoc/mirror/reverse_builder/generic_block.rb +26 -0
  23. data/lib/coradoc/mirror/reverse_builder/header.rb +22 -0
  24. data/lib/coradoc/mirror/reverse_builder/horizontal_rule.rb +17 -0
  25. data/lib/coradoc/mirror/reverse_builder/image.rb +25 -0
  26. data/lib/coradoc/mirror/reverse_builder/include.rb +46 -0
  27. data/lib/coradoc/mirror/reverse_builder/inline_text.rb +19 -0
  28. data/lib/coradoc/mirror/reverse_builder/list_item.rb +37 -0
  29. data/lib/coradoc/mirror/reverse_builder/literal_block.rb +22 -0
  30. data/lib/coradoc/mirror/reverse_builder/open_block.rb +17 -0
  31. data/lib/coradoc/mirror/reverse_builder/ordered_list.rb +18 -0
  32. data/lib/coradoc/mirror/reverse_builder/paragraph.rb +17 -0
  33. data/lib/coradoc/mirror/reverse_builder/pass_block.rb +22 -0
  34. data/lib/coradoc/mirror/reverse_builder/preamble.rb +17 -0
  35. data/lib/coradoc/mirror/reverse_builder/raw_inline.rb +17 -0
  36. data/lib/coradoc/mirror/reverse_builder/section.rb +28 -0
  37. data/lib/coradoc/mirror/reverse_builder/sections.rb +19 -0
  38. data/lib/coradoc/mirror/reverse_builder/sidebar.rb +20 -0
  39. data/lib/coradoc/mirror/reverse_builder/soft_break.rb +17 -0
  40. data/lib/coradoc/mirror/reverse_builder/stem_block.rb +22 -0
  41. data/lib/coradoc/mirror/reverse_builder/table.rb +27 -0
  42. data/lib/coradoc/mirror/reverse_builder/table_body.rb +17 -0
  43. data/lib/coradoc/mirror/reverse_builder/table_cell.rb +24 -0
  44. data/lib/coradoc/mirror/reverse_builder/table_head.rb +17 -0
  45. data/lib/coradoc/mirror/reverse_builder/table_row.rb +18 -0
  46. data/lib/coradoc/mirror/reverse_builder/text.rb +24 -0
  47. data/lib/coradoc/mirror/reverse_builder/toc.rb +17 -0
  48. data/lib/coradoc/mirror/reverse_builder/toc_entry.rb +18 -0
  49. data/lib/coradoc/mirror/reverse_builder/verse.rb +20 -0
  50. data/lib/coradoc/mirror/reverse_builder.rb +59 -574
  51. data/lib/coradoc/mirror/version.rb +1 -1
  52. data/lib/coradoc/mirror.rb +2 -0
  53. data/lib/coradoc-mirror.rb +0 -2
  54. metadata +45 -2
  55. data/lib/coradoc/mirror/output.rb +0 -62
@@ -0,0 +1,22 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'base'
4
+
5
+ module Coradoc
6
+ module Mirror
7
+ module ReverseBuilder
8
+ class Header < Base
9
+ registers 'floating_title', 'heading'
10
+
11
+ def build(node)
12
+ attrs = node.attrs
13
+ CoreModel::HeaderElement.new(
14
+ title: attrs&.title,
15
+ level: attrs&.level,
16
+ children: build_content(node)
17
+ )
18
+ end
19
+ end
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'base'
4
+
5
+ module Coradoc
6
+ module Mirror
7
+ module ReverseBuilder
8
+ class HorizontalRule < Base
9
+ registers 'horizontal_rule', 'thematic_break'
10
+
11
+ def build(_node)
12
+ CoreModel::HorizontalRuleBlock.new
13
+ end
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,25 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'base'
4
+
5
+ module Coradoc
6
+ module Mirror
7
+ module ReverseBuilder
8
+ class Image < Base
9
+ registers 'image'
10
+
11
+ def build(node)
12
+ attrs = node.attrs
13
+ CoreModel::Image.new(
14
+ src: attrs&.src,
15
+ alt: attrs&.alt,
16
+ title: attrs&.title,
17
+ caption: attrs&.caption,
18
+ width: attrs&.width,
19
+ height: attrs&.height
20
+ )
21
+ end
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,46 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'base'
4
+
5
+ module Coradoc
6
+ module Mirror
7
+ module ReverseBuilder
8
+ # Include directive: round-trips back to a CoreModel::Include link
9
+ # node. The text graph is preserved through mirror_json → core.
10
+ class Include < Base
11
+ registers 'include'
12
+
13
+ def build(node)
14
+ attrs = node.attrs
15
+ CoreModel::Include.new(
16
+ target: attrs&.target,
17
+ options: build_options(attrs),
18
+ raw_options: attrs&.raw_options || ''
19
+ )
20
+ end
21
+
22
+ private
23
+
24
+ def build_options(attrs)
25
+ return CoreModel::IncludeOptions.new unless attrs
26
+
27
+ CoreModel::IncludeOptions.new(
28
+ tags: Array(attrs.tags),
29
+ tags_wildcard: attrs.tags == ['*'],
30
+ tags_inverted: attrs.tags == ['**'],
31
+ lines_spec: attrs.lines,
32
+ leveloffset: parse_leveloffset(attrs.leveloffset),
33
+ indent: attrs.indent,
34
+ file_encoding: attrs.file_encoding
35
+ )
36
+ end
37
+
38
+ def parse_leveloffset(raw)
39
+ return nil if raw.nil? || raw.to_s.empty?
40
+
41
+ Coradoc::CoreModel::IncludeLevelOffset.parse(raw.to_s)
42
+ end
43
+ end
44
+ end
45
+ end
46
+ end
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'base'
4
+
5
+ module Coradoc
6
+ module Mirror
7
+ module ReverseBuilder
8
+ class InlineText < Base
9
+ registers 'dt', 'dd'
10
+
11
+ def build(node)
12
+ children = build_inline_children(node)
13
+ text = children.map { |c| c.is_a?(CoreModel::TextContent) ? c.text : '' }.join
14
+ CoreModel::InlineElement.new(content: text)
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,37 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'base'
4
+
5
+ module Coradoc
6
+ module Mirror
7
+ module ReverseBuilder
8
+ class ListItem < Base
9
+ registers 'list_item'
10
+
11
+ LIST_TYPES = %w[bullet_list ordered_list].freeze
12
+ private_constant :LIST_TYPES
13
+
14
+ def build(node)
15
+ children = build_inline_children(node)
16
+ text = children.map { |c| c.is_a?(CoreModel::TextContent) ? c.text : '' }.join
17
+
18
+ CoreModel::ListItem.new(
19
+ content: text,
20
+ children: children,
21
+ nested_list: find_nested_list(node)
22
+ )
23
+ end
24
+
25
+ private
26
+
27
+ def find_nested_list(node)
28
+ node.content&.each do |child|
29
+ next unless child.is_a?(Node)
30
+ return build_node(child) if LIST_TYPES.include?(child.type)
31
+ end
32
+ nil
33
+ end
34
+ end
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,22 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'base'
4
+
5
+ module Coradoc
6
+ module Mirror
7
+ module ReverseBuilder
8
+ class LiteralBlock < Base
9
+ registers 'literal'
10
+
11
+ def build(node)
12
+ attrs = node.attrs
13
+ CoreModel::LiteralBlock.new(
14
+ content: attrs&.text || extract_text(node),
15
+ language: attrs&.language,
16
+ title: attrs&.title
17
+ )
18
+ end
19
+ end
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'base'
4
+
5
+ module Coradoc
6
+ module Mirror
7
+ module ReverseBuilder
8
+ class OpenBlock < Base
9
+ registers 'open_block'
10
+
11
+ def build(node)
12
+ CoreModel::OpenBlock.new(children: build_content(node))
13
+ end
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,18 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'base'
4
+
5
+ module Coradoc
6
+ module Mirror
7
+ module ReverseBuilder
8
+ class OrderedList < Base
9
+ registers 'ordered_list'
10
+
11
+ def build(node)
12
+ items = build_content(node).select { |c| c.is_a?(CoreModel::ListItem) }
13
+ CoreModel::ListBlock.new(marker_type: 'ordered', items: items)
14
+ end
15
+ end
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'base'
4
+
5
+ module Coradoc
6
+ module Mirror
7
+ module ReverseBuilder
8
+ class Paragraph < Base
9
+ registers 'paragraph'
10
+
11
+ def build(node)
12
+ CoreModel::ParagraphBlock.new(children: build_inline_children(node))
13
+ end
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,22 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'base'
4
+
5
+ module Coradoc
6
+ module Mirror
7
+ module ReverseBuilder
8
+ class PassBlock < Base
9
+ registers 'pass'
10
+
11
+ def build(node)
12
+ attrs = node.attrs
13
+ CoreModel::PassBlock.new(
14
+ content: attrs&.text || extract_text(node),
15
+ language: attrs&.language,
16
+ title: attrs&.title
17
+ )
18
+ end
19
+ end
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'base'
4
+
5
+ module Coradoc
6
+ module Mirror
7
+ module ReverseBuilder
8
+ class Preamble < Base
9
+ registers 'preface'
10
+
11
+ def build(node)
12
+ CoreModel::PreambleElement.new(children: build_content(node))
13
+ end
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'base'
4
+
5
+ module Coradoc
6
+ module Mirror
7
+ module ReverseBuilder
8
+ class RawInline < Base
9
+ registers 'raw_inline'
10
+
11
+ def build(node)
12
+ CoreModel::RawInlineElement.new(content: node.text.to_s)
13
+ end
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,28 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'base'
4
+
5
+ module Coradoc
6
+ module Mirror
7
+ module ReverseBuilder
8
+ # All JS SECTION_TYPES reverse to a generic SectionElement. Style
9
+ # information lives in the original AsciiDoc and is preserved only
10
+ # on the forward side; the reverse side collapses them.
11
+ class Section < Base
12
+ registers 'section', 'clause', 'annex', 'content_section',
13
+ 'abstract', 'foreword', 'introduction',
14
+ 'acknowledgements', 'terms', 'definitions', 'references'
15
+
16
+ def build(node)
17
+ attrs = node.attrs
18
+ CoreModel::SectionElement.new(
19
+ title: attrs&.title,
20
+ level: attrs&.level,
21
+ id: attrs&.id,
22
+ children: build_content(node)
23
+ )
24
+ end
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'base'
4
+
5
+ module Coradoc
6
+ module Mirror
7
+ module ReverseBuilder
8
+ # `sections` is a structural container only — unwrap directly into
9
+ # an array. MirrorToCoreModel#build_content flattens arrays.
10
+ class Sections < Base
11
+ registers 'sections'
12
+
13
+ def build(node)
14
+ build_content(node)
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,20 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'base'
4
+
5
+ module Coradoc
6
+ module Mirror
7
+ module ReverseBuilder
8
+ class Sidebar < Base
9
+ registers 'sidebar'
10
+
11
+ def build(node)
12
+ CoreModel::SidebarBlock.new(
13
+ title: node.attrs&.title,
14
+ children: build_content(node)
15
+ )
16
+ end
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'base'
4
+
5
+ module Coradoc
6
+ module Mirror
7
+ module ReverseBuilder
8
+ class SoftBreak < Base
9
+ registers 'soft_break'
10
+
11
+ def build(_node)
12
+ CoreModel::LineBreakElement.new
13
+ end
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,22 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'base'
4
+
5
+ module Coradoc
6
+ module Mirror
7
+ module ReverseBuilder
8
+ class StemBlock < Base
9
+ registers 'stem'
10
+
11
+ def build(node)
12
+ attrs = node.attrs
13
+ CoreModel::StemBlock.new(
14
+ content: attrs&.text || extract_text(node),
15
+ language: attrs&.language || 'latex',
16
+ title: attrs&.title
17
+ )
18
+ end
19
+ end
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,27 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'base'
4
+
5
+ module Coradoc
6
+ module Mirror
7
+ module ReverseBuilder
8
+ class Table < Base
9
+ registers 'table'
10
+
11
+ def build(node)
12
+ rows = []
13
+ node.content&.each do |child|
14
+ next unless child.is_a?(Node)
15
+ next unless %w[table_head table_body].include?(child.type)
16
+
17
+ child.content&.each do |row_node|
18
+ rows << build_node(row_node) if row_node.is_a?(Node)
19
+ end
20
+ end
21
+
22
+ CoreModel::Table.new(title: node.attrs&.title, rows: rows)
23
+ end
24
+ end
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'base'
4
+
5
+ module Coradoc
6
+ module Mirror
7
+ module ReverseBuilder
8
+ class TableBody < Base
9
+ registers 'table_body'
10
+
11
+ def build(node)
12
+ build_content(node).first || CoreModel::TableRow.new
13
+ end
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,24 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'base'
4
+
5
+ module Coradoc
6
+ module Mirror
7
+ module ReverseBuilder
8
+ class TableCell < Base
9
+ registers 'table_cell'
10
+
11
+ def build(node)
12
+ attrs = node.attrs
13
+ CoreModel::TableCell.new(
14
+ content: extract_text(node),
15
+ header: attrs&.header || false,
16
+ colspan: attrs&.colspan,
17
+ rowspan: attrs&.rowspan,
18
+ alignment: attrs&.alignment
19
+ )
20
+ end
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'base'
4
+
5
+ module Coradoc
6
+ module Mirror
7
+ module ReverseBuilder
8
+ class TableHead < Base
9
+ registers 'table_head'
10
+
11
+ def build(node)
12
+ build_content(node).first || CoreModel::TableRow.new
13
+ end
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,18 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'base'
4
+
5
+ module Coradoc
6
+ module Mirror
7
+ module ReverseBuilder
8
+ class TableRow < Base
9
+ registers 'table_row'
10
+
11
+ def build(node)
12
+ cells = build_content(node).select { |c| c.is_a?(CoreModel::TableCell) }
13
+ CoreModel::TableRow.new(cells: cells)
14
+ end
15
+ end
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,24 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'base'
4
+
5
+ module Coradoc
6
+ module Mirror
7
+ module ReverseBuilder
8
+ class Text < Base
9
+ registers 'text'
10
+
11
+ def build(node)
12
+ text = node.text || ''
13
+ marks = node.marks || []
14
+
15
+ return CoreModel::TextContent.new(text: text) if marks.empty?
16
+
17
+ marks.reduce(CoreModel::TextContent.new(text: text)) do |current, mark|
18
+ apply_mark(current, mark)
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'base'
4
+
5
+ module Coradoc
6
+ module Mirror
7
+ module ReverseBuilder
8
+ class Toc < Base
9
+ registers 'toc'
10
+
11
+ def build(_node)
12
+ CoreModel::Toc.new
13
+ end
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,18 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'base'
4
+
5
+ module Coradoc
6
+ module Mirror
7
+ module ReverseBuilder
8
+ class TocEntry < Base
9
+ registers 'toc_entry'
10
+
11
+ def build(node)
12
+ attrs = node.attrs
13
+ CoreModel::TocEntry.new(id: attrs&.id, title: attrs&.title)
14
+ end
15
+ end
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,20 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'base'
4
+
5
+ module Coradoc
6
+ module Mirror
7
+ module ReverseBuilder
8
+ class Verse < Base
9
+ registers 'verse'
10
+
11
+ def build(node)
12
+ CoreModel::VerseBlock.new(
13
+ content: extract_text(node),
14
+ attribution: node.attrs&.attribution
15
+ )
16
+ end
17
+ end
18
+ end
19
+ end
20
+ end