Module: IsoDoc::WordFunction::Comments

Included in:
IsoDoc::WordConvert
Defined in:
lib/isodoc/word_function/comments.rb

Constant Summary collapse

COMMENT_IN_COMMENT_LIST1 =
'//div[@style="mso-element:comment-list"]//' \
'span[@style="MsoCommentReference"]'.freeze
COMMENT_TARGET_XREFS1 =
"//span[@style='mso-special-character:comment']/@target".freeze

Instance Method Summary collapse

Instance Method Details

#comment_attributes(docxml, span) ⇒ Object



82
83
84
85
86
87
88
89
# File 'lib/isodoc/word_function/comments.rb', line 82

def comment_attributes(docxml, span)
  fromlink = docxml.at("//*[@id='#{span['from']}']")
  return(nil) if fromlink.nil?

  tolink = docxml.at("//*[@id='#{span['to']}']") || fromlink
  target = docxml.at("//*[@id='#{span['target']}']")
  { from: fromlink, to: tolink, target: target }
end

#comment_cleanup(docxml) ⇒ Object



56
57
58
59
60
# File 'lib/isodoc/word_function/comments.rb', line 56

def comment_cleanup(docxml)
  move_comment_link_to_from(docxml)
  reorder_comments_by_comment_link(docxml)
  embed_comment_in_comment_list(docxml)
end


20
21
22
23
24
# File 'lib/isodoc/word_function/comments.rb', line 20

def comment_link_attrs(fnote, node)
  { style: "MsoCommentReference", target: fnote,
    class: "commentLink", from: node["from"],
    to: node["to"] }
end

#comments(div) ⇒ Object



4
5
6
7
8
9
10
# File 'lib/isodoc/word_function/comments.rb', line 4

def comments(div)
  return if @comments.empty?

  div.div style: "mso-element:comment-list" do |div1|
    @comments.each { |fn| div1.parent << fn }
  end
end

#embed_comment_in_comment_list(docxml) ⇒ Object



66
67
68
69
70
71
72
73
# File 'lib/isodoc/word_function/comments.rb', line 66

def embed_comment_in_comment_list(docxml)
  # docxml.xpath(COMMENT_IN_COMMENT_LIST).each do |x|
  docxml.xpath(COMMENT_IN_COMMENT_LIST1).each do |x|
    n = x.next_element
    n&.children&.first&.add_previous_sibling(x.remove)
  end
  docxml
end

#get_comments_from_text(docxml, link_order) ⇒ Object



126
127
128
129
130
131
132
133
134
135
# File 'lib/isodoc/word_function/comments.rb', line 126

def get_comments_from_text(docxml, link_order)
  comments = []
  docxml.xpath("//div[@style='mso-element:comment']").each do |c|
    next unless c["id"] && !link_order[c["id"]].nil?

    comments << { text: c.remove.to_s, id: c["id"] }
  end
  comments.sort! { |a, b| link_order[a[:id]] <=> link_order[b[:id]] }
  # comments
end

#insert_comment_cont(from, upto, target) ⇒ Object



106
107
108
109
110
111
112
113
114
115
116
# File 'lib/isodoc/word_function/comments.rb', line 106

def insert_comment_cont(from, upto, target)
  # includes_to = from.at(".//*[@id='#{upto}']")
  while !from.nil? && from["id"] != upto
    following = from.xpath("./following::*")
    (from = following.shift) && incl_to = from.at(".//*[@id='#{upto}']")
    while !incl_to.nil? && !from.nil? && skip_comment_wrap(from)
      (from = following.shift) && incl_to = from.at(".//*[@id='#{upto}']")
    end
    wrap_comment_cont(from, target) if !from.nil?
  end
end

add in from and to links to move the comment into place



27
28
29
30
31
32
33
34
35
36
# File 'lib/isodoc/word_function/comments.rb', line 27

def make_comment_link(out, fnote, node)
  out.span(**comment_link_attrs(fnote, node)) do |s1|
    s1.span lang: "EN-GB", style: "font-size:9.0pt" do |s2|
      s2.a style: "mso-comment-reference:SMC_#{fnote};" \
                      "mso-comment-date:#{node['date'].gsub(/[:-]+/,
                                                            '')}"
      s2.span style: "mso-special-character:comment", target: fnote # do |s|
    end
  end
end

#make_comment_target(out) ⇒ Object



38
39
40
41
42
43
44
# File 'lib/isodoc/word_function/comments.rb', line 38

def make_comment_target(out)
  out.span style: "MsoCommentReference" do |s1|
    s1.span lang: "EN-GB", style: "font-size:9.0pt" do |s2|
      s2.span style: "mso-special-character:comment"
    end
  end
end

#make_comment_text(node, fnote) ⇒ Object



46
47
48
49
50
51
52
53
54
# File 'lib/isodoc/word_function/comments.rb', line 46

def make_comment_text(node, fnote)
  noko do |xml|
    xml.div style: "mso-element:comment", id: fnote do |div|
      div.span style: %{mso-comment-author:"#{node['reviewer']}"}
      make_comment_target(div)
      node.children.each { |n| parse(n, div) }
    end
  end.join("\n")
end


118
119
120
121
122
123
124
# File 'lib/isodoc/word_function/comments.rb', line 118

def move_comment_link_to_from(docxml)
  docxml.xpath('//span[@style="MsoCommentReference"][@from]').each do |x|
    attrs = comment_attributes(docxml, x) || next
    move_comment_link_to_from1(x, attrs[:from])
    insert_comment_cont(attrs[:from], x["to"], x["target"])
  end
end


75
76
77
78
79
80
# File 'lib/isodoc/word_function/comments.rb', line 75

def move_comment_link_to_from1(tolink, fromlink)
  tolink.remove
  link = tolink.at(".//a")
  fromlink.replace(tolink)
  link.children = fromlink
end


140
141
142
143
144
145
146
147
148
# File 'lib/isodoc/word_function/comments.rb', line 140

def reorder_comments_by_comment_link(docxml)
  link_order = {}
  docxml.xpath(COMMENT_TARGET_XREFS1).each_with_index do |target, i|
    link_order[target.value] = i
  end
  comments = get_comments_from_text(docxml, link_order)
  list = docxml.at("//*[@style='mso-element:comment-list']") || return
  list.children = comments.map { |c| c[:text] }.join("\n")
end

#review_note_parse(node, out) ⇒ Object



12
13
14
15
16
17
18
# File 'lib/isodoc/word_function/comments.rb', line 12

def review_note_parse(node, out)
  fn = @comments.length + 1
  make_comment_link(out, fn, node)
  @in_comment = true
  @comments << make_comment_text(node, fn)
  @in_comment = false
end

#skip_comment_wrap(from) ⇒ Object



102
103
104
# File 'lib/isodoc/word_function/comments.rb', line 102

def skip_comment_wrap(from)
  from["style"] != "mso-special-character:comment"
end

#wrap_comment_cont(from, target) ⇒ Object



91
92
93
94
95
96
97
98
99
100
# File 'lib/isodoc/word_function/comments.rb', line 91

def wrap_comment_cont(from, target)
  if %w(ol ul li div p).include?(from.name)
    from.children.each do |c|
      wrap_comment_cont(c, target)
    end
  else
    s = from.replace("<span style='mso-comment-continuation:#{target}'>")
    s.first.children = from
  end
end