asciidoctor-iso 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.oss-guides.rubocop.yml +1077 -0
- data/.rubocop.yml +15 -0
- data/Gemfile +4 -0
- data/README.adoc +96 -0
- data/asciidoctor-iso.gemspec +44 -0
- data/grammar1.gif +0 -0
- data/grammar2.gif +0 -0
- data/grammar3.gif +0 -0
- data/grammar4.gif +0 -0
- data/lib/asciidoctor-iso.rb +3 -0
- data/lib/asciidoctor/iso/base.rb +145 -0
- data/lib/asciidoctor/iso/blocks.rb +185 -0
- data/lib/asciidoctor/iso/converter.rb +53 -0
- data/lib/asciidoctor/iso/front.rb +80 -0
- data/lib/asciidoctor/iso/inline_anchor.rb +65 -0
- data/lib/asciidoctor/iso/lists.rb +158 -0
- data/lib/asciidoctor/iso/table.rb +53 -0
- data/lib/asciidoctor/iso/utils.rb +224 -0
- data/lib/asciidoctor/iso/validate.rb +37 -0
- data/lib/asciidoctor/iso/validate.rnc +444 -0
- data/lib/asciidoctor/iso/validate.rng +1001 -0
- data/lib/asciidoctor/iso/version.rb +5 -0
- data/spec/examples/rice.adoc +654 -0
- data/spec/examples/rice.html +1805 -0
- data/spec/examples/rice.xml +63 -0
- metadata +268 -0
| @@ -0,0 +1,53 @@ | |
| 1 | 
            +
            require "asciidoctor"
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            require "asciidoctor/iso/version"
         | 
| 4 | 
            +
            require "asciidoctor/iso/base"
         | 
| 5 | 
            +
            require "asciidoctor/iso/front"
         | 
| 6 | 
            +
            require "asciidoctor/iso/lists"
         | 
| 7 | 
            +
            require "asciidoctor/iso/inline_anchor"
         | 
| 8 | 
            +
            require "asciidoctor/iso/blocks"
         | 
| 9 | 
            +
            require "asciidoctor/iso/table"
         | 
| 10 | 
            +
            require "asciidoctor/iso/validate"
         | 
| 11 | 
            +
            require "asciidoctor/iso/utils"
         | 
| 12 | 
            +
             | 
| 13 | 
            +
            module Asciidoctor
         | 
| 14 | 
            +
              module ISO
         | 
| 15 | 
            +
                # A {Converter} implementation that generates ISO output, and a document
         | 
| 16 | 
            +
                # schema encapsulation of the document for validation
         | 
| 17 | 
            +
                class Converter
         | 
| 18 | 
            +
                  include ::Asciidoctor::Converter
         | 
| 19 | 
            +
                  include ::Asciidoctor::Writer
         | 
| 20 | 
            +
             | 
| 21 | 
            +
                  include ::Asciidoctor::ISO::Base
         | 
| 22 | 
            +
                  include ::Asciidoctor::ISO::Front
         | 
| 23 | 
            +
                  include ::Asciidoctor::ISO::Lists
         | 
| 24 | 
            +
                  include ::Asciidoctor::ISO::InlineAnchor
         | 
| 25 | 
            +
                  include ::Asciidoctor::ISO::Blocks
         | 
| 26 | 
            +
                  include ::Asciidoctor::ISO::Table
         | 
| 27 | 
            +
                  include ::Asciidoctor::ISO::Utils
         | 
| 28 | 
            +
                  include ::Asciidoctor::ISO::Validate
         | 
| 29 | 
            +
             | 
| 30 | 
            +
                  register_for "iso"
         | 
| 31 | 
            +
             | 
| 32 | 
            +
                  $xreftext = {}
         | 
| 33 | 
            +
             | 
| 34 | 
            +
                  def initialize(backend, opts)
         | 
| 35 | 
            +
                    super
         | 
| 36 | 
            +
                    basebackend "html"
         | 
| 37 | 
            +
                    outfilesuffix ".xml"
         | 
| 38 | 
            +
                  end
         | 
| 39 | 
            +
             | 
| 40 | 
            +
                  # alias_method :pass, :content
         | 
| 41 | 
            +
                  alias_method :embedded, :content
         | 
| 42 | 
            +
                  alias_method :verse, :content
         | 
| 43 | 
            +
                  alias_method :literal, :content
         | 
| 44 | 
            +
                  alias_method :audio, :skip
         | 
| 45 | 
            +
                  alias_method :thematic_break, :skip
         | 
| 46 | 
            +
                  alias_method :video, :skip
         | 
| 47 | 
            +
                  alias_method :inline_button, :skip
         | 
| 48 | 
            +
                  alias_method :inline_kbd, :skip
         | 
| 49 | 
            +
                  alias_method :inline_menu, :skip
         | 
| 50 | 
            +
                  alias_method :inline_image, :skip
         | 
| 51 | 
            +
                end
         | 
| 52 | 
            +
              end
         | 
| 53 | 
            +
            end
         | 
| @@ -0,0 +1,80 @@ | |
| 1 | 
            +
            require "date"
         | 
| 2 | 
            +
            require "nokogiri"
         | 
| 3 | 
            +
            require "htmlentities"
         | 
| 4 | 
            +
            require "json"
         | 
| 5 | 
            +
            require "pathname"
         | 
| 6 | 
            +
            require "open-uri"
         | 
| 7 | 
            +
            require "pp"
         | 
| 8 | 
            +
             | 
