Module: IsoDoc::Function::Cleanup

Included in:
Common
Defined in:
lib/isodoc/function/cleanup.rb

Constant Summary collapse

FIGURE_WITH_FOOTNOTES =
"//div[@class = 'figure'][descendant::aside]"\
"[not(descendant::div[@class = 'figure'])]".freeze

Instance Method Summary collapse

Instance Method Details

#admonition_cleanup(docxml) ⇒ Object



65
66
67
68
69
70
71
72
# File 'lib/isodoc/function/cleanup.rb', line 65

def admonition_cleanup(docxml)
  docxml.xpath("//div[@class = 'Admonition'][title]").each do |d|
    title = d.at("./title")
    n = title.next_element
    n&.children&.first&.add_previous_sibling(title.remove.text + "—")
  end
  docxml
end

#break_up_long_strings(t) ⇒ Object



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

def break_up_long_strings(t)
  return t if t.match(/^\s*$/)
  t.split(/(?=\s)/).map do |w|
    (/^\s*$/.match(t) or w.size < 30) ? w :
      w.scan(/.{,30}/).map do |w1|
      (w1.size < 30) ? w1 : break_up_long_strings1(w1)
    end.join
  end.join
end

#break_up_long_strings1(w1) ⇒ Object



56
57
58
59
60
61
62
63
# File 'lib/isodoc/function/cleanup.rb', line 56

def break_up_long_strings1(w1)
  s = w1.split(%r{(?<=[,.?+;/=])})
  if s.size == 1 then w1 + " "
  else
    s[-1] = " " + s[-1]
    s.join
  end
end

#cleanup(docxml) ⇒ Object



23
24
25
26
27
28
29
30
31
32
33
# File 'lib/isodoc/function/cleanup.rb', line 23

def cleanup(docxml)
  @i18n ||= i18n_init(@lang, @script) 
  comment_cleanup(docxml)
  footnote_cleanup(docxml)
  inline_header_cleanup(docxml)
  figure_cleanup(docxml)
  table_cleanup(docxml)
  symbols_cleanup(docxml)
  example_cleanup(docxml)
  admonition_cleanup(docxml)
end

#example_cleanup(docxml) ⇒ Object



74
75
76
77
78
79
# File 'lib/isodoc/function/cleanup.rb', line 74

def example_cleanup(docxml)
  docxml.xpath("//table[@class = 'example']//p[not(@class)]").each do |p|
    p["class"] = "example"
  end
  docxml
end

#figure_aside_process(f, aside, key) ⇒ Object



94
95
96
97
98
99
100
101
102
103
104
105
# File 'lib/isodoc/function/cleanup.rb', line 94

def figure_aside_process(f, aside, key)
  # get rid of footnote link, it is in diagram
  f&.at("./a[@class='TableFootnoteRef']")&.remove
  fnref = f.at(".//span[@class='TableFootnoteRef']/..")
  dt = key.add_child("<dt></dt>").first
  dd = key.add_child("<dd></dd>").first
  fnref.parent = dt
  aside.xpath(".//p").each do |a|
    a.delete("class")
    a.parent = dd
  end
end

#figure_cleanup(docxml) ⇒ Object

move footnotes into key, and get rid of footnote reference since it is in diagram



109
110
111
112
113
114
115
116
117
118
# File 'lib/isodoc/function/cleanup.rb', line 109

def figure_cleanup(docxml)
  docxml.xpath(FIGURE_WITH_FOOTNOTES).each do |f|
    next unless f.at(".//aside[not(ancestor::p[@class = 'FigureTitle'])]")
    key = figure_get_or_make_dl(f)
    f.xpath(".//aside").each do |aside|
      figure_aside_process(f, aside, key)
    end
  end
  docxml
end

#figure_get_or_make_dl(t) ⇒ Object



81
82
83
84
85
86
87
88
# File 'lib/isodoc/function/cleanup.rb', line 81

def figure_get_or_make_dl(t)
  dl = t.at(".//dl")
  if dl.nil?
    t.add_child("<p><b>#{@i18n.key}</b></p><dl></dl>")
    dl = t.at(".//dl")
  end
  dl
end

#footnote_cleanup(docxml) ⇒ Object



133
134
135
136
137
138
# File 'lib/isodoc/function/cleanup.rb', line 133

def footnote_cleanup(docxml)
  docxml.xpath('//a[@class = "FootnoteRef"]/sup').each_with_index do |x, i|
    x.content = (i + 1).to_s
  end
  docxml
end

#footnote_reference_format(a) ⇒ Object



214
215
216
# File 'lib/isodoc/function/cleanup.rb', line 214

def footnote_reference_format(a)
  a
end

#inline_header_cleanup(docxml) ⇒ Object



120
121
122
123
124
125
126
127
128
129
130
131
# File 'lib/isodoc/function/cleanup.rb', line 120

def inline_header_cleanup(docxml)
  docxml.xpath('//span[@class="zzMoveToFollowing"]').each do |x|
    x.delete("class")
    n = x.next_element
    if n.nil?
      x.name = "p"
    else
      n.children.first.previous = x.remove
    end
  end
  docxml
end

#merge_fnref_into_fn_text(a) ⇒ Object



140
141
142
143
144
# File 'lib/isodoc/function/cleanup.rb', line 140

def merge_fnref_into_fn_text(a)
  fn = a.at('.//span[@class="TableFootnoteRef"]/..')
  n = fn.next_element
  n&.children&.first&.add_previous_sibling(fn.remove)
