reverse_adoc 1.0.1 → 2.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (105) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +3 -3
  3. data/README.adoc +4 -294
  4. data/Rakefile +2 -13
  5. data/reverse_adoc.gemspec +2 -20
  6. metadata +5 -246
  7. data/.editorconfig +0 -15
  8. data/.github/workflows/rake.yml +0 -15
  9. data/.gitignore +0 -10
  10. data/.hound.yml +0 -5
  11. data/.rubocop.yml +0 -10
  12. data/LICENSE.txt +0 -25
  13. data/exe/reverse_adoc +0 -70
  14. data/exe/w2a +0 -72
  15. data/lib/reverse_adoc/cleaner.rb +0 -113
  16. data/lib/reverse_adoc/config.rb +0 -54
  17. data/lib/reverse_adoc/converters/a.rb +0 -42
  18. data/lib/reverse_adoc/converters/aside.rb +0 -16
  19. data/lib/reverse_adoc/converters/audio.rb +0 -29
  20. data/lib/reverse_adoc/converters/base.rb +0 -100
  21. data/lib/reverse_adoc/converters/blockquote.rb +0 -27
  22. data/lib/reverse_adoc/converters/br.rb +0 -15
  23. data/lib/reverse_adoc/converters/bypass.rb +0 -81
  24. data/lib/reverse_adoc/converters/code.rb +0 -56
  25. data/lib/reverse_adoc/converters/div.rb +0 -18
  26. data/lib/reverse_adoc/converters/drop.rb +0 -22
  27. data/lib/reverse_adoc/converters/em.rb +0 -55
  28. data/lib/reverse_adoc/converters/figure.rb +0 -25
  29. data/lib/reverse_adoc/converters/h.rb +0 -42
  30. data/lib/reverse_adoc/converters/head.rb +0 -23
  31. data/lib/reverse_adoc/converters/hr.rb +0 -15
  32. data/lib/reverse_adoc/converters/ignore.rb +0 -16
  33. data/lib/reverse_adoc/converters/img.rb +0 -93
  34. data/lib/reverse_adoc/converters/li.rb +0 -17
  35. data/lib/reverse_adoc/converters/mark.rb +0 -21
  36. data/lib/reverse_adoc/converters/math.rb +0 -31
  37. data/lib/reverse_adoc/converters/ol.rb +0 -64
  38. data/lib/reverse_adoc/converters/p.rb +0 -23
  39. data/lib/reverse_adoc/converters/pass_through.rb +0 -13
  40. data/lib/reverse_adoc/converters/pre.rb +0 -55
  41. data/lib/reverse_adoc/converters/q.rb +0 -16
  42. data/lib/reverse_adoc/converters/strong.rb +0 -52
  43. data/lib/reverse_adoc/converters/sub.rb +0 -16
  44. data/lib/reverse_adoc/converters/sup.rb +0 -16
  45. data/lib/reverse_adoc/converters/table.rb +0 -69
  46. data/lib/reverse_adoc/converters/td.rb +0 -83
  47. data/lib/reverse_adoc/converters/text.rb +0 -65
  48. data/lib/reverse_adoc/converters/th.rb +0 -14
  49. data/lib/reverse_adoc/converters/tr.rb +0 -22
  50. data/lib/reverse_adoc/converters/video.rb +0 -29
  51. data/lib/reverse_adoc/converters.rb +0 -32
  52. data/lib/reverse_adoc/errors.rb +0 -10
  53. data/lib/reverse_adoc/html_converter.rb +0 -61
  54. data/lib/reverse_adoc/version.rb +0 -3
  55. data/lib/reverse_adoc.rb +0 -27
  56. data/spec/assets/anchors.html +0 -30
  57. data/spec/assets/basic.html +0 -61
  58. data/spec/assets/code.html +0 -22
  59. data/spec/assets/escapables.html +0 -17
  60. data/spec/assets/external_images.docx +0 -0
  61. data/spec/assets/external_images.html +0 -35
  62. data/spec/assets/from_the_wild.html +0 -23
  63. data/spec/assets/full_example.html +0 -49
  64. data/spec/assets/html_fragment.html +0 -3
  65. data/spec/assets/lists.html +0 -137
  66. data/spec/assets/minimum.html +0 -4
  67. data/spec/assets/paragraphs.html +0 -24
  68. data/spec/assets/quotation.html +0 -12
  69. data/spec/assets/tables.html +0 -99
  70. data/spec/assets/unknown_tags.html +0 -9
  71. data/spec/bin/reverse_adoc_spec.rb +0 -33
  72. data/spec/bin/w2a_spec.rb +0 -35
  73. data/spec/components/anchors_spec.rb +0 -32
  74. data/spec/components/basic_spec.rb +0 -63
  75. data/spec/components/code_spec.rb +0 -25
  76. data/spec/components/escapables_spec.rb +0 -30
  77. data/spec/components/from_the_wild_spec.rb +0 -15
  78. data/spec/components/html_fragment_spec.rb +0 -9
  79. data/spec/components/lists_spec.rb +0 -90
  80. data/spec/components/paragraphs_spec.rb +0 -14
  81. data/spec/components/quotation_spec.rb +0 -12
  82. data/spec/components/tables_spec.rb +0 -42
  83. data/spec/components/unknown_tags_spec.rb +0 -41
  84. data/spec/lib/reverse_adoc/cleaner_spec.rb +0 -180
  85. data/spec/lib/reverse_adoc/config_spec.rb +0 -25
  86. data/spec/lib/reverse_adoc/converters/aside_spec.rb +0 -11
  87. data/spec/lib/reverse_adoc/converters/audio_spec.rb +0 -15
  88. data/spec/lib/reverse_adoc/converters/blockquote_spec.rb +0 -23
  89. data/spec/lib/reverse_adoc/converters/br_spec.rb +0 -9
  90. data/spec/lib/reverse_adoc/converters/code_spec.rb +0 -15
  91. data/spec/lib/reverse_adoc/converters/div_spec.rb +0 -15
  92. data/spec/lib/reverse_adoc/converters/figure_spec.rb +0 -10
  93. data/spec/lib/reverse_adoc/converters/img_spec.rb +0 -25
  94. data/spec/lib/reverse_adoc/converters/li_spec.rb +0 -11
  95. data/spec/lib/reverse_adoc/converters/mark_spec.rb +0 -10
  96. data/spec/lib/reverse_adoc/converters/p_spec.rb +0 -10
  97. data/spec/lib/reverse_adoc/converters/pre_spec.rb +0 -43
  98. data/spec/lib/reverse_adoc/converters/q_spec.rb +0 -10
  99. data/spec/lib/reverse_adoc/converters/strong_spec.rb +0 -21
  100. data/spec/lib/reverse_adoc/converters/text_spec.rb +0 -67
  101. data/spec/lib/reverse_adoc/converters/video_spec.rb +0 -15
  102. data/spec/lib/reverse_adoc/converters_spec.rb +0 -22
  103. data/spec/lib/reverse_adoc.rb +0 -90
  104. data/spec/spec_helper.rb +0 -25
  105. data/spec/support/shell_helpers.rb +0 -15
