class FuriganaRuby::Parser::FuriganaParser

Performs the parsing

Attributes

segments[R]

Public Class Methods

new(reading) click to toggle source

@param [String] reading

# File lib/furigana_ruby/parser.rb, line 38
def initialize(reading)
  @segments = []
  @current_base = ""
  @current_furigana = ""
  @parsing_base_section = true
  @characters = Utils.present?(reading) && reading.length ? reading.split("") : []

  process
end

Public Instance Methods

get_segment(base_text, furigana) click to toggle source

@param [String] base_text @param [String] furigana

# File lib/furigana_ruby/parser.rb, line 82
def get_segment(base_text, furigana)
  return UndecoratedSegment.new(base_text) unless Utils.present?(furigana)

  FuriganaSegment.new(base_text, furigana)
end
kanji?(character) click to toggle source

@return [Boolean]

# File lib/furigana_ruby/parser.rb, line 102
def kanji?(character)
  char = character[0, 1]
  Utils.present?(character) && char.ord >= 0x4e00 && char.ord <= 0x9faf
end
last_character_in_block?(current, character_list) click to toggle source

@param [String] current @param [Array<String>] character_list @return [Boolean]

# File lib/furigana_ruby/parser.rb, line 92
def last_character_in_block?(current, character_list)
  character_list.length.zero? ||
    (
      kanji?(current) != kanji?(character_list[0]) &&
        character_list[0] != "["
    )
end
next_segment() click to toggle source

rubocop:enable Metrics/MethodLength

# File lib/furigana_ruby/parser.rb, line 71
def next_segment
  @segments << get_segment(@current_base, @current_furigana) if @current_base.length.positive?

  @current_base = ""
  @current_furigana = ""
  @parsing_base_section = true
end
process() click to toggle source

rubocop:disable Metrics/MethodLength

# File lib/furigana_ruby/parser.rb, line 49
def process
  while @characters.length.positive?
    current = @characters.shift

    if current == "["
      @parsing_base_section = false
    elsif current == "]"
      next_segment
    elsif last_character_in_block?(current, @characters) && @parsing_base_section
      @current_base += current
      next_segment
    elsif !@parsing_base_section
      @current_furigana += current
    else
      @current_base += current
    end
  end

  next_segment
end