require_relative "presentation_function/block" require_relative "presentation_function/reqt" require_relative "presentation_function/concepts" require_relative "presentation_function/terms" require_relative "presentation_function/xrefs" require_relative "presentation_function/erefs" require_relative "presentation_function/inline" require_relative "presentation_function/math" require_relative "presentation_function/section" require_relative "presentation_function/bibdata" require_relative "presentation_function/metadata" module IsoDoc class PresentationXMLConvert < ::IsoDoc::Convert def initialize(options) @format = :presentation @suffix = "presentation.xml" super end def convert1(docxml, filename, dir) @outputdir = dir @outputfile = Pathname.new(filename).basename.to_s docid_prefixes(docxml) # feeds @xrefs.parse citation processing @xrefs.parse docxml @xrefs.klass.meta = @meta @xrefs.klass.info docxml, nil conversions(docxml) docxml.root["type"] = "presentation" docxml.to_xml.gsub("<", "<").gsub(">", ">") end def bibitem_lookup(docxml) @bibitem_lookup ||= docxml.xpath(ns("//references/bibitem")) .each_with_object({}) do |b, m| m[b["id"]] = b end end def conversions(docxml) semantic_xml_insert(docxml) metadata docxml bibdata docxml @xrefs.parse docxml section docxml block docxml terms docxml inline docxml end # parse annex after term, references, # to deal with single-term and single-ref annexes def section(docxml) references docxml # feeds middle_title # triggers xrefs reparse, so put references before all other sections, # which alter titles and thus can alter xrefs rearrange_clauses docxml # feeds toc, display_order, clausetitle, clause, middle_title middle_title docxml annex docxml clause docxml # feeds clausetitle term docxml index docxml clausetitle docxml # feeds floattitle floattitle docxml # feeds rearrange_clauses toc docxml display_order docxml end def block(docxml) amend docxml table docxml figure docxml sourcecode docxml formula docxml example docxml note docxml admonition docxml source docxml ol docxml permission docxml requirement docxml recommendation docxml requirement_render docxml end def inline(docxml) bibitem_lookup(docxml) # feeds citeas citeas docxml # feeds xref, eref, origin, quotesource xref docxml eref docxml # feeds eref2link origin docxml # feeds eref2link quotesource docxml # feeds eref2link eref2link docxml mathml docxml ruby docxml variant docxml identifier docxml date docxml passthrough docxml inline_format docxml end def terms(docxml) termexample docxml termnote docxml termdefinition docxml designation docxml termsource docxml concept docxml related docxml end def semantic_xml_insert(xml) @semantic_xml_insert or return embed = embedable_semantic_xml(xml) ins = metanorma_extension_insert_pt(xml) ins = ins.at(ns("./metanorma")) || ins.add_child("").first ins = ins.add_child("").first ins << embed end def metanorma_extension_insert_pt(xml) xml.at(ns("//metanorma-extension")) || xml.at(ns("//bibdata"))&.after("") &.next_element || xml.root.elements.first.before("") .previous_element end def embedable_semantic_xml(xml) xml = embedable_semantic_xml_tags(xml) embedable_semantic_xml_attributes(xml) end def embedable_semantic_xml_tags(xml) ret = to_xml(xml) .sub(/ xmlns=['"][^"']+['"]/, "") # root XMLNS .split(/(?=[<> \t\r\n\f\v])/).map do |x| case x when /^<[^:]+:/ then x.sub(":", ":semantic__") when /^<[^:]+$/ then x.sub(%r{(