Module: Metanorma::Standoc::Review

Included in:
Cleanup
Defined in:
lib/metanorma/cleanup/review.rb

Instance Method Summary collapse

Instance Method Details

#available_bookmark_destination(node) ⇒ Object

we know node is a block: dig for a place bookmark can go



26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
# File 'lib/metanorma/cleanup/review.rb', line 26

def available_bookmark_destination(node)
  ret = case node.name
        when "title", "name", "p" then node
        when "sourcecode" then node.at(".//name")
        when "admonition", "note", "example", "li", "quote", "dt", "dd",
          "permission", "requirement", "recommendation"
          node.at(".//p | .//name") || node
        when "formula"
          node.at(".//p | .//name | .//dt")
        when "ol", "ul" then node.at(".//p | .//name") || node.at("./li")
        when "dl" then node.at(".//p | .//name") || node.at("./dt | ./dd")
        when "table" then node.at(".//td[text()] | .//th[text()]")
        end or return nil
  first_non_stem_text(ret)
end

#find_review_sibling(children, index, direction = :previous) ⇒ Object



53
54
55
56
57
58
59
60
61
62
63
64
65
# File 'lib/metanorma/cleanup/review.rb', line 53

def find_review_sibling(children, index, direction = :previous)
  range = if direction == :previous then (index - 1).downto(0)
          else (index + 1).upto(children.size - 1)
          end
  range.each do |i|
    node = children[i]
    if node.element? && !node.text.empty? && node.text.strip != "" &&
        ret = available_bookmark_destination(node)
      return ret
    end
  end
  nil
end

#first_non_stem_text(ret) ⇒ Object



42
43
44
45
46
47
48
49
50
51
# File 'lib/metanorma/cleanup/review.rb', line 42

def first_non_stem_text(ret)
  first_non_stem_text = nil
  ret.traverse do |n|
    if n.text? && n.ancestors("stem").empty? && !n.text.strip.empty?
      first_non_stem_text = n
      break
    end
  end
  first_non_stem_text
end

#review_cleanup(xmldoc) ⇒ Object



4
5
6
7
8
9
10
11
12
# File 'lib/metanorma/cleanup/review.rb', line 4

def review_cleanup(xmldoc)
  reviews = xmldoc.xpath("//annotation")
  reviews.empty? and return
  ctr = xmldoc.root.add_child("<annotation-container/>").first
  reviews.each do |r|
    review_set_location(r)
    ctr << r
  end
end

#review_insert_bookmark(review) ⇒ Object



14
15
16
17
18
19
20
21
22
23
# File 'lib/metanorma/cleanup/review.rb', line 14

def review_insert_bookmark(review)
  parent = review.parent
  children = parent.children
  index = children.index(review)
  x = find_review_sibling(children, index, :previous) ||
    find_review_sibling(children, index, :following)
  ins = x || review.before("<p> </p>").previous.at(".//text()")
  ins.previous = "<bookmark/>"
  ins.previous
end

#review_set_location(review) ⇒ Object



67
68
69
70
71
72
73
74
75
# File 'lib/metanorma/cleanup/review.rb', line 67

def review_set_location(review)
  unless review["from"]
    bookmark = review_insert_bookmark(review)
    add_id(bookmark)
    bookmark["anchor"] = bookmark["id"]
    review["from"] = bookmark["id"]
  end
  review["to"] ||= review["from"]
end