module IsoDoc module Function module Lists def list_title_parse(node, out) name = node.at(ns("./fmt-name")) or return out.p class: "ListTitle" do |p| name.children&.each { |n| parse(n, p) } end end def ul_attrs(node) { id: node["id"], style: keep_style(node) } end def ul_parse(node, out) out.div **attr_code(class: "ul_wrap") do |div| list_title_parse(node, div) div.ul **attr_code(ul_attrs(node)) do |ul| node.children.each { |n| n.name == "fmt-name" or parse(n, ul) } end end end OL_STYLE = { arabic: "1", roman: "i", alphabet: "a", roman_upper: "I", alphabet_upper: "A", }.freeze def ol_style(type) type ||= :alphabet OL_STYLE[type.to_sym] end # We don't really want users to specify type of ordered list; # we will use a fixed hierarchy as practiced by ISO (though not # fully spelled out): a) 1) i) A) I) def ol_depth(node) depth = node.ancestors("ul, ol").size + 1 type = :alphabet type = :arabic if [2, 7].include? depth type = :roman if [3, 8].include? depth type = :alphabet_upper if [4, 9].include? depth type = :roman_upper if [5, 10].include? depth ol_style(type) end def ol_attrs(node) { type: node["type"] ? ol_style(node["type"].to_sym) : ol_depth(node), id: node["id"], style: keep_style(node) } end def ol_parse(node, out) out.div **attr_code(class: "ol_wrap") do |div| list_title_parse(node, div) div.ol **attr_code(ol_attrs(node)) do |ol| node.children.each { |n| n.name == "fmt-name" or parse(n, ol) } end end end def li_parse(node, out) out.li **attr_code(id: node["id"]) do |li| if node["uncheckedcheckbox"] == "true" li << '' \ '' elsif node["checkedcheckbox"] == "true" li << '' \ '' end node.children.each { |n| parse(n, li) } end end def dt_parse(dterm, term) if dterm.elements.empty? term.p do |p| dterm.children.each { |n| parse(n, p) } end else dterm.children.each { |n| parse(n, term) } end end def dt_dd?(node) %w{dt dd}.include? node.name end def dl_attrs(node) attr_code(id: node["id"], style: keep_style(node), class: node["class"]) end def dl_parse(node, out) out.div **attr_code(class: "figdl") do |div| list_title_parse(node, div) div.dl **dl_attrs(node) do |v| node.elements.select { |n| dt_dd? n }.each_slice(2) do |dt, dd| dl_parse1(v, dt, dd) end end dl_parse_notes(node, div) end end def dl_parse_notes(node, out) node.elements.reject { |n| dt_dd?(n) || n.name == "fmt-name" } .each { |n| parse(n, out) } end def dl_parse1(dlist, dterm, ddef) dlist.dt **attr_code(id: dterm["id"]) do |term| dt_parse(dterm, term) end dlist.dd **attr_code(id: ddef["id"]) do |listitem| ddef.children.each { |n| parse(n, listitem) } end end end end end