stepmod-utils 0.3.5 → 0.3.7

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 (66) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/rake.yml +1 -1
  3. data/.github/workflows/release.yml +4 -3
  4. data/.rubocop.yml +1 -1
  5. data/Gemfile +3 -3
  6. data/Rakefile +1 -1
  7. data/exe/stepmod-annotate-all +17 -11
  8. data/exe/stepmod-build-resource-docs-cache +8 -7
  9. data/exe/stepmod-convert-express-description +6 -4
  10. data/exe/stepmod-convert-express-resource +6 -4
  11. data/exe/stepmod-extract-terms +38 -25
  12. data/exe/stepmod-find-express-files +8 -7
  13. data/lib/stepmod/utils/bibdata.rb +31 -35
  14. data/lib/stepmod/utils/cleaner.rb +3 -3
  15. data/lib/stepmod/utils/concept.rb +30 -35
  16. data/lib/stepmod/utils/converters/a.rb +7 -10
  17. data/lib/stepmod/utils/converters/blockquote.rb +4 -4
  18. data/lib/stepmod/utils/converters/br.rb +1 -1
  19. data/lib/stepmod/utils/converters/bypass.rb +33 -33
  20. data/lib/stepmod/utils/converters/clause_ref.rb +3 -3
  21. data/lib/stepmod/utils/converters/code.rb +1 -1
  22. data/lib/stepmod/utils/converters/comment.rb +5 -3
  23. data/lib/stepmod/utils/converters/dd.rb +2 -2
  24. data/lib/stepmod/utils/converters/def.rb +19 -19
  25. data/lib/stepmod/utils/converters/drop.rb +2 -2
  26. data/lib/stepmod/utils/converters/dt.rb +2 -2
  27. data/lib/stepmod/utils/converters/em.rb +1 -1
  28. data/lib/stepmod/utils/converters/em_express_description.rb +1 -1
  29. data/lib/stepmod/utils/converters/eqn.rb +28 -26
  30. data/lib/stepmod/utils/converters/example.rb +5 -6
  31. data/lib/stepmod/utils/converters/express_g.rb +10 -9
  32. data/lib/stepmod/utils/converters/express_ref.rb +2 -2
  33. data/lib/stepmod/utils/converters/express_ref_express_description.rb +3 -2
  34. data/lib/stepmod/utils/converters/ext_description.rb +1 -1
  35. data/lib/stepmod/utils/converters/figure.rb +3 -3
  36. data/lib/stepmod/utils/converters/fund_cons.rb +1 -1
  37. data/lib/stepmod/utils/converters/head.rb +3 -2
  38. data/lib/stepmod/utils/converters/hr.rb +2 -2
  39. data/lib/stepmod/utils/converters/ignore.rb +3 -3
  40. data/lib/stepmod/utils/converters/introduction.rb +1 -1
  41. data/lib/stepmod/utils/converters/module_ref.rb +6 -6
  42. data/lib/stepmod/utils/converters/note.rb +5 -6
  43. data/lib/stepmod/utils/converters/ol.rb +5 -5
  44. data/lib/stepmod/utils/converters/p.rb +2 -2
  45. data/lib/stepmod/utils/converters/pass_through.rb +2 -2
  46. data/lib/stepmod/utils/converters/q.rb +1 -1
  47. data/lib/stepmod/utils/converters/schema.rb +1 -1
  48. data/lib/stepmod/utils/converters/stem.rb +1 -1
  49. data/lib/stepmod/utils/converters/stepmod_ext_description.rb +5 -4
  50. data/lib/stepmod/utils/converters/strong.rb +5 -4
  51. data/lib/stepmod/utils/converters/sub.rb +2 -2
  52. data/lib/stepmod/utils/converters/sup.rb +2 -2
  53. data/lib/stepmod/utils/converters/synonym.rb +2 -2
  54. data/lib/stepmod/utils/converters/table.rb +7 -9
  55. data/lib/stepmod/utils/converters/term.rb +18 -9
  56. data/lib/stepmod/utils/converters/text.rb +11 -13
  57. data/lib/stepmod/utils/converters/uof.rb +3 -4
  58. data/lib/stepmod/utils/html_to_asciimath.rb +91 -90
  59. data/lib/stepmod/utils/smrl_description_converter.rb +34 -33
  60. data/lib/stepmod/utils/smrl_resource_converter.rb +50 -49
  61. data/lib/stepmod/utils/stepmod_definition_converter.rb +39 -38
  62. data/lib/stepmod/utils/stepmod_file_annotator.rb +26 -19
  63. data/lib/stepmod/utils/terms_extractor.rb +138 -86
  64. data/lib/stepmod/utils/version.rb +1 -1
  65. data/stepmod-utils.gemspec +11 -5
  66. metadata +71 -15
