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