require "date" require "nokogiri" require "htmlentities" require "json" require "pathname" require "open-uri" require "pp" module Asciidoctor module Standoc module Front def metadata_id(node, xml) part, subpart = node&.attr("partnumber")&.split(/-/) id = node.attr("docnumber") || "" id += "-#{part}" if part id += "-#{subpart}" if subpart xml.docidentifier id xml.docnumber node.attr("docnumber") end def metadata_version(node, xml) xml.edition node.attr("edition") if node.attr("edition") xml.version do |v| v.revision_date node.attr("revdate") if node.attr("revdate") v.draft node.attr("draft") if node.attr("draft") end end def committee_component(compname, node, out) out.send compname.gsub(/-/, "_"), node.attr(compname), **attr_code(number: node.attr("#{compname}-number"), type: node.attr("#{compname}-type")) i = 2 while node.attr(compname+"_#{i}") do out.send compname.gsub(/-/, "_"), node.attr(compname+"_#{i}"), **attr_code(number: node.attr("#{compname}-number_#{i}"), type: node.attr("#{compname}-type_#{i}")) i += 1 end end def organization(org, orgname) org.name orgname end def metadata_author(node, xml) publishers = node.attr("publisher") || "" publishers.split(/,[ ]?/).each do |p| xml.contributor do |c| c.role **{ type: "author" } c.organization { |a| organization(a, p) } end end personal_author(node, xml) end def personal_author(node, xml) if node.attr("fullname") || node.attr("surname") personal_author1(node, xml, "") end i = 2 while node.attr("fullname_#{i}") || node.attr("surname_#{i}") personal_author1(node, xml, "_#{i}") i += 1 end end def personal_author1(node, xml, suffix) xml.contributor do |c| c.role **{ type: node.attr("role#{suffix}")&.downcase || "author" } c.person do |p| p.name do |n| if node.attr("fullname#{suffix}") n.completename node.attr("fullname#{suffix}") else n.forename node.attr("givenname#{suffix}") n.initial node.attr("initials#{suffix}") n.surname node.attr("surname#{suffix}") end end node.attr("affiliation#{suffix}") and p.affiliation do |a| a.organization do |o| o.name node.attr("affiliation#{suffix}") node.attr("address#{suffix}") and o.address do |ad| ad.formattedAddress node.attr("address#{suffix}") end end end node.attr("email#{suffix}") and p.email node.attr("email#{suffix}") node.attr("contributor-uri#{suffix}") and p.uri node.attr("contributor-uri#{suffix}") end end end def metadata_publisher(node, xml) publishers = node.attr("publisher") || return publishers.split(/,[ ]?/).each do |p| xml.contributor do |c| c.role **{ type: "publisher" } c.organization { |a| organization(a, p) } end end end def metadata_copyright(node, xml) publishers = node.attr("publisher") || " " publishers.split(/,[ ]?/).each do |p| xml.copyright do |c| c.from (node.attr("copyright-year") || Date.today.year) p.match(/[A-Za-z]/).nil? or c.owner do |owner| owner.organization { |o| organization(o, p) } end end end end def metadata_status(node, xml) xml.status(**{ format: "plain" }) do |s| s << ( node.attr("status") || "published" ) end end def metadata_committee(node, xml) xml.editorialgroup do |a| committee_component("technical-committee", node, a) end end def metadata_ics(node, xml) ics = node.attr("library-ics") ics && ics.split(/,\s*/).each do |i| xml.ics do |ics| ics.code i end end end def metadata_source(node, xml) node.attr("uri") && xml.uri(node.attr("uri")) node.attr("xml-uri") && xml.uri(node.attr("xml-uri"), type: "xml") node.attr("html-uri") && xml.uri(node.attr("html-uri"), type: "html") node.attr("pdf-uri") && xml.uri(node.attr("pdf-uri"), type: "pdf") node.attr("doc-uri") && xml.uri(node.attr("doc-uri"), type: "doc") node.attr("relaton-uri") && xml.uri(node.attr("relaton-uri"), type: "relaton") end def metadata_date1(node, xml, type) date = node.attr("#{type}-date") date and xml.date **{ type: type } do |d| d.on date end end def datetypes %w{ published accessed created implemented obsoleted confirmed updated issued circulated unchanged received } end def metadata_date(node, xml) datetypes.each { |t| metadata_date1(node, xml, t) } node.attributes.keys.each do |a| next unless a == "date" || /^date_\d+$/.match(a) type, date = node.attr(a).split(/ /, 2) type or next xml.date **{ type: type } do |d| d.on date end end end def metadata_language(node, xml) xml.language (node.attr("language") || "en") end def metadata_script(node, xml) xml.script (node.attr("script") || "Latn") end def relaton_relations %w(part-of) end def metadata_relations(node, xml) relaton_relations.each do |t| metadata_getrelation(node, xml, t) end end def relation_normalise(type) type.sub(/-by$/, "By").sub(/-of$/, "Of") end def metadata_getrelation(node, xml, type) docs = node.attr(type) || return docs.split(/,/).each do |d| xml.relation **{ type: relation_normalise(type) } do |r| fetch_ref(r, d, nil, {}) or r.bibitem do |b| b.title "--" b.docidentifier d end end end end def metadata(node, xml) title node, xml metadata_source(node, xml) metadata_id(node, xml) metadata_date(node, xml) metadata_author(node, xml) metadata_publisher(node, xml) metadata_version(node, xml) metadata_note(node, xml) metadata_language(node, xml) metadata_script(node, xml) metadata_status(node, xml) metadata_copyright(node, xml) metadata_relations(node, xml) metadata_committee(node, xml) metadata_ics(node, xml) end def metadata_note(node, xml) end def asciidoc_sub(x) return nil if x.nil? return "" if x.empty? d = Asciidoctor::Document.new(x.lines.entries, {header_footer: false}) b = d.parse.blocks.first b.apply_subs(b.source) end def title(node, xml) title_english(node, xml) title_otherlangs(node, xml) end def title_english(node, xml) ["en"].each do |lang| at = { language: lang, format: "text/plain" } xml.title **attr_code(at) do |t| t << asciidoc_sub(node.attr("title") || node.attr("title-en") || node.title) end end end def title_otherlangs(node, xml) node.attributes.each do |k, v| next unless /^title-(?.+)$/ =~ k next if titlelang == "en" xml.title v, { language: titlelang, format: "text/plain" } end end end end end