relaton-iec 1.7.6 → 1.9.0
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 +4 -4
- data/.github/workflows/rake.yml +36 -0
- data/.rubocop.yml +1 -1
- data/README.adoc +25 -0
- data/grammars/basicdoc.rng +165 -20
- data/grammars/biblio.rng +5 -6
- data/grammars/iec.rng +96 -1
- data/grammars/isodoc.rng +532 -16
- data/grammars/isostandard.rng +56 -103
- data/grammars/reqt.rng +31 -2
- data/lib/relaton_iec/basic_block/alignment.rb +30 -0
- data/lib/relaton_iec/basic_block/basic_block.rb +15 -0
- data/lib/relaton_iec/basic_block/citation_type.rb +32 -0
- data/lib/relaton_iec/basic_block/dl.rb +60 -0
- data/lib/relaton_iec/basic_block/eref.rb +10 -0
- data/lib/relaton_iec/basic_block/eref_type.rb +39 -0
- data/lib/relaton_iec/basic_block/formula.rb +34 -0
- data/lib/relaton_iec/basic_block/image.rb +41 -0
- data/lib/relaton_iec/basic_block/index.rb +27 -0
- data/lib/relaton_iec/basic_block/index_xref.rb +31 -0
- data/lib/relaton_iec/basic_block/note.rb +21 -0
- data/lib/relaton_iec/basic_block/paragraph.rb +27 -0
- data/lib/relaton_iec/basic_block/paragraph_with_footnote.rb +29 -0
- data/lib/relaton_iec/basic_block/reference_format.rb +38 -0
- data/lib/relaton_iec/basic_block/stem.rb +30 -0
- data/lib/relaton_iec/basic_block/table.rb +115 -0
- data/lib/relaton_iec/basic_block/text_element.rb +27 -0
- data/lib/relaton_iec/hash_converter.rb +1 -1
- data/lib/relaton_iec/hit_collection.rb +1 -1
- data/lib/relaton_iec/iec_bibliographic_item.rb +93 -1
- data/lib/relaton_iec/iec_bibliography.rb +6 -5
- data/lib/relaton_iec/processor.rb +1 -2
- data/lib/relaton_iec/scrapper.rb +10 -13
- data/lib/relaton_iec/tc_sc_officers_note.rb +24 -0
- data/lib/relaton_iec/version.rb +1 -1
- data/lib/relaton_iec/xml_parser.rb +21 -1
- data/relaton_iec.gemspec +2 -4
- metadata +25 -37
- data/.github/workflows/macos.yml +0 -34
- data/.github/workflows/ubuntu.yml +0 -33
- data/.github/workflows/windows.yml +0 -35
| @@ -0,0 +1,39 @@ | |
| 1 | 
            +
            module RelatonIec
         | 
| 2 | 
            +
              class ErefType < RelatonIec::CitationType
         | 
| 3 | 
            +
                # @return [String]
         | 
| 4 | 
            +
                attr_reader :citeas
         | 
| 5 | 
            +
             | 
| 6 | 
            +
                # @return [RelatonIec::ReferenceFormat]
         | 
| 7 | 
            +
                attr_reader :type
         | 
| 8 | 
            +
             | 
| 9 | 
            +
                # @return [Boolean, nil]
         | 
| 10 | 
            +
                attr_reader :normative
         | 
| 11 | 
            +
             | 
| 12 | 
            +
                # @return [String, nil]
         | 
| 13 | 
            +
                attr_reader :alt
         | 
| 14 | 
            +
             | 
| 15 | 
            +
                # @param [String] citeas
         | 
| 16 | 
            +
                # @param [RelatonIec::ReferenceFormat] type
         | 
| 17 | 
            +
                # @param [Hash] args
         | 
| 18 | 
            +
                # @option args [Boolean, nil] :normative
         | 
| 19 | 
            +
                # @option args [String, nil] :alt
         | 
| 20 | 
            +
                def initialize(citeas:, type:, bibitemid:, locality:, **args)
         | 
