Class: ReverseAdoc::Converters::Base

Inherits:
Object
  • Object
show all
Defined in:
lib/reverse_adoc/converters/base.rb

Direct Known Subclasses

A, Aside, Audio, Blockquote, Br, Bypass, Code, Div, Drop, Em, Figure, H, Head, Hr, Ignore, Img, Li, Mark, Math, Ol, P, PassThrough, Pre, Q, Strong, Sub, Sup, Table, Td, Text, Tr, Video

Instance Method Summary collapse

Instance Method Details

#constrained?(node) ⇒ Boolean

TODO: This logic ought to be cleaned up.

Returns:

  • (Boolean)


74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
# File 'lib/reverse_adoc/converters/base.rb', line 74

def constrained?(node)
  before = node.at_xpath("preceding::node()[1]").to_s[-1]
  before = if before
             before&.match?(/\s/) ? true : false
           else
             true
           end

  if !before && (node.to_s[0] =~ /\s/)
    before = true
  end

  after = node.at_xpath("following::node()[1]").to_s[0]
  after = if after
            after&.match?(/\s|,|;|"|\.\?!/) ? true : false
          else
            true
          end
  if !after && (node.to_s[-1] =~ /\s/)
    after = true
  end

  before && after
end

#escape_keychars(string) ⇒ Object



24
25
26
27
28
29
30
31
32
# File 'lib/reverse_adoc/converters/base.rb', line 24

def escape_keychars(string)
  subs = { "*" => '\*', "_" => '\_' }
  string
    .gsub(/((?<=\s)[\*_]+)|[\*_]+(?=\s)/) do |n|
    n.chars.map do |char|
      subs[char]
    end.join
  end
end

#extract_title(node) ⇒ Object



34
35
36
37
# File 'lib/reverse_adoc/converters/base.rb', line 34

def extract_title(node)
  title = escape_keychars(node["title"].to_s)
  title.empty? ? "" : %[ #{title}]
end

#node_has_ancestor?(node, name) ⇒ Boolean

Returns:

  • (Boolean)


39
40
41
42
43
44
45
46
# File 'lib/reverse_adoc/converters/base.rb', line 39

def node_has_ancestor?(node, name)
  case name
  when String
    node.ancestors.map(&:name).include?(name)
  when Array
    (node.ancestors.map(&:name) & name).any?
  end
end

#textnode_before_end_with?(node, str) ⇒ Boolean

Returns:

  • (Boolean)


48
49
50
51
52
53
# File 'lib/reverse_adoc/converters/base.rb', line 48

def textnode_before_end_with?(node, str)
  return nil if !str.is_a?(String) || str.empty?

  node2 = node.at_xpath("preceding-sibling::node()[1]")
  node2.respond_to?(:text) && node2.text.end_with?(str)
end

#treat(node, state) ⇒ Object



10
11
12
# File 'lib/reverse_adoc/converters/base.rb', line 10

def treat(node, state)
  ReverseAdoc::Converters.lookup(node.name).convert(node, state)
end

#treat_children(node, state) ⇒ Object



4
5
6
7
8
# File 'lib/reverse_adoc/converters/base.rb', line 4

def treat_children(node, state)
  node.children.inject("") do |memo, child|
    memo << treat(child, state)
  end
end

#treat_children_coradoc(node, state) ⇒ Object



14
15
16
17
18
# File 'lib/reverse_adoc/converters/base.rb', line 14

def treat_children_coradoc(node, state)
  node.children.inject([]) do |memo, child|
    memo << treat_coradoc(child, state)
  end.flatten.reject { |x| x == "" || x.nil? }
end

#treat_coradoc(node, state) ⇒ Object



20
21
22
# File 'lib/reverse_adoc/converters/base.rb', line 20

def treat_coradoc(node, state)
  ReverseAdoc::Converters.lookup(node.name).to_coradoc(node, state)
end

#unconstrained_after?(node) ⇒ Boolean

TODO: This logic ought to be cleaned up.

Returns:

  • (Boolean)


64
65
66
67
68
69
# File 'lib/reverse_adoc/converters/base.rb', line 64

def unconstrained_after?(node)
  after = node.at_xpath("following::node()[1]")

  after && !after.text.strip.empty? &&
    after.text[0]&.match?(/\w|,|;|"|\.\?!/)
end

#unconstrained_before?(node) ⇒ Boolean

Returns:

  • (Boolean)


55
56
57
58
59
60
61
# File 'lib/reverse_adoc/converters/base.rb', line 55

def unconstrained_before?(node)
  before = node.at_xpath("preceding::node()[1]")

  before &&
    !before.text.strip.empty? &&
    before.text[-1]&.match?(/\w/)
end