# class RDoc::I18n::Text

frozen_string_literal: false

An i18n supported text.

This object provides the following two features:

    * Extracts translation messages from wrapped raw text.
    * Translates wrapped raw text in specified locale.

Wrapped raw text is one of String, RDoc::Comment or Array of them.

### Public Class Methods

new(raw) click to toggle source

Creates a new i18n supported text for `raw` text.

    # File lib/rdoc/i18n/text.rb, line 17
    def initialize(raw)
      @raw = raw
    end

### Public Instance Methods

extract_messages() { |part| ... } click to toggle source

Extracts translation target messages and yields each message.

Each yielded message is a Hash. It consists of the followings:

:type

  :paragraph

:paragraph

  String (The translation target message itself.)

:line_no

  Integer (The line number of the :paragraph is started.)

The above content may be added in the future.

    # File lib/rdoc/i18n/text.rb, line 32
    def extract_messages
      parse do |part|
        case part[:type]
        when :empty_line
          # ignore
        when :paragraph
          yield(part)
        end
      end
    end

translate(locale) click to toggle source

Translates raw text into `locale`.

    # File lib/rdoc/i18n/text.rb, line 44
    def translate(locale)
      translated_text = ''
      parse do |part|
        case part[:type]
        when :paragraph
          translated_text << locale.translate(part[:paragraph])
        when :empty_line
          translated_text << part[:line]
        else
          raise "should not reach here: unexpected type: #{type}"
        end
      end
      translated_text
    end

### Private Instance Methods

each_line(raw, &block) click to toggle source

    # File lib/rdoc/i18n/text.rb, line 88
    def each_line(raw, &block)
      case raw
      when RDoc::Comment
        raw.text.each_line(&block)
      when Array
        raw.each do |comment, location|
          each_line(comment, &block)
        end
      else
        raw.each_line(&block)
      end
    end

emit_empty_line_event(line, line_no) { |part| ... } click to toggle source

    # File lib/rdoc/i18n/text.rb, line 101
    def emit_empty_line_event(line, line_no)
      part = {
        :type => :empty_line,
        :line => line,
        :line_no => line_no,
      }
      yield(part)
    end

emit_paragraph_event(paragraph, paragraph_start_line, line_no) { |paragraph_part| ... } click to toggle source

    # File lib/rdoc/i18n/text.rb, line 110
    def emit_paragraph_event(paragraph, paragraph_start_line, line_no, &block)
      paragraph_part = {
        :type => :paragraph,
        :line_no => paragraph_start_line,
      }
      match_data = /(\s*)\z/.match(paragraph)
      if match_data
        paragraph_part[:paragraph] = match_data.pre_match
        yield(paragraph_part)
        emit_empty_line_event(match_data[1], line_no, &block)
      else
        paragraph_part[:paragraph] = paragraph
        yield(paragraph_part)
      end
    end

parse(&block) click to toggle source

    # File lib/rdoc/i18n/text.rb, line 60
    def parse(&block)
      paragraph = ''
      paragraph_start_line = 0
      line_no = 0

      each_line(@raw) do |line|
        line_no += 1
        case line
        when /\A\s*\z/
          if paragraph.empty?
            emit_empty_line_event(line, line_no, &block)
          else
            paragraph << line
            emit_paragraph_event(paragraph, paragraph_start_line, line_no,
                                 &block)
            paragraph = ''
          end
        else
          paragraph_start_line = line_no if paragraph.empty?
          paragraph << line
        end
      end

      unless paragraph.empty?
        emit_paragraph_event(paragraph, paragraph_start_line, line_no, &block)
      end
    end