| 21 | 
            +
                  super bibitemid, locality, args[:date]
         | 
| 22 | 
            +
                  @citeas = citeas
         | 
| 23 | 
            +
                  @type = type
         | 
| 24 | 
            +
                  @normative = args[:normative]
         | 
| 25 | 
            +
                  @alt = args[:alt]
         | 
| 26 | 
            +
                end
         | 
| 27 | 
            +
             | 
| 28 | 
            +
                #
         | 
| 29 | 
            +
                # @param [Nokogiri::XML::Builder] builder <description>
         | 
| 30 | 
            +
                #
         | 
| 31 | 
            +
                def to_xml(builder) # rubocop:disable Metrics/AbcSize
         | 
| 32 | 
            +
                  builder.parent[:normative] = normative unless normative.nil?
         | 
| 33 | 
            +
                  builder.parent[:citeas] = citeas
         | 
| 34 | 
            +
                  builder.parent[:type] = type
         | 
| 35 | 
            +
                  builder.parent[:alt] = alt if alt
         | 
| 36 | 
            +
                  super
         | 
| 37 | 
            +
                end
         | 
| 38 | 
            +
              end
         | 
| 39 | 
            +
            end
         | 
| @@ -0,0 +1,34 @@ | |
| 1 | 
            +
            module BasicBlock
         | 
| 2 | 
            +
              class Formula
         | 
| 3 | 
            +
                #
         | 
| 4 | 
            +
                # @param [String] id
         | 
| 5 | 
            +
                # @param [BasicBlock::Stem] content
         | 
| 6 | 
            +
                # @param [Array<BasicBlock::Note>] note
         | 
| 7 | 
            +
                # @param [Hash] args
         | 
| 8 | 
            +
                # @option args [Boolean, nil] :unnumbered
         | 
| 9 | 
            +
                # @option args [String, nil] :subsequence
         | 
| 10 | 
            +
                # @option args [Boolean, nil] :inequality
         | 
| 11 | 
            +
                # @option args [BasicBlock::Dl, nil] :dl
         | 
| 12 | 
            +
                #
         | 
| 13 | 
            +
                def initialize(id:, content:, note:, **args)
         | 
| 14 | 
            +
                  @id = id
         | 
| 15 | 
            +
                  @content = content
         | 
| 16 | 
            +
                  @note = note
         | 
| 17 | 
            +
                  @unnumbered = args[:unnumbered]
         | 
| 18 | 
            +
                end
         | 
| 19 | 
            +
             | 
| 20 | 
            +
                #
         | 
| 21 | 
            +
                # @param [Builder] builder
         | 
| 22 | 
            +
                #
         | 
| 23 | 
            +
                def to_xml(builder) # rubocop:disable Metrics/CyclomaticComplexity
         | 
| 24 | 
            +
                  f = builder.formula id: @id do |b|
         | 
| 25 | 
            +
                    @content.to_xml b
         | 
| 26 | 
            +
                    @dl&.each { |d| d.to_xml b }
         | 
| 27 | 
            +
                    @note.each { |n| n.to_xml b }
         | 
| 28 | 
            +
                  end
         | 
| 29 | 
            +
                  f[:unnumbered] = @unnumbered if @unnumbered
         | 
| 30 | 
            +
                  f[:subsequence] = @subsequence if @subsequence
         | 
| 31 | 
            +
                  f[:inequality] = @inequality if @ineainequality
         | 
| 32 | 
            +
                end
         | 
| 33 | 
            +
              end
         | 
| 34 | 
            +
            end
         | 
| @@ -0,0 +1,41 @@ | |
| 1 | 
            +
            module BasicBlock
         | 
| 2 | 
            +
              class Image
         | 
| 3 | 
            +
                #
         | 
| 4 | 
            +
                # @param [String] id
         | 
| 5 | 
            +
                # @param [String] src
         | 
| 6 | 
            +
                # @param [String] mimetype
         | 
| 7 | 
            +
                # @param [Hash] args
         | 
| 8 | 
            +
                # @option args [String] :filename
         | 
