module IsoDoc
module Ieee
class WordConvert < IsoDoc::WordConvert
def authority_cleanup(docxml)
feedback_footnote(docxml)
%w(copyright license disclaimers participants).each do |t|
authority_cleanup1(docxml, t)
end
coverpage_note_cleanup(docxml)
authority_style(docxml)
end
def feedback_footnote(docxml)
feedback_style(docxml)
feedback_table(docxml)
f = docxml.at("//div[@class = 'boilerplate-feedback']") or return
docxml.at("//aside").previous = <<~FN
FN
end
def authority_style(docxml)
copyright_style(docxml)
license_style(docxml)
officer_style(docxml)
end
def copyright_style(docxml)
docxml.at("//div[@class = 'boilerplate-copyright']")&.xpath(".//p")
&.reverse&.each_with_index do |p, i|
p["class"] =
i.zero? ? "IEEEStdsTitleDraftCRBody" : "IEEEStdsTitleDraftCRaddr"
end
end
def license_style(docxml)
docxml.at("//div[@class = 'boilerplate-license']")&.xpath(".//p")
&.reverse&.each_with_index do |p, i|
p["class"] =
i.zero? ? "IEEEStdsTitleDraftCRBody" : "IEEEStdsTitleDraftCRaddr"
end
end
def officer_style(docxml)
docxml.xpath("//p[@type = 'officeholder']").each do |p|
officeholder_style(p)
end
officemember_style(docxml)
officeorgrep_style(docxml)
three_column_officemembers(docxml
.at("//div[@id = 'boilerplate-participants']"))
end
def officeholder_style(para)
n = para.next_element
p = para.previous_element
n && n.name == "p" && n["type"] != "officeholder" and
klass = "IEEEStdsNamesCtrCxSpLast"
p && p.name == "p" && p["type"] != "officeholder" and
klass = "IEEEStdsNamesCtrCxSpFirst"
para["class"] = klass || "IEEEStdsNamesCtrCxSpMiddle"
end
SECTIONBREAK = <<~BREAK.freeze
BREAK
def officemember_style(docxml)
docxml.xpath("//p[@type = 'officemember' or @type = 'officeorgmember']")
.each do |p|
p["class"] = stylesmap[:nameslist]
end
docxml.xpath("//p[@type = 'emeritus_sign']").each do |p|
p["class"] = "IEEEStdsParaMemEmeritus"
end
end
def officeorgrep_style(docxml)
docxml.xpath("//p[@type = 'officeorgrepmemberhdr']").each do |p|
p["class"] = stylesmap[:nameslist]
p["style"] =
"margin-bottom:6.0pt;tab-stops:right 432.0pt;"
end
docxml.xpath("//p[@type = 'officeorgrepmember']").each do |p|
p["class"] = stylesmap[:nameslist]
p["style"] =
"margin-top:6.0pt;tab-stops:right dotted 432.0pt;"
end
end
def three_column_officemembers(div)
div or return
ret = three_column_officemembers_split(div)
three_column_officemembers_render(div, ret)
end
def three_column_officemembers_split(div)
prev = false
div.xpath(".//div").each { |d| d.replace(d.children) }
div.elements.each_with_object([[]]) do |e, m|
member = e.name == "p" && e["type"] == "officemember"
(prev == member and m[-1] << to_xml(e)) or m << [to_xml(e)]
prev = member
end.map(&:join)
end
def three_column_officemembers_render(div, ret)
div.children = ret[0]
out = ret[1..-1].map.with_index do |d, i|
para = i % 2 == 1 && i != ret.size - 2 ? "
" : "" "
" i == 4 and div.xpath(".//p[br]").each do |p| p.replace(to_xml(p).gsub(%r{
")) end feedback_style1(div, i) end end # STYLE def feedback_style1(div, idx) div.xpath(".//p").each_with_index do |p, j| p["class"] = idx == 4 ? "IEEEStdsCRTextItal" : "IEEEStdsCRTextReg" j.zero? && idx.zero? and p.children.first.previous = '' end end def authority_cleanup1(docxml, klass) dest = docxml.at("//div[@id = 'boilerplate-#{klass}-destination']") auth = docxml.at("//div[@id = 'boilerplate-#{klass}' " \ "or @class = 'boilerplate-#{klass}']") auth&.xpath(".//h1[not(text())] | .//h2[not(text())]")&.each(&:remove) authority_cleanup_hdr(auth) dest and auth and dest.replace(auth.remove) end def authority_cleanup_hdr(auth) (1..2).each do |i| auth&.xpath(".//h#{i}")&.each do |h| h.name = "p" h["class"] = "level#{i}frontmatter" end end end def abstract_cleanup(docxml) dest = docxml.at("div[@id = 'abstract-destination']") or return if f = docxml.at("//div[@class = 'abstract']") f.previous_element.remove abstract_cleanup1(f, dest) abstract_header(dest) f.remove elsif f = docxml.at("//div[@type = 'scope']") abstract_cleanup1(f, dest) abstract_header(dest) end end def abstract_cleanup1(source, dest) source.elements.reject { |e| %w(h1 h2).include?(e.name) }.each do |e| e1 = e.dup e1.xpath("self::p | .//p").each do |p| p["class"] = stylesmap[:abstract] p["style"] ||= "" p["style"] = "font-family: 'Arial', sans-serif;#{p['style']}" end dest and dest << e1 end end def abstract_header(dest) dest.elements.first.children.first.previous = "" \ "Abstract: " end def introduction_cleanup(docxml) dest = docxml.at("div[@id = 'introduction-destination']") or return unless i = docxml.at("//h1[@class = 'IntroTitle']")&.parent dest.parent.remove return end introduction_cleanup1(i, dest) end def introduction_cleanup1(intro, dest) docxml = intro.document intro.previous_element.remove dest.replace(intro.remove) i = docxml.at("//h1[@class = 'IntroTitle']") if i.next_element.name == "div" && i.next_element["class"] == stylesmap[:intro] i.next_element.name = "p" end end end end end