data/.gitignore DELETED
@@ -1,10 +0,0 @@
1
- /coverage
2
- /Gemfile.lock
3
-
4
- .DS_Store
5
-
6
- # RuboCop's remote style books
7
- .rubocop-https---*
8
-
9
- # Some odd files created by specs
10
- /test1
data/.hound.yml DELETED
@@ -1,5 +0,0 @@
1
- # Auto-generated by Cimas: Do not edit it manually!
2
- # See https://github.com/metanorma/cimas
3
- ruby:
4
- enabled: true
5
- config_file: .rubocop.yml
data/.rubocop.yml DELETED
@@ -1,10 +0,0 @@
1
- # Auto-generated by Cimas: Do not edit it manually!
2
- # See https://github.com/metanorma/cimas
3
- inherit_from:
4
- - https://raw.githubusercontent.com/riboseinc/oss-guides/master/ci/rubocop.yml
5
-
6
- # local repo-specific modifications
7
- # ...
8
-
9
- AllCops:
10
- TargetRubyVersion: 2.5
data/LICENSE.txt DELETED
@@ -1,25 +0,0 @@
1
- BSD 2-Clause License
2
-
3
- Copyright (c) 2018, Ribose
4
- All rights reserved.
5
-
6
- Redistribution and use in source and binary forms, with or without
7
- modification, are permitted provided that the following conditions are met:
8
-
9
- * Redistributions of source code must retain the above copyright notice, this
10
- list of conditions and the following disclaimer.
11
-
12
- * Redistributions in binary form must reproduce the above copyright notice,
13
- this list of conditions and the following disclaimer in the documentation
14
- and/or other materials provided with the distribution.
15
-
16
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
17
- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18
- IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19
- DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
20
- FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
21
- DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
22
- SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
23
- CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
24
- OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
25
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
data/exe/reverse_adoc DELETED
@@ -1,70 +0,0 @@
1
- #!/usr/bin/env ruby
2
- # Usage: reverse_adoc [FILE]...
3
- # Usage: cat FILE | reverse_adoc
4
- require "rubygems"
5
- require "bundler/setup"
6
-
7
- require "reverse_adoc"
8
- require "optparse"
9
- require "fileutils"
10
-
11
- OptionParser.new do |opts|
12
- opts.banner = "Usage: reverse_adoc [options] <file>"
13
- opts.on("-m", "--mathml2asciimath", "Convert MathML to AsciiMath") do |_v|
14
- ReverseAdoc.config.mathml2asciimath = true
15
- end
16
-
17
- opts.on("-oFILENAME", "--output=FILENAME", "Output file to write to") do |v|
18
- ReverseAdoc.config.destination = File.expand_path(v)
19
- # puts "output goes to #{ReverseAdoc.config.destination}"
20
- end
21
-
22
- opts.on("-e", "--external-images", "Export images if data URI") do |_v|
23
- ReverseAdoc.config.external_images = true
24
- end
25
-
26
- opts.on("-u", "--unknown_tags [pass_through, drop, bypass, raise]",
27
- "Unknown tag handling (default: pass_through)") do |v|
28
- ReverseAdoc.config.unknown_tags = v
29
- end
30
-
31
- opts.on("-v", "--version", "Version information") do |_v|
32
- puts "reverse_adoc: v#{ReverseAdoc::VERSION}"
33
- exit
34
- end
35
-
36
- opts.on("-h", "--help", "Prints this help") do
37
- puts opts
38
- exit
39
- end
40
- end.parse!
41
-
42
- if filename = ARGV.pop
43
- input_content = IO.read(filename)
44
- ReverseAdoc.config.sourcedir = File.dirname(File.expand_path(filename))
45
- else
46
- if ReverseAdoc.config.external_images
47
- raise "The -e | --external-images feature cannot be used with STDIN input. Exiting."
48
- end
49
-
50
- input_content = ARGF.read
51
- end
52
-
53
- if ReverseAdoc.config.external_images && ReverseAdoc.config.destination.nil?
54
- raise "The -e | --external-images feature must be used with -o | --output. Exiting."
55
- end
56
-
57
- # Read from STDIN
58
- adoc_content = ReverseAdoc.convert(input_content)
59
-
60
- # Print to STDOUT
61
- unless ReverseAdoc.config.destination
62
- puts adoc_content
63
- exit
64
- end
65
-
66
- # Write output to ReverseAdoc.config.destination
67
- FileUtils.mkdir_p(File.dirname(ReverseAdoc.config.destination))
68
- File.open(ReverseAdoc.config.destination, "w") do |file|
69
- file.write(adoc_content)
70
- end
data/exe/w2a DELETED
@@ -1,72 +0,0 @@
1
- #!/usr/bin/env ruby
2
- # frozen_string_literal: true
3
-
4
- require "rubygems"
5
- require "bundler/setup"
6
-
7
- require "word-to-markdown"
8
- require "optparse"
9
- require "reverse_adoc"
10
-
11
- ARGV.push("-h") if ARGV.empty?
12
-
13
- OptionParser.new do |opts|
14
- opts.banner = "Usage: w2a [options] <file>"
15
- opts.on("-m", "--mathml2asciimath", "Convert MathML to AsciiMath") do |_v|
16
- ReverseAdoc.config.mathml2asciimath = true
17
- end
18
-
19
- opts.on("-oFILENAME", "--output=FILENAME", "Output file to write to") do |v|
20
- ReverseAdoc.config.destination = File.expand_path(v)
21
- # puts "output goes to #{ReverseAdoc.config.destination}"
22
- end
23
-
24
- opts.on("-e", "--external-images", "Export images if data URI") do |_v|
25
- ReverseAdoc.config.external_images = true
26
- end
27
-
28
- opts.on("-v", "--version", "Version information") do |_v|
29
- puts "reverse_adoc: v#{ReverseAdoc::VERSION}"
30
- puts "[dependency] WordToMarkdown: v#{WordToMarkdown::VERSION}"
31
- if Gem.win_platform?
32
- puts "[dependency] LibreOffice: version not available on Windows"
33
- else
34
- puts "[dependency] LibreOffice: v#{WordToMarkdown.soffice.version}"
35
- end
36
- exit
37
- end
38
-
39
- opts.on("-h", "--help", "Prints this help") do
40
- puts opts
41
- exit
42
- end
43
- end.parse!
44
-
45
- filename = ARGV.pop
46
- raise "Please provide an input file to process. Exiting." unless filename
47
-
48
- if ReverseAdoc.config.external_images && ReverseAdoc.config.destination.nil?
49
- raise "The -e | --external-images feature must be used with -o | --output. Exiting."
50
- end
51
-
52
- ReverseAdoc.config.sourcedir = Dir.mktmpdir
53
-
54
- doc = WordToMarkdown.new(filename, ReverseAdoc.config.sourcedir)
55
- # File.open("test.html", "w:UTF-8") { |f| f.write doc.document.html }
56
- adoc_content = ReverseAdoc.convert(
57
- ReverseAdoc.cleaner.preprocess_word_html(doc.document.html),
58
- WordToMarkdown::REVERSE_MARKDOWN_OPTIONS,
59
- )
60
- # puts scrub_whitespace(doc.document.html)
61
-
62
- # Print to STDOUT
63
- unless ReverseAdoc.config.destination
64
- puts adoc_content
65
- exit
66
- end
67
-
68
- # Write output to ReverseAdoc.config.destination
69
- FileUtils.mkdir_p(File.dirname(ReverseAdoc.config.destination))
70
- File.open(ReverseAdoc.config.destination, "w") do |file|
71
- file.write(adoc_content)
72
- end
@@ -1,113 +0,0 @@
1
- module ReverseAdoc
2
- class Cleaner
3
- def tidy(string)
4
- result = remove_inner_whitespaces(String.new(string))
5
- result = remove_newlines(result)
6
- result = remove_leading_newlines(result)
7
- result = clean_tag_borders(result)
8
- clean_punctuation_characters(result)
9
- end
10
-
11
- def remove_newlines(string)
12
- string.gsub(/\n{3,}/, "\n\n")
13
- end
14
-
15
- def remove_leading_newlines(string)
16
- string.gsub(/\A\n+/, "")
17
- end
18
-
19
- def remove_inner_whitespaces(string)
20
- unless string.nil?
21
- string.gsub!(/\n stem:\[/, "\nstem:[")
22
- string.gsub!(/(stem:\[([^\]]|\\\])*\])\n(?=\S)/, "\\1 ")
23
- string.gsub!(/(stem:\[([^\]]|\\\])*\])\s+(?=[\^-])/, "\\1")
24
- end
25
- string.each_line.inject("") do |memo, line|
26
- memo + preserve_border_whitespaces(line) do
27
- line.strip.gsub(/[ \t]{2,}/, " ")
28
- end
29
- end
30
- end
31
-
32
- # Find non-asterisk content that is enclosed by two or
33
- # more asterisks. Ensure that only one whitespace occurs
34
- # in the border area.
35
- # Same for underscores and brackets.
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
42
-
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
-
49
- result = string.gsub(/\s?~{2,}.*?~{2,}\s?/) do |match|
50
- preserve_border_whitespaces(match,
51
- default_border: ReverseAdoc.config.tag_border) do
52
- match.strip.sub("~~ ", "~~").sub(" ~~", "~~")
53
- end
54
- end
55
-
56
- result.gsub(/\s?\[.*?\]\s?/) do |match|
57
- preserve_border_whitespaces(match) do
58
- match.strip.sub("[ ", "[").sub(" ]", "]")
59
- end
60
- end
61
- end
62
-
63
- def clean_punctuation_characters(string)
64
- string.gsub(/(\*\*|~~|__)\s([.!?'"])/, "#{'\\1'.strip}\\2")
65
- end
66
-
67
- # preprocesses HTML, rather than postprocessing it
68
- def preprocess_word_html(string)
69
- clean_headings(scrub_whitespace(string.dup))
70
- end
71
-
72
- def scrub_whitespace(string)
73
- string.gsub!(/&nbsp;|&#xA0;|\u00a0/i, "&#xA0;") # HTML encoded spaces
74
- string.sub!(/^\A[[:space:]]+/m, "") # document leading whitespace
75
- string.sub!(/[[:space:]]+\z$/m, "") # document trailing whitespace
76
- string.gsub!(/( +)$/, " ") # line trailing whitespace
77
- string.gsub!(/\n\n\n\n/, "\n\n") # Quadruple line breaks
78
- # string.delete!('?| ') # Unicode non-breaking spaces, injected as tabs
79
- string
80
- end
81
-
82
- # following added by me
83
- def clean_headings(string)
84
- string.gsub!(%r{<h([1-9])[^>]*></h\1>}, " ")
85
- # I don't know why Libre Office is inserting them, but they need to go
86
- string.gsub!(%r{<h([1-9])[^>]* style="vertical-align: super;[^>]*>(.+?)</h\1>},
87
- "<sup>\\2</sup>")
88
- # I absolutely don't know why Libre Office is rendering superscripts as h1
89
- string
90
- end
91
-
92
- private
93
-
94
- def preserve_border_whitespaces(string, options = {})
95
- return string if /\A\s*\Z/.match?(string)
96
-
97
- default_border = options.fetch(:default_border, "")
98
- # If the string contains part of a link so the characters [,],(,)
99
- # then don't add any extra spaces
100
- default_border = "" if /[\[(\])]/.match?(string)
101
- string_start = present_or_default(string[/\A\s*/], default_border)
102
- string_end = present_or_default(string[/\s*\Z/], default_border)
103
- result = yield
104
- string_start + result + string_end
105
- end
106
-
107
- def present_or_default(string, default)
108
- return default if string.nil? || string.empty?
109
-
110
- string
111
- end
112
- end
113
- end
@@ -1,54 +0,0 @@
1
- require "tmpdir"
2
-
3
- module ReverseAdoc
4
- class Config
5
- attr_accessor :unknown_tags, :tag_border, :mathml2asciimath, :external_images,
6
- :destination, :sourcedir, :image_counter, :image_counter_pattern, :input_format
7
-
8
- def initialize
9
- @unknown_tags = :pass_through
10
- @input_format = :html
11
- @mathml2asciimath = false
12
- @external_images = false
13
-
14
- # Destination to save file and images
15
- @destination = nil
16
-
17
- # Source of HTML
18
- # @sourcedir = nil
19
-
20
- # Image counter, assuming there are max 999 images
21
- @image_counter = 1
22
- # pad with 0s
23
- @image_counter_pattern = "%03d"
24
-
25
- @em_delimiter = "_".freeze
26
- @strong_delimiter = "*".freeze
27
- @inline_options = {}
28
- @tag_border = " ".freeze
29
- end
30
-
31
- def with(options = {})
32
- @inline_options = options
33
- result = yield
34
- @inline_options = {}
35
- result
36
- end
37
-
38
- def unknown_tags
39
- @inline_options[:unknown_tags] || @unknown_tags
40
- end
41
-
42
- def mathml2asciimath
43
- @inline_options[:mathml2asciimath] || @mathml2asciimath
44
- end
45
-
46
- def external_images
47
- @inline_options[:external_images] || @external_images
48
- end
49
-
50
- def tag_border
51
- @inline_options[:tag_border] || @tag_border
52
- end
53
- end
54
- end
@@ -1,42 +0,0 @@
1
- require "coradoc"
2
-
3
- module ReverseAdoc
4
- module Converters
5
- class A < Base
6
- def to_coradoc(node, state = {})
7
- name = treat_children(node, state)
8
-
9
- href = node["href"]
10
- title = extract_title(node)
11
- id = node["id"] || node["name"]
12
-
13
- id = id&.gsub(/\s/, "")&.gsub(/__+/, "_")
14
-
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?("#")
22
- href = href.sub(/^#/, "").gsub(/\s/, "").gsub(/__+/, "_")
23
- return Coradoc::Element::Inline::CrossReference.new(href, name)
24
- end
25
-
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
34
-
35
- def convert(node, state = {})
36
- Coradoc::Generator.gen_adoc(to_coradoc(node, state))
37
- end
38
- end
39
-
40
- register :a, A.new
41
- end
42
- end
@@ -1,16 +0,0 @@
1
- module ReverseAdoc
2
- module Converters
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
-
9
- def convert(node, state = {})
10
- Coradoc::Generator.gen_adoc(to_coradoc(node, state))
11
- end
12
- end
13
-
14
- register :aside, Aside.new
15
- end
16
- end
@@ -1,29 +0,0 @@
1
- module ReverseAdoc
2
- module Converters
3
- class Audio < Base
4
- def to_coradoc(node, _state = {})
5
- src = node["src"]
6
- id = node["id"]
7
- title = extract_title(node)
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))
17
- end
18
-
19
- def options(node)
20
- autoplay = node["autoplay"]
21
- loop_attr = node["loop"]
22
- controls = node["controls"]
23
- [autoplay, loop_attr, controls].compact
24
- end
25
- end
26
-
27
- register :audio, Audio.new
28
- end
29
- end
@@ -1,100 +0,0 @@
1
- module ReverseAdoc
2
- module Converters
3
- class Base
4
- def treat_children(node, state)
5
- node.children.inject("") do |memo, child|
6
- memo << treat(child, state)
7
- end
8
- end
9
-
10
- def treat(node, state)
11
- ReverseAdoc::Converters.lookup(node.name).convert(node, state)
12
- end
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
-
24
- def escape_keychars(string)
25
- subs = { "*" => '\*', "_" => '\_' }
26
- string
27
- .gsub(/((?<=\s)[\*_]+)|[\*_]+(?=\s)/) do |n|
28
- n.chars.map do |char|
29
- subs[char]
30
- end.join
31
- end
32
- end
33
-
34
- def extract_title(node)
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
97
- end
98
- end
99
- end
100
- end
@@ -1,27 +0,0 @@
1
- module 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 = 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
@@ -1,15 +0,0 @@
1
- module 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
@@ -1,81 +0,0 @@
1
- module 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