coradoc 0.1.0 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (126) hide show
  1. checksums.yaml +4 -4
  2. data/.docker/Dockerfile +1 -1
  3. data/.docker/docker-compose.yml +2 -2
  4. data/.editorconfig +15 -0
  5. data/.pryrc.sample +1 -0
  6. data/CHANGELOG.md +4 -0
  7. data/Rakefile +10 -0
  8. data/coradoc.gemspec +11 -2
  9. data/exe/reverse_adoc +70 -0
  10. data/exe/w2a +72 -0
  11. data/lib/coradoc/document.rb +40 -23
  12. data/lib/coradoc/element/admonition.rb +13 -0
  13. data/lib/coradoc/{document → element}/attribute.rb +1 -1
  14. data/lib/coradoc/element/attribute_list.rb +46 -0
  15. data/lib/coradoc/element/audio.rb +22 -0
  16. data/lib/coradoc/element/author.rb +22 -0
  17. data/lib/coradoc/element/base.rb +15 -0
  18. data/lib/coradoc/element/block/core.rb +69 -0
  19. data/lib/coradoc/element/block/example.rb +22 -0
  20. data/lib/coradoc/element/block/literal.rb +19 -0
  21. data/lib/coradoc/element/block/quote.rb +19 -0
  22. data/lib/coradoc/element/block/side.rb +17 -0
  23. data/lib/coradoc/element/block/sourcecode.rb +20 -0
  24. data/lib/coradoc/element/block.rb +13 -0
  25. data/lib/coradoc/element/break.rb +11 -0
  26. data/lib/coradoc/{document/bibdata.rb → element/document_attributes.rb} +4 -8
  27. data/lib/coradoc/element/header.rb +20 -0
  28. data/lib/coradoc/element/image/block_image.rb +12 -0
  29. data/lib/coradoc/element/image/core.rb +25 -0
  30. data/lib/coradoc/element/image/inline_image.rb +12 -0
  31. data/lib/coradoc/element/image.rb +10 -0
  32. data/lib/coradoc/element/inline/anchor.rb +17 -0
  33. data/lib/coradoc/element/inline/bold.rb +20 -0
  34. data/lib/coradoc/element/inline/cross_reference.rb +22 -0
  35. data/lib/coradoc/element/inline/hard_line_break.rb +11 -0
  36. data/lib/coradoc/element/inline/highlight.rb +20 -0
  37. data/lib/coradoc/element/inline/image.rb +26 -0
  38. data/lib/coradoc/element/inline/italic.rb +20 -0
  39. data/lib/coradoc/element/inline/link.rb +26 -0
  40. data/lib/coradoc/element/inline/monospace.rb +20 -0
  41. data/lib/coradoc/element/inline/quotation.rb +18 -0
  42. data/lib/coradoc/element/inline/subscript.rb +18 -0
  43. data/lib/coradoc/element/inline/superscript.rb +18 -0
  44. data/lib/coradoc/element/inline.rb +18 -0
  45. data/lib/coradoc/element/list/core.rb +35 -0
  46. data/lib/coradoc/element/list/definition.rb +8 -0
  47. data/lib/coradoc/element/list/ordered.rb +15 -0
  48. data/lib/coradoc/element/list/unordered.rb +15 -0
  49. data/lib/coradoc/element/list.rb +12 -0
  50. data/lib/coradoc/element/list_item.rb +19 -0
  51. data/lib/coradoc/element/paragraph.rb +32 -0
  52. data/lib/coradoc/element/revision.rb +25 -0
  53. data/lib/coradoc/element/section.rb +37 -0
  54. data/lib/coradoc/element/table.rb +67 -0
  55. data/lib/coradoc/element/text_element.rb +32 -0
  56. data/lib/coradoc/{document → element}/title.rb +14 -5
  57. data/lib/coradoc/element/video.rb +23 -0
  58. data/lib/coradoc/generator.rb +17 -0
  59. data/lib/coradoc/legacy_parser.rb +48 -48
  60. data/lib/coradoc/oscal.rb +6 -5
  61. data/lib/coradoc/parser/asciidoc/base.rb +17 -17
  62. data/lib/coradoc/parser/asciidoc/content.rb +55 -29
  63. data/lib/coradoc/parser/asciidoc/document_attributes.rb +19 -0
  64. data/lib/coradoc/parser/asciidoc/header.rb +13 -10
  65. data/lib/coradoc/parser/asciidoc/section.rb +6 -6
  66. data/lib/coradoc/parser/base.rb +5 -5
  67. data/lib/coradoc/parser.rb +1 -1
  68. data/lib/coradoc/reverse_adoc/LICENSE.txt +25 -0
  69. data/lib/coradoc/reverse_adoc/README.adoc +302 -0
  70. data/lib/coradoc/reverse_adoc/cleaner.rb +113 -0
  71. data/lib/coradoc/reverse_adoc/config.rb +54 -0
  72. data/lib/coradoc/reverse_adoc/converters/a.rb +42 -0
  73. data/lib/coradoc/reverse_adoc/converters/aside.rb +16 -0
  74. data/lib/coradoc/reverse_adoc/converters/audio.rb +29 -0
  75. data/lib/coradoc/reverse_adoc/converters/base.rb +100 -0
  76. data/lib/coradoc/reverse_adoc/converters/blockquote.rb +27 -0
  77. data/lib/coradoc/reverse_adoc/converters/br.rb +15 -0
  78. data/lib/coradoc/reverse_adoc/converters/bypass.rb +81 -0
  79. data/lib/coradoc/reverse_adoc/converters/code.rb +56 -0
  80. data/lib/coradoc/reverse_adoc/converters/div.rb +18 -0
  81. data/lib/coradoc/reverse_adoc/converters/drop.rb +22 -0
  82. data/lib/coradoc/reverse_adoc/converters/em.rb +55 -0
  83. data/lib/coradoc/reverse_adoc/converters/figure.rb +25 -0
  84. data/lib/coradoc/reverse_adoc/converters/h.rb +42 -0
  85. data/lib/coradoc/reverse_adoc/converters/head.rb +23 -0
  86. data/lib/coradoc/reverse_adoc/converters/hr.rb +15 -0
  87. data/lib/coradoc/reverse_adoc/converters/ignore.rb +16 -0
  88. data/lib/coradoc/reverse_adoc/converters/img.rb +93 -0
  89. data/lib/coradoc/reverse_adoc/converters/li.rb +17 -0
  90. data/lib/coradoc/reverse_adoc/converters/mark.rb +21 -0
  91. data/lib/coradoc/reverse_adoc/converters/math.rb +31 -0
  92. data/lib/coradoc/reverse_adoc/converters/ol.rb +64 -0
  93. data/lib/coradoc/reverse_adoc/converters/p.rb +23 -0
  94. data/lib/coradoc/reverse_adoc/converters/pass_through.rb +13 -0
  95. data/lib/coradoc/reverse_adoc/converters/pre.rb +55 -0
  96. data/lib/coradoc/reverse_adoc/converters/q.rb +16 -0
  97. data/lib/coradoc/reverse_adoc/converters/strong.rb +52 -0
  98. data/lib/coradoc/reverse_adoc/converters/sub.rb +16 -0
  99. data/lib/coradoc/reverse_adoc/converters/sup.rb +16 -0
  100. data/lib/coradoc/reverse_adoc/converters/table.rb +69 -0
  101. data/lib/coradoc/reverse_adoc/converters/td.rb +83 -0
  102. data/lib/coradoc/reverse_adoc/converters/text.rb +65 -0
  103. data/lib/coradoc/reverse_adoc/converters/th.rb +14 -0
  104. data/lib/coradoc/reverse_adoc/converters/tr.rb +22 -0
  105. data/lib/coradoc/reverse_adoc/converters/video.rb +29 -0
  106. data/lib/coradoc/reverse_adoc/converters.rb +32 -0
  107. data/lib/coradoc/reverse_adoc/errors.rb +10 -0
  108. data/lib/coradoc/reverse_adoc/html_converter.rb +61 -0
  109. data/lib/coradoc/reverse_adoc.rb +27 -0
  110. data/lib/coradoc/transformer.rb +59 -46
  111. data/lib/coradoc/version.rb +1 -1
  112. data/lib/coradoc.rb +6 -4
  113. data/lib/reverse_adoc.rb +20 -0
  114. metadata +231 -23
  115. data/lib/coradoc/document/admonition.rb +0 -11
  116. data/lib/coradoc/document/author.rb +0 -11
  117. data/lib/coradoc/document/base.rb +0 -17
  118. data/lib/coradoc/document/block.rb +0 -34
  119. data/lib/coradoc/document/header.rb +0 -11
  120. data/lib/coradoc/document/list.rb +0 -14
  121. data/lib/coradoc/document/paragraph.rb +0 -19
  122. data/lib/coradoc/document/revision.rb +0 -11
  123. data/lib/coradoc/document/section.rb +0 -28
  124. data/lib/coradoc/document/table.rb +0 -20
  125. data/lib/coradoc/document/text_element.rb +0 -22
  126. data/lib/coradoc/parser/asciidoc/bibdata.rb +0 -19
