require_relative "../../html2doc/lists"
module IsoDoc
module JIS
class WordConvert < IsoDoc::Iso::WordConvert
def word_cleanup(docxml)
word_note_cleanup(docxml)
boldface(docxml)
super
end
def word_remove_empty_sections(docxml)
move_to_inner_cover(docxml) # preempt by populating WordSection1
super
end
def move_to_inner_cover(docxml)
source = docxml.at("//div[@type = 'inner-cover-note']")
dest = docxml.at("//div[@id = 'boilerplate-inner-cover-note']")
source && dest and dest.replace(source.remove)
source = docxml.at("//div[@type = 'participants']")
dest = docxml.at("//div[@id = 'boilerplate-contributors']")
source && dest and dest.replace(source.remove)
docxml
end
def word_intro(docxml, level)
intro = insert_toc(File.read(@wordintropage, encoding: "UTF-8"),
docxml, level)
intro = populate_template(intro, :word)
introxml = to_word_xhtml_fragment(intro)
docxml.at('//div[@class="WordSection2"]') << introxml
.to_xml(encoding: "US-ASCII")
end
def word_note_cleanup(docxml)
docxml.xpath("//p[@class = 'Note']").each do |p|
p.xpath("//following-sibling::p").each do |p2|
p2["class"] == "Note" and
p2["class"] = "NoteCont"
end
end
end
def boldface(docxml)
docxml.xpath("//b").each do |b|
b.name = "span"
b["class"] = "Strong"
end
end
def postprocess_cleanup(result)
result = cleanup(to_xhtml(textcleanup(result)))
word_split(word_cleanup(result))
end
def toWord(result, filename, dir, header)
result.each do |k, v|
to_word1(v, "#{filename}#{k}", dir, header)
end
header&.unlink
@wordstylesheet.unlink if @wordstylesheet.is_a?(Tempfile)
end
def to_word1(result, filename, dir, header)
result or return
result = from_xhtml(result).gsub(/-DOUBLE_HYPHEN_ESCAPE-/, "--")
::Html2Doc::JIS.new(
filename: filename, imagedir: @localdir,
stylesheet: @wordstylesheet&.path,
header_file: header&.path, dir: dir,
asciimathdelims: [@openmathdelim, @closemathdelim],
liststyles: { ul: @ulstyle, ol: @olstyle }
).process(result)
end
def word_split(xml)
b = xml.dup
{ _cover: cover_split(xml), "": main_split(b) }
end
def cover_split(xml)
xml.at("//body").elements.each do |e|
e.name == "div" && e["class"] == "WordSection1" and next
e.remove
end
xml
end
def main_split(xml)
if c = xml.at("//div[@class = 'WordSection1']")
c.next_element&.remove
c.remove
end
if c = xml.at("//div[@class = 'WordSection2']")
c.elements.first.at("./br") and c.elements.first.remove
end
xml
end
STYLESMAP = {}.freeze
def style_cleanup(docxml)
new_styles(docxml)
index_cleanup(docxml)
end
def new_styles(docxml)
super
biblio_paras(docxml)
heading_to_para(docxml)
end
def biblio_paras(docxml)
docxml.xpath("//div[@class = 'normref_div']//" \
"p[not(@class) or @class = 'MsoNormal']").each do |p|
p["class"] = "NormRefText"
end
end
def heading_to_para(docxml)
docxml.xpath("//h1[@class = 'ForewordTitle']").each do |p|
p.name = "p"
p.parent.xpath("./p[not(@class) or @class = 'MsoNormal']").each do |n|
n["class"] = "ForewordText"
end
end
docxml.xpath("//h1[@class = 'IntroTitle'] | //h1[@class = 'Annex'] | " \
"//h2[@class = 'Terms'] | " \
"//h3[@class = 'Terms'] | //h4[@class = 'Terms'] | " \
"//h5[@class = 'Terms'] | //h6[@class = 'Terms']").each do |n|
n.name = "p"
end
end
def word_annex_cleanup1(docxml, lvl)
docxml.xpath("//h#{lvl}[ancestor::*[@class = 'Section3']]").each do |h2|
h2.name = "p"
h2["class"] = "h#{lvl}Annex"
end
end
end
end
end