module Asciidoctor
module Ogc
class Converter < Standoc::Converter
def sections_cleanup(xml)
super
xml.xpath("//*[@inline-header]").each do |h|
h.delete("inline-header")
end
end
def make_preface(xml, sect)
super
insert_security(xml, sect)
insert_submitters(xml, sect)
end
def add_id
%(id="_#{UUIDTools::UUID.random_create}")
end
def insert_security(xml, sect)
description = "document"
description = "standard" if %w(standard community-standard)
.include?(sect&.at("//bibdata/ext/doctype")&.text)
preface = sect.at("//preface") ||
sect.add_previous_sibling("").first
sect = xml&.at("//clause[@type = 'security']")&.remove ||
""\
"Security considerations"\
"#{@i18n.security_empty.sub(/%/, description)}
"
preface.add_child sect
end
def insert_submitters(xml, sect)
if xml.at("//submitters")
preface = sect.at("//preface") ||
sect.add_previous_sibling("").first
submitters = xml.at("//submitters").remove
submitters.xpath(".//table").each do |t|
t["unnumbered"] = true
end
preface.add_child submitters.remove
end
end
def termdef_boilerplate_cleanup(xmldoc); end
def bibdata_cleanup(xmldoc)
super
a = xmldoc.at("//bibdata/status/stage")
a.text == "published" and a.children = "approved"
end
def section_names_terms_cleanup(xml)
replace_title(xml, "//definitions[@type = 'symbols']", @i18n&.symbols)
replace_title(xml, "//definitions[@type = 'abbreviated_terms']",
@i18n&.abbrev)
replace_title(xml, "//definitions[not(@type)]", @i18n&.symbolsabbrev)
replace_title(xml, "//sections//terms#{SYMnoABBR} | "\
"//sections//clause[.//terms]#{SYMnoABBR}",
@i18n&.termsdefsymbols, true)
replace_title(xml, "//sections//terms#{ABBRnoSYM} | "\
"//sections//clause[.//terms]#{ABBRnoSYM}",
@i18n&.termsdefabbrev, true)
replace_title(xml, "//sections//terms#{SYMABBR} | "\
"//sections//clause[.//terms]#{SYMABBR}",
@i18n&.termsdefsymbolsabbrev, true)
replace_title(xml, "//sections//terms#{NO_SYMABBR} | "\
"//sections//clause[.//terms]#{NO_SYMABBR}",
@i18n&.termsdefsymbolsabbrev, true)
replace_title(xml, "//sections//terms[not(.//definitions)] | "\
"//sections//clause[.//terms][not(.//definitions)]",
@i18n&.termsdef, true)
end
def requirement_metadata_component_tags
%w(test-purpose test-method test-method-type conditions part description
reference step requirement permission recommendation)
end
def requirement_metadata1(reqt, dlist, ins)
ins1 = super
dlist.xpath("./dt").each do |e|
tag = e&.text&.gsub(/ /, "-")&.downcase
next unless requirement_metadata_component_tags.include? tag
ins1.next = requirement_metadata1_component(e, tag)
ins1 = ins1.next
end
end
def requirement_metadata1_component(term, tag)
val = term.at("./following::dd")
val.name = tag
val.xpath("./dl").each do |d|
requirement_metadata1(val, d, d)
d.remove
end
if %w(requirement permission
recommendation).include?(term.text) && !val.text.empty?
val["label"] = val.text.strip
val.children.remove
end
val
end
def requirement_metadata(xmldoc)
super
xmldoc.xpath(REQRECPER).each do |r|
requirement_metadata_to_component(r)
requirement_metadata_to_requirement(r)
requirement_subparts_to_blocks(r)
end
end
def requirement_metadata_to_component(reqt)
reqt.xpath(".//test-method | .//test-purpose | .//conditions | "\
".//part | .//test-method-type | .//step | .//reference")
.each do |c|
c["class"] = c.name
c.name = "component"
end
end
def requirement_metadata_to_requirement(reqt)
reqt.xpath("./requirement | ./permission | ./recommendation")
.each do |c|
c["id"] = Metanorma::Utils::anchor_or_uuid
end
end
def requirement_subparts_to_blocks(reqt)
reqt.xpath(".//component | .//description").each do |c|
next if %w(p ol ul dl table component description)
.include?(c&.elements&.first&.name)
c.children = "
#{c.children.to_xml}
"
end
end
def termdef_cleanup(xmldoc)
super
termdef_subclause_cleanup(xmldoc)
end
# skip annex/terms/terms, which is empty node
def termdef_subclause_cleanup(xmldoc)
xmldoc.xpath("//annex//clause[terms]").each do |t|
next unless t.xpath("./clause | ./terms | ./definitions").size == 1
t.children.each { |n| n.parent = t.parent }
t.remove
end
end
def requirement_cleanup(xmldoc)
requirement_type(xmldoc)
super
end
def requirement_type(xmldoc)
xmldoc.xpath(REQRECPER).each do |r|
next unless r["type"]
r["type"] = case r["type"]
when "requirement", "recommendation", "permission"
"general"
when "requirements_class" then "class"
when "conformance_test" then "verification"
when "conformance_class" then "conformanceclass"
when "abstract_test" then "abstracttest"
else r["type"]
end
end
end
end
end
end