| 9 | 
            +
                #
         | 
| 10 | 
            +
                def initialize(id:, src:, mimetype:, **args) # rubocop:disable Metrics/AbcSize,Metrics/CyclomaticComplexity,Metrics/MethodLength
         | 
| 11 | 
            +
                  @id = id
         | 
| 12 | 
            +
                  @src = src
         | 
| 13 | 
            +
                  @mimetype = mimetype
         | 
| 14 | 
            +
                  @filename = args[:filename]
         | 
| 15 | 
            +
                  if args[:width] && !args[:width].is_a?(Integer) && args[:width] != "auto"
         | 
| 16 | 
            +
                    warn "[basic-block] WARNING: invalid image width attribute \"#{args[:width]}"
         | 
| 17 | 
            +
                    warn "[basic-block] image width should be integer or \"auto\""
         | 
| 18 | 
            +
                  end
         | 
| 19 | 
            +
                  if args[:height] && !args[:height].is_a?(Integer) && args[:height] != "auto"
         | 
| 20 | 
            +
                    warn "[basic-block] WARNING: invalid image height attribute \"#{args[:height]}"
         | 
| 21 | 
            +
                    warn "[basic-block] image height should be integer or \"auto\""
         | 
| 22 | 
            +
                  end
         | 
| 23 | 
            +
                  @width = args[:width]
         | 
| 24 | 
            +
                  @height = args[:height]
         | 
| 25 | 
            +
                  @alt = args[:alt]
         | 
| 26 | 
            +
                  @title = args[:title]
         | 
| 27 | 
            +
                  @longdesc = args[:longdesc]
         | 
| 28 | 
            +
                end
         | 
| 29 | 
            +
             | 
| 30 | 
            +
                # @param [Nokogiri::XML::Builder]
         | 
| 31 | 
            +
                def to_xml(builder) # rubocop:disable Metrics/CyclomaticComplexity
         | 
| 32 | 
            +
                  img = builder.image id: @id, src: @src, mimetype: @mimetype
         | 
| 33 | 
            +
                  img[:filename] = @filename if @filename
         | 
| 34 | 
            +
                  img[:width] = @width if @width
         | 
| 35 | 
            +
                  img[:height] = @height if @height
         | 
| 36 | 
            +
                  img[:alt] = @alt if @alt
         | 
| 37 | 
            +
                  img[:title] = @title if @title
         | 
| 38 | 
            +
                  img[:longdesc] = @longdesc if @longdesc
         | 
| 39 | 
            +
                end
         | 
| 40 | 
            +
              end
         | 
| 41 | 
            +
            end
         | 
| @@ -0,0 +1,27 @@ | |
| 1 | 
            +
            module BasicBlock
         | 
| 2 | 
            +
              class Index
         | 
| 3 | 
            +
                #
         | 
| 4 | 
            +
                # @param [Array<BasicBlock::TextElement] primary
         | 
| 5 | 
            +
                # @param [Hash] args
         | 
| 6 | 
            +
                # @option args [String, nil] :to
         | 
| 7 | 
            +
                # @option args [Array<BasicBlock::TextElement>, nil] :secondary
         | 
| 8 | 
            +
                # @option args [Array<BasicBlock::TextElement>, nil] :tertiary
         | 
| 9 | 
            +
                #
         | 
| 10 | 
            +
                def initialize(primary:, **args)
         | 
| 11 | 
            +
                  @to = args[:to]
         | 
| 12 | 
            +
                  @primary = primary
         | 
| 13 | 
            +
                  @secondary = args[:secondary]
         | 
| 14 | 
            +
                  @tertiary = args[:tertiary]
         | 
| 15 | 
            +
                end
         | 
| 16 | 
            +
             | 
| 17 | 
            +
                # @param [Nokogiri::XML::Builder] builder
         | 
| 18 | 
            +
                def to_xml(builder) # rubocop:disable Metrics/CyclomaticComplexity
         | 
| 19 | 
            +
                  idx = builder.index do |b|
         | 
