aozorahack/aozora2html

View on GitHub
lib/aozora2html/utils.rb

Summary

Maintainability
F
3 days
Test Coverage
# frozen_string_literal: true

class Aozora2Html
  # ユーティリティ関数モジュール
  module Utils
    using StringRefinements

    def create_font_size(times, daisho)
      size = case times
             when 1
               +''
             when 2
               +'x-'
             else
               raise Aozora2Html::Error, I18n.t(:invalid_font_size) unless times >= 3

               +'xx-'
             end

      case daisho
      when :dai
        size << 'large'
      when :sho
        size << 'small'
      else
        raise Aozora2Html::Error, I18n.t(:invalid_font_size)
      end

      size
    end
    module_function :create_font_size

    def create_midashi_tag(size)
      if size.match(SIZE_SMALL)
        'h5'
      elsif size.match(SIZE_MIDDLE)
        'h4'
      elsif size.match(SIZE_LARGE)
        'h3'
      else
        raise Aozora2Html::Error, I18n.t(:undefined_header)
      end
    end
    module_function :create_midashi_tag

    def create_midashi_class(type, tag)
      normal_midashi_tag = {
        'h5' => 'ko-midashi',
        'h4' => 'naka-midashi',
        'h3' => 'o-midashi'
      }

      dogyo_midashi_tag = {
        'h5' => 'dogyo-ko-midashi',
        'h4' => 'dogyo-naka-midashi',
        'h3' => 'dogyo-o-midashi'
      }

      mado_midashi_tag = {
        'h5' => 'mado-ko-midashi',
        'h4' => 'mado-naka-midashi',
        'h3' => 'mado-o-midashi'
      }

      case type
      when :normal
        normal_midashi_tag[tag]
      when :dogyo
        dogyo_midashi_tag[tag]
      when :mado
        mado_midashi_tag[tag]
      else
        raise Aozora2Html::Error, I18n.t(:undefined_header)
      end
    end
    module_function :create_midashi_class

    def convert_japanese_number(command)
      tmp = command.tr(ZENKAKU_NUMS, '0123456789')
      tmp.tr!(KANJI_NUMS, '0123456789')
      tmp.gsub!(/(\d)#{KANJI_TEN}(\d)/o) { "#{$1}#{$2}" }
      tmp.gsub!(/(\d)#{KANJI_TEN}/o) { "#{$1}0" }
      tmp.gsub!(/#{KANJI_TEN}(\d)/o) { "1#{$1}" }
      tmp.gsub!(/#{KANJI_TEN}/o, '10')
      tmp
    end
    module_function :convert_japanese_number

    # 使うべきではない文字があるかチェックする
    #
    # 警告を出力するだけで結果には影響を与えない。警告する文字は以下:
    #
    # * 1バイト文字
    # * `#`ではなく`♯`
    # * JIS(JIS X 0208)外字
    #
    # @return [void]
    #
    def illegal_char_check(char, line)
      return unless char.is_a?(String)

      code = char.unpack1('H*')
      if (code == '21') ||
         (code == '23') ||
         ((code >= 'a1') && (code <= 'a5')) ||
         ((code >= '28') && (code <= '29')) ||
         (code == '5b') ||
         (code == '5d') ||
         (code == '3d') ||
         (code == '3f') ||
         (code == '2b') ||
         ((code >= '7b') && (code <= '7d'))
        puts I18n.t(:warn_onebyte, line, char)
      end

      if code == '81f2'
        puts I18n.t(:warn_chuki, line, char)
      end

      if ((code >= '81ad') && (code <= '81b7')) ||
         ((code >= '81c0') && (code <= '81c7')) ||
         ((code >= '81cf') && (code <= '81d9')) ||
         ((code >= '81e9') && (code <= '81ef')) ||
         ((code >= '81f8') && (code <= '81fb')) ||
         ((code >= '8240') && (code <= '824e')) ||
         ((code >= '8259') && (code <= '825f')) ||
         ((code >= '827a') && (code <= '8280')) ||
         ((code >= '829b') && (code <= '829e')) ||
         ((code >= '82f2') && (code <= '82fc')) ||
         ((code >= '8397') && (code <= '839e')) ||
         ((code >= '83b7') && (code <= '83be')) ||
         ((code >= '83d7') && (code <= '83fc')) ||
         ((code >= '8461') && (code <= '846f')) ||
         ((code >= '8492') && (code <= '849e')) ||
         ((code >= '84bf') && (code <= '84fc')) ||
         ((code >= '8540') && (code <= '85fc')) ||
         ((code >= '8640') && (code <= '86fc')) ||
         ((code >= '8740') && (code <= '87fc')) ||
         ((code >= '8840') && (code <= '889e')) ||
         ((code >= '9873') && (code <= '989e')) ||
         ((code >= 'eaa5') && (code <= 'eafc')) ||
         ((code >= 'eb40') && (code <= 'ebfc')) ||
         ((code >= 'ec40') && (code <= 'ecfc')) ||
         ((code >= 'ed40') && (code <= 'edfc')) ||
         ((code >= 'ee40') && (code <= 'eefc')) ||
         ((code >= 'ef40') && (code <= 'effc'))
        puts I18n.t(:warn_jis_gaiji, line, char)
      end
    end
    module_function :illegal_char_check
  end
end