require_relative "./section_titles" module IsoDoc module Function module Section def clause_attrs(node) { id: node["id"] } end # used for subclauses def clause_parse(node, out) out.div **attr_code(clause_attrs(node)) do |div| clause_parse_title(node, div, node.at(ns("./title")), out) node.children.reject { |c1| c1.name == "title" }.each do |c1| parse(c1, div) end end end def clause(isoxml, out) isoxml.xpath(ns(middle_clause(isoxml))).each do |c| out.div **attr_code(clause_attrs(c)) do |s| clause_name(c, c&.at(ns("./title")), s, nil) c.elements.reject { |c1| c1.name == "title" }.each do |c1| parse(c1, s) end end end end def annex_attrs(node) { id: node["id"], class: "Section3" } end def annex(isoxml, out) isoxml.xpath(ns("//annex")).each do |c| page_break(out) out.div **attr_code(annex_attrs(c)) do |s| c.elements.each do |c1| if c1.name == "title" then annex_name(c, c1, s) else parse(c1, s) end end end end end def scope(isoxml, out, num) f = isoxml.at(ns("//clause[@type = 'scope']")) or return num out.div **attr_code(id: f["id"]) do |div| num = num + 1 clause_name(f, f&.at(ns("./title")), div, nil) f.elements.each do |e| parse(e, div) unless e.name == "title" end end num end TERM_CLAUSE = "//sections/terms | " \ "//sections/clause[descendant::terms]".freeze def terms_defs(isoxml, out, num) f = isoxml.at(ns(TERM_CLAUSE)) or return num out.div **attr_code(id: f["id"]) do |div| num = num + 1 clause_name(f, f&.at(ns("./title")), div, nil) f.elements.each do |e| parse(e, div) unless %w{title source}.include? e.name end end num end # subclause def terms_parse(isoxml, out) clause_parse(isoxml, out) end def symbols_abbrevs(isoxml, out, num) f = isoxml.at(ns("//sections/definitions")) or return num out.div **attr_code(id: f["id"], class: "Symbols") do |div| num = num + 1 clause_name(f, f.at(ns("./title")), div, nil) f.elements.each do |e| parse(e, div) unless e.name == "title" end end num end # subclause def symbols_parse(isoxml, out) isoxml.at(ns("./title")) or isoxml.children.first.previous = "#{@i18n.symbols}" clause_parse(isoxml, out) end def introduction(isoxml, out) f = isoxml.at(ns("//introduction")) || return page_break(out) out.div class: "Section3", id: f["id"] do |div| clause_name(f, f.at(ns("./title")), div, { class: "IntroTitle" }) f.elements.each do |e| parse(e, div) unless e.name == "title" end end end def foreword(isoxml, out) f = isoxml.at(ns("//foreword")) || return page_break(out) out.div **attr_code(id: f["id"]) do |s| clause_name(f, f.at(ns("./title")) || @i18n.foreword, s, { class: "ForewordTitle" }) f.elements.each { |e| parse(e, s) unless e.name == "title" } end end def acknowledgements(isoxml, out) f = isoxml.at(ns("//acknowledgements")) || return title_attr = { class: "IntroTitle" } page_break(out) out.div class: "Section3", id: f["id"] do |div| clause_name(f, f&.at(ns("./title")), div, title_attr) f.elements.each do |e| parse(e, div) unless e.name == "title" end end end def abstract(isoxml, out) f = isoxml.at(ns("//preface/abstract")) || return page_break(out) out.div **attr_code(id: f["id"]) do |s| clause_name(f, f.at(ns("./title")), s, { class: "AbstractTitle" }) f.elements.each { |e| parse(e, s) unless e.name == "title" } end end def preface(isoxml, out) isoxml.xpath(ns("//preface/clause | //preface/references | " \ "//preface/definitions | //preface/terms")).each do |f| page_break(out) out.div class: "Section3", id: f["id"] do |div| clause_name(f, f&.at(ns("./title")), div, { class: "IntroTitle" }) f.elements.each do |e| parse(e, div) unless e.name == "title" end end end end def colophon(isoxml, out) isoxml.at(ns("//colophon")) or return page_break(out) isoxml.xpath(ns("//colophon/clause")).each do |f| out.div class: "Section3", id: f["id"] do |div| clause_name(f, f&.at(ns("./title")), div, { class: "IntroTitle" }) f.elements.each do |e| parse(e, div) unless e.name == "title" end end end end def is_clause?(name) %w(clause references definitions terms foreword introduction abstract acknowledgements).include? name end def single_term_clause?(elem) t = elem.xpath(ns("./clause | ./terms | ./definitions | ./references")) t.size == 1 && %w(terms definitions references).include?(t[0].name) end def preface_block(isoxml, out) p = isoxml.at(ns("//preface")) or return p.elements.each do |e| next if is_clause?(e.name) parse(e, out) end end def copyright_parse(node, out) return if @bare out.div class: "boilerplate-copyright" do |div| node.children.each { |n| parse(n, div) } end end def license_parse(node, out) return if @bare out.div class: "boilerplate-license" do |div| node.children.each { |n| parse(n, div) } end end def legal_parse(node, out) return if @bare out.div class: "boilerplate-legal" do |div| node.children.each { |n| parse(n, div) } end end def feedback_parse(node, out) return if @bare out.div class: "boilerplate-feedback" do |div| node.children.each { |n| parse(n, div) } end end end end end