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
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 5ada0c5000d417b1fa73962833f53144ae8ef29d4089ec49cd5aa8cfe87f0a99
4
- data.tar.gz: d56d80b96a0c52b7ad1d1c0e0133821ba9711f277388f59727fc6c904a2cad12
3
+ metadata.gz: 69ca642594cadc268f47a51d4d9fc10852d7f0e51f2987ecb7839702187f345a
4
+ data.tar.gz: 7e0ca6f3c222616d8fc1d0d4b94853a97abb9b310418aa531e2c4abde3ce1a39
5
5
  SHA512:
6
- metadata.gz: 2cde0734e47f95bb24664dade9a3a11266bf4d109b15211b45e3385d71b6cc5748d7faa238aca2861d31f01045c09975f5e516a251b7c555ad31d48199fc8a90
7
- data.tar.gz: 3f318a46c99954e5d69b12b03aaaca6e75b0238740fbdded85ae8dc2c1d147bdb1b5c2e4e9207f34406664150359a92bb6237cfe38622996cd24f89899af8323
6
+ metadata.gz: a625dfb2610efafebcb38b8427a2f414b8358c0261a463627f60190e3cb45d18f643b1e29c62135c9a76d402db380189bea234e82af3d658871f3ce2f56c6655
7
+ data.tar.gz: 9076811a8e823ab0b52c4565b1bd8996931721b59d84b603494ab0fe475bc72a9f35f6e585722f6afbb535b945d6abe1c8fdf097c7ef97ac181335b8a1157137
@@ -7,11 +7,12 @@ on:
7
7
  inputs:
8
8
  next_version:
9
9
  description: |
10
- Next release version. Possible values: x.y.z, major, minor, patch or pre|rc|etc
10
+ Next release version. Possible values: x.y.z, major, minor, patch (or pre|rc|etc).
11
+ Also, you can pass 'skip' to skip 'git tag' and do 'gem push' for the current version
11
12
  required: true
12
13
  default: 'skip'
13
- push:
14
- tags: [ v* ]
14
+ repository_dispatch:
15
+ types: [ do-release ]
15
16
 
16
17
  jobs:
17
18
  release:
data/Gemfile CHANGED
@@ -1,6 +1,6 @@
1
1
  source "https://rubygems.org"
2
2
 
3
- git_source(:github) {|repo_name| "https://github.com/#{repo_name}" }
3
+ git_source(:github) { |repo_name| "https://github.com/#{repo_name}" }
4
4
 
5
5
  # Specify your gem's dependencies in reverse_adoc.gemspec
6
6
  gemspec
data/Rakefile CHANGED
@@ -1,14 +1,14 @@
1
- require 'bundler/gem_tasks'
1
+ require "bundler/gem_tasks"
2
2
 
3
- if File.exist?('.codeclimate')
4
- ENV["CODECLIMATE_REPO_TOKEN"] = File.read('.codeclimate').strip
3
+ if File.exist?(".codeclimate")
4
+ ENV["CODECLIMATE_REPO_TOKEN"] = File.read(".codeclimate").strip
5
5
  end
6
6
 
7
- require 'rspec/core/rake_task'
7
+ require "rspec/core/rake_task"
8
8
  RSpec::Core::RakeTask.new(:spec)
9
- task :default => :spec
9
+ task default: :spec
10
10
 
11
- desc 'Open an irb session preloaded with this library'
11
+ desc "Open an irb session preloaded with this library"
12
12
  task :console do
13
- sh 'irb -rubygems -I lib -r reverse_adoc.rb'
13
+ sh "irb -rubygems -I lib -r reverse_adoc.rb"
14
14
  end
data/exe/reverse_adoc CHANGED
@@ -1,33 +1,34 @@
1
1
  #!/usr/bin/env ruby
2
2
  # Usage: reverse_adoc [FILE]...
3
3
  # Usage: cat FILE | reverse_adoc
