module IsoDoc class PresentationXMLConvert < ::IsoDoc::Convert def designation(docxml) docxml.xpath(ns("//term")).each { |t| merge_second_preferred(t) } docxml.xpath(ns("//preferred | //admitted | //deprecates")) .each { |p| designation1(p) } docxml.xpath(ns("//deprecates")).each { |d| deprecates(d) } docxml.xpath(ns("//admitted")).each { |d| admits(d) } end def deprecates(elem) elem.children.first.previous = @i18n.l10n("#{@i18n.deprecated}: ") end def admits(elem); end def merge_second_preferred(term) pref = nil term.xpath(ns("./preferred[expression/name]")).each_with_index do |p, i| (i.zero? and pref = p) or merge_second_preferred1(pref, p) end end def merge_second_preferred1(pref, second) merge_preferred_eligible?(pref, second) or return n1 = pref.at(ns("./expression/name")) n2 = second.remove.at(ns("./expression/name")) n1.children = l10n("#{to_xml(n1.children)}; #{Common::to_xml(n2.children)}") end def merge_preferred_eligible?(first, second) firstex = first.at(ns("./expression")) || {} secondex = second.at(ns("./expression")) || {} first["geographic-area"] == second["geographic-area"] && firstex["language"] == secondex["language"] && !first.at(ns("./pronunciation | ./grammar")) && !second.at(ns("./pronunciation | ./grammar")) end def designation1(desgn) s = desgn.at(ns("./termsource")) name = desgn.at(ns("./expression/name | ./letter-symbol/name | " \ "./graphical-symbol")) or return designation_annotate(desgn, name) s and desgn.next = s end def designation_annotate(desgn, name) designation_boldface(desgn) designation_field(desgn, name) g = desgn.at(ns("./expression/grammar")) and name << ", #{designation_grammar(g).join(', ')}" designation_localization(desgn, name) designation_pronunciation(desgn, name) designation_bookmarks(desgn, name) desgn.children = name.children end def designation_boldface(desgn) desgn.name == "preferred" or return name = desgn.at(ns("./expression/name | ./letter-symbol/name")) or return name.children = "#{name.children}" end def designation_field(desgn, name) f = desgn.xpath(ns("./field-of-application | ./usage-info")) &.map { |u| to_xml(u.children) }&.join(", ") f&.empty? and return nil name << ", <#{f}>" end def designation_grammar(grammar) ret = [] grammar.xpath(ns("./gender | ./number")).each do |x| ret << @i18n.grammar_abbrevs[x.text] end %w(isPreposition isParticiple isAdjective isVerb isAdverb isNoun) .each do |x| grammar.at(ns("./#{x}[text() = 'true']")) and ret << @i18n.grammar_abbrevs[x] end ret end def designation_localization(desgn, name) loc = [desgn&.at(ns("./expression/@language"))&.text, desgn&.at(ns("./expression/@script"))&.text, desgn&.at(ns("./@geographic-area"))&.text].compact loc.empty? and return name << ", #{loc.join(' ')}" end def designation_pronunciation(desgn, name) f = desgn.at(ns("./expression/pronunciation")) or return name << ", /#{to_xml(f.children)}/" end def designation_bookmarks(desgn, name) desgn.xpath(ns(".//bookmark")).each do |b| name << b.remove end end def termexample(docxml) docxml.xpath(ns("//termexample")).each { |f| example1(f) } end def termnote(docxml) docxml.xpath(ns("//termnote")).each { |f| termnote1(f) } end def termnote1(elem) lbl = l10n(@xrefs.anchor(elem["id"], :label) || "???") prefix_name(elem, "", lower2cap(lbl), "name") end def termdefinition(docxml) docxml.xpath(ns("//term[definition]")).each do |f| termdefinition1(f) end end def termdefinition1(elem) unwrap_definition(elem) multidef(elem) if elem.xpath(ns("./definition")).size > 1 end def multidef(elem) d = elem.at(ns("./definition")) d = d.replace("
  1. #{to_xml(d.children)}
").first elem.xpath(ns("./definition")).each do |f| f = f.replace("
  • #{to_xml(f.children)}
  • ").first d << f end d.wrap("") end def unwrap_definition(elem) elem.xpath(ns("./definition")).each do |d| %w(verbal-definition non-verbal-representation).each do |e| v = d&.at(ns("./#{e}")) v&.replace(v.children) end end end def termsource(docxml) docxml.xpath(ns("//termsource")).each { |f| termsource_modification(f) } docxml.xpath(ns("//termsource")).each { |f| termsource1(f) } end def termsource1(elem) while elem&.next_element&.name == "termsource" elem << "; #{to_xml(elem.next_element.remove.children)}" end elem.children = l10n("[#{@i18n.source}: #{to_xml(elem.children).strip}]") end def termsource_modification(elem) origin = elem.at(ns("./origin")) s = termsource_status(elem["status"]) and origin.next = l10n(", #{s}") termsource_add_modification_text(elem.at(ns("./modification"))) end def termsource_add_modification_text(mod) mod or return mod.text.strip.empty? or mod.previous = " — " mod.elements.size == 1 and mod.elements[0].replace(mod.elements[0].children) mod.replace(mod.children) end def termsource_status(status) case status when "modified" then @i18n.modified when "adapted" then @i18n.adapted end end end end