reverse_adoc 0.3.6 → 1.0.0

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 (84) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/release.yml +4 -3
  3. data/Gemfile +1 -1
  4. data/Rakefile +7 -7
  5. data/exe/reverse_adoc +11 -11
  6. data/exe/w2a +15 -16
  7. data/lib/reverse_adoc/cleaner.rb +17 -18
  8. data/lib/reverse_adoc/config.rb +7 -7
  9. data/lib/reverse_adoc/converters/a.rb +24 -24
  10. data/lib/reverse_adoc/converters/aside.rb +6 -4
  11. data/lib/reverse_adoc/converters/audio.rb +16 -21
  12. data/lib/reverse_adoc/converters/base.rb +79 -5
  13. data/lib/reverse_adoc/converters/blockquote.rb +16 -7
  14. data/lib/reverse_adoc/converters/br.rb +5 -1
  15. data/lib/reverse_adoc/converters/bypass.rb +38 -34
  16. data/lib/reverse_adoc/converters/code.rb +42 -1
  17. data/lib/reverse_adoc/converters/div.rb +7 -3
  18. data/lib/reverse_adoc/converters/drop.rb +6 -2
  19. data/lib/reverse_adoc/converters/em.rb +44 -7
  20. data/lib/reverse_adoc/converters/figure.rb +10 -6
  21. data/lib/reverse_adoc/converters/h.rb +19 -11
  22. data/lib/reverse_adoc/converters/head.rb +7 -2
  23. data/lib/reverse_adoc/converters/hr.rb +5 -1
  24. data/lib/reverse_adoc/converters/ignore.rb +6 -2
  25. data/lib/reverse_adoc/converters/img.rb +29 -19
  26. data/lib/reverse_adoc/converters/li.rb +6 -13
  27. data/lib/reverse_adoc/converters/mark.rb +11 -2
  28. data/lib/reverse_adoc/converters/math.rb +13 -2
  29. data/lib/reverse_adoc/converters/ol.rb +44 -26
  30. data/lib/reverse_adoc/converters/p.rb +13 -7
  31. data/lib/reverse_adoc/converters/pass_through.rb +5 -1
  32. data/lib/reverse_adoc/converters/pre.rb +23 -10
  33. data/lib/reverse_adoc/converters/q.rb +6 -2
  34. data/lib/reverse_adoc/converters/strong.rb +41 -6
  35. data/lib/reverse_adoc/converters/sub.rb +6 -2
  36. data/lib/reverse_adoc/converters/sup.rb +6 -2
  37. data/lib/reverse_adoc/converters/table.rb +28 -23
  38. data/lib/reverse_adoc/converters/td.rb +32 -16
  39. data/lib/reverse_adoc/converters/text.rb +19 -19
  40. data/lib/reverse_adoc/converters/th.rb +4 -6
  41. data/lib/reverse_adoc/converters/tr.rb +7 -7
  42. data/lib/reverse_adoc/converters/video.rb +16 -23
  43. data/lib/reverse_adoc/converters.rb +2 -3
  44. data/lib/reverse_adoc/html_converter.rb +48 -43
  45. data/lib/reverse_adoc/version.rb +1 -1
  46. data/lib/reverse_adoc.rb +9 -9
  47. data/reverse_adoc.gemspec +6 -3
  48. data/spec/assets/basic.html +3 -0
  49. data/spec/bin/reverse_adoc_spec.rb +9 -8
  50. data/spec/bin/w2a_spec.rb +12 -12
  51. data/spec/components/anchors_spec.rb +18 -12
  52. data/spec/components/basic_spec.rb +28 -14
  53. data/spec/components/code_spec.rb +2 -4
  54. data/spec/components/escapables_spec.rb +4 -6
  55. data/spec/components/from_the_wild_spec.rb +2 -4
  56. data/spec/components/html_fragment_spec.rb +2 -3
  57. data/spec/components/lists_spec.rb +12 -8
  58. data/spec/components/paragraphs_spec.rb +2 -3
  59. data/spec/components/quotation_spec.rb +5 -5
  60. data/spec/components/tables_spec.rb +22 -11
  61. data/spec/components/unknown_tags_spec.rb +13 -10
  62. data/spec/lib/reverse_adoc/cleaner_spec.rb +70 -71
  63. data/spec/lib/reverse_adoc/config_spec.rb +5 -6
  64. data/spec/lib/reverse_adoc/converters/aside_spec.rb +2 -3
  65. data/spec/lib/reverse_adoc/converters/audio_spec.rb +3 -5
  66. data/spec/lib/reverse_adoc/converters/blockquote_spec.rb +5 -6
  67. data/spec/lib/reverse_adoc/converters/br_spec.rb +2 -2
  68. data/spec/lib/reverse_adoc/converters/code_spec.rb +3 -5
  69. data/spec/lib/reverse_adoc/converters/div_spec.rb +3 -5
  70. data/spec/lib/reverse_adoc/converters/figure_spec.rb +2 -4
  71. data/spec/lib/reverse_adoc/converters/img_spec.rb +5 -7
  72. data/spec/lib/reverse_adoc/converters/li_spec.rb +2 -4
  73. data/spec/lib/reverse_adoc/converters/mark_spec.rb +4 -4
  74. data/spec/lib/reverse_adoc/converters/p_spec.rb +2 -3
  75. data/spec/lib/reverse_adoc/converters/pre_spec.rb +8 -9
  76. data/spec/lib/reverse_adoc/converters/q_spec.rb +3 -3
  77. data/spec/lib/reverse_adoc/converters/strong_spec.rb +9 -8
  78. data/spec/lib/reverse_adoc/converters/text_spec.rb +21 -16
  79. data/spec/lib/reverse_adoc/converters/video_spec.rb +7 -9
  80. data/spec/lib/reverse_adoc/converters_spec.rb +9 -6
  81. data/spec/lib/reverse_adoc.rb +25 -25
  82. data/spec/spec_helper.rb +11 -11
  83. data/spec/support/shell_helpers.rb +1 -1
  84. metadata +20 -6