| 20 | 
            +
                    @primary.each { |p| p.to_xml b }
         | 
| 21 | 
            +
                    @secondary&.each { |s| s.to_xml b }
         | 
| 22 | 
            +
                    @tertiary&.each { |t| t.to_xml b }
         | 
| 23 | 
            +
                  end
         | 
| 24 | 
            +
                  idx[:to] = @to if @to
         | 
| 25 | 
            +
                end
         | 
| 26 | 
            +
              end
         | 
| 27 | 
            +
            end
         | 
| @@ -0,0 +1,31 @@ | |
| 1 | 
            +
            module BasicBlock
         | 
| 2 | 
            +
              class IndexXref
         | 
| 3 | 
            +
                #
         | 
| 4 | 
            +
                # @param [Boolean] also
         | 
| 5 | 
            +
                # @param [Array<BasicBlock::TextElement>] primary
         | 
| 6 | 
            +
                # @param [Array<BasicBlock::TextElement>] target
         | 
| 7 | 
            +
                # @param [Hash] args
         | 
| 8 | 
            +
                # @option args [Array<BasicBlock::TextElement>, nil] secondary
         | 
| 9 | 
            +
                # @option args [Array<BasicBlock::TextElement>, nil] tertiary
         | 
| 10 | 
            +
                #
         | 
| 11 | 
            +
                def initialize(also:, primary:, target:, **args)
         | 
| 12 | 
            +
                  @also = also
         | 
| 13 | 
            +
                  @primary = primary
         | 
| 14 | 
            +
                  @target = target
         | 
| 15 | 
            +
                  @secondary = args[:secondary]
         | 
| 16 | 
            +
                  @tertiary = args[:tertiary]
         | 
| 17 | 
            +
                end
         | 
| 18 | 
            +
             | 
| 19 | 
            +
                #
         | 
| 20 | 
            +
                # @param [Nokogiri::XML::Builder] builder
         | 
| 21 | 
            +
                #
         | 
| 22 | 
            +
                def to_xml(builder) # rubocop:disable Metrics/CyclomaticComplexity
         | 
| 23 | 
            +
                  builder.send "index-xref", also: @also do |b|
         | 
| 24 | 
            +
                    @primary.each { |p| p.to_xml b }
         | 
| 25 | 
            +
                    @secondary&.each { |s| s.to_xml b }
         | 
| 26 | 
            +
                    @tertiary&.each { |t| t.to_xml b }
         | 
| 27 | 
            +
                    @target.each { |t| t.to_xml b }
         | 
| 28 | 
            +
                  end
         | 
| 29 | 
            +
                end
         | 
| 30 | 
            +
              end
         | 
| 31 | 
            +
            end
         | 
| @@ -0,0 +1,21 @@ | |
| 1 | 
            +
            module BasicBlock
         | 
| 2 | 
            +
              class Note
         | 
| 3 | 
            +
                #
         | 
| 4 | 
            +
                # @param [String] id
         | 
| 5 | 
            +
                # @param [Array<BasicBlock::Paragraph>] content
         | 
| 6 | 
            +
                #
         | 
| 7 | 
            +
                def initialize(id:, content:)
         | 
| 8 | 
            +
                  @id = id
         | 
| 9 | 
            +
                  @contain = content
         | 
| 10 | 
            +
                end
         | 
| 11 | 
            +
             | 
| 12 | 
            +
                #
         | 
| 13 | 
            +
                # @param [Nokogiei::XMO::Builder] builder
         | 
| 14 | 
            +
                #
         | 
| 15 | 
            +
                def to_xml(builder)
         | 
| 16 | 
            +
                  builder.note id: @id do |b|
         | 
| 17 | 
            +
                    @content.each { |c| c.to_xm b }
         | 
| 18 | 
            +
                  end
         | 
| 19 | 
            +
                end
         | 
| 20 | 
            +
              end
         | 
| 21 | 
            +
            end
         | 
| @@ -0,0 +1,27 @@ | |
| 1 | 
            +
            module BasicBlock
         | 