| 9 | 
            +
            module Asciidoctor
         | 
| 10 | 
            +
              module ISO
         | 
| 11 | 
            +
                module Front
         | 
| 12 | 
            +
                  def metadata_id(node, xml)
         | 
| 13 | 
            +
                    xml.id do |i|
         | 
| 14 | 
            +
                      i.documentnumber node.attr("docnumber"),
         | 
| 15 | 
            +
                        **attr_code(partnumber: node.attr("partnumber"))
         | 
| 16 | 
            +
                      if node.attr("tc-docnumber")
         | 
| 17 | 
            +
                        i.tc_documentnumber node.attr("tc-docnumber")
         | 
| 18 | 
            +
                      end
         | 
| 19 | 
            +
                      if node.attr("ref-docnumber")
         | 
| 20 | 
            +
                        i.ref_documentnumber node.attr("ref-docnumber")
         | 
| 21 | 
            +
                      end
         | 
| 22 | 
            +
                    end
         | 
| 23 | 
            +
                  end
         | 
| 24 | 
            +
             | 
| 25 | 
            +
                  def metadata_version(node, xml)
         | 
| 26 | 
            +
                    xml.version do |v|
         | 
| 27 | 
            +
                      v.edition node.attr("edition") if node.attr("edition")
         | 
| 28 | 
            +
                      v.revdate node.attr("revdate") if node.attr("revdate")
         | 
| 29 | 
            +
                      if node.attr("copyright-year")
         | 
| 30 | 
            +
                        v.copyright_year node.attr("copyright-year")
         | 
| 31 | 
            +
                      end
         | 
| 32 | 
            +
                    end
         | 
| 33 | 
            +
                  end
         | 
| 34 | 
            +
             | 
| 35 | 
            +
                  def metadata_author(node, xml)
         | 
| 36 | 
            +
                    xml.author do |a|
         | 
| 37 | 
            +
                      a.technical_committee node.attr("technical-committee"),
         | 
| 38 | 
            +
                        **attr_code(number: node.attr("technical-committee-number"))
         | 
| 39 | 
            +
                      if node.attr("subcommittee")
         | 
| 40 | 
            +
                        a.subcommittee node.attr("subcommittee"),
         | 
| 41 | 
            +
                          **attr_code(number: node.attr("subcommittee-number"))
         | 
| 42 | 
            +
                      end
         | 
| 43 | 
            +
                      if node.attr("workgroup")
         | 
| 44 | 
            +
                        a.workgroup node.attr("workgroup"),
         | 
| 45 | 
            +
                          **attr_code(number: node.attr("workgroup-number"))
         | 
| 46 | 
            +
                      end
         | 
| 47 | 
            +
                      a.secretariat node.attr("secretariat") if node.attr("secretariat")
         | 
| 48 | 
            +
                    end
         | 
| 49 | 
            +
                  end
         | 
| 50 | 
            +
             | 
| 51 | 
            +
                  def metadata(node, xml)
         | 
| 52 | 
            +
                    xml.documenttype node.attr("doctype")
         | 
| 53 | 
            +
                    xml.documentstatus do |s|
         | 
| 54 | 
            +
                      s.stage node.attr("docstage")
         | 
| 55 | 
            +
                      s.substage node.attr("docsubstage") if node.attr("docsubstage")
         | 
| 56 | 
            +
                    end
         | 
| 57 | 
            +
                    metadata_id(node, xml)
         | 
| 58 | 
            +
                    xml.language node.attr("language")
         | 
| 59 | 
            +
                    metadata_version(node, xml)
         | 
| 60 | 
            +
                    metadata_author(node, xml)
         | 
| 61 | 
            +
                  end
         | 
| 62 | 
            +
             | 
| 63 | 
            +
                  def title(node, xml)
         | 
| 64 | 
            +
                    xml.title do |t0|
         | 
| 65 | 
            +
                      ["en", "fr"].each do |lang|
         | 
| 66 | 
            +
                        t0.send lang do |t|
         | 
| 67 | 
            +
                          if node.attr("title-intro-#{lang}")
         | 
| 68 | 
            +
                            t.title_intro { |t1| t1 << node.attr("title-intro-#{lang}") }
         | 
| 69 | 
            +
                          end
         | 
| 70 | 
            +
                          t.title_main { |t1| t1 << node.attr("title-main-#{lang}") }
         | 
| 71 | 
            +
                          if node.attr("title-part-#{lang}")
         | 
| 72 | 
            +
                            t.title_part node.attr("title-part-#{lang}")
         | 
| 73 | 
            +
                          end
         | 
| 74 | 
            +
                        end
         | 
| 75 | 
            +
                      end
         | 
| 76 | 
            +
                    end
         | 
| 77 | 
            +
                  end
         | 
| 78 | 
            +
                end
         | 
| 79 | 
            +
              end
         | 
| 80 | 
            +
            end
         | 
| @@ -0,0 +1,65 @@ | |
| 1 | 
            +
            module Asciidoctor
         | 
| 2 | 
            +
              module ISO
         | 
| 3 | 
            +
                module InlineAnchor
         | 
| 4 | 
            +
                  def inline_anchor(node)
         | 
| 5 | 
            +
                    case node.type
         | 
| 6 | 
            +
                    when :xref
         | 
| 7 | 
            +
                      inline_anchor_xref node
         | 
| 8 | 
            +
                    when :link
         | 
| 9 | 
            +
                      inline_anchor_link node
         | 