4
- require 'rubygems'
5
- require 'bundler/setup'
4
+ require "rubygems"
5
+ require "bundler/setup"
6
6
 
7
- require 'reverse_adoc'
8
- require 'optparse'
9
- require 'fileutils'
7
+ require "reverse_adoc"
8
+ require "optparse"
9
+ require "fileutils"
10
10
 
11
11
  OptionParser.new do |opts|
12
12
  opts.banner = "Usage: reverse_adoc [options] <file>"
13
- opts.on('-m', '--mathml2asciimath', 'Convert MathML to AsciiMath') do |v|
13
+ opts.on("-m", "--mathml2asciimath", "Convert MathML to AsciiMath") do |_v|
14
14
  ReverseAdoc.config.mathml2asciimath = true
15
15
  end
16
16
 
17
- opts.on('-oFILENAME', '--output=FILENAME', 'Output file to write to') do |v|
17
+ opts.on("-oFILENAME", "--output=FILENAME", "Output file to write to") do |v|
18
18
  ReverseAdoc.config.destination = File.expand_path(v)
19
19
  # puts "output goes to #{ReverseAdoc.config.destination}"
20
20
  end
21
21
 
22
- opts.on('-e', '--external-images', 'Export images if data URI') do |v|
22
+ opts.on("-e", "--external-images", "Export images if data URI") do |_v|
23
23
  ReverseAdoc.config.external_images = true
24
24
  end
25
25
 
26
- opts.on('-u', '--unknown_tags [pass_through, drop, bypass, raise]', 'Unknown tag handling (default: pass_through)') do |v|
26
+ opts.on("-u", "--unknown_tags [pass_through, drop, bypass, raise]",
27
+ "Unknown tag handling (default: pass_through)") do |v|
27
28
  ReverseAdoc.config.unknown_tags = v
28
29
  end
29
30
 
30
- opts.on('-v', '--version', 'Version information') do |v|
31
+ opts.on("-v", "--version", "Version information") do |_v|
31
32
  puts "reverse_adoc: v#{ReverseAdoc::VERSION}"
32
33
  exit
33
34
  end
@@ -36,7 +37,6 @@ OptionParser.new do |opts|
36
37
  puts opts
37
38
  exit
38
39
  end
39
-
40
40
  end.parse!
41
41
 
42
42
  if filename = ARGV.pop
data/exe/w2a CHANGED
@@ -1,37 +1,37 @@
1
1
  #!/usr/bin/env ruby
2
2
  # frozen_string_literal: true
3
3
 
4
- require 'rubygems'
5
- require 'bundler/setup'
4
+ require "rubygems"
5
+ require "bundler/setup"
6
6
 
7
- require 'word-to-markdown'
8
- require 'optparse'
9
- require 'reverse_adoc'
7
+ require "word-to-markdown"
8
+ require "optparse"
9
+ require "reverse_adoc"
10
10
 
11
- ARGV.push('-h') if ARGV.empty?
11
+ ARGV.push("-h") if ARGV.empty?
12
12
 
13
13
  OptionParser.new do |opts|
14
14
  opts.banner = "Usage: w2a [options] <file>"
15
- opts.on('-m', '--mathml2asciimath', 'Convert MathML to AsciiMath') do |v|
15
+ opts.on("-m", "--mathml2asciimath", "Convert MathML to AsciiMath") do |_v|
16
16
  ReverseAdoc.config.mathml2asciimath = true
17
17
  end
18
18
 
19
- opts.on('-oFILENAME', '--output=FILENAME', 'Output file to write to') do |v|
19
+ opts.on("-oFILENAME", "--output=FILENAME", "Output file to write to") do |v|
20
20
  ReverseAdoc.config.destination = File.expand_path(v)
21
21
  # puts "output goes to #{ReverseAdoc.config.destination}"
22
22
  end
23
23
 
24
- opts.on('-e', '--external-images', 'Export images if data URI') do |v|
24
+ opts.on("-e", "--external-images", "Export images if data URI") do |_v|
25
25
  ReverseAdoc.config.external_images = true