@@ -1,8 +1,12 @@
1
1
  module ReverseAdoc
2
2
  module Converters
3
3
  class Bypass < Base
4
+ def to_coradoc(node, state = {})
5
+ treat_children_coradoc(node, state)
6
+ end
7
+
4
8
  def convert(node, state = {})
5
- treat_children(node, state)
9
+ Coradoc::Generator.gen_adoc(to_coradoc(node, state))
6
10
  end
7
11
  end
8
12
 
@@ -13,65 +17,65 @@ module ReverseAdoc
13
17
  register :thead, Bypass.new
14
18
  register :tbody, Bypass.new
15
19
  register :tfoot, Bypass.new
16
- register :abbr, Bypass.new
20
+ register :abbr, Bypass.new
17
21
  register :acronym, Bypass.new
18
22
  register :address, Bypass.new
19
- register :applet, Bypass.new
20
- register :map, Bypass.new
21
- register :area, Bypass.new
23
+ register :applet, Bypass.new
24
+ register :map, Bypass.new
25
+ register :area, Bypass.new
22
26
  register :bdi, Bypass.new
23
27
  register :bdo, Bypass.new
24
28
  register :big, Bypass.new
25
29
  register :button, Bypass.new
26
30
  register :canvas, Bypass.new
27
- register :data, Bypass.new
28
- register :datalist, Bypass.new
31
+ register :data, Bypass.new
32
+ register :datalist, Bypass.new
29
33
  register :del, Bypass.new
30
34
  register :ins, Bypass.new
31
35
  register :dfn, Bypass.new
32
- register :dialog, Bypass.new
33
- register :embed, Bypass.new
34
- register :fieldset, Bypass.new
35
- register :font, Bypass.new
36
- register :footer, Bypass.new
37
- register :form, Bypass.new
38
- register :frame, Bypass.new
39
- register :frameset, 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
40
44
  register :header, Bypass.new
41
45
  register :iframe, Bypass.new
42
46
  register :input, Bypass.new
43
47
  register :label, Bypass.new
44
- register :legend, Bypass.new
48
+ register :legend, Bypass.new
45
49
  register :main, Bypass.new
46
50
  register :menu, Bypass.new
47
- register :menulist, Bypass.new
48
- register :meter, Bypass.new
49
- register :nav, Bypass.new
51
+ register :menulist, Bypass.new
52
+ register :meter, Bypass.new
53
+ register :nav, Bypass.new
50
54
  register :noframes, Bypass.new
51
55
  register :noscript, Bypass.new
52
- register :object, Bypass.new
53
- register :optgroup, Bypass.new
56
+ register :object, Bypass.new
57
+ register :optgroup, Bypass.new
54
58
  register :option, Bypass.new
55
59
  register :output, Bypass.new
56
- register :param, Bypass.new
57
- register :picture, Bypass.new
58
- register :progress, Bypass.new
59
- register :ruby, Bypass.new
60
+ register :param, Bypass.new
61
+ register :picture, Bypass.new
62
+ register :progress, Bypass.new
63
+ register :ruby, Bypass.new
60
64
  register :rt, Bypass.new