| 10 | 
            +
                    when :bibref
         | 
| 11 | 
            +
                      inline_anchor_bibref node
         | 
| 12 | 
            +
                    else
         | 
| 13 | 
            +
                      warn %(asciidoctor: WARNING (#{current_location(node)}): unknown anchor type: #{node.type.inspect})
         | 
| 14 | 
            +
                    end
         | 
| 15 | 
            +
                  end
         | 
| 16 | 
            +
             | 
| 17 | 
            +
                  def inline_anchor_xref(node)
         | 
| 18 | 
            +
                    matched = /^fn(:  (?<text>.*))?$/.match node.text
         | 
| 19 | 
            +
                    if matched.nil?
         | 
| 20 | 
            +
                      format = "inline"
         | 
| 21 | 
            +
                      xref_contents = node.text
         | 
| 22 | 
            +
                    else
         | 
| 23 | 
            +
                      format = "footnote"
         | 
| 24 | 
            +
                      xref_contents = matched[:text]
         | 
| 25 | 
            +
                    end
         | 
| 26 | 
            +
                    xref_attributes = {
         | 
| 27 | 
            +
                      target: node.target.gsub(/^#/, "").gsub(/(.)(\.xml)?#.*$/, "\\1"),
         | 
| 28 | 
            +
                      format: format,
         | 
| 29 | 
            +
                    }
         | 
| 30 | 
            +
             | 
| 31 | 
            +
                    noko do |xml|
         | 
| 32 | 
            +
                      xml.xref xref_contents, **attr_code(xref_attributes)
         | 
| 33 | 
            +
                    end.join
         | 
| 34 | 
            +
                  end
         | 
| 35 | 
            +
             | 
| 36 | 
            +
                  def inline_anchor_link(node)
         | 
| 37 | 
            +
                    eref_contents = node.target == node.text ? nil : node.text
         | 
| 38 | 
            +
                    eref_attributes = {
         | 
| 39 | 
            +
                      target: node.target,
         | 
| 40 | 
            +
                    }
         | 
| 41 | 
            +
             | 
| 42 | 
            +
                    noko do |xml|
         | 
| 43 | 
            +
                      xml.eref eref_contents, **attr_code(eref_attributes)
         | 
| 44 | 
            +
                    end.join
         | 
| 45 | 
            +
                  end
         | 
| 46 | 
            +
             | 
| 47 | 
            +
                  def inline_anchor_bibref(node)
         | 
| 48 | 
            +
                    eref_contents = node.target == node.text ? nil : node.text
         | 
| 49 | 
            +
                    eref_attributes = {
         | 
| 50 | 
            +
                      anchor: node.target,
         | 
| 51 | 
            +
                    }
         | 
| 52 | 
            +
             | 
| 53 | 
            +
                    noko do |xml|
         | 
| 54 | 
            +
                      xml.ref eref_contents, **attr_code(eref_attributes)
         | 
| 55 | 
            +
                    end.join
         | 
| 56 | 
            +
                  end
         | 
| 57 | 
            +
             | 
| 58 | 
            +
                  def inline_callout(node)
         | 
| 59 | 
            +
                    noko do |xml|
         | 
| 60 | 
            +
                      xml.ref node.text
         | 
| 61 | 
            +
                    end.join
         | 
| 62 | 
            +
                  end
         | 
| 63 | 
            +
                end
         | 
| 64 | 
            +
              end
         | 
| 65 | 
            +
            end
         | 
| @@ -0,0 +1,158 @@ | |
| 1 | 
            +
            require "pp"
         | 
| 2 | 
            +
            module Asciidoctor
         | 
| 3 | 
            +
              module ISO
         | 
| 4 | 
            +
                module Lists
         | 
| 5 | 
            +
                  def ulist(node)
         | 
| 6 | 
            +
                    return norm_ref(node) if $norm_ref
         | 
| 7 | 
            +
                    return biblio_ref(node) if $biblio
         | 
| 8 | 
            +
                    noko do |xml|
         | 
| 9 | 
            +
                      xml.ul **attr_code(anchor: node.id) do |xml_ul|
         | 
| 10 | 
            +
                        node.items.each do |item|
         | 
| 11 | 
            +
                          xml_ul.li **attr_code(anchor: item.id) do |xml_li|
         | 
| 12 | 
            +
                            if item.blocks?
         | 
| 13 | 
            +
                              xml_li.p { |t| t << item.text }
         | 
| 14 | 
            +
                              xml_li << item.content
         | 
| 15 | 
            +
                            else
         | 
| 16 | 
            +
                              xml_li.p { |p| p << item.text }
         | 
| 17 | 
            +
                            end
         | 
| 18 | 
            +
                          end
         | 
| 19 | 
            +
                        end
         | 
| 20 | 
            +
                      end
         | 
| 21 | 
            +
                    end.join
         | 
| 22 | 
            +
                  end
         | 
| 23 | 
            +
             | 
| 24 | 
            +
                  def isorefmatches(xml, matched)
         | 
| 25 | 
            +
                    ref_attributes = {
         | 
| 26 | 
            +
                      anchor: matched[:anchor],
         | 
| 27 | 
            +
                    }
         | 
| 28 | 
            +
                    xml.iso_ref_title **attr_code(ref_attributes) do |t|
         | 
| 29 | 
            +
                      t.isocode matched[:code]
         | 
| 30 | 
            +
                      t.isodate matched[:year] if matched[:year]
         | 
| 31 | 
            +
                      t.isotitle { |i| i << ref_normalise(matched[:text]) }
         | 
| 32 | 
            +
                    end
         | 
| 33 | 
            +
                  end
         | 
| 34 | 
            +
             | 
| 35 | 
            +
                  def isorefmatches2(xml, matched2)
         | 
| 36 | 
            +
                    ref_attributes = {
         | 
| 37 | 
            +
                      anchor: matched2[:anchor],
         | 
| 38 | 
            +
                    }
         | 
| 39 | 
            +
                    xml.iso_ref_title **attr_code(ref_attributes) do |t|
         | 
| 40 | 
            +
                      t.isocode matched2[:code]
         | 
| 41 | 
            +
                      t.isodate "--"
         | 
| 42 | 
            +
                      t.date_footnote matched2[:fn]
         | 
| 43 | 
            +
                      t.isotitle { |i| i << ref_normalise(matched2[:text]) }
         | 
| 44 | 
            +
                    end
         | 
| 45 | 
            +
                  end
         | 
| 46 | 
            +
             | 
| 47 | 
            +
                  def ref_normalise(ref)
         | 
| 48 | 
            +
                    ref.gsub(/ — /, " -- ").
         | 
| 49 | 
            +
                      gsub(/&amp;/, "&")
         | 
| 50 | 
            +
                  end
         | 
| 51 | 
            +
             | 
| 52 | 
            +
                  def norm_ref(node)
         | 
| 53 | 
            +
                    noko do |xml|
         | 
| 54 | 
            +
                      node.items.each do |item|
         | 
| 55 | 
            +
                        matched = %r{^<ref\sanchor="(?<anchor>[^"]+)">
         | 
| 56 | 
            +
                        \[ISO\s(?<code>[0-9-]+)(:(?<year>[0-9]+))?\]</ref>,?\s
         | 
| 57 | 
            +
                        (?<text>.*)$}x.match item.text
         | 
| 58 | 
            +
                        matched2 = %r{^<ref\sanchor="(?<anchor>[^"]+)">
         | 
