require "htmlentities" require_relative "cleanup" require_relative "utils" require_relative "isodoc" require_relative "xrefs" module Metanorma class Requirements class Default def initialize(options) @c = HTMLEntities.new @parent = options[:parent] @i18n = @parent.i18n @labels = @parent.labels end def reqt_subpart?(name) %w[specification measurement-target verification import identifier title description component subject inherit classification].include? name end def reqt_subpart_attrs(node, name, attrs) klass = node.attr("class") || "component" attr_code(attrs .merge(exclude: node.option?("exclude"), type: node.attr("type"), class: name == "component" ? klass : nil)) end def requirement_subpart(node, attrs) name = node.role || node.attr("style") noko do |xml| xml.send name, **reqt_subpart_attrs(node, name, attrs) do |o| o << node.content end end end def req_classif_parse(classif) ret = [] @c.decode(classif).split(/;\s*/).each do |c| c1 = c.split(/:\s*/) next unless c1.size == 2 c1[1].split(/,\s*/).each { |v| ret << [c1[0], v] } end ret end def requirement_classification(classif, out) req_classif_parse(classif).each do |r| out.classification do |c| c.tag { |t| t << r[0] } c.value { |v| v << r[1] } end end end def reqt_attrs(node, attrs) attr_code(attrs.merge( id: Metanorma::Utils.anchor_or_uuid(node), unnumbered: node.option?("unnumbered") ? "true" : nil, number: node.attr("number"), subsequence: node.attr("subsequence"), obligation: node.attr("obligation"), filename: node.attr("filename"), type: node.attr("type"), )) end def requirement_elems(node, out) node.title and out.title { |t| t << node.title } a = node.attr("identifier") and out.identifier do |l| l << out.text(a) end a = node.attr("subject") and csv_split(a)&.each do |subj| out.subject { |s| s << out.text(subj) } end a = @c.decode(node.attr("inherit")) and csv_split(a)&.each do |i| out.inherit do |inh| inh << @c.encode(i, :hexadecimal) end end classif = node.attr("classification") and requirement_classification(classif, out) end def requirement(node, obligation, attrs) noko do |xml| xml.send obligation, **reqt_attrs(node, attrs) do |ex| requirement_elems(node, ex) wrap_in_para(node, ex) end end.join("\n") end def validate(_reqt, _log) [] end end end end