require "set" require "relaton_bib" module Metanorma module Standoc module Cleanup def biblio_reorder(xmldoc) xmldoc.xpath("//references[@normative = 'false']").each do |r| biblio_reorder1(r) end end def biblio_reorder1(refs) fold_notes_into_biblio(refs) bib = sort_biblio(refs.xpath("./bibitem")) insert = refs&.at("./bibitem")&.previous_element refs.xpath("./bibitem").each(&:remove) bib.reverse.each do |b| (insert and insert.next = b.to_xml) or refs.children.first.add_previous_sibling b.to_xml end extract_notes_from_biblio(refs) refs.xpath("./references").each { |r| biblio_reorder1(r) } end def fold_notes_into_biblio(refs) refs.xpath("./bibitem").each do |r| while r&.next_element&.name == "note" r.next_element["appended"] = true r << r.next_element.remove end end end def extract_notes_from_biblio(refs) refs.xpath("./bibitem").each do |r| r.xpath("./note[@appended]").reverse.each do |n| n.delete("appended") r.next = n end end end def sort_biblio(bib) bib end # default presuppose that all citations in biblio numbered # consecutively, but that standards codes are preserved as is: # only numeric references are renumbered def biblio_renumber(xmldoc) i = 0 xmldoc.xpath("//references[not(@normative = 'true')]"\ "[not(@hidden = 'true')]").each do |r| r.xpath("./bibitem[not(@hidden = 'true')]").each do |b| i += 1 next unless docid = b.at("./docidentifier[@type = 'metanorma']") next unless /^\[\d+\]$/.match?(docid.text) docid.children = "[#{i}]" end end end # move ref before p def ref_cleanup(xmldoc) xmldoc.xpath("//p/ref").each do |r| parent = r.parent parent.previous = r.remove end end def normref_cleanup(xmldoc) r = xmldoc.at(self.class::NORM_REF) || return preface = ((r.xpath("./title/following-sibling::*") & # intersection r.xpath("./bibitem[1]/preceding-sibling::*")) - r.xpath("./note[@type = 'boilerplate']/descendant-or-self::*")) preface.each(&:remove) end def biblio_cleanup(xmldoc) biblio_reorder(xmldoc) biblio_nested(xmldoc) biblio_renumber(xmldoc) biblio_linkonly(xmldoc) biblio_hidden_inherit(xmldoc) biblio_no_ext(xmldoc) end def biblio_hidden_inherit(xmldoc) xmldoc.xpath("//references[@hidden = 'true']").each do |r| r.xpath("./bibitem").each do |b| b["hidden"] = true end end end def biblio_linkonly(xmldoc) return unless xmldoc.at("//xref[@hidden]") ins = xmldoc.at("//bibliography") .add_child("