| 59 | 
            +
                        \[ISO\s(?<code>[0-9-]+):--\]</ref>,?\s?
         | 
| 60 | 
            +
                        <fn>(?<fn>[^\]]+)</fn>,?\s?(?<text>.*)$}x.match item.text
         | 
| 61 | 
            +
                        if matched2.nil?
         | 
| 62 | 
            +
                          if matched.nil?
         | 
| 63 | 
            +
                            warn %(asciidoctor: WARNING (#{current_location(node)}): normative reference not in expected format: #{item.text})
         | 
| 64 | 
            +
                          else
         | 
| 65 | 
            +
                            isorefmatches(xml, matched)
         | 
| 66 | 
            +
                          end
         | 
| 67 | 
            +
                        else
         | 
| 68 | 
            +
                          isorefmatches2(xml, matched2)
         | 
| 69 | 
            +
                        end
         | 
| 70 | 
            +
                      end
         | 
| 71 | 
            +
                    end.join
         | 
| 72 | 
            +
                  end
         | 
| 73 | 
            +
             | 
| 74 | 
            +
                  def biblio_ref(node)
         | 
| 75 | 
            +
                    noko do |xml|
         | 
| 76 | 
            +
                      node.items.each do |item|
         | 
| 77 | 
            +
                        matched = %r{^<ref\sanchor="(?<anchor>[^"]+)">
         | 
| 78 | 
            +
                        \[ISO\s(?<code>[0-9-]+)(:(?<year>[0-9]+))?\]</ref>,?\s
         | 
| 79 | 
            +
                        (?<text>.*)$}.match item.text
         | 
| 80 | 
            +
                        matched2 = %r{^<ref\sanchor="(?<anchor>[^"]+)">
         | 
| 81 | 
            +
                        \[ISO\s(?<code>[0-9-]+):--\]</ref>,?\s?
         | 
| 82 | 
            +
                        <fn>(?<fn>[^\]]+)</fn>,?\s?(?<text>.*)$}.match item.text
         | 
| 83 | 
            +
                        if matched2.nil?
         | 
| 84 | 
            +
                          if matched.nil?
         | 
| 85 | 
            +
                            xml.reference do |t|
         | 
| 86 | 
            +
                              t.p { |p| p << ref_normalise(item.text) }
         | 
| 87 | 
            +
                            end
         | 
| 88 | 
            +
                          else
         | 
| 89 | 
            +
                            isorefmatches(xml, matched)
         | 
| 90 | 
            +
                          end
         | 
| 91 | 
            +
                        else
         | 
| 92 | 
            +
                          isorefmatches2(xml, matched2)
         | 
| 93 | 
            +
                        end
         | 
| 94 | 
            +
                      end
         | 
| 95 | 
            +
                    end.join
         | 
| 96 | 
            +
                  end
         | 
| 97 | 
            +
             | 
| 98 | 
            +
                  def olist(node)
         | 
| 99 | 
            +
                    noko do |xml|
         | 
| 100 | 
            +
                      xml.ol **attr_code(anchor: node.id, type: node.style) do |xml_ol|
         | 
| 101 | 
            +
                        node.items.each do |item|
         | 
| 102 | 
            +
                          xml_ol.li **attr_code(anchor: item.id) do |xml_li|
         | 
| 103 | 
            +
                            if item.blocks?
         | 
| 104 | 
            +
                              xml_li.p { |t| t << item.text }
         | 
