Sha256: cfc45df0cfa8aae7f457ed0ba2484ebbc2d477d3151f5bfe6a4d8cbe80f69e5d

Contents?: true

Size: 1.46 KB

Versions: 8

Compression:

Stored size: 1.46 KB

Contents

require 'roo/font'
require 'roo/excelx/extractor'

module Roo
  class Excelx
    class Styles < Excelx::Extractor
      # convert internal excelx attribute to a format
      def style_format(style)
        id = num_fmt_ids[style.to_i]
        num_fmts[id] || Excelx::Format::STANDARD_FORMATS[id.to_i]
      end

      def definitions
        @definitions ||= extract_definitions
      end

      private

      def num_fmt_ids
        @num_fmt_ids ||= extract_num_fmt_ids
      end

      def num_fmts
        @num_fmts ||= extract_num_fmts
      end

      def fonts
        @fonts ||= extract_fonts
      end

      def extract_definitions
        doc.xpath('//cellXfs').flat_map do |xfs|
          xfs.children.map do |xf|
            fonts[xf['fontId'].to_i]
          end
        end
      end

      def extract_fonts
        doc.xpath('//fonts/font').map do |font_el|
          Font.new.tap do |font|
            font.bold = !font_el.xpath('./b').empty?
            font.italic = !font_el.xpath('./i').empty?
            font.underline = !font_el.xpath('./u').empty?
          end
        end
      end

      def extract_num_fmt_ids
        doc.xpath('//cellXfs').flat_map do |xfs|
          xfs.children.map do |xf|
            xf['numFmtId']
          end
        end.compact
      end

      def extract_num_fmts
        doc.xpath('//numFmt').each_with_object({}) do |num_fmt, hash|
          hash[num_fmt['numFmtId']] = num_fmt['formatCode']
        end
      end
    end
  end
end

Version data entries

8 entries across 8 versions & 2 rubygems

Version Path
roo-2.10.1 lib/roo/excelx/styles.rb
roo-2.10.0 lib/roo/excelx/styles.rb
roo-2.9.0 lib/roo/excelx/styles.rb
ruh-roo-3.0.1 lib/roo/excelx/styles.rb
roo-2.8.3 lib/roo/excelx/styles.rb
roo-2.8.2 lib/roo/excelx/styles.rb
roo-2.8.1 lib/roo/excelx/styles.rb
roo-2.8.0 lib/roo/excelx/styles.rb