@@ -0,0 +1,27 @@
1
+ module Coradoc::ReverseAdoc
2
+ module Converters
3
+ class Blockquote < Base
4
+ def to_coradoc(node, state = {})
5
+ node["id"]
6
+ cite = node["cite"]
7
+ attributes = if cite.nil?
8
+ nil
9
+ else
10
+ Coradoc::Element::AttributeList.new(
11
+ "quote", cite
12
+ )
13
+ end
14
+ content = treat_children(node, state).strip
15
+ content = Coradoc::ReverseAdoc.cleaner.remove_newlines(content)
16
+ Coradoc::Element::Block::Quote.new(nil, lines: content,
17
+ attributes: attributes)
18
+ end
19
+
20
+ def convert(node, state = {})
21
+ Coradoc::Generator.gen_adoc(to_coradoc(node, state))
22
+ end
23
+ end
24
+
25
+ register :blockquote, Blockquote.new
26
+ end
27
+ end
@@ -0,0 +1,15 @@
1
+ module Coradoc::ReverseAdoc
2
+ module Converters
3
+ class Br < Base
4
+ def to_coradoc(_node, _state = {})
5
+ Coradoc::Element::Inline::HardLineBreak.new
6
+ end
7
+
8
+ def convert(node, state = {})
9
+ Coradoc::Generator.gen_adoc(to_coradoc(node, state))
10
+ end
11
+ end
12
+
13
+ register :br, Br.new
14
+ end
15
+ end
@@ -0,0 +1,81 @@
1
+ module Coradoc::ReverseAdoc
2
+ module Converters
3
+ class Bypass < Base
4
+ def to_coradoc(node, state = {})
5
+ treat_children_coradoc(node, state)
6
+ end
7
+
8
+ def convert(node, state = {})
9
+ Coradoc::Generator.gen_adoc(to_coradoc(node, state))
10
+ end
11
+ end
12
+
13
+ register :document, Bypass.new
14
+ register :html, Bypass.new
15
+ register :body, Bypass.new
16
+ register :span, Bypass.new
17
+ register :thead, Bypass.new
18
+ register :tbody, Bypass.new
19
+ register :tfoot, Bypass.new
20
+ register :abbr, Bypass.new
21
+ register :acronym, Bypass.new
22
+ register :address, Bypass.new
23
+ register :applet, Bypass.new
24
+ register :map, Bypass.new
25
+ register :area, Bypass.new
26
+ register :bdi, Bypass.new
27
+ register :bdo, Bypass.new
28
+ register :big, Bypass.new
29
+ register :button, Bypass.new
30
+ register :canvas, Bypass.new
31
+ register :data, Bypass.new
32
+ register :datalist, Bypass.new
33
+ register :del, Bypass.new
34
+ register :ins, Bypass.new
35
+ register :dfn, Bypass.new
36
+ register :dialog, Bypass.new
37
+ register :embed, Bypass.new
38
+ register :fieldset, Bypass.new
39
+ register :font, Bypass.new
40
+ register :footer, Bypass.new
41
+ register :form, Bypass.new
42
+ register :frame, Bypass.new
43
+ register :frameset, Bypass.new
44
+ register :header, Bypass.new
45
+ register :iframe, Bypass.new
46
+ register :input, Bypass.new
47
+ register :label, Bypass.new
48
+ register :legend, Bypass.new
49
+ register :main, Bypass.new
50
+ register :menu, Bypass.new
51
+ register :menulist, Bypass.new
52
+ register :meter, Bypass.new
53
+ register :nav, Bypass.new
54
+ register :noframes, Bypass.new
55
+ register :noscript, Bypass.new
56
+ register :object, Bypass.new
57
+ register :optgroup, Bypass.new
58
+ register :option, Bypass.new
59
+ register :output, Bypass.new
60
+ register :param, Bypass.new
61
+ register :picture, Bypass.new
62
+ register :progress, Bypass.new
63
+ register :ruby, Bypass.new
64
+ register :rt, Bypass.new
65
+ register :rp, Bypass.new
66
+ register :s, Bypass.new
67
+ register :select, Bypass.new
68
+ register :small, Bypass.new
69
+ register :span, Bypass.new
70
+ register :strike, Bypass.new
71
+ register :details, Bypass.new
72
+ register :section, Bypass.new
73
+ register :summary, Bypass.new
74
+ register :svg, Bypass.new
75
+ register :template, Bypass.new
76
+ register :textarea, Bypass.new
77
+ register :track, Bypass.new
78
+ register :u, Bypass.new
79
+ register :wbr, Bypass.new
80
+ end
81
+ end
@@ -0,0 +1,56 @@
1
+ module Coradoc::ReverseAdoc
2
+ module Converters
3
+ class Code < Base
4
+ def to_coradoc(node, state = {})
5
+ content = treat_children_coradoc(node, state)
6
+
7
+ if Coradoc::Generator.gen_adoc(content).strip.empty?
8
+ return ""
9
+ end
10
+
11
+ if node_has_ancestor?(node, ["code", "tt", "kbd", "samp", "var"])
12
+ return content
13
+ end
14
+
15
+ node.text =~ /^(\s+)/
16
+ leading_whitespace = $1
17
+ has_leading_whitespace = !leading_whitespace.nil?
18
+
19
+ if has_leading_whitespace
20
+ first_text = node.at_xpath("./text()[1]")
21
+ first_text.replace(first_text.text.lstrip)
22
+ leading_whitespace = " "
23
+ end
24
+
25
+ node.text =~ /(\s+)$/
26
+ trailing_whitespace = $1
27
+ has_trailing_whitespace = !trailing_whitespace.nil?
28
+
29
+ if has_trailing_whitespace
30
+ last_text = node.at_xpath("./text()[last()]")
31
+ last_text.replace(last_text.text.rstrip)
32
+ trailing_whitespace = " "
33
+ end
34
+
35
+ u_before = unconstrained_before?(node)
36
+ u_after = unconstrained_after?(node)
37
+ u = !((!u_before || has_leading_whitespace) && (!u_after || has_trailing_whitespace))
38
+ e = Coradoc::Element::Inline::Monospace.new(
39
+ Coradoc::Element::TextElement.new(content), u
40
+ )
41
+
42
+ [leading_whitespace, e, trailing_whitespace]
43
+ end
44
+
45
+ def convert(node, state = {})
46
+ Coradoc::Generator.gen_adoc(to_coradoc(node, state))
47
+ end
48
+ end
49
+
50
+ register :code, Code.new
51
+ register :tt, Code.new
52
+ register :kbd, Code.new
53
+ register :samp, Code.new
54
+ register :var, Code.new
55
+ end
56
+ end
@@ -0,0 +1,18 @@
1
+ module Coradoc::ReverseAdoc
2
+ module Converters
3
+ class Div < Base
4
+ def to_coradoc(node, state = {})
5
+ id = node["id"]
6
+ contents = treat_children_coradoc(node, state)
7
+ Coradoc::Element::Section.new(nil, id: id, contents: contents)
8
+ end
9
+
10
+ def convert(node, state = {})
11
+ Coradoc::Generator.gen_adoc(to_coradoc(node, state))
12
+ end
13
+ end
14
+
15
+ register :div, Div.new
16
+ register :article, Div.new
17
+ end
18
+ end
@@ -0,0 +1,22 @@
1
+ module Coradoc::ReverseAdoc
2
+ module Converters
3
+ class Drop < Base
4
+ def to_coradoc(node, state = {})
5
+ convert(node, state)
6
+ end
7
+
8
+ def convert(_node, _state = {})
9
+ ""
10
+ end
11
+ end
12
+
13
+ register :caption, Drop.new
14
+ register :figcaption, Drop.new
15
+ register :title, Drop.new
16
+ register :link, Drop.new
17
+ register :style, Drop.new
18
+ register :meta, Drop.new
19
+ register :script, Drop.new
20
+ register :comment, Drop.new
21
+ end
22
+ end
@@ -0,0 +1,55 @@
1
+ module Coradoc::ReverseAdoc
2
+ module Converters
3
+ class Em < Base
4
+ def to_coradoc(node, state = {})
5
+ content = treat_children_coradoc(node,
6
+ state.merge(already_italic: true))
7
+
8
+ if Coradoc::Generator.gen_adoc(content).strip.empty?
9
+ return ""
10
+ end
11
+
12
+ if node_has_ancestor?(node, ["em", "i", "cite"])
13
+ return content
14
+ end
15
+
16
+ node.text =~ /^(\s+)/
17
+ leading_whitespace = $1
18
+ has_leading_whitespace = !leading_whitespace.nil?
19
+
20
+ if has_leading_whitespace
21
+ first_text = node.at_xpath("./text()[1]")
22
+ first_text.replace(first_text.text.lstrip)
23
+ leading_whitespace = " "
24
+ end
25
+
26
+ node.text =~ /(\s+)$/
27
+ trailing_whitespace = $1
28
+ has_trailing_whitespace = !trailing_whitespace.nil?
29
+
30
+ if has_trailing_whitespace
31
+ last_text = node.at_xpath("./text()[last()]")
32
+ last_text.replace(last_text.text.rstrip)
33
+ trailing_whitespace = " "
34
+ end
35
+
36
+ u_before = unconstrained_before?(node)
37
+ u_after = unconstrained_after?(node)
38
+ u = !((!u_before || has_leading_whitespace) && (!u_after || has_trailing_whitespace))
39
+ e = Coradoc::Element::Inline::Italic.new(
40
+ Coradoc::Element::TextElement.new(content), u
41
+ )
42
+
43
+ [leading_whitespace, e, trailing_whitespace]
44
+ end
45
+
46
+ def convert(node, state = {})
47
+ Coradoc::Generator.gen_adoc(to_coradoc(node, state))
48
+ end
49
+ end
50
+
51
+ register :em, Em.new
52
+ register :i, Em.new
53
+ register :cite, Em.new
54
+ end
55
+ end
@@ -0,0 +1,25 @@
1
+ module Coradoc::ReverseAdoc
2
+ module Converters
3
+ class Figure < Base
4
+ def to_coradoc(node, state = {})
5
+ id = node["id"]
6
+ title = extract_title(node)
7
+ content = treat_children_coradoc(node, state)
8
+ Coradoc::Element::Block::Example.new(title, lines: content, id: id)
9
+ end
10
+
11
+ def convert(node, state = {})
12
+ Coradoc::Generator.gen_adoc(to_coradoc(node, state))
13
+ end
14
+
15
+ def extract_title(node)
16
+ title = node.at("./figcaption")
17
+ return "" if title.nil?
18
+
19
+ treat_children_coradoc(title, {})
20
+ end
21
+ end
22
+
23
+ register :figure, Figure.new
24
+ end
25
+ end
@@ -0,0 +1,42 @@
1
+ module Coradoc::ReverseAdoc
2
+ module Converters
3
+ class H < Base
4
+ def to_coradoc(node, state = {})
5
+ id = node["id"]
6
+ internal_anchor = treat_children_anchors(node, state)
7
+
8
+ if id.to_s.empty? && internal_anchor.size.positive?
9
+ id = internal_anchor.first.id
10
+ end
11
+
12
+ level = node.name[/\d/].to_i
13
+ content = treat_children_no_anchors(node, state)
14
+
15
+ Coradoc::Element::Title.new(content, level, id: id)
16
+ end
17
+
18
+ def convert(node, state = {})
19
+ Coradoc::Generator.gen_adoc(to_coradoc(node, state))
20
+ end
21
+
22
+ def treat_children_no_anchors(node, state)
23
+ node.children.reject { |a| a.name == "a" }.inject([]) do |memo, child|
24
+ memo << treat_coradoc(child, state)
25
+ end
26
+ end
27
+
28
+ def treat_children_anchors(node, state)
29
+ node.children.select { |a| a.name == "a" }.inject([]) do |memo, child|
30
+ memo << treat_coradoc(child, state)
31
+ end
32
+ end
33
+ end
34
+
35
+ register :h1, H.new
36
+ register :h2, H.new
37
+ register :h3, H.new
38
+ register :h4, H.new
39
+ register :h5, H.new
40
+ register :h6, H.new
41
+ end
42
+ end
@@ -0,0 +1,23 @@
1
+ module Coradoc::ReverseAdoc
2
+ module Converters
3
+ class Head < Base
4
+ def to_coradoc(node, _state = {})
5
+ title = extract_title(node)
6
+ Coradoc::Element::Header.new(title)
7
+ end
8
+
9
+ def convert(node, state = {})
10
+ Coradoc::Generator.gen_adoc(to_coradoc(node, state))
11
+ end
12
+
13
+ def extract_title(node)
14
+ title = node.at("./title")
15
+ return "(???)" if title.nil?
16
+
17
+ title.text
18
+ end
19
+ end
20
+
21
+ register :head, Head.new
22
+ end
23
+ end
@@ -0,0 +1,15 @@
1
+ module Coradoc::ReverseAdoc
2
+ module Converters
3
+ class Hr < Base
4
+ def to_coradoc(_node, _state = {})
5
+ Coradoc::Element::Break::ThematicBreak.new
6
+ end
7
+
8
+ def convert(node, state = {})
9
+ Coradoc::Generator.gen_adoc(to_coradoc(node, state))
10
+ end
11
+ end
12
+
13
+ register :hr, Hr.new
14
+ end
15
+ end
@@ -0,0 +1,16 @@
1
+ module Coradoc::ReverseAdoc
2
+ module Converters
3
+ class Ignore < Base
4
+ def to_coradoc(node, state = {})
5
+ convert(node, state)
6
+ end
7
+
8
+ def convert(_node, _state = {})
9
+ "" # noop
10
+ end
11
+ end
12
+
13
+ register :colgroup, Ignore.new
14
+ register :col, Ignore.new
15
+ end
16
+ end
@@ -0,0 +1,93 @@
1
+ require "fileutils"
2
+ require "pathname"
3
+ require "tempfile"
4
+ require "base64"
5
+ require "marcel"
6
+
7
+ module Coradoc::ReverseAdoc
8
+ module Converters
9
+ class Img < Base
10
+ def image_number
11
+ sprintf(
12
+ Coradoc::ReverseAdoc.config.image_counter_pattern,
13
+ Coradoc::ReverseAdoc.config.image_counter,
14
+ )
15
+ end
16
+
17
+ def image_number_increment
18
+ Coradoc::ReverseAdoc.config.image_counter += 1
19
+ end
20
+
21
+ def datauri2file(src)
22
+ %r{^data:image/(?:[^;]+);base64,(?<imgdata>.+)$} =~ src
23
+
24
+ dest_dir = Pathname.new(Coradoc::ReverseAdoc.config.destination).dirname
25
+ images_dir = dest_dir.join("images")
26
+ FileUtils.mkdir_p(images_dir)
27
+
28
+ ext, image_src_path = determine_image_src_path(src, imgdata)
29
+ image_dest_path = images_dir + "#{image_number}.#{ext}"
30
+
31
+ # puts "image_dest_path: #{image_dest_path.to_s}"
32
+ # puts "image_src_path: #{image_src_path.to_s}"
33
+
34
+ FileUtils.cp(image_src_path, image_dest_path)
35
+ image_number_increment
36
+
37
+ image_dest_path.relative_path_from(dest_dir)
38
+ end
39
+
40
+ def determine_image_src_path(src, imgdata)
41
+ return copy_temp_file(imgdata) if imgdata
42
+
43
+ ext = File.extname(src).strip.downcase[1..-1]
44
+ [ext, Pathname.new(Coradoc::ReverseAdoc.config.sourcedir).join(src)]
45
+ end
46
+
47
+ def copy_temp_file(imgdata)
48
+ Tempfile.open(["radoc", ".jpg"]) do |f|
49
+ f.binmode
50
+ f.write(Base64.strict_decode64(imgdata))
51
+ f.rewind
52
+ ext = Marcel::MimeType.for(f).sub(%r{^[^/]+/}, "")
53
+ [ext, f.path]
54
+ end
55
+ end
56
+
57
+ def to_coradoc(node, _state = {})
58
+ id = node["id"]
59
+ alt = node["alt"]
60
+ src = node["src"]
61
+ width = node["width"]
62
+ height = node["height"]
63
+
64
+ title = extract_title(node)
65
+
66
+ if Coradoc::ReverseAdoc.config.external_images
67
+ # puts "external image conversion #{id}, #{src}"
68
+ src = datauri2file(src)
69
+ end
70
+
71
+ attributes = Coradoc::Element::AttributeList.new
72
+ # attributes.add_named("id", id) if id
73
+ if alt # && !alt.to_s.empty?
74
+ attributes.add_positional(alt)
75
+ elsif width || height
76
+ attributes.add_positional("\"\"")
77
+ end
78
+ # attributes.add_named("title", title) if title
79
+ attributes.add_positional(width) if width
80
+ attributes.add_positional(height) if height
81
+
82
+ Coradoc::Element::Image::BlockImage.new(title, id, src,
83
+ attributes: attributes)
84
+ end
85
+
86
+ def convert(node, state = {})
87
+ Coradoc::Generator.gen_adoc(to_coradoc(node, state))
88
+ end
89
+ end
90
+
91
+ register :img, Img.new
92
+ end
93
+ end
@@ -0,0 +1,17 @@
1
+ module Coradoc::ReverseAdoc
2
+ module Converters
3
+ class Li < Base
4
+ def to_coradoc(node, state = {})
5
+ id = node["id"]
6
+ content = treat_children_coradoc(node, state)
7
+ Coradoc::Element::ListItem.new(content, id: id)
8
+ end
9
+
10
+ def convert(node, state = {})
11
+ Coradoc::Generator.gen_adoc(to_coradoc(node, state))
12
+ end
13
+ end
14
+
15
+ register :li, Li.new
16
+ end
17
+ end
@@ -0,0 +1,21 @@
1
+ module Coradoc::ReverseAdoc
2
+ module Converters
3
+ class Mark < Base
4
+ def to_coradoc(node, state = {})
5
+ content = treat_children(node, state.merge(already_strong: true))
6
+
7
+ if content.strip.empty? || state[:already_strong]
8
+ return content
9
+ end
10
+
11
+ Coradoc::Element::Inline::Highlight.new(content, constrained?(node))
12
+ end
13
+
14
+ def convert(node, state = {})
15
+ Coradoc::Generator.gen_adoc(to_coradoc(node, state))
16
+ end
17
+ end
18
+
19
+ register :mark, Mark.new
20
+ end
21
+ end
@@ -0,0 +1,31 @@
1
+ # Unless run with Coradoc::ReverseAdoc.config.mathml2asciimath,
2
+ # this is cheating: we're injecting MathML into Asciidoctor, but
3
+ # Asciidoctor only understands AsciiMath or LaTeX
4
+
5
+ require "mathml2asciimath"
6
+
7
+ module Coradoc::ReverseAdoc
8
+ module Converters
9
+ class Math < Base
10
+ # FIXIT
11
+ def to_coradoc(node, state = {})
12
+ convert(node, state)
13
+ end
14
+
15
+ def convert(node, _state = {})
16
+ stem = node.to_s.gsub(/\n/, " ")
17
+ stem = MathML2AsciiMath.m2a(stem) if Coradoc::ReverseAdoc.config.mathml2asciimath
18
+ unless stem.nil?
19
+ stem = stem.gsub(/\[/, "\\[").gsub(/\]/, "\\]").gsub(
20
+ /\(\(([^\)]+)\)\)/, "(\\1)"
21
+ )
22
+ end
23
+
24
+ # TODO: This is to be done in Coradoc
25
+ " stem:[" << stem << "] "
26
+ end
27
+ end
28
+
29
+ register :math, Math.new
30
+ end
31
+ end
@@ -0,0 +1,64 @@
1
+ module Coradoc::ReverseAdoc
2
+ module Converters
3
+ class Ol < Base
4
+ # FIXIT
5
+ def to_coradoc(node, state = {})
6
+ # convert(node, state)
7
+ id = node["id"]
8
+ ol_count = state.fetch(:ol_count, 0) + 1
9
+ attrs = ol_attrs(node)
10
+ items = treat_children_coradoc(node, state.merge(ol_count: ol_count))
11
+
12
+ options = {}.tap do |hash|
13
+ hash[:id] = id
14
+ hash[:ol_count] = ol_count
15
+ hash[:attrs] = attrs
16
+ end
17
+
18
+ case get_list_type(node, state)
19
+ when :ordered
20
+ Coradoc::Element::List::Ordered.new(items, options)
21
+ when :unordered
22
+ Coradoc::Element::List::Unordered.new(items, options)
23
+ end
24
+ end
25
+
26
+ def convert(node, state = {})
27
+ Coradoc::Generator.gen_adoc(to_coradoc(node, state))
28
+ end
29
+
30
+ def get_list_type(node, _state)
31
+ case node.name
32
+ when "ol"
33
+ :ordered
34
+ when "ul"
35
+ :unordered
36
+ end
37
+ end
38
+
39
+ def number_style(node)
40
+ case node["style"]
41
+ when "1" then "arabic"
42
+ when "A" then "upperalpha"
43
+ when "a" then "loweralpha"
44
+ when "I" then "upperroman"
45
+ when "i" then "lowerroman"
46
+ end
47
+ end
48
+
49
+ def ol_attrs(node)
50
+ attrs = Coradoc::Element::AttributeList.new
51
+ style = number_style(node)
52
+ attrs.add_positional(style) if style
53
+ attrs.add_positional("%reversed") if node["reversed"]
54
+ attrs.add_named("start", node["start"]) if node["start"]
55
+ attrs.add_named("type", node["type"]) if node["type"]
56
+ attrs
57
+ end
58
+ end
59
+
60
+ register :ol, Ol.new
61
+ register :ul, Ol.new
62
+ register :dir, Ol.new
63
+ end
64
+ end
@@ -0,0 +1,23 @@
1
+ module Coradoc::ReverseAdoc
2
+ module Converters
3
+ class P < Base
4
+ def to_coradoc(node, state = {})
5
+ id = node["id"]
6
+ content = treat_children_coradoc(node, state)
7
+
8
+ options = {}.tap do |hash|
9
+ hash[:id] = id if id
10
+ hash[:tdsinglepara] = true if state[:tdsinglepara]
11
+ end
12
+
13
+ Coradoc::Element::Paragraph.new(content, options)
14
+ end
15
+
16
+ def convert(node, state = {})
17
+ Coradoc::Generator.gen_adoc(to_coradoc(node, state))
18
+ end
19
+ end
20
+
21
+ register :p, P.new
22
+ end
23
+ end
@@ -0,0 +1,13 @@
1
+ module Coradoc::ReverseAdoc
2
+ module Converters
3
+ class PassThrough < Base
4
+ def to_coradoc(node, _state = {})
5
+ node.to_s
6
+ end
7
+
8
+ def convert(node, state = {})
9
+ to_coradoc(node, state)
10
+ end
11
+ end
12
+ end
13
+ end