| 2 | 
            +
              class Paragraph
         | 
| 3 | 
            +
                #
         | 
| 4 | 
            +
                # @param [String] id
         | 
| 5 | 
            +
                # @param [Array<BasicBlock::TextElement>] content
         | 
| 6 | 
            +
                # @param [Array<BasicBlock::Note>] note
         | 
| 7 | 
            +
                # @param [BasicBlock::Alignment, nil] align
         | 
| 8 | 
            +
                #
         | 
| 9 | 
            +
                def initialize(id:, content:, note:, align: nil)
         | 
| 10 | 
            +
                  @id = id
         | 
| 11 | 
            +
                  @content = content
         | 
| 12 | 
            +
                  @note = note
         | 
| 13 | 
            +
                  @align = align
         | 
| 14 | 
            +
                end
         | 
| 15 | 
            +
              end
         | 
| 16 | 
            +
             | 
| 17 | 
            +
              #
         | 
| 18 | 
            +
              # @param [Nokogiri::XML::Builder] builder
         | 
| 19 | 
            +
              #
         | 
| 20 | 
            +
              def to_xml(builder)
         | 
| 21 | 
            +
                p = builder.p id: @id do |b|
         | 
| 22 | 
            +
                  @content.each { |c| c.to_xml b }
         | 
| 23 | 
            +
                  @note.each { |n| n.to_xml b }
         | 
| 24 | 
            +
                end
         | 
| 25 | 
            +
                p[:align] = @align if @align
         | 
| 26 | 
            +
              end
         | 
| 27 | 
            +
            end
         | 
| @@ -0,0 +1,29 @@ | |
| 1 | 
            +
            module BasicBlock
         | 
| 2 | 
            +
              class ParagraphWithFootnote
         | 
| 3 | 
            +
                #
         | 
| 4 | 
            +
                # @param [String] id
         | 
| 5 | 
            +
                # @param [Hash] args
         | 
| 6 | 
            +
                # @param [BasicBlock::Alignment, nil] align
         | 
| 7 | 
            +
                # @param [Array<BasicBlock::TextElement, BasicBlock::Eref, BasicBlock::Stem,
         | 
| 8 | 
            +
                #   BasicBlock::Image, BasicBlock::Index, BasicBlock::IndexXref>] content
         | 
| 9 | 
            +
                # @param [Array<RelatonIec::Note>] note
         | 
| 10 | 
            +
                #
         | 
| 11 | 
            +
                def initialize(id:, align: nil, content: [], note: [])
         | 
| 12 | 
            +
                  @id = id
         | 
| 13 | 
            +
                  @aligments = align
         | 
| 14 | 
            +
                  @content = content
         | 
| 15 | 
            +
                  @note = note
         | 
| 16 | 
            +
                end
         | 
| 17 | 
            +
             | 
| 18 | 
            +
                #
         | 
| 19 | 
            +
                # @param [Nokogiri::XML::Builder] builder
         | 
| 20 | 
            +
                #
         | 
| 21 | 
            +
                def to_xml(builder)
         | 
| 22 | 
            +
                  elm = builder.p(@id) do |b|
         | 
| 23 | 
            +
                    @content.each { |te| te.to_xml b }
         | 
| 24 | 
            +
                    @note.each { |n| n.to_xml b }
         | 
| 25 | 
            +
                  end
         | 
| 26 | 
            +
                  elm[:align] = @align if @align
         | 
| 27 | 
            +
                end
         | 
| 28 | 
            +
              end
         | 
| 29 | 
            +
            end
         | 
| @@ -0,0 +1,38 @@ | |
| 1 | 
            +
            module RelatonIec
         | 
| 2 | 
            +
              def self.respond_to_missing?(method, _include_private)
         | 
| 3 | 
            +
                method == "ReferenceFormat"
         | 
| 4 | 
            +
              end
         | 
| 5 | 
            +
             | 
| 6 | 
            +
              def self.method_missing(_method, *args)
         | 
| 7 | 
            +
                ReferenceFormat.new *args
         | 