61
65
  register :rp, Bypass.new
62
- register :s, Bypass.new
63
- register :select, Bypass.new
64
- register :small, Bypass.new
65
- register :span, Bypass.new
66
- register :strike, 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
67
71
  register :details, Bypass.new
68
72
  register :section, Bypass.new
69
73
  register :summary, Bypass.new
70
- register :svg, Bypass.new
74
+ register :svg, Bypass.new
71
75
  register :template, Bypass.new
72
76
  register :textarea, Bypass.new
73
- register :track, Bypass.new
74
- register :u, Bypass.new
75
- register :wbr, Bypass.new
77
+ register :track, Bypass.new
78
+ register :u, Bypass.new
79
+ register :wbr, Bypass.new
76
80
  end
77
81
  end
@@ -1,8 +1,49 @@
1
1
  module ReverseAdoc
2
2
  module Converters
3
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
+
4
45
  def convert(node, state = {})
5
- "`#{node.text}`"
46
+ Coradoc::Generator.gen_adoc(to_coradoc(node, state))
6
47
  end
7
48
  end
8
49
 
@@ -1,10 +1,14 @@
1
1
  module ReverseAdoc
2
2
  module Converters
3
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
+
4
10
  def convert(node, state = {})
5
- id = node['id']
6
- anchor = id ? "[[#{id}]]\n" : ""
7
- "\n#{anchor}" << treat_children(node, state) << "\n"
11
+ Coradoc::Generator.gen_adoc(to_coradoc(node, state))
8
12
  end
9
13
  end
10
14
 
@@ -1,8 +1,12 @@
1
1
  module ReverseAdoc
2
2
  module Converters
3
3
  class Drop < Base
4
- def convert(node, state = {})
5
- ''
4
+ def to_coradoc(node, state = {})
5
+ convert(node, state)
6
+ end
7
+
8
+ def convert(_node, _state = {})
9
+ ""
6
10
  end
7
11
  end
8
12
 
@@ -1,18 +1,55 @@
1
1
  module ReverseAdoc
2
2
  module Converters
3
3
  class Em < Base
4
- def convert(node, state = {})
5
- content = treat_children(node, state.merge(already_italic: true))
6
- if content.strip.empty? || state[:already_italic]
7
- content
8
- else
9
- "#{content[/^\s*/]}_#{content.strip}_#{content[/\s*$/]}"
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
10
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))
11
48
  end
12
49
  end
13
50
 
14
51
  register :em, Em.new
15
52
  register :i, Em.new
16
- register :cite, Em.new
53
+ register :cite, Em.new
17
54
  end
18
55
  end
@@ -1,18 +1,22 @@
1
1
  module ReverseAdoc
2
2
  module Converters
3
3
  class Figure < Base
4
- def convert(node, state = {})
5
- id = node['id']
6
- anchor = id ? "[[#{id}]]\n" : ""
4
+ def to_coradoc(node, state = {})
5
+ id = node["id"]
7
6
  title = extract_title(node)
8
- title = ".#{title}\n" unless title.empty?
9
- "\n\n#{anchor}#{title}====\n" << treat_children(node, state).strip << "\n====\n\n"
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))
10
13
  end
11
14
 
12
15
  def extract_title(node)
13
16
  title = node.at("./figcaption")
14
17
  return "" if title.nil?
15
- treat_children(title, {})
18
+
19
+ treat_children_coradoc(title, {})
16
20
  end
17
21
  end
18
22
 
@@ -1,25 +1,33 @@
1
1
  module ReverseAdoc
2
2
  module Converters
3
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
+
4
18
  def convert(node, state = {})
5
- id = node['id']
6
- anchor = id ? "[[#{id}]]" : ""
7
- internal_anchor = treat_children_anchors(node, state) || ""
8
- anchor.empty? and anchor = internal_anchor
9
- anchor.empty? or anchor += "\n"
10
- prefix = '=' * (node.name[/\d/].to_i + 1)
11
- ["\n", anchor, prefix, ' ', treat_children_no_anchors(node, state), "\n"].join
19
+ Coradoc::Generator.gen_adoc(to_coradoc(node, state))
12
20
  end
13
21
 
14
22
  def treat_children_no_anchors(node, state)
15
- node.children.reject { |a| a.name == "a" }.inject('') do |memo, child|
16
- memo << treat(child, state)
23
+ node.children.reject { |a| a.name == "a" }.inject([]) do |memo, child|
24
+ memo << treat_coradoc(child, state)
17
25
  end
18
26
  end