@@ -1,11 +1,11 @@
1
- require 'reverse_adoc/cleaner'
1
+ require "reverse_adoc/cleaner"
2
2
 
3
3
  module Stepmod
4
4
  module Utils
5
5
  class Cleaner < ReverseAdoc::Cleaner
6
6
  def tidy(string)
7
- super.gsub(/^ +/, '')
7
+ super.gsub(/^ +/, "")
8
8
  end
9
9
  end
10
10
  end
11
- end
11
+ end
@@ -1,39 +1,29 @@
1
+ require "glossarist"
2
+
1
3
  module Stepmod
2
4
  module Utils
3
-
4
- class Concept
5
+ class Concept < Glossarist::LocalizedConcept
5
6
  attr_accessor *%w(
6
- designation
7
- definition
8
- reference_anchor
9
7
  reference_clause
10
- examples
11
- notes
12
- synonym
8
+ reference_anchor
13
9
  converted_definition
14
10
  file_path
15
11
  )
16
12
 
17
- def initialize(options)
18
- options.each_pair do |k, v|
19
- send("#{k}=", v)
20
- end
21
- end
22
-
23
13
  class << self
24
- def parse(definition_xml, reference_anchor:, reference_clause:, file_path:)
14
+ def parse(definition_xml, reference_anchor:, reference_clause:, file_path:, language_code: "en")
25
15
  converted_definition = Stepmod::Utils::StepmodDefinitionConverter.convert(
26
16
  definition_xml,
27
17
  {
28
18
  # We don't want examples and notes
29
19
  no_notes_examples: true,
30
- reference_anchor: reference_anchor
31
- }
20
+ reference_anchor: reference_anchor,
21
+ },
32
22
  )
33
23
 
34
24
  return nil if converted_definition.nil? || converted_definition.strip.empty?
35
25
 
36
- if definition_xml.name == 'ext_description'
26
+ if definition_xml.name == "ext_description"
37
27
  converted_definition = <<~TEXT
38
28
  #{converted_definition}
39
29
 
@@ -42,35 +32,40 @@ module Stepmod
42
32
  TEXT
43
33
  end
44
34
  # https://github.com/metanorma/stepmod-utils/issues/86
45
- if definition_xml.name == 'definition'
35
+ if definition_xml.name == "definition"
46
36
  designation = definition_designation(definition_xml)
47
- definition = definition_xml_definition(definition_xml, reference_anchor)
48
- converted_definition = definition_xml_converted_definition(designation, definition).strip
37
+ definition = definition_xml_definition(definition_xml,
38
+ reference_anchor)
39
+ converted_definition = definition_xml_converted_definition(
40
+ designation, definition
41
+ ).strip
49
42
  end
50
43
  new(
51
- designation: designation,
44
+ designations: [designation],
52
45
  definition: definition,
53
46
  converted_definition: converted_definition,
47
+ id: "#{reference_anchor}.#{reference_clause}",
54
48
  reference_anchor: reference_anchor,
55
49
  reference_clause: reference_clause,
56
- file_path: file_path
50
+ file_path: file_path,
51
+ language_code: language_code,
57
52
  )
58
53
  end
59
54
 
60
55
  def definition_designation(definition_xml)
61
- alts = definition_xml.xpath('.//def/p').map(&:text)
56
+ alts = definition_xml.xpath(".//def/p").map(&:text)
62
57
  {
63
- accepted: definition_xml.xpath('.//term').first&.text,
64
- alt: alts
58
+ accepted: definition_xml.xpath(".//term").first&.text,
59
+ alt: alts,
65
60
  }
66
61
  end
67
62
 
68
63
  def definition_xml_definition(definition_xml, reference_anchor)
69
64
  text_nodes = definition_xml