| 8 | 
            +
              end
         | 
| 9 | 
            +
             | 
| 10 | 
            +
              class ReferenceFormat
         | 
| 11 | 
            +
                FORMATS = %w[external inline footnote callout].freeze
         | 
| 12 | 
            +
             | 
| 13 | 
            +
                #
         | 
| 14 | 
            +
                # @param [String] format
         | 
| 15 | 
            +
                #
         | 
| 16 | 
            +
                def initialize(format)
         | 
| 17 | 
            +
                  unless FORMATS.include? format
         | 
| 18 | 
            +
                    warn "[relaton-iec] WARNING: invalid reference format \"#{format}\""
         | 
| 19 | 
            +
                    warn "[relaton-iec] alloved reference formats are: #{FORMATS.join ', '}"
         | 
| 20 | 
            +
                  end
         | 
| 21 | 
            +
                  @format = format
         | 
| 22 | 
            +
                end
         | 
| 23 | 
            +
             | 
| 24 | 
            +
                #
         | 
| 25 | 
            +
                # @return [String]
         | 
| 26 | 
            +
                #
         | 
| 27 | 
            +
                def to_s
         | 
| 28 | 
            +
                  @format
         | 
| 29 | 
            +
                end
         | 
| 30 | 
            +
             | 
| 31 | 
            +
                #
         | 
| 32 | 
            +
                # @return [Sting] <description>
         | 
| 33 | 
            +
                #
         | 
| 34 | 
            +
                def inspect
         | 
| 35 | 
            +
                  to_s
         | 
| 36 | 
            +
                end
         | 
| 37 | 
            +
              end
         | 
| 38 | 
            +
            end
         | 
| @@ -0,0 +1,30 @@ | |
| 1 | 
            +
            module BasicBlock
         | 
| 2 | 
            +
              class Stem
         | 
| 3 | 
            +
                TYPES = %w[MathML AsciiMath].freeze
         | 
| 4 | 
            +
             | 
| 5 | 
            +
                # @return [String]
         | 
| 6 | 
            +
                attr_reader :type
         | 
| 7 | 
            +
             | 
| 8 | 
            +
                #
         | 
| 9 | 
            +
                # @param [String] type
         | 
| 10 | 
            +
                # @param [Array<#to_xml>] content any element
         | 
| 11 | 
            +
                #
         | 
| 12 | 
            +
                def initialize(type:, content: [])
         | 
| 13 | 
            +
                  unless TYPES.include? type
         | 
| 14 | 
            +
                    warn "[relaton-iec] WARNING: invalud type \"#{type}\""
         | 
| 15 | 
            +
                    warn "[relaton-iec] allowed types are: #{TYPES.join ', '}"
         | 
| 16 | 
            +
                  end
         | 
| 17 | 
            +
                  @type = type
         | 
| 18 | 
            +
                  @content = content
         | 
| 19 | 
            +
                end
         | 
| 20 | 
            +
             | 
| 21 | 
            +
                #
         | 
| 22 | 
            +
                # @param [Nokogiri::XML::Builder] builder
         | 
| 23 | 
            +
                #
         | 
| 24 | 
            +
                def to_xml(builder)
         | 
| 25 | 
            +
                  builder.stem(type) do |b|
         | 
| 26 | 
            +
                    content.each { |c| c.to_xml b }
         | 
| 27 | 
            +
                  end
         | 
| 28 | 
            +
                end
         | 
| 29 | 
            +
              end
         | 
| 30 | 
            +
            end
         | 
| @@ -0,0 +1,115 @@ | |
| 1 | 
            +
            module BasicBlock
         | 
| 2 | 
            +
              class Table
         | 
| 3 | 
            +
                #
         | 
| 4 | 
            +
                # @param [String] id
         | 
| 5 | 
            +
                # @param [Array<BasicBlock::Tr>] tbody
         | 
| 6 | 
            +
                # @param [Array<BasicBlock::Paragraph>] note
         | 
| 7 | 
            +
                # @param [Hash] args
         | 