| 105 | 
            +
                              xml_li << item.content
         | 
| 106 | 
            +
                            else
         | 
| 107 | 
            +
                              xml_li.p { |p| p << item.text }
         | 
| 108 | 
            +
                            end
         | 
| 109 | 
            +
                          end
         | 
| 110 | 
            +
                        end
         | 
| 111 | 
            +
                      end
         | 
| 112 | 
            +
                    end.join
         | 
| 113 | 
            +
                  end
         | 
| 114 | 
            +
             | 
| 115 | 
            +
                  def dlist(node)
         | 
| 116 | 
            +
                    noko do |xml|
         | 
| 117 | 
            +
                      xml.dl **attr_code(anchor: node.id) do |xml_dl|
         | 
| 118 | 
            +
                        node.items.each do |terms, dd|
         | 
| 119 | 
            +
                          terms.each_with_index do |dt, idx|
         | 
| 120 | 
            +
                            xml_dl.dt { |xml_dt| xml_dt << dt.text }
         | 
| 121 | 
            +
                            if idx < terms.size - 1
         | 
| 122 | 
            +
                              xml_dl.dd
         | 
| 123 | 
            +
                            end
         | 
| 124 | 
            +
                          end
         | 
| 125 | 
            +
             | 
| 126 | 
            +
                          if dd.nil?
         | 
| 127 | 
            +
                            xml_dl.dd
         | 
| 128 | 
            +
                          else
         | 
| 129 | 
            +
                            xml_dl.dd do |xml_dd|
         | 
| 130 | 
            +
                              if dd.blocks?
         | 
| 131 | 
            +
                                if dd.text?
         | 
| 132 | 
            +
                                  xml_dd.p { |t| t << dd.text }
         | 
| 133 | 
            +
                                end
         | 
| 134 | 
            +
                                xml_dd << dd.content
         | 
| 135 | 
            +
                              else
         | 
| 136 | 
            +
                                xml_dd.p { |t| t << dd.text }
         | 
| 137 | 
            +
                              end
         | 
| 138 | 
            +
                            end
         | 
| 139 | 
            +
                          end
         | 
| 140 | 
            +
                        end
         | 
| 141 | 
            +
                      end
         | 
| 142 | 
            +
                    end.join
         | 
| 143 | 
            +
                  end
         | 
| 144 | 
            +
             | 
| 145 | 
            +
                  def colist(node)
         | 
| 146 | 
            +
                    noko do |xml|
         | 
| 147 | 
            +
                      xml.colist **attr_code(anchor: node.id) do |xml_ul|
         | 
| 148 | 
            +
                        node.items.each_with_index do |item, i|
         | 
| 149 | 
            +
                          xml_ul.annotation **attr_code(id: i + 1) do |xml_li|
         | 
| 150 | 
            +
                            xml_li << item.text
         | 
| 151 | 
            +
                          end
         | 
| 152 | 
            +
                        end
         | 
| 153 | 
            +
                      end
         | 
| 154 | 
            +
                    end.join
         | 
| 155 | 
            +
                  end
         | 
| 156 | 
            +
                end
         | 
| 157 | 
            +
              end
         | 
| 158 | 
            +
            end
         | 
| @@ -0,0 +1,53 @@ | |
| 1 | 
            +
            module Asciidoctor
         | 
| 2 | 
            +
              module ISO
         | 
| 3 | 
            +
                module Table
         | 
| 4 | 
            +
                  def table(node)
         | 
| 5 | 
            +
                    noko do |xml|
         | 
| 6 | 
            +
                      has_body = false
         | 
| 7 | 
            +
                      xml.table **attr_code(anchor: node.id) do |xml_table|
         | 
| 8 | 
            +
                        %i(head body foot).reject do |tblsec|
         | 
| 9 | 
            +
                          node.rows[tblsec].empty?
         | 
| 10 | 
            +
                        end.each do |tblsec|
         | 
| 11 | 
            +
                          has_body = true if tblsec == :body
         | 
| 12 | 
            +
                        end
         | 
| 13 | 
            +
                        xml_table.name node.title if node.title?
         | 
| 14 | 
            +
                        table_head_body_and_foot node, xml_table
         | 
| 15 | 
            +
                      end
         | 
| 16 | 
            +
                    end
         | 
| 17 | 
            +
                  end
         | 
| 18 | 
            +
             | 
| 19 | 
            +
                  private
         | 
| 20 | 
            +
             | 
| 21 | 
            +
                  def table_head_body_and_foot(node, xml)
         | 
| 22 | 
            +
                    %i(head body foot).reject do |tblsec|
         | 
| 23 | 
            +
                      node.rows[tblsec].empty?
         | 
| 24 | 
            +
                    end.each do |tblsec|
         | 
| 25 | 
            +
                      tblsec_tag = "t#{tblsec}"
         | 
| 26 | 
            +
                      # "anchor" attribute from tblsec.id not supported
         | 
| 27 | 
            +
                      xml.send tblsec_tag do |xml_tblsec|
         | 
| 28 | 
            +
                        node.rows[tblsec].each_with_index do |row, i|
         | 
| 29 | 
            +
                          xml_tblsec.tr do |xml_tr|
         | 
| 30 | 
            +
                            rowlength = 0
         | 
| 31 | 
            +
                            row.each do |cell|
         | 
