<commit_before># -*- coding: utf-8 -*-

class Aozora
  Titles = lambda {
    titles = Array.new
    titles.push :kokoro
    titles.push :bocchan
    titles.push :hashire_merosu
    titles.push :joseito
    titles.push :lemon
    titles.push :london
    titles.push :ningen_shikkaku
    titles.push :pandorano_hako
    titles.push :sangetsuki
    titles.push :sanshiro
    titles.push :viyon
    titles.push :wagahaiwa_nekodearu
    titles.push :watashino_kojinshugi
    titles.push :__TEST_DATA__ # for test only
    return titles
  }.call

  def initialize(title=:kokoro, length=100)
    validate_tilte(title)
    validate_length(length)

    if title.kind_of? Numeric
      title = Titles[title]
    end
    @text = read_file(title, length)
    return self
  end

  def text; to_s end

  def self.titles; print self._titles end

  def dots
    @text += "…"
    return self
  end

  def alpha(option)
    case option
    when :half, "half"
      @text.tr!("ａ-ｚ","a-z")
      @text.tr!("Ａ-Ｚ","A-Z")
      return self
    when :full, "full"
      @text.tr!("a-z","ａ-ｚ")
      @text.tr!("A-Z","Ａ-Ｚ")
      return self
    end
    raise 'option must be :half, "half", :full, or "full"'
  end

  def digit(option)
    case option
    when :half, "half"
      @text.tr!("０-９","0-9")
      return self
    when :full, "full"
      @text.tr!("0-9","０-９")
      return self
    end
    raise 'option must be :half, "half", :full, or "full"'
  end

  def sign(option)
    full_sign = "！＃＄％＆（）＊＋，ー．／：；＜＝＞？＠［］＾＿｀｛｜｝〜’＼"
    half_sign = "!#\$%&()*+,-./:;<=>?@[]^_`{|}~'\\"
    case option
    when :half, "half"
      @text.tr!(full_sign, half_sign)
      return self
    when :full, "full"
      @text.tr!(half_sign, full_sign)
      return self
    end
    raise 'option must be :half, "half", :full, or "full"'
  end

  def paragraph(p_length=40, options={})
    div_paragraph(p_length)

    if options[:space_head]
      @text = "　"+@text
      @text.gsub!(/\n/,"\n　")
    end

    if options[:blank_line]
      @text.gsub!(/\n/,"\n\n")
    end

    return self
  end

  def to_s; @text.to_s end

  private
  
  def read_file(title, length)
    dir = File.expand_path(File.dirname(__FILE__))
    filename = dir+"/../../data/#{title}.txt"
    File.open(filename) do |full_sign|
      text = String.new
      loop do
        while (line = full_sign.gets) == nil
          full_sign.seek(0) 
        end
        text += line.chomp
        break if text.size >= length<commit_msg>rdoc add #3<commit_after># -*- coding: utf-8 -*-