26
26
  end
27
27
 
28
- opts.on('-v', '--version', 'Version information') do |v|
28
+ opts.on("-v", "--version", "Version information") do |_v|
29
29
  puts "reverse_adoc: v#{ReverseAdoc::VERSION}"
30
30
  puts "[dependency] WordToMarkdown: v#{WordToMarkdown::VERSION}"
31
- unless Gem.win_platform?
32
- puts "[dependency] LibreOffice: v#{WordToMarkdown.soffice.version}"
33
- else
31
+ if Gem.win_platform?
34
32
  puts "[dependency] LibreOffice: version not available on Windows"
33
+ else
34
+ puts "[dependency] LibreOffice: v#{WordToMarkdown.soffice.version}"
35
35
  end
36
36
  exit
37
37
  end
@@ -40,7 +40,6 @@ OptionParser.new do |opts|
40
40
  puts opts
41
41
  exit
42
42
  end
43
-
44
43
  end.parse!
45
44
 
46
45
  filename = ARGV.pop
@@ -53,10 +52,10 @@ end
53
52
  ReverseAdoc.config.sourcedir = Dir.mktmpdir
54
53
 
55
54
  doc = WordToMarkdown.new(filename, ReverseAdoc.config.sourcedir)
56
- #File.open("test.html", "w:UTF-8") { |f| f.write doc.document.html }
55
+ # File.open("test.html", "w:UTF-8") { |f| f.write doc.document.html }
57
56
  adoc_content = ReverseAdoc.convert(
58
57
  ReverseAdoc.cleaner.preprocess_word_html(doc.document.html),
59
- WordToMarkdown::REVERSE_MARKDOWN_OPTIONS
58
+ WordToMarkdown::REVERSE_MARKDOWN_OPTIONS,
60
59
  )
61
60
  # puts scrub_whitespace(doc.document.html)
62
61
 
@@ -34,20 +34,21 @@ module ReverseAdoc
34
34
  # in the border area.
35
35
  # Same for underscores and brackets.
36
36
  def clean_tag_borders(string)
37
- result = string.gsub(/\s?\*{2,}.*?\*{2,}\s?/) do |match|
38
- preserve_border_whitespaces(match, default_border: ReverseAdoc.config.tag_border) do
39
- match.strip.sub("** ", "**").sub(" **", "**")
40
- end
41
- end
37
+ # result = string.gsub(/\s?\*{2,}.*?\*{2,}\s?/) do |match|
38
+ # preserve_border_whitespaces(match, default_border: ReverseAdoc.config.tag_border) do
39
+ # match.strip.sub("** ", "**").sub(" **", "**")
40
+ # end
41
+ # end
42
42
 
43
- result = result.gsub(/\s?_{2,}.*?_{2,}\s?/) do |match|
44
- preserve_border_whitespaces(match, default_border: ReverseAdoc.config.tag_border) do
45
- match.strip.sub("__ ", "__").sub(" __", "__")
46
- end
47
- end
43
+ # result = string.gsub(/\s?_{2,}.*?_{2,}\s?/) do |match|
44
+ # preserve_border_whitespaces(match, default_border: ReverseAdoc.config.tag_border) do
45
+ # match.strip.sub("__ ", "__").sub(" __", "__")
46
+ # end
47
+ # end
48
48
 
49
- result = result.gsub(/\s?~{2,}.*?~{2,}\s?/) do |match|
50
- preserve_border_whitespaces(match, default_border: ReverseAdoc.config.tag_border) do
49
+ result = string.gsub(/\s?~{2,}.*?~{2,}\s?/) do |match|
50
+ preserve_border_whitespaces(match,
51
+ default_border: ReverseAdoc.config.tag_border) do
51
52
  match.strip.sub("~~ ", "~~").sub(" ~~", "~~")
52
53
  end
53
54
  end
@@ -60,7 +61,7 @@ module ReverseAdoc
60
61
  end