| 32 | 
            +
                              cell_attributes = {
         | 
| 33 | 
            +
                                anchor: cell.id,
         | 
| 34 | 
            +
                                colspan: cell.colspan,
         | 
| 35 | 
            +
                                rowspan: cell.rowspan,
         | 
| 36 | 
            +
                                align: cell.attr("halign"),
         | 
| 37 | 
            +
                              }
         | 
| 38 | 
            +
             | 
| 39 | 
            +
                              cell_tag = "td"
         | 
| 40 | 
            +
                              cell_tag = "th" if tblsec == :head || cell.style == :header
         | 
| 41 | 
            +
                              rowlength += cell.text.size
         | 
| 42 | 
            +
                              xml_tr.send cell_tag, **attr_code(cell_attributes) do |thd|
         | 
| 43 | 
            +
                                thd << (cell.style == :asciidoc ? cell.content : cell.text)
         | 
| 44 | 
            +
                              end
         | 
| 45 | 
            +
                            end
         | 
| 46 | 
            +
                          end
         | 
| 47 | 
            +
                        end
         | 
| 48 | 
            +
                      end
         | 
| 49 | 
            +
                    end
         | 
| 50 | 
            +
                  end
         | 
| 51 | 
            +
                end
         | 
| 52 | 
            +
              end
         | 
| 53 | 
            +
            end
         | 
| @@ -0,0 +1,224 @@ | |
| 1 | 
            +
            require "date"
         | 
| 2 | 
            +
            require "nokogiri"
         | 
| 3 | 
            +
            require "htmlentities"
         | 
| 4 | 
            +
            require "json"
         | 
| 5 | 
            +
            require "pathname"
         | 
| 6 | 
            +
            require "open-uri"
         | 
| 7 | 
            +
            require "pp"
         | 
| 8 | 
            +
             | 
| 9 | 
            +
            module Asciidoctor
         | 
| 10 | 
            +
              module ISO
         | 
| 11 | 
            +
                module Utils
         | 
| 12 | 
            +
                  def convert(node, transform = nil, opts = {})
         | 
| 13 | 
            +
                    transform ||= node.node_name
         | 
| 14 | 
            +
                    opts.empty? ? (send transform, node) : (send transform, node, opts)
         | 
| 15 | 
            +
                  end
         | 
| 16 | 
            +
             | 
| 17 | 
            +
                  def document_ns_attributes(_doc)
         | 
| 18 | 
            +
                    # ' xmlns="http://riboseinc.com/isoxml"'
         | 
| 19 | 
            +
                    nil
         | 
| 20 | 
            +
                  end
         | 
| 21 | 
            +
             | 
| 22 | 
            +
                  def cleanup(xmldoc)
         | 
| 23 | 
            +
                    intro_cleanup(xmldoc)
         | 
| 24 | 
            +
                    termdef_cleanup(xmldoc)
         | 
| 25 | 
            +
                    isotitle_cleanup(xmldoc)
         | 
| 26 | 
            +
                    tablenote_cleanup(xmldoc)
         | 
| 27 | 
            +
                    formula_cleanup(xmldoc)
         | 
| 28 | 
            +
                    figure_cleanup(xmldoc)
         | 
| 29 | 
            +
                    back_cleanup(xmldoc)
         | 
| 30 | 
            +
                    ref_cleanup(xmldoc)
         | 
| 31 | 
            +
                  end
         | 
| 32 | 
            +
             | 
| 33 | 
            +
                  def intro_cleanup(xmldoc)
         | 
| 34 | 
            +
                    intro = xmldoc.at("//introduction")
         | 
| 35 | 
            +
                    foreword = xmldoc.at("//foreword")
         | 
| 36 | 
            +
                    front = xmldoc.at("//front")
         | 
| 37 | 
            +
                    unless foreword.nil? || front.nil?
         | 
| 38 | 
            +
                      foreword.remove
         | 
| 39 | 
            +
                      front << foreword
         | 
| 40 | 
            +
                    end
         | 
| 41 | 
            +
                    unless intro.nil? || front.nil?
         | 
| 42 | 
            +
                      intro.remove
         | 
| 43 | 
            +
                      front << intro
         | 
| 44 | 
            +
                    end
         | 
| 45 | 
            +
                  end
         | 
| 46 | 
            +
             | 
| 47 | 
            +
                  def termdef_cleanup(xmldoc)
         | 
| 48 | 
            +
                    # release termdef tags from surrounding paras
         | 