| 8 | 
            +
                # @option args [Boolean, nil] :unnumbered
         | 
| 9 | 
            +
                # @option args [String, nil] :subsequence
         | 
| 10 | 
            +
                # @option args [String, nil] :alt
         | 
| 11 | 
            +
                # @option args [String, nil] :summary
         | 
| 12 | 
            +
                # @option args [String, nil] :uri
         | 
| 13 | 
            +
                # @option args [BasicBlock::TextElement, nil] :tname
         | 
| 14 | 
            +
                # @option args [BasicBlock::Table::Tr, nil] :thead
         | 
| 15 | 
            +
                # @option args [BasicBlock::TextElement, nil] :tfoot
         | 
| 16 | 
            +
                # @option args [BasicBlock::Dl, nil] :dl
         | 
| 17 | 
            +
                #
         | 
| 18 | 
            +
                def initialize(id:, tbody:, note:, **args) # rubocop:disable Metrics/MethodLength
         | 
| 19 | 
            +
                  @id = id
         | 
| 20 | 
            +
                  @unnumbered = args[:unnumbered]
         | 
| 21 | 
            +
                  @subsequence = args[:subsequence]
         | 
| 22 | 
            +
                  @alt = args[:alt]
         | 
| 23 | 
            +
                  @summary = args[:summary]
         | 
| 24 | 
            +
                  @uri = args[:uri]
         | 
| 25 | 
            +
                  @tname = args[:tname]
         | 
| 26 | 
            +
                  @thead = args[:thead]
         | 
| 27 | 
            +
                  @tbody = tbody
         | 
| 28 | 
            +
                  @tfoot = args[:tfoot]
         | 
| 29 | 
            +
                  @note = note
         | 
| 30 | 
            +
                  @dl = args[:dl]
         | 
| 31 | 
            +
                end
         | 
| 32 | 
            +
             | 
| 33 | 
            +
                # @param [Nokogiri::XML::Builder] builder
         | 
| 34 | 
            +
                def to_xml(builder) # rubocop:disable Metrics/AbcSize,Metrics/CyclomaticComplexity,Metrics/MethodLength,Metrics/PerceivedComplexity
         | 
| 35 | 
            +
                  tab = builder.table id: @id do |b|
         | 
| 36 | 
            +
                    b.name { @tname.to_xml b } if @tname
         | 
| 37 | 
            +
                    b.thead { @thead.to_xml b } if @thead
         | 
| 38 | 
            +
                    @tbody.each { |tb| tb.to_xml b }
         | 
| 39 | 
            +
                    b.name { @tfoot.to_xml b } if @tfoot
         | 
| 40 | 
            +
                    @note.each { |n| b.note { n.to_xml b } }
         | 
| 41 | 
            +
                    @dl.to_xml b
         | 
| 42 | 
            +
                  end
         | 
| 43 | 
            +
                  tab[:unnumbered] = @unnumbered if @unnumbered
         | 
| 44 | 
            +
                  tab[:subsequence] = @subsequence if @subsequence
         | 
| 45 | 
            +
                  tab[:alt] = @alt if @alt
         | 
| 46 | 
            +
                  tab[:summary] = @summary if @summary
         | 
| 47 | 
            +
                  tab[:uri] = @uri if @uri
         | 
| 48 | 
            +
                end
         | 
| 49 | 
            +
             | 
| 50 | 
            +
                class Tr
         | 
| 51 | 
            +
                  # @param [Array<BasicBlock::Table::Td, BasicBlock::Table::Th>] content
         | 
| 52 | 
            +
                  def initialize(content)
         | 
| 53 | 
            +
                    @content = content
         | 
| 54 | 
            +
                  end
         | 
| 55 | 
            +
             | 
| 56 | 
            +
                  # @param [Nokogiri::XML::Builder] builder
         | 
| 57 | 
            +
                  def to_xml(builder)
         | 
| 58 | 
            +
                    builder.tr do |b|
         | 
| 59 | 
            +
                      @content.each { |c| c.to_xm b }
         | 