70
- .xpath('.//def')
71
- .first
72
- .children
73
- .reject { |n| n.name == 'p' }
65
+ .xpath(".//def")
66
+ .first
67
+ .children
68
+ .reject { |n| n.name == "p" }
74
69
  wrapper = "<def>#{text_nodes.map(&:to_s).join}</def>"
75
70
  Stepmod::Utils::Converters::Def
76
71
  .new
@@ -79,8 +74,9 @@ module Stepmod
79
74
  {
80
75
  # We don't want examples and notes
81
76
  no_notes_examples: true,
82
- reference_anchor: reference_anchor
83
- })
77
+ reference_anchor: reference_anchor,
78
+ },
79
+ )
84
80
  end
85
81
 
86
82
  def definition_xml_converted_definition(designation, definition)
@@ -105,15 +101,14 @@ module Stepmod
105
101
 
106
102
  def to_mn_adoc
107
103
  <<~TEXT
108
- // STEPmod path:#{!file_path.empty? ? " #{file_path}" : ""}
104
+ // STEPmod path:#{!file_path.empty? ? " #{file_path}" : ''}
109
105
  #{converted_definition}
110
106
 
111
107
  [.source]
112
- <<#{reference_anchor}#{reference_clause ? ",clause=" + reference_clause : ""}>>
108
+ <<#{reference_anchor}#{reference_clause ? ",clause=#{reference_clause}" : ''}>>
113
109
 
114
110
  TEXT
115
111
  end
116
-
117
112
  end
118
113
  end
119
114
  end
@@ -8,17 +8,17 @@ module Stepmod
8
8
  class A < ReverseAdoc::Converters::Base
9
9
  def convert(node, state = {})
10
10
  name = treat_children(node, state)
11
- href = node['href']
11
+ href = node["href"]
12
12
  title = extract_title(node)
13
- id = node['id'] || node['name']
13
+ id = node["id"] || node["name"]
14
14
 
15
15
  id = id&.gsub(/\s/, "")&.gsub(/__+/, "_")
16
16
 
17
- if /^_Toc\d+$|^_GoBack$/.match id
17
+ if /^_Toc\d+$|^_GoBack$/.match? id
18
18
  ""
19
19
  elsif !id.nil? && !id.empty?
20
20
  "[[#{id}]]"