19
27
 
20
28
  def treat_children_anchors(node, state)
21
- node.children.select { |a| a.name == "a" }.inject('') do |memo, child|
22
- memo << treat(child, state)
29
+ node.children.select { |a| a.name == "a" }.inject([]) do |memo, child|
30
+ memo << treat_coradoc(child, state)
23
31
  end
24
32
  end
25
33
  end
@@ -1,14 +1,19 @@
1
1
  module ReverseAdoc
2
2
  module Converters
3
3
  class Head < Base
4
- def convert(node, state = {})
4
+ def to_coradoc(node, _state = {})
5
5
  title = extract_title(node)
6
- "= #{title}\n:stem:\n\n"
6
+ Coradoc::Element::Header.new(title)
7
+ end
8
+
9
+ def convert(node, state = {})
10
+ Coradoc::Generator.gen_adoc(to_coradoc(node, state))
7
11
  end
8
12
 
9
13
  def extract_title(node)
10
14
  title = node.at("./title")
11
15
  return "(???)" if title.nil?
16
+
12
17
  title.text
13
18
  end
14
19
  end
@@ -1,8 +1,12 @@
1
1
  module ReverseAdoc
2
2
  module Converters
3
3
  class Hr < Base
4
+ def to_coradoc(_node, _state = {})
5
+ Coradoc::Element::Break::ThematicBreak.new
6
+ end
7
+
4
8
  def convert(node, state = {})
5
- "\n* * *\n"
9
+ Coradoc::Generator.gen_adoc(to_coradoc(node, state))
6
10
  end
7
11
  end
8
12
 
@@ -1,8 +1,12 @@
1
1
  module ReverseAdoc
2
2
  module Converters
3
3
  class Ignore < Base
4
- def convert(node, state = {})
5
- '' # noop
4
+ def to_coradoc(node, state = {})
5
+ convert(node, state)
6
+ end
7
+
8
+ def convert(_node, _state = {})
9
+ "" # noop
6
10
  end
7
11
  end
8
12
 
@@ -7,11 +7,10 @@ require "marcel"
7
7
  module ReverseAdoc
8
8
  module Converters
9
9
  class Img < Base
10
-
11
10
  def image_number
12
11
  sprintf(
13
12
  ReverseAdoc.config.image_counter_pattern,
14
- ReverseAdoc.config.image_counter
13
+ ReverseAdoc.config.image_counter,
15
14
  )
16
15
  end
17
16
 
@@ -20,10 +19,10 @@ module ReverseAdoc
20
19
  end
21
20
 
22
21
  def datauri2file(src)
23
- %r{^data:image/(?<imgtype>[^;]+);base64,(?<imgdata>.+)$} =~ src
22
+ %r{^data:image/(?:[^;]+);base64,(?<imgdata>.+)$} =~ src
24
23
 
25
24
  dest_dir = Pathname.new(ReverseAdoc.config.destination).dirname
26
- images_dir = dest_dir + 'images'
25
+ images_dir = dest_dir.join("images")
27
26
  FileUtils.mkdir_p(images_dir)
28
27
 
29
28
  ext, image_src_path = determine_image_src_path(src, imgdata)
@@ -42,11 +41,11 @@ module ReverseAdoc
42
41
  return copy_temp_file(imgdata) if imgdata
43
42
 
44
43
  ext = File.extname(src).strip.downcase[1..-1]
45
- [ext, Pathname.new(ReverseAdoc.config.sourcedir) + src]
44
+ [ext, Pathname.new(ReverseAdoc.config.sourcedir).join(src)]
46
45
  end
47
46
 
48
47
  def copy_temp_file(imgdata)
49
- Tempfile.open(['radoc', '.jpg']) do |f|
48
+ Tempfile.open(["radoc", ".jpg"]) do |f|
50
49
  f.binmode
51
50
  f.write(Base64.strict_decode64(imgdata))
52
51
  f.rewind
@@ -55,13 +54,13 @@ module ReverseAdoc
55
54
  end
56
55
  end
57
56
 
58
- def convert(node, state = {})
59
- alt = node['alt']
60
- src = node['src']
61
- id = node['id']
62
- width = node['width']
63
- height = node['height']
64
- anchor = id ? "[[#{id}]]\n" : ""
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
+
65
64
  title = extract_title(node)
66
65
 
67
66
  if ReverseAdoc.config.external_images
@@ -69,12 +68,23 @@ module ReverseAdoc
69
68
  src = datauri2file(src)
70
69
  end
71
70
 
