module Metanorma
class Requirements
class Default
def requirement_type_cleanup(reqt); end
def requirement_identifier_cleanup(reqt)
reqt.xpath("./identifier[link] | ./inherit[link]").each do |i|
i.children = i.at("./link/@target").text
end
end
def requirement_inherit_cleanup(reqt)
ins = requirement_inherit_insert(reqt)
reqt.xpath("./*//inherit").each { |i| ins.previous = i }
end
def requirement_inherit_insert(reqt)
ins = reqt.at("./classification") || reqt.at(
"./description | ./measurementtarget | ./specification | "\
"./verification | ./import | ./description | ./component | "\
"./requirement | ./recommendation | ./permission",
) and return ins
requirement_inherit_insert1(reqt)
end
def requirement_inherit_insert1(reqt)
if t = reqt.at("./title")
t.next = " "
t.next
else
if reqt.children.empty? then reqt.add_child(" ")
else reqt.children.first.previous = " "
end
reqt.children.first
end
end
def requirement_descriptions_cleanup(reqt)
reqt.xpath(".//p[not(./*)][normalize-space(.)='']").each(&:remove)
reqt.children.each do |e|
requirement_description_wrap(reqt, e)
end
requirement_description_cleanup1(reqt)
end
REQS = %w(recommendation requirement permission).freeze
def requirement_description_wrap(reqt, text)
return if (text.element? && (reqt_subpart?(text.name) ||
REQS.include?(text.name))) ||
(text.text.strip.empty? && !text.at(".//xref | .//eref | .//link"))
t = Nokogiri::XML::Element.new("description", reqt.document)
text.before(t)
t.children = text.remove
end
def requirement_description_cleanup1(reqt)
while d = reqt.at("./description[following-sibling::*[1]"\
"[self::description]]")
n = d.next.remove
d << n.children
end
reqt.xpath("./description[normalize-space(.)='']").each do |r|
r.replace("\n")
end
end
def requirement_metadata_cleanup(reqt)
dl = reqt.at("./dl[@metadata = 'true']")&.remove or return
requirement_metadata1(reqt, dl, reqt.at("./title"))
end
def requirement_metadata1_attrs
%w(obligation model type)
end
def requirement_metadata1_tags
%w(identifier subject inherit)
end
def requirement_metadata_component_tags
[]
end
def dl_to_attrs(elem, dlist, name)
Metanorma::Utils::dl_to_attrs(elem, dlist, name)
end
def dl_to_elems(ins, elem, dlist, name)
Metanorma::Utils::dl_to_elems(ins, elem, dlist, name)
end
def requirement_metadata1(reqt, dlist, ins)
ins = requirement_metadata1_set_insert(reqt, ins)
requirement_metadata1_attrs.each do |a|
dl_to_attrs(reqt, dlist, a)
end
requirement_metadata1_tags.each do |a|
ins = dl_to_elems(ins, reqt, dlist, a)
end
ins = reqt_dl_to_classif(ins, reqt, dlist)
reqt_dl_to_classif1(ins, reqt, dlist)
end
def requirement_metadata1_set_insert(reqt, ins)
return ins if ins
reqt.children.first.previous = " "
reqt.children.first
end
def reqt_dl_to_classif(ins, reqt, dlist)
if a = reqt.at("./classification[last()]") then ins = a end
dlist.xpath("./dt[text()='classification']").each do |e|
val = e.at("./following::dd/p") || e.at("./following::dd")
req_classif_parse(val.children.to_xml).each do |r|
ins.next = "#{r[0]}"\
"#{r[1]}"
ins = ins.next
end
end
ins
end
def reqt_dl_to_classif1(ins, reqt, dlist)
if a = reqt.at("./classification[last()]") then ins = a end
dlist.xpath("./dt").each do |e|
next if (requirement_metadata1_attrs + requirement_metadata1_tags +
requirement_metadata_component_tags + %w(classification))
.include?(e.text)
ins = reqt_dl_to_classif2(e, ins)
end
ins
end
def reqt_dl_to_classif2(term, ins)
val = term.at("./following::dd/p") || e.at("./following::dd")
ins.next = "#{term.text}"\
"#{val.children.to_xml}"
ins.next
end
end
end
end