Class: Metanorma::Requirements::Default
- Inherits:
-
Object
- Object
- Metanorma::Requirements::Default
- Defined in:
- lib/metanorma/default/utils.rb,
lib/metanorma/default/xrefs.rb,
lib/metanorma/default/isodoc.rb,
lib/metanorma/default/cleanup.rb,
lib/metanorma/default/default.rb
Direct Known Subclasses
Constant Summary collapse
- REQS =
%w(recommendation requirement permission).freeze
Instance Method Summary collapse
- #attr_code(attributes) ⇒ Object
- #csv_split(text, delim = ";") ⇒ Object
- #descr_classif_extract(desc, ins) ⇒ Object
- #descr_classif_render(reqt) ⇒ Object
- #dl_to_attrs(elem, dlist, name) ⇒ Object
- #dl_to_elems(ins, elem, dlist, name) ⇒ Object
-
#initialize(options) ⇒ Default
constructor
A new instance of Default.
- #l10n(text) ⇒ Object
- #noko(&block) ⇒ Object
- #ns(xpath) ⇒ Object
- #permission_parts(_block, _block_id, _label, _klass) ⇒ Object
- #postprocess_anchor_struct(_block, anchor) ⇒ Object
- #recommendation_attr_keyvalue(node, key, value) ⇒ Object
- #recommendation_attr_parse(node, label) ⇒ Object
- #recommendation_attributes(node, out) ⇒ Object
- #recommendation_attributes1(node, out) ⇒ Object
- #recommendation_base(node, klass) ⇒ Object
- #recommendation_header(node, out) ⇒ Object
- #recommendation_label(elem, type, xrefs) ⇒ Object
- #recommendation_labels(node) ⇒ Object
- #req_class_paths ⇒ Object
- #req_classif_parse(classif) ⇒ Object
- #req_nested_class_paths ⇒ Object
- #reqt_attrs(node, attrs) ⇒ Object
- #reqt_component_type(node) ⇒ Object
- #reqt_dl_to_classif(ins, reqt, dlist) ⇒ Object
- #reqt_dl_to_classif1(ins, reqt, dlist) ⇒ Object
- #reqt_dl_to_classif2(term, ins) ⇒ Object
- #reqt_metadata_node?(node) ⇒ Boolean
- #reqt_subpart?(name) ⇒ Boolean
- #reqt_subpart_attrs(node, name, attrs) ⇒ Object
- #requirement(node, obligation, attrs) ⇒ Object
- #requirement_classification(classif, out) ⇒ Object
- #requirement_component_parse(node, out) ⇒ Object
- #requirement_description_cleanup1(reqt) ⇒ Object
- #requirement_description_wrap(reqt, text) ⇒ Object
- #requirement_descriptions_cleanup(reqt) ⇒ Object
- #requirement_elems(node, out) ⇒ Object
- #requirement_identifier_cleanup(reqt) ⇒ Object
- #requirement_inherit_cleanup(reqt) ⇒ Object
- #requirement_inherit_insert(reqt) ⇒ Object
- #requirement_inherit_insert1(reqt) ⇒ Object
- #requirement_metadata1(reqt, dlist, ins) ⇒ Object
- #requirement_metadata1_attrs ⇒ Object
- #requirement_metadata1_set_insert(reqt, ins) ⇒ Object
- #requirement_metadata1_tags ⇒ Object
- #requirement_metadata_cleanup(reqt) ⇒ Object
- #requirement_metadata_component_tags ⇒ Object
- #requirement_render1(node) ⇒ Object
- #requirement_subpart(node, attrs) ⇒ Object
- #requirement_type_cleanup(reqt) ⇒ Object
- #validate(_reqt, _log) ⇒ Object
- #wrap_in_para(node, out) ⇒ Object
Constructor Details
#initialize(options) ⇒ Default
Returns a new instance of Default.
10 11 12 13 14 15 |
# File 'lib/metanorma/default/default.rb', line 10 def initialize() @c = HTMLEntities.new @parent = [:parent] @i18n = @parent.i18n @labels = @parent.labels end |
Instance Method Details
#attr_code(attributes) ⇒ Object
10 11 12 |
# File 'lib/metanorma/default/utils.rb', line 10 def attr_code(attributes) Metanorma::Utils.attr_code(attributes) end |
#csv_split(text, delim = ";") ⇒ Object
14 15 16 |
# File 'lib/metanorma/default/utils.rb', line 14 def csv_split(text, delim = ";") Metanorma::Utils.csv_split(text, delim) end |
#descr_classif_extract(desc, ins) ⇒ Object
115 116 117 118 119 120 121 122 123 |
# File 'lib/metanorma/default/isodoc.rb', line 115 def descr_classif_extract(desc, ins) dlist = desc.xpath(ns("./classification")) dlist.each do |x| x.at(ns("./tag")).name = "dt" x.at(ns("./value")).name = "dd" ins << x.children x.remove end end |
#descr_classif_render(reqt) ⇒ Object
109 110 111 112 113 |
# File 'lib/metanorma/default/isodoc.rb', line 109 def descr_classif_render(reqt) reqt.at(ns("./classification")) or return ins = reqt.at(ns("./classification")).before("<dl/>").previous descr_classif_extract(reqt, ins) end |
#dl_to_attrs(elem, dlist, name) ⇒ Object
86 87 88 |
# File 'lib/metanorma/default/cleanup.rb', line 86 def dl_to_attrs(elem, dlist, name) Metanorma::Utils::dl_to_attrs(elem, dlist, name) end |
#dl_to_elems(ins, elem, dlist, name) ⇒ Object
90 91 92 |
# File 'lib/metanorma/default/cleanup.rb', line 90 def dl_to_elems(ins, elem, dlist, name) Metanorma::Utils::dl_to_elems(ins, elem, dlist, name) end |
#l10n(text) ⇒ Object
4 5 6 |
# File 'lib/metanorma/default/isodoc.rb', line 4 def l10n(text) @i18n.l10n(text) end |
#noko(&block) ⇒ Object
6 7 8 |
# File 'lib/metanorma/default/utils.rb', line 6 def noko(&block) Metanorma::Utils.noko(&block) end |
#ns(xpath) ⇒ Object
22 23 24 |
# File 'lib/metanorma/default/utils.rb', line 22 def ns(xpath) Metanorma::Utils.ns(xpath) end |
#permission_parts(_block, _block_id, _label, _klass) ⇒ Object
4 5 6 |
# File 'lib/metanorma/default/xrefs.rb', line 4 def (_block, _block_id, _label, _klass) [] end |
#postprocess_anchor_struct(_block, anchor) ⇒ Object
30 31 32 |
# File 'lib/metanorma/default/xrefs.rb', line 30 def postprocess_anchor_struct(_block, anchor) anchor end |
#recommendation_attr_keyvalue(node, key, value) ⇒ Object
76 77 78 79 80 81 |
# File 'lib/metanorma/default/isodoc.rb', line 76 def recommendation_attr_keyvalue(node, key, value) tag = node.at(ns("./#{key}")) or return nil value = node.at(ns("./#{value}")) or return nil l10n("#{Metanorma::Utils.strict_capitalize_first tag.text}: " \ "#{value.children.to_xml}") end |
#recommendation_attr_parse(node, label) ⇒ Object
72 73 74 |
# File 'lib/metanorma/default/isodoc.rb', line 72 def recommendation_attr_parse(node, label) l10n("#{label}: #{node.children.to_xml}") end |
#recommendation_attributes(node, out) ⇒ Object
83 84 85 86 87 88 89 |
# File 'lib/metanorma/default/isodoc.rb', line 83 def recommendation_attributes(node, out) ret = recommendation_attributes1(node, []) .map { |a| "<em>#{a}</em>" } ret.empty? or out << "<p>#{ret.join("<br/>\n")}</p>" out end |
#recommendation_attributes1(node, out) ⇒ Object
57 58 59 60 61 62 63 64 65 66 67 68 69 70 |
# File 'lib/metanorma/default/isodoc.rb', line 57 def recommendation_attributes1(node, out) oblig = node["obligation"] and out << l10n("#{@labels['default']['obligation']}: #{oblig}") node.xpath(ns("./subject")).each do |subj| out << l10n("#{@labels['default']['subject']}: #{subj.text}") end node.xpath(ns("./inherit")).each do |i| out << recommendation_attr_parse(i, @labels["default"]["inherits"]) end node.xpath(ns("./classification")).each do |c| out << recommendation_attr_keyvalue(c, "tag", "value") end out end |
#recommendation_base(node, klass) ⇒ Object
28 29 30 31 32 33 34 |
# File 'lib/metanorma/default/isodoc.rb', line 28 def recommendation_base(node, klass) out = node.document.create_element(klass) node.attributes.each do |k, v| out[k] = v end out end |
#recommendation_header(node, out) ⇒ Object
44 45 46 47 48 49 50 51 52 53 54 55 |
# File 'lib/metanorma/default/isodoc.rb', line 44 def recommendation_header(node, out) label, title, name = recommendation_labels(node) ret = name ? [name] : [] if label || title ret << ":" unless ret.empty? ret += ["<br/>", label] ret << ". " if label && title ret << title end out << "<name>#{l10n(ret.compact.join)}</name>" out end |
#recommendation_label(elem, type, xrefs) ⇒ Object
8 9 10 11 |
# File 'lib/metanorma/default/isodoc.rb', line 8 def recommendation_label(elem, type, xrefs) number = xrefs.anchor(elem["id"], :label, false) (number.nil? ? type : "#{type} #{number}") end |
#recommendation_labels(node) ⇒ Object
36 37 38 39 40 41 42 |
# File 'lib/metanorma/default/isodoc.rb', line 36 def recommendation_labels(node) [node.at(ns("./identifier")), node.at(ns("./title")), node.at(ns("./name"))] .map do |n| n&.children&.to_xml end end |
#req_class_paths ⇒ Object
8 9 10 11 12 13 14 15 16 17 |
# File 'lib/metanorma/default/xrefs.rb', line 8 def req_class_paths [ { klass: "permission", label: @labels["default"]["permission"], xpath: "permission" }, { klass: "requirement", label: @labels["default"]["requirement"], xpath: "requirement" }, { klass: "recommendation", label: @labels["default"]["recommendation"], xpath: "recommendation" }, ] end |
#req_classif_parse(classif) ⇒ Object
39 40 41 42 43 44 45 46 47 48 |
# File 'lib/metanorma/default/default.rb', line 39 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 |
#req_nested_class_paths ⇒ Object
19 20 21 22 23 24 25 26 27 28 |
# File 'lib/metanorma/default/xrefs.rb', line 19 def req_nested_class_paths [ { klass: "permission", label: @labels["default"]["permission"], xpath: "permission" }, { klass: "requirement", label: @labels["default"]["requirement"], xpath: "requirement" }, { klass: "recommendation", label: @labels["default"]["recommendation"], xpath: "recommendation" }, ] end |
#reqt_attrs(node, attrs) ⇒ Object
59 60 61 62 63 64 65 66 67 68 69 |
# File 'lib/metanorma/default/default.rb', line 59 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 |
#reqt_component_type(node) ⇒ Object
91 92 93 94 95 |
# File 'lib/metanorma/default/isodoc.rb', line 91 def reqt_component_type(node) klass = node.name klass == "component" and klass = node["class"] "requirement-#{klass}" end |
#reqt_dl_to_classif(ins, reqt, dlist) ⇒ Object
113 114 115 116 117 118 119 120 121 122 123 124 |
# File 'lib/metanorma/default/cleanup.rb', line 113 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 = "<classification><tag>#{r[0]}</tag>" \ "<value>#{r[1]}</value></classification>" ins = ins.next end end ins end |
#reqt_dl_to_classif1(ins, reqt, dlist) ⇒ Object
126 127 128 129 130 131 132 133 134 135 136 |
# File 'lib/metanorma/default/cleanup.rb', line 126 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 ( + + + %w(classification)) .include?(e.text) ins = reqt_dl_to_classif2(e, ins) end ins end |
#reqt_dl_to_classif2(term, ins) ⇒ Object
138 139 140 141 142 143 |
# File 'lib/metanorma/default/cleanup.rb', line 138 def reqt_dl_to_classif2(term, ins) val = term.at("./following::dd/p") || e.at("./following::dd") ins.next = "<classification><tag>#{term.text}</tag>" \ "<value>#{val.children.to_xml}</value></classification>" ins.next end |
#reqt_metadata_node?(node) ⇒ Boolean
13 14 15 16 |
# File 'lib/metanorma/default/isodoc.rb', line 13 def (node) %w(identifier title subject classification tag value inherit name).include? node.name end |
#reqt_subpart?(name) ⇒ Boolean
17 18 19 20 |
# File 'lib/metanorma/default/default.rb', line 17 def reqt_subpart?(name) %w[specification measurement-target verification import identifier title description component subject inherit classification].include? name end |
#reqt_subpart_attrs(node, name, attrs) ⇒ Object
22 23 24 25 26 27 28 |
# File 'lib/metanorma/default/default.rb', line 22 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 |
#requirement(node, obligation, attrs) ⇒ Object
89 90 91 92 93 94 95 96 |
# File 'lib/metanorma/default/default.rb', line 89 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 |
#requirement_classification(classif, out) ⇒ Object
50 51 52 53 54 55 56 57 |
# File 'lib/metanorma/default/default.rb', line 50 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 |
#requirement_component_parse(node, out) ⇒ Object
97 98 99 100 101 102 103 104 105 106 107 |
# File 'lib/metanorma/default/isodoc.rb', line 97 def requirement_component_parse(node, out) node["exclude"] == "true" and return out ret = node.dup if reqt_subpart?(node.name) ret["type"] = reqt_component_type(node) ret.name = "div" end descr_classif_render(ret) out << ret out end |
#requirement_description_cleanup1(reqt) ⇒ Object
58 59 60 61 62 63 64 65 66 67 |
# File 'lib/metanorma/default/cleanup.rb', line 58 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 |
#requirement_description_wrap(reqt, text) ⇒ Object
48 49 50 51 52 53 54 55 56 |
# File 'lib/metanorma/default/cleanup.rb', line 48 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 |
#requirement_descriptions_cleanup(reqt) ⇒ Object
38 39 40 41 42 43 44 |
# File 'lib/metanorma/default/cleanup.rb', line 38 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 |
#requirement_elems(node, out) ⇒ Object
71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 |
# File 'lib/metanorma/default/default.rb', line 71 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 |
#requirement_identifier_cleanup(reqt) ⇒ Object
6 7 8 9 10 |
# File 'lib/metanorma/default/cleanup.rb', line 6 def requirement_identifier_cleanup(reqt) reqt.xpath("./identifier[link] | ./inherit[link]").each do |i| i.children = i.at("./link/@target").text end end |
#requirement_inherit_cleanup(reqt) ⇒ Object
12 13 14 15 |
# File 'lib/metanorma/default/cleanup.rb', line 12 def requirement_inherit_cleanup(reqt) ins = requirement_inherit_insert(reqt) reqt.xpath("./*//inherit").each { |i| ins.previous = i } end |
#requirement_inherit_insert(reqt) ⇒ Object
17 18 19 20 21 22 23 24 |
# File 'lib/metanorma/default/cleanup.rb', line 17 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 |
#requirement_inherit_insert1(reqt) ⇒ Object
26 27 28 29 30 31 32 33 34 35 36 |
# File 'lib/metanorma/default/cleanup.rb', line 26 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 |
#requirement_metadata1(reqt, dlist, ins) ⇒ Object
94 95 96 97 98 99 100 101 102 103 104 |
# File 'lib/metanorma/default/cleanup.rb', line 94 def (reqt, dlist, ins) ins = (reqt, ins) .each do |a| dl_to_attrs(reqt, dlist, a) end .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 |
#requirement_metadata1_attrs ⇒ Object
74 75 76 |
# File 'lib/metanorma/default/cleanup.rb', line 74 def %w(obligation model type) end |
#requirement_metadata1_set_insert(reqt, ins) ⇒ Object
106 107 108 109 110 111 |
# File 'lib/metanorma/default/cleanup.rb', line 106 def (reqt, ins) return ins if ins reqt.children.first.previous = " " reqt.children.first end |
#requirement_metadata1_tags ⇒ Object
78 79 80 |
# File 'lib/metanorma/default/cleanup.rb', line 78 def %w(identifier subject inherit) end |
#requirement_metadata_cleanup(reqt) ⇒ Object
69 70 71 72 |
# File 'lib/metanorma/default/cleanup.rb', line 69 def (reqt) dl = reqt.at("./dl[@metadata = 'true']")&.remove or return (reqt, dl, reqt.at("./title")) end |
#requirement_metadata_component_tags ⇒ Object
82 83 84 |
# File 'lib/metanorma/default/cleanup.rb', line 82 def [] end |
#requirement_render1(node) ⇒ Object
18 19 20 21 22 23 24 25 26 |
# File 'lib/metanorma/default/isodoc.rb', line 18 def requirement_render1(node) out = recommendation_base(node, node.name) ins = recommendation_header(node, out) ins = recommendation_attributes(node, ins) node.elements.reject do |n| (n) end.each { |n| ins = requirement_component_parse(n, ins) } out end |
#requirement_subpart(node, attrs) ⇒ Object
30 31 32 33 34 35 36 37 |
# File 'lib/metanorma/default/default.rb', line 30 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 |
#requirement_type_cleanup(reqt) ⇒ Object
4 |
# File 'lib/metanorma/default/cleanup.rb', line 4 def requirement_type_cleanup(reqt); end |
#validate(_reqt, _log) ⇒ Object
98 99 100 |
# File 'lib/metanorma/default/default.rb', line 98 def validate(_reqt, _log) [] end |
#wrap_in_para(node, out) ⇒ Object
18 19 20 |
# File 'lib/metanorma/default/utils.rb', line 18 def wrap_in_para(node, out) Metanorma::Utils.wrap_in_para(node, out) end |