| 60 | 
            +
                    end
         | 
| 61 | 
            +
                  end
         | 
| 62 | 
            +
                end
         | 
| 63 | 
            +
             | 
| 64 | 
            +
                class TabCell
         | 
| 65 | 
            +
                  ALIGNS = %w[left right ceter].freeze
         | 
| 66 | 
            +
                  VALIGNS = %w[top middle bottom baseline].freeze
         | 
| 67 | 
            +
             | 
| 68 | 
            +
                  # @param [Array<BasicBlock::TextElement,
         | 
| 69 | 
            +
                  #   BasicBlock::ParagraphWithFootnote>] content
         | 
| 70 | 
            +
                  # @param [Hssh] args
         | 
| 71 | 
            +
                  # @option args [String, nil] :colspan
         | 
| 72 | 
            +
                  # @option args [String, nil] :rowspan
         | 
| 73 | 
            +
                  # @option args [String, nil] :align
         | 
| 74 | 
            +
                  # @option args [String, nil] :valign
         | 
| 75 | 
            +
                  def initialize(content, **args) # rubocop:disable Metrics/AbcSize,Metrics/MethodLength
         | 
| 76 | 
            +
                    if args[:align] && !ALIGNS.include?(args[:align])
         | 
| 77 | 
            +
                      warn "[basic-block] WARNING: invalid table/tr/td align \"#{args[:align]}\""
         | 
| 78 | 
            +
                      warn "[basic-block] alloved aligns are: #{ALIGNS.join ', '}"
         | 
| 79 | 
            +
                    end
         | 
| 80 | 
            +
                    if args[:valign] && !VALIGNS.include?(args[:valign])
         | 
| 81 | 
            +
                      warn "[basic-block] WARNING: invalid table/tr/td valign \"#{args[:valign]}\""
         | 
| 82 | 
            +
                      warn "[basic-block] alloved valigns are: #{VALIGNS.join ', '}"
         | 
| 83 | 
            +
                    end
         | 
| 84 | 
            +
                    @content = content
         | 
| 85 | 
            +
                    @colspan = args[:colspan]
         | 
| 86 | 
            +
                    @rowspan = args[:rowspan]
         | 
| 87 | 
            +
                    @align = args[:align]
         | 
| 88 | 
            +
                    @valign = args[:valign]
         | 
| 89 | 
            +
                  end
         | 
| 90 | 
            +
             | 
| 91 | 
            +
                  # @param [Nokogiri::XML::Builder] builder
         | 
| 92 | 
            +
                  def to_xml(builder)
         | 
| 93 | 
            +
                    td = @content.each { |c| c.to_xml builder }
         | 
| 94 | 
            +
                    td[:colspan] = @colspan if @colspan
         | 
| 95 | 
            +
                    td[:rowspan] = @rowspan if @rowspan
         | 
| 96 | 
            +
                    td[:align] = @align if @align
         | 
| 97 | 
            +
                    td[:valign] = @valign if @valign
         | 
| 98 | 
            +
                  end
         | 
| 99 | 
            +
                end
         | 
| 100 | 
            +
             | 
| 101 | 
            +
                class Td < BasicBlock::Table::TabCell
         | 
| 102 | 
            +
                  # @param [Nokogiri::XML::Builder] builder
         | 
| 103 | 
            +
                  def to_xml(builder)
         | 
| 104 | 
            +
                    builder.th { super }
         | 
| 105 | 
            +
                  end
         | 
| 106 | 
            +
                end
         | 
| 107 | 
            +
             | 
| 108 | 
            +
                class Th < BasicBlock::Table::TabCell
         | 
| 109 | 
            +
                  # @param [Nokogiri::XML::Builder] builder
         | 
| 110 | 
            +
                  def to_xml(builder)
         | 
| 111 | 
            +
                    builder.td { super }
         | 
| 112 | 
            +
                  end
         | 
| 113 | 
            +
                end
         | 
| 114 | 
            +
              end
         | 
| 115 | 
            +
            end
         |