module IsoDoc::Function
module Section
def clausedelim
"."
end
def clausedelimspace(out)
insert_tab(out, 1)
end
def inline_header_title(out, node, c1)
out.span **{ class: "zzMoveToFollowing" } do |s|
s.b do |b|
if anchor(node['id'], :label, false) && !@suppressheadingnumbers
b << "#{anchor(node['id'], :label)}#{clausedelim}"
clausedelimspace(out)
end
c1&.children&.each { |c2| parse(c2, b) }
end
end
end
# used for subclauses
def clause_parse_title(node, div, c1, out)
if node["inline-header"] == "true"
inline_header_title(out, node, c1)
else
div.send "h#{anchor(node['id'], :level, false) || '1'}" do |h|
lbl = anchor(node['id'], :label, false)
h << "#{lbl}#{clausedelim}" if lbl && !@suppressheadingnumbers
clausedelimspace(out) if lbl && !@suppressheadingnumbers
c1&.children&.each { |c2| parse(c2, h) }
end
end
end
# used for subclauses
def clause_parse(node, out)
out.div **attr_code(id: node["id"]) 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_name(num, title, div, header_class)
header_class = {} if header_class.nil?
div.h1 **attr_code(header_class) do |h1|
if num && !@suppressheadingnumbers
h1 << "#{num}#{clausedelim}"
clausedelimspace(h1)
end
title.is_a?(String) ? h1 << title :
title&.children&.each { |c2| parse(c2, h1) }
end
div.parent.at(".//h1")
end
MIDDLE_CLAUSE =
"//clause[parent::sections][not(xmlns:title = 'Scope')]"\
"[not(descendant::terms)]".freeze
def clause(isoxml, out)
isoxml.xpath(ns(self.class::MIDDLE_CLAUSE)).each do |c|
out.div **attr_code(id: c["id"]) do |s|
clause_name(anchor(c['id'], :label),
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_name(annex, name, div)
div.h1 **{ class: "Annex" } do |t|
t << "#{anchor(annex['id'], :label)}
"
t.b do |b|
name&.children&.each { |c2| parse(c2, b) }
end
end
end
def annex(isoxml, out)
isoxml.xpath(ns("//annex")).each do |c|
page_break(out)
out.div **attr_code(id: c["id"], class: "Section3") do |s|
annex_name(c, nil, s) unless c.at(ns("./title"))
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[title = 'Scope']")) or return num
out.div **attr_code(id: f["id"]) do |div|
num = num + 1
clause_name(num, @scope_lbl, 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 term_def_title(title)
case title&.text
when "Terms, definitions, symbols and abbreviated terms"
@labels["termsdefsymbolsabbrev"]
when "Terms, definitions and symbols"
@labels["termsdefsymbols"]
when "Terms, definitions and abbreviated terms"
@labels["termsdefabbrev"]
when "Terms and definitions"
@labels["termsdef"]
else
title
end
end
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(num, term_def_title(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(num, f&.at(ns("./title")) || @symbols_lbl, 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 = "