module IsoDoc module BIPM class PresentationXMLConvert < IsoDoc::Generic::PresentationXMLConvert def doccontrol(doc) return unless doc.at(ns("//bibdata/relation[@type = 'supersedes']")) clause = <<~DOCCONTROL Document Control #{doccontrol_row1(doc)} #{doccontrol_row2(doc)} #{list_drafts(doc)}
Authors:#{list_authors(doc)}
DOCCONTROL doc.root << clause end def doccontrol_row1(doc) return "" if list_draft(doc, 1) == ["", ""] && list_cochairs(doc).empty? <<~ROW #{list_draft(doc, 1)&.map { |x| "#{x}" }&.join} #{list_cochairs(doc)} ROW end def doccontrol_row2(docxml) list_draft(docxml, 2) == ["", ""] && list_chairs(docxml).empty? and return "" <<~ROW #{list_draft(docxml, 2)&.map { |x| "#{x}" }&.join} #{list_chairs(docxml)} ROW end def list_drafts(xml) ret = "" i = 3 while list_draft(xml, i) != ["", ""] ret += "#{list_draft(xml, i).map do |x| "#{x}" end.join} "\ "" i += 1 end ret end def list_draft(xml, idx) d = xml.at(ns("//bibdata/relation[@type = 'supersedes'][#{idx}]"\ "/bibitem")) or return ["", ""] draft = d&.at(ns("./version/draft"))&.text and draft = "Draft #{draft}" edn = d&.at(ns("./edition"))&.text and edn = "Version #{edn}" [[draft, edn].join(" "), d&.at(ns("./date"))&.text] end def list_authors(xml) ret = list_people( xml, "//bibdata/contributor[xmlns:role/@type = 'author']/person" ) @i18n.boolean_conj(ret, "and") end COCHAIR = "xmlns:role[contains(text(),'co-chair')]".freeze CHAIR = "[xmlns:role[contains(text(),'chair')]"\ "[not(contains(text(),'co-chair'))]]".freeze def list_cochairs(xml) ret = list_people(xml, "//bibdata/contributor[#{COCHAIR}]/person") ret.empty? and return "" role = xml&.at(ns("//bibdata/contributor[#{COCHAIR}]/role"))&.text label = ret.size > 1 && role ? "#{role}s" : role "#{label}: #{@i18n.boolean_conj(ret, 'and')}" end def list_chairs(xml) ret = list_people(xml, "//bibdata/contributor#{CHAIR}/person") ret.empty? and return "" role = xml&.at(ns("//bibdata/contributor#{CHAIR}/role"))&.text label = ret.size > 1 && role ? "#{role}s" : role "#{label}: #{@i18n.boolean_conj(ret, 'and')}" end def list_people(xml, xpath) ret = [] xml.xpath(ns(xpath)).each do |p| name = p&.at(ns("./name/completename"))&.text aff = p&.at(ns("./affiliation/organization/abbreviation"))&.text || p&.at(ns("./affiliation/organization/name"))&.text c = name || "" aff and c += " (#{aff})" ret << c end ret end end end end