metanorma/metanorma-bipm

View on GitHub
lib/metanorma/bipm/front.rb

Summary

Maintainability
A
25 mins
Test Coverage
module Metanorma
  module BIPM
    class Converter < Metanorma::Generic::Converter
      def metadata_committee(node, xml)
        return unless node.attr("committee-en") || node.attr("committee-fr")

        xml.editorialgroup do |a|
          metadata_committee1(node, a)
          i = 2
          while node.attr("committee-en_#{i}") || node.attr("committee-fr_#{i}")
            metadata_committee2(node, a, i)
            i += 1
          end
          metadata_workgroup(node, a)
        end
      end

      def metadata_committee1(node, xml)
        xml.committee **attr_code(acronym:
                                  node.attr("committee-acronym")) do |c|
          e = node.attr("committee-en") and
            c.variant e, language: "en", script: "Latn"
          e = node.attr("committee-fr") and
            c.variant e, language: "fr", script: "Latn"
        end
      end

      def metadata_committee2(node, xml, num)
        xml.committee **attr_code(acronym:
                                  node.attr("committee-acronym_#{num}")) do |c|
          %w(en fr).each do |lg|
            e = node.attr("committee-#{lg}_#{num}") and
              c.variant e, language: lg, script: "Latn"
          end
        end
      end

      def metadata_workgroup(node, xml)
        xml.workgroup(node.attr("workgroup"),
                      **attr_code(acronym: node.attr("workgroup-acronym")))
        i = 2
        while node.attr("workgroup_#{i}")
          xml.workgroup(
            node.attr("workgroup_#{i}"),
            **attr_code(acronym: node.attr("workgroup-acronym_#{i}")),
          )
          i += 1
        end
      end

      def metadata_relations(node, xml)
        super
        relation_supersedes_self(node, xml, "")
        i = 2
        while relation_supersedes_self(node, xml, "_#{i}")
          i += 1
        end
      end

      def relation_supersedes_self(node, xml, suffix)
        d = node.attr("supersedes-date#{suffix}")
        draft = node.attr("supersedes-draft#{suffix}")
        edition = node.attr("supersedes-edition#{suffix}")
        return false unless d || draft || edition

        relation_supersedes_self1(xml, d, edition, draft)
      end

      def relation_supersedes_self1(xml, date, edition, draft)
        xml.relation type: "supersedes" do |r|
          r.bibitem do |b|
            date and b.date(date,
                            type: edition ? "published" : "circulated")
            edition and b.edition edition
            draft and b.version do |v|
              v.draft draft
            end
          end
        end
      end

      def personal_role(node, xml, suffix)
        role = node.attr("role#{suffix}") || "author"
        unless %w(author editor).include?(role.downcase)
          desc = role
          role = "editor"
        end
        xml.role type: role.downcase do |d|
          d << desc
        end
      end

      def title(node, xml)
        ["en", "fr"].each do |lang|
          at = { language: lang, format: "text/plain" }
          xml.title **attr_code(at.merge(type: "title-main")) do |t1|
            t1 << Metanorma::Utils::asciidoc_sub(node.attr("title-#{lang}"))
          end
          %w(cover appendix annex part subpart provenance).each do |w|
            typed_title(node, xml, lang, w)
          end
        end
      end

      def typed_title(node, xml, lang, type)
        at = { language: lang, format: "text/plain" }
        return unless title = node.attr("title-#{type}-#{lang}")

        xml.title **attr_code(at.merge(type: "title-#{type}")) do |t1|
          t1 << Metanorma::Utils::asciidoc_sub(title)
        end
      end
    end
  end
end