# 
# ダミーテキストを生成するためのクラスです。
# 青空文庫などの著作権フリーな文書をもとに整形された文字列を生成します。
# 
# Authors:: <NAME>
# Version:: 0.1.0
# Copyright:: MIT License
# License:: 2013 <NAME>
#
class Aozora

  # テキストの種類として指定できるSymbolのリスト
  Titles = lambda {
    titles = Array.new
    titles.push :kokoro
    titles.push :bocchan
    titles.push :hashire_merosu
    titles.push :joseito
    titles.push :lemon
    titles.push :london
    titles.push :ningen_shikkaku
    titles.push :pandorano_hako
    titles.push :sangetsuki
    titles.push :sanshiro
    titles.push :viyon
    titles.push :wagahaiwa_nekodearu
    titles.push :watashino_kojinshugi
    titles.push :__TEST_DATA__ # for test only
    return titles
  }.call

  #
  # Aozoraクラスのインスタンスを生成する。
  #
  # [title] 使用するテキストの種類を設定する
  # [length] テキストの長さを設定する
  #
  def initialize(title=:kokoro, length=100)
    validate_tilte(title)
    validate_length(length)

    if title.kind_of? Numeric
      title = Titles[title]
    end
    @text = read_file(title, length)
    return self
  end

  #
  # <i>Aozora</i><i>to_s</i>の別名です。
  # 生成されたダミーテキストを文字列として返します。
  #
  def text; to_s end

  #
  # テキストの種類として指定できるSymbolおよび番号の
  # 対応表を標準出力に表示します。
  #
  def self.titles; print self._titles end

  #
  # テキストに含まれるアルファベットを半角や全角に変換します。
  # 引数に:halfまたは"half"を渡すとテキスト内のすべてのアルファベットが半角に変換されます。
  # :fullまたは"full"を渡すと全角に変換されます。
  # 
  # [option] オプションを指定します。:half, "half", :full, "full" のうちいずれかを指定して下さい。
  # 
  def alpha(option)
    case option
    when :half, "half"
      @text.tr!("ａ-ｚ","a-z")
      @text.tr!("Ａ-Ｚ","A-Z")
      return self
    when :full, "full"
      @text.tr!("a-z","ａ-ｚ")
      @text.tr!("A-Z","Ａ-Ｚ")
      return self
    end
    raise 'option must be :half, "half", :full, or "full"'
  end

  #
  # テキストに含まれる数字を半角や全角に変換します。
  # 引数に:halfまたは"half"を渡すとテキスト内のすべての数字が半角に変換されます。
  # :fullまたは"full"を渡すと全角に変換されます。
  # 
  # [option] オプションを指定します。:half, "half", :full, "full" のうちいずれかを指定して下さい。
  # 
  def digit(option)
    case option
    when :half, "half"
      @text.tr!("０-９","0-9")
      return self
    when :full, "full"
      @text.tr!("0-9","０-９")
      return self
    end
    raise 'option must be :half, "half", :full, or "full"'
  end

  #
  # テキストに含まれる記号を半角や全角に変換します。
  # 引数に:halfまたは"half"を渡すとテキスト内のすべての記号が半角に変換されます。
  # :fullまたは"full"を渡すと全角に変換されます。
  # 
  # [option] オプションを指定します。:half, "half", :full, "full" のうちいずれかを指定して下さい。
  # 
  def sign(option)
    full_sign = "！＃＄％＆（）＊＋，ー．／：；＜＝＞？＠［］＾＿｀｛｜｝〜’＼"
    half_sign = "!#\$%&()*+,-./:;<=>?@[]^_`{|}~'\\"
    case option
    when :half, "half"
      @text.tr!(full_sign, half_sign)
      return self
    when :full, "full"
      @text.tr!(half_sign, full_sign)
      return self
    end
    raise 'option must be :half, "half", :full, or "full"'
  end

  # 
  # テキストをパラグラフ化します。
  #
  # [p_length] ひとつのパラグラフのおおまかな文字数を指定します。
  # [options] パラグラフに関するオプションをHashで受け取ります。
  #           {:space_head => true} を渡された場合、パラグラフの冒頭にスペースが入ります。
  #           {:_head => true} を渡された場合、パラグラフの冒頭にスペースが入ります。
  #
  def paragraph(p_length=40, options={})
    div_paragraph(p_length)

    if options[:space_head]
      @text = "　"+@text
      @text.gsub!(/\n/,"\n　")
    end

    if options[:blank_line]
      @text.gsub!(/\n/,"\n\n")
    end

    return self
  end

  #
  # ダミーテキストの末尾に、文章の途中であることを示す「…」を付します。
  #
  def dots
    @text += "…"
    return self
  end

  #
  # 生成されたダミーテキストを文字列として返します。
  #
  def to_s; @text.to_s end

  private
  
  def read_file(title, length)
    dir = File.expand_path(File.dirname(__FILE__))
    filename = dir+"/../../data/#{title}.txt"
    File.open(filename) do |full_sign|
      text = String.new
      loop do
        while (line = full_sign.gets) == nil
          full_sign.seek(0) 
        end
        text += line.chomp
        break if text.size >= length
{'fraction_non_alphanumeric': 0.15393204657840165, 'fraction_numerical': 0.006061572818631361, 'mean_word_length': 2.6411149825783973, 'pattern_counts': {'":': 0, '<': 11, '<?xml version=': 0, '>': 15, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '872760', 'n_tokens_mistral': 3079, 'n_tokens_neox': 2963, 'n_words': 487}