21
- elsif href.to_s.start_with?('#')
21
+ elsif href.to_s.start_with?("#")
22
22
  href = href.sub(/^#/, "").gsub(/\s/, "").gsub(/__+/, "_")
23
23
  if name.empty?
24
24
  "<<#{href}>>"
@@ -29,16 +29,13 @@ module Stepmod
29
29
  name
30
30
  else
31
31
  name = title if name.empty?
32
- href = "link:#{href}" unless href.to_s =~ URI::DEFAULT_PARSER.make_regexp
32
+ href = "link:#{href}" unless href.to_s&.match?(URI::DEFAULT_PARSER.make_regexp)
33
33
  link = "#{href}[#{name}]"
34
34
  # link.prepend(' ')
35
- link = " #{link}"
36
- link
35
+ " #{link}"
36
+
37
37
  end
38
38
  end
39
-
40
- private
41
-
42
39
  end
43
40
 
44
41
  ReverseAdoc::Converters.register :a, A.new
@@ -5,14 +5,14 @@ module Stepmod
5
5
  module Converters
6
6
  class Blockquote < ReverseAdoc::Converters::Base
7
7
  def convert(node, state = {})
8
- id = node['id']
8
+ id = node["id"]
9
9
  anchor = id ? "[[#{id}]]\n" : ""
10
- cite = node['cite']
10
+ cite = node["cite"]
11
11
  attrs = cite ? "[quote, #{cite}]\n" : ""
12
12
  content = treat_children(node, state).strip
13
13
  content = ReverseAdoc.cleaner.remove_newlines(content)
14
- #"\n\n> " << content.lines.to_a.join('> ') << "\n\n"
15
- "\n\n#{attrs}____\n" << content.lines.to_a.join('') << "\n____\n\n"
14
+ # "\n\n> " << content.lines.to_a.join('> ') << "\n\n"
15
+ "\n\n#{attrs}____\n" << content.lines.to_a.join("") << "\n____\n\n"
16
16
  end
17
17
  end
18
18
 
@@ -4,7 +4,7 @@ module Stepmod
4
4
  module Utils
5
5
  module Converters
6
6
  class Br < ReverseAdoc::Converters::Base
7
- def convert(node, state = {})
7
+ def convert(_node, _state = {})
8
8
  " +\n"
9
9
  end
10
10
  end
@@ -16,66 +16,66 @@ module Stepmod
16
16
  ReverseAdoc::Converters.register :thead, Bypass.new
17
17
  ReverseAdoc::Converters.register :tbody, Bypass.new
18
18
  ReverseAdoc::Converters.register :tfoot, Bypass.new
19
- ReverseAdoc::Converters.register :abbr, Bypass.new
19
+ ReverseAdoc::Converters.register :abbr, Bypass.new
20
20
  ReverseAdoc::Converters.register :acronym, Bypass.new
21
21
  ReverseAdoc::Converters.register :address, Bypass.new
22
- ReverseAdoc::Converters.register :applet, Bypass.new
23
- ReverseAdoc::Converters.register :map, Bypass.new
24
- ReverseAdoc::Converters.register :area, Bypass.new
22
+ ReverseAdoc::Converters.register :applet, Bypass.new
23
+ ReverseAdoc::Converters.register :map, Bypass.new
24
+ ReverseAdoc::Converters.register :area, Bypass.new
25
25
  ReverseAdoc::Converters.register :bdi, Bypass.new
26
26
  ReverseAdoc::Converters.register :bdo, Bypass.new
27
27
  ReverseAdoc::Converters.register :big, Bypass.new
28
28
  ReverseAdoc::Converters.register :button, Bypass.new
29
29
  ReverseAdoc::Converters.register :canvas, Bypass.new
30
- ReverseAdoc::Converters.register :data, Bypass.new
31
- ReverseAdoc::Converters.register :datalist, Bypass.new
30
+ ReverseAdoc::Converters.register :data, Bypass.new
31
+ ReverseAdoc::Converters.register :datalist, Bypass.new
32
32
  ReverseAdoc::Converters.register :del, Bypass.new
33
33
  ReverseAdoc::Converters.register :ins, Bypass.new
34
34
  ReverseAdoc::Converters.register :dfn, Bypass.new
35
- ReverseAdoc::Converters.register :dialog, Bypass.new
36
- ReverseAdoc::Converters.register :embed, Bypass.new
37
- ReverseAdoc::Converters.register :fieldset, Bypass.new
38
- ReverseAdoc::Converters.register :font, Bypass.new
39
- ReverseAdoc::Converters.register :footer, Bypass.new
40
- ReverseAdoc::Converters.register :form, Bypass.new
41
- ReverseAdoc::Converters.register :frame, Bypass.new
42
- ReverseAdoc::Converters.register :frameset, Bypass.new
35
+ ReverseAdoc::Converters.register :dialog, Bypass.new
36
+ ReverseAdoc::Converters.register :embed, Bypass.new
37
+ ReverseAdoc::Converters.register :fieldset, Bypass.new
38
+ ReverseAdoc::Converters.register :font, Bypass.new
39
+ ReverseAdoc::Converters.register :footer, Bypass.new
40
+ ReverseAdoc::Converters.register :form, Bypass.new
41
+ ReverseAdoc::Converters.register :frame, Bypass.new
42
+ ReverseAdoc::Converters.register :frameset, Bypass.new
43
43
  ReverseAdoc::Converters.register :header, Bypass.new
44
44
  ReverseAdoc::Converters.register :iframe, Bypass.new
45
45
  ReverseAdoc::Converters.register :input, Bypass.new
46
46
  ReverseAdoc::Converters.register :label, Bypass.new
47
- ReverseAdoc::Converters.register :legend, Bypass.new
47
+ ReverseAdoc::Converters.register :legend, Bypass.new
48
48
  ReverseAdoc::Converters.register :main, Bypass.new
49
49
  ReverseAdoc::Converters.register :menu, Bypass.new
50
- ReverseAdoc::Converters.register :menulist, Bypass.new
51
- ReverseAdoc::Converters.register :meter, Bypass.new
52
- ReverseAdoc::Converters.register :nav, Bypass.new
50
+ ReverseAdoc::Converters.register :menulist, Bypass.new
51
+ ReverseAdoc::Converters.register :meter, Bypass.new
52
+ ReverseAdoc::Converters.register :nav, Bypass.new
53
53
  ReverseAdoc::Converters.register :noframes, Bypass.new
54
54
  ReverseAdoc::Converters.register :noscript, Bypass.new
55
- ReverseAdoc::Converters.register :object, Bypass.new
56
- ReverseAdoc::Converters.register :optgroup, Bypass.new
55
+ ReverseAdoc::Converters.register :object, Bypass.new
56
+ ReverseAdoc::Converters.register :optgroup, Bypass.new
57
57
  ReverseAdoc::Converters.register :option, Bypass.new
58
58
  ReverseAdoc::Converters.register :output, Bypass.new
59
- ReverseAdoc::Converters.register :param, Bypass.new
60
- ReverseAdoc::Converters.register :picture, Bypass.new
61
- ReverseAdoc::Converters.register :progress, Bypass.new
62
- ReverseAdoc::Converters.register :ruby, Bypass.new
59
+ ReverseAdoc::Converters.register :param, Bypass.new
60
+ ReverseAdoc::Converters.register :picture, Bypass.new
61
+ ReverseAdoc::Converters.register :progress, Bypass.new
62
+ ReverseAdoc::Converters.register :ruby, Bypass.new
63
63
  ReverseAdoc::Converters.register :rt, Bypass.new
64
64
  ReverseAdoc::Converters.register :rp, Bypass.new
65
- ReverseAdoc::Converters.register :s, Bypass.new
66
- ReverseAdoc::Converters.register :select, Bypass.new
67
- ReverseAdoc::Converters.register :small, Bypass.new
68
- ReverseAdoc::Converters.register :span, Bypass.new
69
- ReverseAdoc::Converters.register :strike, Bypass.new
65
+ ReverseAdoc::Converters.register :s, Bypass.new
66
+ ReverseAdoc::Converters.register :select, Bypass.new
67
+ ReverseAdoc::Converters.register :small, Bypass.new
68
+ ReverseAdoc::Converters.register :span, Bypass.new
69
+ ReverseAdoc::Converters.register :strike, Bypass.new
70
70
  ReverseAdoc::Converters.register :details, Bypass.new
71
71
  ReverseAdoc::Converters.register :section, Bypass.new
72
72
  ReverseAdoc::Converters.register :summary, Bypass.new
73
- ReverseAdoc::Converters.register :svg, Bypass.new
73
+ ReverseAdoc::Converters.register :svg, Bypass.new
74
74
  ReverseAdoc::Converters.register :template, Bypass.new
75
75
  ReverseAdoc::Converters.register :textarea, Bypass.new
76
- ReverseAdoc::Converters.register :track, Bypass.new
77
- ReverseAdoc::Converters.register :u, Bypass.new
78
- ReverseAdoc::Converters.register :wbr, Bypass.new
76
+ ReverseAdoc::Converters.register :track, Bypass.new
77
+ ReverseAdoc::Converters.register :u, Bypass.new
78
+ ReverseAdoc::Converters.register :wbr, Bypass.new
79
79
  end
80
80
  end
81
81
  end
@@ -5,7 +5,7 @@ module Stepmod
5
5
  module Converters
6
6
  class ClauseRef < ReverseAdoc::Converters::Base
7
7
  def convert(node, _state = {})
8
- " term:[#{normalized_ref(node['linkend'])}] "
8
+ " {{#{normalized_ref(node['linkend'])}}} "
9
9
  end
10
10
 
11
11
  private
@@ -13,10 +13,10 @@ module Stepmod
13
13
  def normalized_ref(ref)
14
14
  return unless ref || ref.empty?
15
15
 
16
- ref.to_s.split(':').last.squeeze(' ').strip
16
+ ref.to_s.split(":").last.squeeze(" ").strip
17
17
  end
18
18
  end
19
19
  ReverseAdoc::Converters.register :clause_ref, ClauseRef.new
20
20
  end
21
21
  end
22
- end
22
+ end
@@ -4,7 +4,7 @@ module Stepmod
4
4
  module Utils
5
5
  module Converters
6
6
  class Code < ReverseAdoc::Converters::Base
7
- def convert(node, state = {})
7
+ def convert(node, _state = {})
8
8
  "`#{node.text}`"
9
9
  end
10
10
  end
@@ -4,8 +4,10 @@ module Stepmod
4
4
  module Utils
5
5
  module Converters
6
6
  class Comment < ReverseAdoc::Converters::Base
7
- def convert(node, state = {})
8
- comment = node.text.strip.split("\n").map{|line| "// #{line}"}.join("\n")
7
+ def convert(node, _state = {})
8
+ comment = node.text.strip.split("\n").map do |line|
9
+ "\n// #{line}"
10
+ end.join("\n")
9
11
  "#{comment}\n"
10
12
  end
11
13
  end
@@ -13,4 +15,4 @@ module Stepmod
13
15
  ReverseAdoc::Converters.register :comment, Comment.new
14
16
  end
15
17
  end
16
- end
18
+ end
@@ -4,7 +4,7 @@ module Stepmod
4
4
  module Utils
5
5
  module Converters
6
6
  class Dd < ReverseAdoc::Converters::Base
7
- def convert(node, state = {})
7
+ def convert(node, _state = {})
8
8
  "#{node.text}\n"
9
9
  end
10
10
 
@@ -12,4 +12,4 @@ module Stepmod
12
12
  end
13
13
  end
14
14
  end
15
- end
15
+ end
@@ -1,4 +1,3 @@
1
-
2
1
  module Stepmod
3
2
  module Utils
4
3
  module Converters
@@ -12,30 +11,29 @@ module Stepmod
12
11
 
13
12
  def treat_children(node, state)
14
13
  converted = node.children.each_with_object({}) do |child, res|
15
-
16
14
  content = treat(child, state)
17
15
  next if content.strip.empty?
18
16
 
19
17
  res[child] = content
20
18
  end
21
19
  previous = nil
22
- result = ''
23
-
24
- converted.each.with_index do |(child, content), i|
25
- if block_tag?(child, previous)
26
- result += "\n\n"
27
- elsif comment_tag?(child, previous)
28
- result += "\n"
29
- else
30
- result += ' '
31
- end
20
+ result = ""
21
+
22
+ converted.each.with_index do |(child, content), _i|
23
+ result += if block_tag?(child, previous)
24
+ "\n\n"
25
+ elsif comment_tag?(child, previous)
26
+ "\n"
27
+ else
28
+ " "
29
+ end
32
30
  result += content
33
31
  previous = child
34
32
  end
35
33
 
36
34
  # Remove double newlines for every line
37
35
  result = result.gsub(/\n\n+/, "\n\n")
38
- result = result.squeeze(' ')
36
+ result = result.squeeze(" ")
39
37
 
40
38
  result.strip
41
39
  end
@@ -46,14 +44,14 @@ module Stepmod
46
44
  end
47
45
 
48
46
  def comment_tag?(child, previous)
49
- child.name == 'comment' || (previous && previous.name === 'comment')
47
+ child.name == "comment" || (previous && previous.name === "comment")
50
48
  end
51
49
 
52
50
  def additional_block(node)
53
51
  # Treat first `p` tag as an `alt` block, metanorma/stepmod-utils#9
54
52
  first_child_tag = node
55
- .children
56
- .find { |n| n.is_a?(Nokogiri::XML::Element) }
53
+ .children
54
+ .find { |n| n.is_a?(Nokogiri::XML::Element) }
57
55
  return unless can_transform_to_alt?(first_child_tag)
58
56
 
59
57
  result = Stepmod::Utils::Converters::Synonym
@@ -66,12 +64,14 @@ module Stepmod
66
64
 
67
65
  # metanorma/stepmod-utils#18 when para is the only text doe snot transform it
68
66
  def can_transform_to_alt?(first_child_tag)
69
- return false unless first_child_tag&.name == 'p' &&
70
- defined?(Stepmod::Utils::Converters::Synonym)
67
+ return false unless first_child_tag&.name == "p" &&
68
+ defined?(Stepmod::Utils::Converters::Synonym)
71
69
 
72
70
  next_sibling = first_child_tag.next
73
71
  while next_sibling
74
- return true if !next_sibling.text.to_s.strip.empty? && %w[p text].include?(next_sibling.name)
72
+ return true if !next_sibling.text.to_s.strip.empty? && %w[p
73
+ text].include?(next_sibling.name)
74
+
75
75
  next_sibling = next_sibling.next
76
76
  end
77
77
  false