72
- title = ".#{title}\n" unless title.empty?
73
- attrs = alt
74
- attrs = "\"\"" if (width || height) && alt.nil?
75
- attrs += ",#{width}" if width
76
- attrs += ",#{height}" if width && height
77
- [anchor, title, "image::", src, "[", attrs, "]"].join("")
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))
78
88
  end
79
89
  end
80
90
 
@@ -1,21 +1,14 @@
1
1
  module ReverseAdoc
2
2
  module Converters
3
3
  class Li < Base
4
- def convert(node, state = {})
5
- id = node['id']
6
- anchor = id ? "[[#{id}]]" : ""
7
- content = treat_children(node, state)
8
- prefix = prefix_for(node, state)
9
- "#{prefix} #{anchor}#{content.chomp}\n"
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)
10
8
  end
11
9
 
12
- def prefix_for(node, state)
13
- length = state.fetch(:ol_count, 0)
14
- if node.parent.name == 'ol'
15
- "." * [length, 0].max
16
- else
17
- "*" * [length, 0].max
18
- end
10
+ def convert(node, state = {})
11
+ Coradoc::Generator.gen_adoc(to_coradoc(node, state))
19
12
  end
20
13
  end
21
14
 
@@ -1,9 +1,18 @@
1
1
  module ReverseAdoc
2
2
  module Converters
3
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
+
4
14
  def convert(node, state = {})
5
- content = treat_children(node, state)
6
- "#{content[/^\s*/]}##{content.strip}##{content[/\s*$/]}"
15
+ Coradoc::Generator.gen_adoc(to_coradoc(node, state))
7
16
  end
8
17
  end
9
18
 
@@ -7,10 +7,21 @@ require "mathml2asciimath"
7
7
  module ReverseAdoc
8
8
  module Converters
9
9
  class Math < Base
10
- def convert(node, state = {})
10
+ # FIXIT
11
+ def to_coradoc(node, state = {})
12
+ convert(node, state)
13
+ end
14
+
15
+ def convert(node, _state = {})
11
16
  stem = node.to_s.gsub(/\n/, " ")
12
17
  stem = MathML2AsciiMath.m2a(stem) if ReverseAdoc.config.mathml2asciimath
13
- stem = stem.gsub(/\[/, "\\[").gsub(/\]/, "\\]").gsub(/\(\(([^\)]+)\)\)/, "(\\1)") unless stem.nil?
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
14
25
  " stem:[" << stem << "] "
15
26
  end
16
27
  end
@@ -1,41 +1,59 @@
1
1
  module ReverseAdoc
2
2
  module Converters
3
3
  class Ol < Base
4
- def convert(node, state = {})
5
- id = node['id']
6
- anchor = id ? "[[#{id}]]\n" : ""
4
+ # FIXIT
5
+ def to_coradoc(node, state = {})
6
+ # convert(node, state)
7
+ id = node["id"]
7
8
  ol_count = state.fetch(:ol_count, 0) + 1
8
9
  attrs = ol_attrs(node)
9
- "\n#{anchor}#{attrs}" << treat_children(node, state.merge(ol_count: ol_count))
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
10
37
  end
11
38
 
12
39
  def number_style(node)
13
- style = case node["style"]
14
- when "1" then "arabic"
15
- when "A" then "upperalpha"
16
- when "a" then "loweralpha"
17
- when "I" then "upperroman"
18
- when "i" then "lowerroman"
19
- else
20
- nil
21
- end
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
22
47
  end
23
48
 
24
49
  def ol_attrs(node)
50
+ attrs = Coradoc::Element::AttributeList.new
25
51
  style = number_style(node)
26
- reversed = "%reversed" if node["reversed"]
27
- start = "start=#{node['start']}" if node["start"]
28
- type = "type=#{node['type']}" if node["type"]
29
- attrs = []
30
- attrs << style if style
31
- attrs << reversed if reversed
32
- attrs << start if start
33
- attrs << type if type
34
- if attrs.empty?
35
- ""
36
- else
37
- "[#{attrs.join(',')}]\n"
38
- end
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
39
57
  end
40
58
  end
41
59
 
@@ -1,14 +1,20 @@
1
1
  module ReverseAdoc
2
2
  module Converters
3
3
  class P < Base
4
- def convert(node, state = {})
5
- id = node['id']
6
- anchor = id ? "[[#{id}]]\n" : ""
7
- if state[:tdsinglepara]
8
- "#{anchor}" << treat_children(node, state).strip
9
- else
10
- "\n\n#{anchor}" << treat_children(node, state).strip << "\n\n"
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
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))
12
18
  end
13
19
  end
14
20