require "uri" if /^2\./.match?(RUBY_VERSION) require_relative "ref_sect" require_relative "terms" module Metanorma module Standoc module Section @biblio = false @term_def = false @norm_ref = false def sectiontype1(node) node.attr("style") == "abstract" and return "abstract" node.attr("heading")&.downcase || node.title .gsub(%r{.*?}m, "") .gsub(%r{]*>.*?}m, "") .gsub(/<[^>]+>/, "") .strip.downcase.sub(/\.$/, "") end def sectiontype(node, level = true) ret = sectiontype1(node) ret1 = preface_main_filter(sectiontype_streamline(ret), node) ret1 == "symbols and abbreviated terms" and return ret1 !level || node.level == 1 || node.attr("heading") or return nil @seen_headers.include? ret and return nil @seen_headers << ret unless ret1.nil? @seen_headers_canonical << ret1 unless ret1.nil? ret1 end def sectiontype_streamline(ret) case ret when "terms and definitions", "terms, definitions, symbols and abbreviated terms", "terms, definitions, symbols and abbreviations", "terms, definitions and symbols", "terms, definitions and abbreviations", "terms, definitions and abbreviated terms" "terms and definitions" when "symbols and abbreviated terms", "symbols", "abbreviated terms", "abbreviations", "symbols and abbreviations" "symbols and abbreviated terms" when "acknowledgements", "acknowledgments" "acknowledgements" else ret end end PREFACE_CLAUSE_NAMES = %w(abstract foreword introduction metanorma-extension termdocsource misc-container acknowledgements).freeze MAIN_CLAUSE_NAMES = ["normative references", "terms and definitions", "scope", "symbols and abbreviated terms", "clause", "bibliography"].freeze def role_style(node, value) node.role == value || node.attr("style") == value end def start_main_section(ret, node) role_style(node, "preface") and return @preface = false if self.class::MAIN_CLAUSE_NAMES.include?(ret) @preface = false if self.class::PREFACE_CLAUSE_NAMES .intersection(@seen_headers_canonical + [ret]).empty? end def preface_main_filter(ret, node) start_main_section(ret, node) if @preface self.class::MAIN_CLAUSE_NAMES.include?(ret) and return nil else self.class::PREFACE_CLAUSE_NAMES.include?(ret) and return nil end ret end def section_attributes(node) ret = { id: Metanorma::Utils::anchor_or_uuid(node), unnumbered: node.option?("unnumbered") ? "true" : nil, annex: role_style(node, "appendix") && node.level == 1 ? true : nil, colophon: role_style(node, "colophon") ? true : nil, preface: role_style(node, "preface") ? true : nil } %w(language script number branch-number type tag keeptitle multilingual-rendering).each do |k| a = node.attr(k) and ret[k.to_sym] = a end section_attributes_change(node, ret).compact end def section_attributes_change(node, ret) node.attributes["change"] or return ret ret.merge(change: node.attributes["change"], path: node.attributes["path"], path_end: node.attributes["path_end"], title: node.attributes["title"]) end def section(node) a = section_attributes(node) noko do |xml| case sectiontype(node) when "misc-container", "metanorma-extension" misccontainer_parse(a, xml, node) when "introduction" then introduction_parse(a, xml, node) when "foreword" then foreword_parse(a, xml, node) when "scope" then scope_parse(a, xml, node) when "normative references" then norm_ref_parse(a, xml, node) when "terms and definitions" @term_def = true term_def_parse(a, xml, node, true) @term_def = false when "symbols and abbreviated terms" symbols_parse(symbols_attrs(node, a), xml, node) when "acknowledgements" acknowledgements_parse(a, xml, node) when "bibliography" bibliography_parse(a, xml, node) else if @term_def then term_def_subclause_parse(a, xml, node) elsif @definitions then symbols_parse(a, xml, node) elsif @norm_ref || (node.attr("style") == "bibliography" && sectiontype(node, false) == "normative references") norm_ref_parse(a, xml, node) elsif @biblio || node.attr("style") == "bibliography" bibliography_parse(a, xml, node) elsif node.attr("style") == "abstract" abstract_parse(a, xml, node) elsif node.attr("style") == "index" indexsect_parse(a, xml, node) elsif node.attr("style") == "appendix" && node.level == 1 annex_parse(a, xml, node) else clause_parse(a, xml, node) end end end.join("\n") end def set_obligation(attrs, node) attrs[:obligation] = if node.attributes.has_key?("obligation") node.attr("obligation") elsif node.parent.attributes.has_key?("obligation") node.parent.attr("obligation") else "normative" end end def preamble(node) noko do |xml| xml.foreword **attr_code(section_attributes(node)) do |xml_abstract| xml_abstract.title do |t| t << (node.blocks[0].title || @i18n.foreword) end xml_abstract << node.content end end.join("\n") end def misccontainer_parse(_attrs, xml, node) xml.send :"misc-container-clause" do |xml_section| xml_section << node.content end end def indexsect_parse(attrs, xml, node) xml.indexsect **attr_code(attrs) do |xml_section| xml_section.title { |name| name << node.title } xml_section << node.content end end def abstract_parse(attrs, xml, node) xml.abstract **attr_code(attrs) do |xml_section| xml_section << node.content end end def scope_parse(attrs, xml, node) clause_parse(attrs.merge(type: "scope"), xml, node) end def clause_parse(attrs, xml, node) attrs[:"inline-header"] = node.option? "inline-header" attrs[:bibitem] = true if node.option? "bibitem" attrs[:level] = node.attr("level") set_obligation(attrs, node) xml.send :clause, **attr_code(attrs) do |xml_section| xml_section.title { |n| n << node.title } unless node.title.nil? xml_section << node.content end end def annex_parse(attrs, xml, node) attrs[:"inline-header"] = node.option? "inline-header" set_obligation(attrs, node) xml.annex **attr_code(attrs) do |xml_section| xml_section.title { |name| name << node.title } xml_section << node.content end end def introduction_parse(attrs, xml, node) xml.introduction **attr_code(attrs) do |xml_section| xml_section.title { |t| t << @i18n.introduction } content = node.content xml_section << content end end def foreword_parse(attrs, xml, node) xml.foreword **attr_code(attrs) do |xml_section| xml_section.title { |t| t << node.title } content = node.content xml_section << content end end def acknowledgements_parse(attrs, xml, node) xml.acknowledgements **attr_code(attrs) do |xml_section| xml_section.title { |t| (t << node.title) || @i18n.acknowledgements } content = node.content xml_section << content end end def floating_title_attrs(node) attr_code(id_attr(node) .merge(align: node.attr("align"), depth: node.level, type: "floating-title")) end def floating_title(node) noko do |xml| xml.floating_title **floating_title_attrs(node) do |xml_t| xml_t << node.title end end.join("\n") end end end end