| 49 | 
            +
                    nodes = xmldoc.xpath("//p/admitted_term | //p/termsymbol |
         | 
| 50 | 
            +
                                         //p/deprecated_term")
         | 
| 51 | 
            +
                    while !nodes.empty?
         | 
| 52 | 
            +
                      nodes[0].parent.replace(nodes[0].parent.children)
         | 
| 53 | 
            +
                      nodes = xmldoc.xpath("//p/admitted_term | //p/termsymbol |
         | 
| 54 | 
            +
                                           //p/deprecated_term")
         | 
| 55 | 
            +
                    end
         | 
| 56 | 
            +
                    xmldoc.xpath("//termdef/p/stem").each do |a|
         | 
| 57 | 
            +
                      if a.parent.elements.size == 1
         | 
| 58 | 
            +
                        # para containing just a stem expression
         | 
| 59 | 
            +
                        t = Nokogiri::XML::Element.new("termsymbol", xmldoc)
         | 
| 60 | 
            +
                        parent = a.parent
         | 
| 61 | 
            +
                        a.remove
         | 
| 62 | 
            +
                        t.children = a
         | 
| 63 | 
            +
                        parent.replace(t)
         | 
| 64 | 
            +
                      end
         | 
| 65 | 
            +
                    end
         | 
| 66 | 
            +
                    xmldoc.xpath("//p/termdomain").each do |a|
         | 
| 67 | 
            +
                      prev = a.parent.previous
         | 
| 68 | 
            +
                      a.remove
         | 
| 69 | 
            +
                      prev.next = a
         | 
| 70 | 
            +
                    end
         | 
| 71 | 
            +
                  end
         | 
| 72 | 
            +
             | 
| 73 | 
            +
                  def isotitle_cleanup(xmldoc)
         | 
| 74 | 
            +
                    # Remove italicised ISO titles
         | 
| 75 | 
            +
                    xmldoc.xpath("//isotitle").each do |a|
         | 
| 76 | 
            +
                      if a.elements.size == 1 && a.elements[0].name == "em"
         | 
| 77 | 
            +
                        a.children = a.elements[0].children
         | 
| 78 | 
            +
                      end
         | 
| 79 | 
            +
                    end
         | 
| 80 | 
            +
                  end
         | 
| 81 | 
            +
             | 
| 82 | 
            +
                  def tablenote_cleanup(xmldoc)
         | 
| 83 | 
            +
                    # move notes after table footer
         | 
| 84 | 
            +
                    xmldoc.xpath("//tfoot/tr/td/note | //tfoot/tr/th/note").each do |n|
         | 
| 85 | 
            +
                      target = n.parent.parent.parent.parent
         | 
| 86 | 
            +
                      n.remove
         | 
| 87 | 
            +
                      target << n
         | 
| 88 | 
            +
                    end
         | 
| 89 | 
            +
                  end
         | 
| 90 | 
            +
             | 
| 91 | 
            +
                  def formula_cleanup(xmldoc)
         | 
| 92 | 
            +
                    # include where definition list inside stem block
         | 
| 93 | 
            +
                    xmldoc.xpath("//formula").each do |s|
         | 
| 94 | 
            +
                      if !s.next_element.nil? && s.next_element.name == "p" &&
         | 
| 95 | 
            +
                          s.next_element.content == "where" &&
         | 
| 96 | 
            +
                          !s.next_element.next_element.nil? &&
         | 
| 97 | 
            +
                          s.next_element.next_element.name == "dl"
         | 
| 98 | 
            +
                        dl = s.next_element.next_element.remove
         | 
| 99 | 
            +
                        s.next_element.remove
         | 
| 100 | 
            +
                        s << dl
         | 
| 101 | 
            +
                      end
         | 
| 102 | 
            +
                    end
         | 
| 103 | 
            +
                  end
         | 
| 104 | 
            +
             | 
| 105 | 
            +
                  def figure_cleanup(xmldoc)
         | 
| 106 | 
            +
                    # include key definition list inside figure
         | 
| 107 | 
            +
                    xmldoc.xpath("//figure").each do |s|
         | 
| 108 | 
            +
                      if !s.next_element.nil? && s.next_element.name == "p" &&
         | 
| 109 | 
            +
                          s.next_element.content =~ /^\s*Key\s*$/m &&
         | 
| 110 | 
            +
                          !s.next_element.next_element.nil? &&
         | 
| 111 | 
            +
                          s.next_element.next_element.name == "dl"
         | 
| 112 | 
            +
                        dl = s.next_element.next_element.remove
         | 
| 113 | 
            +
                        s.next_element.remove
         | 
| 114 | 
            +
                        s << dl
         | 
| 115 | 
            +
                      end
         | 
| 116 | 
            +
                    end
         | 
| 117 | 
            +
             | 
| 118 | 
            +
                    # examples containing only figures become subfigures of figures
         | 
| 119 | 
            +
                    nodes = xmldoc.xpath("//example/figure")
         | 
| 120 | 
            +
                    while !nodes.empty?
         | 
| 121 | 
            +
                      nodes[0].parent.name = "figure"
         | 
| 122 | 
            +
                      nodes = xmldoc.xpath("//example/figure")
         | 
| 123 | 
            +
                    end
         | 
| 124 | 
            +
                  end
         | 
| 125 | 
            +
             | 
| 126 | 
            +
                  def back_cleanup(xmldoc)
         | 
| 127 | 
            +
                    # move annex/bibliography to back
         | 
| 128 | 
            +
                    if !xmldoc.xpath("//annex | //bibliography").empty?
         | 
| 129 | 
            +
                      b = Nokogiri::XML::Element.new("back", xmldoc)
         | 
| 130 | 
            +
                      xmldoc.root << b
         | 
| 131 | 
            +
                      xmldoc.xpath("//annex").each do |e|
         | 
| 132 | 
            +
                        e.remove
         | 
| 133 | 
            +
                        b << e
         | 
| 134 | 
            +
                      end
         | 
| 135 | 
            +
                      xmldoc.xpath("//bibliography").each do |e|
         | 
| 136 | 
            +
                        e.remove
         | 
| 137 | 
            +
                        b << e
         | 
| 138 | 
            +
                      end
         | 
| 139 | 
            +
                    end
         | 
| 140 | 
            +
                  end
         | 
| 141 | 
            +
             | 
| 142 | 
            +
                  def ref_cleanup(xmldoc)
         | 
| 143 | 
            +
                    # move ref before p
         | 
| 144 | 
            +
                    xmldoc.xpath("//p/ref").each do |r|
         | 
| 145 | 
            +
                      parent = r.parent
         | 
| 146 | 
            +
                      r.remove
         | 
| 147 | 
            +
                      parent.previous = r
         | 
| 148 | 
            +
                    end
         | 
| 149 | 
            +
             | 
| 150 | 
            +
                    xmldoc
         | 
| 151 | 
            +
                  end
         | 
| 152 | 
            +
             | 
| 153 | 
            +
                  # block for processing XML document fragments as XHTML,
         | 
| 154 | 
            +
                  # to allow for HTMLentities
         | 
| 155 | 
            +
                  def noko(&block)
         | 
| 156 | 
            +
                    # fragment = ::Nokogiri::XML::DocumentFragment.parse("")
         | 
| 157 | 
            +
                    # fragment.doc.create_internal_subset("xml", nil, "xhtml.dtd")
         | 
| 158 | 
            +
                    head = <<HERE
         | 
| 159 | 
            +
                    <!DOCTYPE html SYSTEM
         | 
| 160 | 
            +
                    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
         | 
| 161 | 
            +
                    <html xmlns="http://www.w3.org/1999/xhtml">
         | 
| 162 | 
            +
                    <head> <title></title> <meta charset="UTF-8" /> </head>
         | 
| 163 | 
            +
                    <body> </body> </html>
         | 
| 164 | 
            +
            HERE
         | 
| 165 | 
            +
                    doc = ::Nokogiri::XML.parse(head)
         | 
| 166 | 
            +
                    fragment = doc.fragment("")
         | 
| 167 | 
            +
                    ::Nokogiri::XML::Builder.with fragment, &block
         | 
| 168 | 
            +
                    fragment.to_xml(encoding: "US-ASCII").lines.map do |l|
         | 
| 169 | 
            +
                      l.gsub(/\s*\n/, "")
         | 
| 170 | 
            +
                    end
         | 
| 171 | 
            +
                  end
         | 
| 172 | 
            +
             | 
| 173 | 
            +
                  def attr_code(attributes)
         | 
| 174 | 
            +
                    attributes = attributes.reject { |_, val| val.nil? }.map
         | 
| 175 | 
            +
                    attributes.map do |k, v|
         | 
| 176 | 
            +
                      [k, (v.is_a? String) ? HTMLEntities.new.decode(v) : v]
         | 
| 177 | 
            +
                    end.to_h
         | 
| 178 | 
            +
                  end
         | 
| 179 | 
            +
             | 
| 180 | 
            +
                  def current_location(node)
         | 
| 181 | 
            +
                    if node.respond_to?(:lineno) && !node.lineno.nil? &&
         | 
| 182 | 
            +
                        !node.lineno.empty?
         | 
| 183 | 
            +
                      return "Line #{node.lineno}"
         | 
| 184 | 
            +
                    end
         | 
| 185 | 
            +
                    if node.respond_to?(:id) && !node.id.nil?
         | 
| 186 | 
            +
                      return "ID #{node.id}"
         | 
| 187 | 
            +
                    end
         | 
| 188 | 
            +
                    while !node.nil? && (!node.respond_to?(:level) ||
         | 
| 189 | 
            +
                        node.level.positive?) && node.context != :section
         | 
| 190 | 
            +
                      node = node.parent
         | 
| 191 | 
            +
                      if !node.nil? && node.context == :section
         | 
| 192 | 
            +
                        return "Section: #{node.title}"
         | 
| 193 | 
            +
                      end
         | 
| 194 | 
            +
                    end
         | 
| 195 | 
            +
                    "??"
         | 
| 196 | 
            +
                  end
         | 
| 197 | 
            +
             | 
| 198 | 
            +
                  # if node contains blocks, flatten them into a single line;
         | 
| 199 | 
            +
                  # and extract only raw text
         | 
| 200 | 
            +
                  def flatten_rawtext(node)
         | 
| 201 | 
            +
                    result = []
         | 
| 202 | 
            +
                    if node.respond_to?(:blocks) && node.blocks?
         | 
| 203 | 
            +
                      node.blocks.each { |b| result << flatten_rawtext(b) }
         | 
| 204 | 
            +
                    elsif node.respond_to?(:lines)
         | 
| 205 | 
            +
                      node.lines.each do |x|
         | 
| 206 | 
            +
                        if node.respond_to?(:context) && (node.context == :literal ||
         | 
| 207 | 
            +
                            node.context == :listing)
         | 
| 208 | 
            +
                          result << x.gsub(/</, "<").gsub(/>/, ">")
         | 
| 209 | 
            +
                        else
         | 
| 210 | 
            +
                          # strip not only HTML tags <tag>,
         | 
| 211 | 
            +
                          # but also Asciidoc crossreferences <<xref>>
         | 
| 212 | 
            +
                          result << x.gsub(/<[^>]*>+/, "")
         | 
| 213 | 
            +
                        end
         | 
| 214 | 
            +
                      end
         | 
| 215 | 
            +
                    elsif node.respond_to?(:text)
         | 
| 216 | 
            +
                      result << node.text.gsub(/<[^>]*>+/, "")
         | 
| 217 | 
            +
                    else
         | 
| 218 | 
            +
                      result << node.content.gsub(/<[^>]*>+/, "")
         | 
| 219 | 
            +
                    end
         | 
| 220 | 
            +
                    result.reject(&:empty?)
         | 
| 221 | 
            +
                  end
         | 
| 222 | 
            +
                end
         | 
| 223 | 
            +
              end
         | 
| 224 | 
            +
            end
         |