61
62
 
62
63
  def clean_punctuation_characters(string)
63
- string.gsub(/(\*\*|~~|__)\s([.!?'"])/, "\\1".strip + "\\2")
64
+ string.gsub(/(\*\*|~~|__)\s([.!?'"])/, "#{'\\1'.strip}\\2")
64
65
  end
65
66
 
66
67
  # preprocesses HTML, rather than postprocessing it
@@ -104,11 +105,9 @@ module ReverseAdoc
104
105
  end
105
106
 
106
107
  def present_or_default(string, default)
107
- if string.nil? || string.empty?
108
- default
109
- else
110
- string
111
- end
108
+ return default if string.nil? || string.empty?
109
+
110
+ string
112
111
  end
113
112
  end
114
113
  end
@@ -1,9 +1,9 @@
1
- require 'tmpdir'
1
+ require "tmpdir"
2
2
 
3
3
  module ReverseAdoc
4
4
  class Config
5
5
  attr_accessor :unknown_tags, :tag_border, :mathml2asciimath, :external_images,
6
- :destination, :sourcedir, :image_counter, :image_counter_pattern, :input_format
6
+ :destination, :sourcedir, :image_counter, :image_counter_pattern, :input_format
7
7
 
8
8
  def initialize
9
9
  @unknown_tags = :pass_through
@@ -18,14 +18,14 @@ module ReverseAdoc
18
18
  # @sourcedir = nil
19
19
 
20
20
  # Image counter, assuming there are max 999 images
21
- @image_counter = 1
21
+ @image_counter = 1
22
22
  # pad with 0s
23
- @image_counter_pattern = '%03d'
23
+ @image_counter_pattern = "%03d"
24
24
 
25
- @em_delimiter = '_'.freeze
26
- @strong_delimiter = '*'.freeze
25
+ @em_delimiter = "_".freeze
26
+ @strong_delimiter = "*".freeze
27
27
  @inline_options = {}
28
- @tag_border = ' '.freeze
28
+ @tag_border = " ".freeze
29
29
  end
30
30
 
31
31
  def with(options = {})
@@ -1,40 +1,40 @@
1
- require "uri"
1
+ require "coradoc"
2
2
 
3
3
  module ReverseAdoc
4
4
  module Converters
5
5
  class A < Base
6
- def convert(node, state = {})
6
+ def to_coradoc(node, state = {})
7
7
  name = treat_children(node, state)
8
- href = node['href']
8
+
9
+ href = node["href"]
9
10
  title = extract_title(node)
10
- id = node['id'] || node['name']
11
+ id = node["id"] || node["name"]
11
12
 
12
13
  id = id&.gsub(/\s/, "")&.gsub(/__+/, "_")
13
14
 
14
- if /^_Toc\d+$|^_GoBack$/.match id
15
- ""
16
- elsif !id.nil? && !id.empty?
17
- "[[#{id}]]"
18
- elsif href.to_s.start_with?('#')
15
+ return "" if /^_Toc\d+$|^_GoBack$/.match?(id)
16
+
17
+ if !id.nil? && !id.empty?
18
+ return Coradoc::Element::Inline::Anchor.new(id)
19
+ end
20
+
21
+ if href.to_s.start_with?("#")
19
22
  href = href.sub(/^#/, "").gsub(/\s/, "").gsub(/__+/, "_")
20
- if name.empty?
21
- "<<#{href}>>"
22
- else
23
- "<<#{href},#{name}>>"
24
- end
25
- elsif href.to_s.empty?
26
- name
27
- else
28
- name = title if name.empty?
29
- href = "link:#{href}" unless href.to_s =~ URI::DEFAULT_PARSER.make_regexp
30
- link = "#{href}[#{name}]"
31
- link.prepend(' ')
32
- link
23
+ return Coradoc::Element::Inline::CrossReference.new(href, name)
33
24
  end
34
- end
35
25
 
36
- private
26
+ if href.to_s.empty?
27
+ return name
28
+ end
29
+
30
+ Coradoc::Element::Inline::Link.new(path: href,
31
+ name: name,
32
+ title: title)
33
+ end
37
34
 
35
+ def convert(node, state = {})
36
+ Coradoc::Generator.gen_adoc(to_coradoc(node, state))
37
+ end
38
38
  end
39
39
 
40
40
  register :a, A.new
@@ -1,11 +1,13 @@
1
1
  module ReverseAdoc
2
2
  module Converters
3
3
  class Aside < Base
4
+ def to_coradoc(node, state = {})
5
+ content = treat_children(node, state)
6
+ Coradoc::Element::Block::Side.new(lines: content.lines)
7
+ end
8
+
4
9
  def convert(node, state = {})
5
- id = node['id']
6
- anchor = id ? "[[#{id}]]\n" : ""
7
- content = treat_children(node, state).strip
8
- "\n\n****\n" << treat_children(node, state) << "\n****\n\n"
10
+ Coradoc::Generator.gen_adoc(to_coradoc(node, state))
9
11
  end
10
12
  end
11
13
 
@@ -1,31 +1,26 @@
1
1
  module ReverseAdoc
2
2
  module Converters
3
3
  class Audio < Base
4
- def convert(node, state = {})
5
- autoplay = node['autoplay']
6
- loop_attr = node['loop']
7
- controls = node['controls']
8
- src = node['src']
9
- id = node['id']
10
- anchor = id ? "[[#{id}]]\n" : ""
4
+ def to_coradoc(node, _state = {})
5
+ src = node["src"]
6
+ id = node["id"]
11
7
  title = extract_title(node)
12
- title = ".#{title}\n" unless title.empty?
13
- [anchor, title, "audio::", src, "[", options(node), "]"].join("")
8
+ attributes = Coradoc::Element::AttributeList.new
9
+ options = options(node)
10
+ attributes.add_named("options", options) if options.any?
11
+ Coradoc::Element::Audio.new(title, id: id, src: src,
12
+ attributes: attributes)
13
+ end
14
+
15
+ def convert(node, state = {})
16
+ Coradoc::Generator.gen_adoc(to_coradoc(node, state))
14
17
  end
15
18
 
16
19
  def options(node)
17
- autoplay = node['autoplay']
18
- loop_attr = node['loop']
19
- controls = node['controls']
20
- ret = ""
21
- if autoplay || loop_attr || controls
22
- out = []
23
- out << "autoplay" if autoplay
24
- out << "loop" if loop_attr
25
- out << "controls" if controls
26
- ret = %{options="#{out.join(',')}"}
27
- end
28
- ret
20
+ autoplay = node["autoplay"]
21
+ loop_attr = node["loop"]
22
+ controls = node["controls"]
23
+ [autoplay, loop_attr, controls].compact
29
24
  end
30
25
  end
31
26
 
@@ -2,7 +2,7 @@ module ReverseAdoc
2
2
  module Converters
3
3
  class Base
4
4
  def treat_children(node, state)
5
- node.children.inject('') do |memo, child|
5
+ node.children.inject("") do |memo, child|
6
6
  memo << treat(child, state)
7
7
  end
8
8
  end
@@ -11,15 +11,89 @@ module ReverseAdoc
11
11
  ReverseAdoc::Converters.lookup(node.name).convert(node, state)
12
12
  end
13
13
 
14
+ def treat_children_coradoc(node, state)
15
+ node.children.inject([]) do |memo, child|
16
+ memo << treat_coradoc(child, state)
17
+ end.flatten.reject { |x| x == "" || x.nil? }
18
+ end
19
+
20
+ def treat_coradoc(node, state)
21
+ ReverseAdoc::Converters.lookup(node.name).to_coradoc(node, state)
22
+ end
23
+
14
24
  def escape_keychars(string)
15
- subs = { '*' => '\*', '_' => '\_' }
25
+ subs = { "*" => '\*', "_" => '\_' }
16
26
  string
17
- .gsub(/((?<=\s)[\*_]+)|[\*_]+(?=\s)/) { |n| n.chars.map { |char| subs[char] }.join }
27
+ .gsub(/((?<=\s)[\*_]+)|[\*_]+(?=\s)/) do |n|
28
+ n.chars.map do |char|
29
+ subs[char]
30
+ end.join
31
+ end
18
32
  end
19
33
 
20
34
  def extract_title(node)
21
- title = escape_keychars(node['title'].to_s)
22
- title.empty? ? '' : %[ #{title}]
35
+ title = escape_keychars(node["title"].to_s)
36
+ title.empty? ? "" : %[ #{title}]
37
+ end
38
+
39
+ def node_has_ancestor?(node, name)
40
+ case name
41
+ when String
42
+ node.ancestors.map(&:name).include?(name)
43
+ when Array
44
+ (node.ancestors.map(&:name) & name).any?
45
+ end
46
+ end
47
+
48
+ def textnode_before_end_with?(node, str)
49
+ return nil if !str.is_a?(String) || str.empty?
50
+
51
+ node2 = node.at_xpath("preceding-sibling::node()[1]")
52
+ node2.respond_to?(:text) && node2.text.end_with?(str)
53
+ end
54
+
55
+ def unconstrained_before?(node)
56
+ before = node.at_xpath("preceding::node()[1]")
57
+
58
+ before &&
59
+ !before.text.strip.empty? &&
60
+ before.text[-1]&.match?(/\w/)
61
+ end
62
+
63
+ # TODO: This logic ought to be cleaned up.
64
+ def unconstrained_after?(node)
65
+ after = node.at_xpath("following::node()[1]")
66
+
67
+ after && !after.text.strip.empty? &&
68
+ after.text[0]&.match?(/\w|,|;|"|\.\?!/)
69
+ end
70
+
71
+ # def trailing_whitespace?(node)
72
+
73
+ # TODO: This logic ought to be cleaned up.
74
+ def constrained?(node)
75
+ before = node.at_xpath("preceding::node()[1]").to_s[-1]
76
+ before = if before
77
+ before&.match?(/\s/) ? true : false
78
+ else
79
+ true
80
+ end
81
+
82
+ if !before && (node.to_s[0] =~ /\s/)
83
+ before = true
84
+ end
85
+
86
+ after = node.at_xpath("following::node()[1]").to_s[0]
87
+ after = if after
88
+ after&.match?(/\s|,|;|"|\.\?!/) ? true : false
89
+ else
90
+ true
91
+ end
92
+ if !after && (node.to_s[-1] =~ /\s/)
93
+ after = true
94
+ end
95
+
96
+ before && after
23
97
  end
24
98
  end
25
99
  end
@@ -1,15 +1,24 @@
1
1
  module ReverseAdoc
2
2
  module Converters
3
3
  class Blockquote < Base
4
- def convert(node, state = {})
5
- id = node['id']
6
- anchor = id ? "[[#{id}]]\n" : ""
7
- cite = node['cite']
8
- attrs = cite ? "[quote, #{cite}]\n" : ""
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
9
14
  content = treat_children(node, state).strip
10
15
  content = ReverseAdoc.cleaner.remove_newlines(content)
11
- #"\n\n> " << content.lines.to_a.join('> ') << "\n\n"
12
- "\n\n#{attrs}____\n" << content.lines.to_a.join('') << "\n____\n\n"
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))
13
22
  end
14
23
  end
15
24
 
@@ -1,8 +1,12 @@
1
1
  module ReverseAdoc
2
2
  module Converters
3
3
  class Br < Base
4
+ def to_coradoc(_node, _state = {})
5
+ Coradoc::Element::Inline::HardLineBreak.new
6
+ end
7
+
4
8
  def convert(node, state = {})
5
- " +\n"
9
+ Coradoc::Generator.gen_adoc(to_coradoc(node, state))
6
10
  end
7
11
  end
8
12