end

#new_fullcolspan_row(t, tfoot) ⇒ Object



178
179
180
181
182
183
184
185
186
187
# File 'lib/isodoc/function/cleanup.rb', line 178

def new_fullcolspan_row(t, tfoot)
  # how many columns in the table?
  cols = 0
  t.at(".//tr").xpath("./td | ./th").each do |td|
    cols += (td["colspan"] ? td["colspan"].to_i : 1)
  end
  style = %{border-top:0pt;border-bottom:#{IsoDoc::Function::Table::SW} 1.5pt;}
  tfoot.add_child("<tr><td colspan='#{cols}' style='#{style}'/></tr>")
  tfoot.xpath(".//td").last
end

#passthrough_cleanup(docxml) ⇒ Object



16
17
18
19
20
21
# File 'lib/isodoc/function/cleanup.rb', line 16

def passthrough_cleanup(docxml)
  docxml.split(%r{(<passthrough>|</passthrough>)}).each_slice(4).map do |a|
    a.size > 2 and a[2] = HTMLEntities.new.decode(a[2])
    [a[0], a[2]]
  end.join
end

#remove_bottom_border(td) ⇒ Object



162
163
164
165
# File 'lib/isodoc/function/cleanup.rb', line 162

def remove_bottom_border(td)
  td["style"] =
    td["style"].gsub(/border-bottom:[^;]+;/, "border-bottom:0pt;")
end

#symbols_cleanup(docxml) ⇒ Object



207
208
# File 'lib/isodoc/function/cleanup.rb', line 207

def symbols_cleanup(docxml)
end

#table_cleanup(docxml) ⇒ Object



200
201
202
203
204
205
# File 'lib/isodoc/function/cleanup.rb', line 200

def table_cleanup(docxml)
  table_footnote_cleanup(docxml)
  table_note_cleanup(docxml)
  table_long_strings_cleanup(docxml)
  docxml
end

#table_footnote_cleanup(docxml) ⇒ Object



146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
# File 'lib/isodoc/function/cleanup.rb', line 146

def table_footnote_cleanup(docxml)
  docxml.xpath("//table[descendant::aside]").each do |t|
    t.xpath(".//aside").each do |a|
      merge_fnref_into_fn_text(a)
      a.name = "div"
      a["class"] = "TableFootnote"
      t << a.remove
    end
  end
  # preempt html2doc putting MsoNormal there
  docxml.xpath("//p[not(self::*[@class])]"\
               "[ancestor::*[@class = 'TableFootnote']]").each do |p|
    p["class"] = "TableFootnote"
  end
end

#table_footnote_reference_format(a) ⇒ Object



210
211
212
# File 'lib/isodoc/function/cleanup.rb', line 210

def table_footnote_reference_format(a)
  a
end

#table_get_or_make_tfoot(t) ⇒ Object



167
168
169
170
171
172
173
174
175
176
# File 'lib/isodoc/function/cleanup.rb', line 167

def table_get_or_make_tfoot(t)
  tfoot = t.at(".//tfoot")
  if tfoot.nil?
    t.add_child("<tfoot></tfoot>")
    tfoot = t.at(".//tfoot")
  else
    tfoot.xpath(".//td | .//th").each { |td| remove_bottom_border(td) }
  end
  tfoot
end

#table_long_strings_cleanup(docxml) ⇒ Object



35
36
37
38
39
40
41
42
43
44
# File 'lib/isodoc/function/cleanup.rb', line 35

def table_long_strings_cleanup(docxml)
  return unless @break_up_urls_in_tables == true
  docxml.xpath("//td | //th").each do |d|
    d.traverse do |n|
      next unless n.text?
      n.replace(HTMLEntities.new.encode(
        break_up_long_strings(n.text)))
    end
  end
end

#table_note_cleanup(docxml) ⇒ Object



189
190
191
192
193
194
195
196
197
198
# File 'lib/isodoc/function/cleanup.rb', line 189

def table_note_cleanup(docxml)
  docxml.xpath("//table[div[@class = 'Note' or "\
               "@class = 'TableFootnote']]").each do |t|
    tfoot = table_get_or_make_tfoot(t)
    insert_here = new_fullcolspan_row(t, tfoot)
    t.xpath("div[@class = 'Note' or @class = 'TableFootnote']").each do |d|
      d.parent = insert_here
    end
  end
end

#termref_cleanup(docxml) ⇒ Object



7
8
9
10
11
12
13
14
# File 'lib/isodoc/function/cleanup.rb', line 7

def termref_cleanup(docxml)
  docxml.
    gsub(/\s*\[MODIFICATION\]\s*\[\/TERMREF\]/, l10n(", #{@i18n.modified} [/TERMREF]")).
    gsub(%r{\s*\[/TERMREF\]\s*</p>\s*<p>\s*\[TERMREF\]}, "; ").
    gsub(/\[TERMREF\]\s*/, l10n("[#{@i18n.source}: ")).
    gsub(%r{\s*\[\/TERMREF\]\s*}, l10n("]")).
    gsub(/\s*\[MODIFICATION\]/, l10n(", #{@i18n.modified} &mdash; "))
end

#textcleanup(docxml) ⇒ Object



3
4
5
# File 'lib/isodoc/function/cleanup.rb', line 3

def textcleanup(docxml)
  docxml = termref_cleanup(passthrough_cleanup(docxml))
end