ya_lorem_ja 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +17 -0
- data/.rspec +2 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +22 -0
- data/README.md +83 -0
- data/Rakefile +6 -0
- data/lib/ya_lorem_ja/resources/kazehakase.rb +210 -0
- data/lib/ya_lorem_ja/version.rb +5 -0
- data/lib/ya_lorem_ja/word_resource.rb +161 -0
- data/lib/ya_lorem_ja.rb +114 -0
- data/spec/spec_helper.rb +2 -0
- data/spec/ya_lorem_ja_spec.rb +94 -0
- data/ya_lorem_ja.gemspec +24 -0
- metadata +101 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: e5512f6c17f33e8be6efbae30aa08b1ab36b44ac
|
4
|
+
data.tar.gz: adb703f62f39320e831bc5601761768fd3aa451f
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 067d885ebc020d08a06811dcd2daef9a6ebe92ca553a92474651430fa379eb6f212d9ec8df606fe0ed979a16d872d82701661735d8cdee71152cc3bc42955b09
|
7
|
+
data.tar.gz: a54799e67d9c868e1dfa98aa7931d4dafaf9e2dd185f95f3fcf6388a283549adf19fdb596a189d8faa8df22731d26d3a138a6564807e27d752b246b1947c34b0
|
data/.gitignore
ADDED
data/.rspec
ADDED
data/Gemfile
ADDED
data/LICENSE.txt
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
Copyright (c) 2015 tanaken2
|
2
|
+
|
3
|
+
MIT License
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
6
|
+
a copy of this software and associated documentation files (the
|
7
|
+
"Software"), to deal in the Software without restriction, including
|
8
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
9
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
10
|
+
permit persons to whom the Software is furnished to do so, subject to
|
11
|
+
the following conditions:
|
12
|
+
|
13
|
+
The above copyright notice and this permission notice shall be
|
14
|
+
included in all copies or substantial portions of the Software.
|
15
|
+
|
16
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
17
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
18
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
19
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
20
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
21
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
22
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,83 @@
|
|
1
|
+
# YaLoremJa
|
2
|
+
|
3
|
+
簡易版 日本語 lorem です。
|
4
|
+
|
5
|
+
## Installation
|
6
|
+
|
7
|
+
Add this line to your application's Gemfile:
|
8
|
+
|
9
|
+
gem 'ya_lorem_ja'
|
10
|
+
|
11
|
+
And then execute:
|
12
|
+
|
13
|
+
$ bundle
|
14
|
+
|
15
|
+
Or install it yourself as:
|
16
|
+
|
17
|
+
$ gem install ya_lorem_ja
|
18
|
+
|
19
|
+
## Usage
|
20
|
+
|
21
|
+
```ruby
|
22
|
+
require 'ya_lorem_ja'
|
23
|
+
|
24
|
+
lorem = YaLoremJa::Lorem.new
|
25
|
+
|
26
|
+
# puts a word.
|
27
|
+
puts lorem.word
|
28
|
+
|
29
|
+
# puts ten words.
|
30
|
+
puts lorem.words(10)
|
31
|
+
|
32
|
+
# puts a sentence.
|
33
|
+
puts lorem.sentence
|
34
|
+
|
35
|
+
# puts three sentences.
|
36
|
+
puts lorem.sentences(3)
|
37
|
+
|
38
|
+
# puts a paragraph.
|
39
|
+
puts lorem.paragraph
|
40
|
+
|
41
|
+
# puts five paragraphs.
|
42
|
+
puts lorem.paragraphs(5)
|
43
|
+
```
|
44
|
+
|
45
|
+
## Interface
|
46
|
+
|
47
|
+
Middleman の lorem のインターフェースを参考にしています。
|
48
|
+
|
49
|
+
実装しているインターフェースは以下です。
|
50
|
+
|
51
|
+
- word
|
52
|
+
- words(num_of_words)
|
53
|
+
- sentence
|
54
|
+
- sentences(num_of_sentces)
|
55
|
+
- paragraph
|
56
|
+
- paragraphs(num_of_paragraph)
|
57
|
+
|
58
|
+
## 実装
|
59
|
+
|
60
|
+
日本語 lorem の簡易版であるため、自然言語処理は一切していません。
|
61
|
+
文を最小単位とした文章情報から、指定された文字数に収まる文を選択しています。
|
62
|
+
|
63
|
+
そのため、 word(or words) が指定された場合は、1単語あたり2〜6文字(コンストラクタで変更可)の範囲でランダムに文字数を決定し、
|
64
|
+
その文字数に収まる文を選択しています。ただし、 word(or words)の場合は、選択した文末に句点が存在する場合、文末の句点を削除します。
|
65
|
+
|
66
|
+
sentence(or sentence)が指定された場合は、1文あたり6〜20単語(コンストラクタで変更可)の範囲でランダムに単語数を決定し、単語数×単語の文字数に収まる文を選択しています。
|
67
|
+
複数文(例: sentences(3))を指定した場合は、改行文字(デフォルト "\n", line_breakプロパティで変更可)で各文を結合します。
|
68
|
+
|
69
|
+
paragraph(or paragraphs)が指定された場合は、1段落あたり2〜5文(コンストラクタで変更可)の範囲でランダムに文数を決定し、文を選択します。
|
70
|
+
複数段落(例: paragraphs(3))を指定した場合は、2つ分の改行文字(デフォルト "\n\n)を段落区切りとして設定します。
|
71
|
+
|
72
|
+
## 文章情報
|
73
|
+
|
74
|
+
デフォルトの文章情報として、 [坂口安吾「風博士」](http://www.aozora.gr.jp/cards/001095/card42616.html) を使用しています。
|
75
|
+
|
76
|
+
|
77
|
+
## Contributing
|
78
|
+
|
79
|
+
1. Fork it
|
80
|
+
2. Create your feature branch (`git checkout -b my-new-feature`)
|
81
|
+
3. Commit your changes (`git commit -am 'Add some feature'`)
|
82
|
+
4. Push to the branch (`git push origin my-new-feature`)
|
83
|
+
5. Create new Pull Request
|
data/Rakefile
ADDED
@@ -0,0 +1,210 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
module YaLoremJa
|
3
|
+
##
|
4
|
+
# word resource from {http://www.aozora.gr.jp/cards/001095/card42616.html kazehakase}
|
5
|
+
class Kazehakase < ::YaLoremJa::WordResource
|
6
|
+
|
7
|
+
##
|
8
|
+
# @param [Range] char_count_range range of character count in a word
|
9
|
+
# @param [Range] word_count_range range of word count in sentence
|
10
|
+
# @param [Range] sentence_count_range renage of sentence count in paragraph
|
11
|
+
def initialize(char_count_range, word_count_range, sentence_count_range)
|
12
|
+
super(char_count_range, word_count_range, sentence_count_range)
|
13
|
+
@sentence_end_chars = ["?", "。", "!"]
|
14
|
+
@sentence_map = Hash.new{ |h,k| h[k] = [] }
|
15
|
+
|
16
|
+
lines=<<CONTENTS.split("\n")
|
17
|
+
諸君は、東京市某町某番地なる風博士の邸宅を御存じであろう乎?
|
18
|
+
御存じない。
|
19
|
+
それは大変残念である。
|
20
|
+
そして諸君は偉大なる風博士を御存知であろうか?
|
21
|
+
ない。
|
22
|
+
嗚呼。
|
23
|
+
では諸君は遺書だけが発見されて、偉大なる風博士自体は杳として紛失したことも御存知ないであろうか?
|
24
|
+
ない。
|
25
|
+
嗟乎。
|
26
|
+
では諸君は僕が其筋の嫌疑のために並々ならぬ困難を感じていることも御存じあるまい。
|
27
|
+
しかし警察は知っていたのである。
|
28
|
+
そして其筋の計算に由れば、偉大なる風博士は僕と共謀のうえ遺書を捏造して自殺を装い、かくてかの憎むべき蛸博士の名誉毀損をたくらんだに相違あるまいと睨んだのである。
|
29
|
+
諸君、これは明らかに誤解である。
|
30
|
+
何となれば偉大なる風博士は自殺したからである。
|
31
|
+
果して自殺した乎?
|
32
|
+
然り、偉大なる風博士は紛失したのである。
|
33
|
+
諸君は軽率に真理を疑っていいのであろうか?
|
34
|
+
なぜならば、それは諸君の生涯に様々な不運を齎らすに相違ないからである。
|
35
|
+
真理は信ぜらるべき性質のものであるから、諸君は偉大なる風博士の死を信じなければならない。
|
36
|
+
そして諸君は、かの憎むべき蛸博士の——あ、諸君はかの憎むべき蛸博士を御存知であろうか?
|
37
|
+
御存じない。
|
38
|
+
噫呼、それは大変残念である。
|
39
|
+
では諸君は、まず悲痛なる風博士の遺書を一読しなければなるまい。
|
40
|
+
風博士の遺書
|
41
|
+
諸君、彼は禿頭である。
|
42
|
+
然り、彼は禿頭である。
|
43
|
+
禿頭以外の何物でも、断じてこれある筈はない。
|
44
|
+
彼は鬘を以て之の隠蔽をなしおるのである。
|
45
|
+
ああこれ実に何たる滑稽!
|
46
|
+
然り何たる滑稽である。
|
47
|
+
ああ何たる滑稽である。
|
48
|
+
かりに諸君、一撃を加えて彼の毛髪を強奪せりと想像し給え。
|
49
|
+
突如諸君は気絶せんとするのである。
|
50
|
+
而して諸君は気絶以外の何物にも遭遇することは不可能である。
|
51
|
+
即ち諸君は、猥褻名状すべからざる無毛赤色の突起体に深く心魄を打たるるであろう。
|
52
|
+
異様なる臭気は諸氏の余生に消えざる歎きを与えるに相違ない。
|
53
|
+
忌憚なく言えば、彼こそ憎むべき蛸である。
|
54
|
+
人間の仮面を被り、門にあらゆる悪計を蔵すところの蛸は即ち彼に外ならぬのである。
|
55
|
+
諸君、余を指して誣告の誹を止め給え、何となれば、真理に誓って彼は禿頭である。
|
56
|
+
尚疑わんとせば諸君よ、巴里府モンマルトル三番地、Bis, Perruquier ショオブ氏に訊き給え。
|
57
|
+
今を距ること四十八年前のことなり、二人の日本人留学生によって鬘の購われたることを記憶せざるや。
|
58
|
+
一人は禿頭にして肥満すること豚児の如く愚昧の相を漂わし、その友人は黒髪|明眸の美少年なりき、と。
|
59
|
+
黒髪明眸なる友人こそ即ち余である。
|
60
|
+
見給え諸君、ここに至って彼は果然四十八年以前より禿げていたのである。
|
61
|
+
於戯実に慨嘆の至に堪えんではない乎!
|
62
|
+
高尚なること檞の木の如き諸君よ、諸君は何故彼如き陋劣漢を地上より埋没せしめんと願わざる乎。
|
63
|
+
彼は鬘を以てその禿頭を瞞着せんとするのである。
|
64
|
+
諸君、彼は余の憎むべき論敵である。
|
65
|
+
単なる論敵であるか?
|
66
|
+
否否否。
|
67
|
+
千辺否。
|
68
|
+
余の生活の全てに於て彼は又余の憎むべき仇敵である。
|
69
|
+
実に憎むべきであるか?
|
70
|
+
然り実に憎むべきである!
|
71
|
+
諸君、彼の教養たるや浅薄至極でありますぞ。
|
72
|
+
かりに諸君、聡明なること世界地図の如き諸君よ、諸君は学識深遠なる蛸の存在を認容することが出来るであろうか?
|
73
|
+
否否否、万辺否。
|
74
|
+
余はここに敢て彼の無学を公開せんとするものである。
|
75
|
+
諸君は南欧の小部落バスクを認識せらるるであろうか?
|
76
|
+
もしも諸君が仏蘭西、西班牙両国の国境をなすピレネエ山脈をさまようならば、諸君は山中に散在する小部落バスクに逢着するのである。
|
77
|
+
この珍奇なる部落は、人種、風俗、言語に於て西欧の全人種に隔絶し、実に地球の半廻転を試みてのち、極東じゃぽん国にいたって初めて著しき類似を見出すのである。
|
78
|
+
これ余の研究完成することなくしては、地球の怪談として深く諸氏の心胆を寒からしめたに相違ない。
|
79
|
+
而して諸君安んぜよ、余の研究は完成し、世界平和に偉大なる貢献を与えたのである。
|
80
|
+
見給え、源義経は成吉思汗となったのである。
|
81
|
+
成吉思汗は欧州を侵略し、西班牙に至ってその消息を失うたのである。
|
82
|
+
然り、義経及びその一党はピレネエ山中最も気候の温順なる所に老後の隠栖を卜したのである。
|
83
|
+
之即ちバスク開闢の歴史である。
|
84
|
+
しかるに嗚乎、かの無礼なる蛸博士は不遜千万にも余の偉大なる業績に異論を説えたのである。
|
85
|
+
彼は曰く、蒙古の欧州侵略は成吉思汗の後継者太宗の事蹟にかかり、成吉思汗の死後十年の後に当る、と。
|
86
|
+
実に何たる愚論浅識であろうか。
|
87
|
+
失われたる歴史に於て、単なる十年が何である乎!
|
88
|
+
実にこれ歴史の幽玄を冒涜するも甚だしいではないか。
|
89
|
+
さて諸君、彼の悪徳を列挙するは余の甚だ不本意とするところである。
|
90
|
+
なんとなれば、その犯行は奇想天外にして識者の常識を肯んぜしめず、むしろ余に対して誣告の誹を発せしむる憾みあるからである。
|
91
|
+
たとえば諸君、頃日余の戸口に Banana の皮を撒布し余の殺害を企てたのも彼の方寸に相違ない。
|
92
|
+
愉快にも余は臀部及び肩胛骨に軽微なる打撲傷を受けしのみにて脳震盪の被害を蒙るにはいたらなかったのであるが、余の告訴に対し世人は挙げて余を罵倒したのである。
|
93
|
+
諸君はよく余の悲しみを計りうるであろう乎。
|
94
|
+
賢明にして正大なること太平洋の如き諸君よ。
|
95
|
+
諸君はこの悲痛なる椿事をも黙殺するであろう乎。
|
96
|
+
即ち彼は余の妻を寝取ったのである!
|
97
|
+
而して諸君、再び明敏なること触鬚の如き諸君よ。
|
98
|
+
余の妻は麗わしきこと高山植物の如く、実に単なる植物ではなかったのである!
|
99
|
+
ああ三度冷静なること扇風機の如き諸君よ、かの憎むべき蛸博士は何等の愛なくして余の妻を奪ったのである。
|
100
|
+
何となれば諸君、ああ諸君永遠に蛸なる動物に戦慄せよ、即ち余の妻はバスク生れの女性であった。
|
101
|
+
彼の女は余の研究を助くること、疑いもなく地の塩であったのである。
|
102
|
+
蛸博士はこの点に深く目をつけたのである。
|
103
|
+
ああ、千慮の一失である。
|
104
|
+
然り、千慮の一失である。
|
105
|
+
余は不覚にも、蛸博士の禿頭なる事実を余の妻に教えておかなかったのである。
|
106
|
+
そしてそのために不幸なる彼の女はついに蛸博士に籠絡せられたのである。
|
107
|
+
ここに於てか諸君、余は奮然|蹴起したのである。
|
108
|
+
打倒蛸!
|
109
|
+
蛸博士を葬れ、然り、膺懲せよ、憎むべき悪徳漢!
|
110
|
+
然り然り。
|
111
|
+
故に余は日夜その方策を練ったのである。
|
112
|
+
諸君はすでに、正当なる攻撃は一つとして彼の詭計に敵し難い所以を了解せられたに違いない。
|
113
|
+
而して今や、唯一策を地上に見出すのみである。
|
114
|
+
然り、ただ一策である。
|
115
|
+
故に余は深く決意をかため、鳥打帽に面体を隠してのち夜陰に乗じて彼の邸宅に忍び入ったのである。
|
116
|
+
長夜にわたって余は、錠前に関する凡そあらゆる研究書を読破しておいたのである。
|
117
|
+
そのために、余は空気の如く彼の寝室に侵入することが出来たのである。
|
118
|
+
そして諸君、余は何のたわいもなくかの憎むべき鬘を余の掌中に収めたのである。
|
119
|
+
諸君、目前に露出する無毛赤色の怪物を認めた時に、余は実に万感胸にせまり、溢れ出る涙を禁じ難かったのである。
|
120
|
+
諸君よ、翌日の夜明けを期して、かの憎むべき蛸はついに蛸自体の正体を遺憾なく暴露するに至るであろう!
|
121
|
+
余は躍る胸に鬘をひそめて、再び影の如く忍び出たのである。
|
122
|
+
しかるに諸君、ああ諸君、おお諸君、余は敗北したのである。
|
123
|
+
悪略神の如しとは之か。
|
124
|
+
ああ蛸は曲者の中の曲者である。
|
125
|
+
誰かよく彼の深謀遠慮を予測しうるであろう乎。
|
126
|
+
翌日彼の禿頭は再び鬘に隠されていたのである。
|
127
|
+
実に諸君、彼は秘かに別の鬘を貯蔵していたのである。
|
128
|
+
余は負けたり矣。
|
129
|
+
刀折れ矢尽きたり矣。
|
130
|
+
余の力を以てして、彼の悪略に及ばざることすでに明白なり矣。
|
131
|
+
諸氏よ、誰人かよく蛸を懲す勇士なきや。
|
132
|
+
蛸博士を葬れ!
|
133
|
+
彼を平なる地上より抹殺せよ!
|
134
|
+
諸君は正義を愛さざる乎!
|
135
|
+
ああ止むを得ん次第である。
|
136
|
+
しからば余の方より消え去ることにきめた。
|
137
|
+
ああ悲しいかな。
|
138
|
+
諸君は偉大なる同博士の遺書を読んで、どんなに深い感動を催されたであろうか?
|
139
|
+
そしてどんなに劇しい怒りを覚えられたであろうか?
|
140
|
+
僕にはよくお察しすることが出来るのである。
|
141
|
+
偉大なる風博士はかくて自殺したのである。
|
142
|
+
然り、偉大なる風博士は果して死んだのである。
|
143
|
+
極めて不可解な方法によって、そして屍体を残さない方法によって、それが行われたために、一部の人々はこれを怪しいと睨んだのである。
|
144
|
+
ああ僕は大変残念である。
|
145
|
+
それ故僕は唯一の目撃者として、偉大なる風博士の臨終をつぶさに述べたいと思うのである。
|
146
|
+
偉大なる博士は甚だ周章て者であったのである。
|
147
|
+
たとえば今、部屋の西南端に当る長椅子に腰懸けて一冊の書に読み耽っていると仮定するのである。
|
148
|
+
次の瞬間に、偉大なる博士は東北端の肱掛椅子に埋もれて、実にあわただしく頁をくっているのである。
|
149
|
+
又偉大なる博士は水を呑む場合に、突如コップを呑み込んでいるのである。
|
150
|
+
諸君はその時、実にあわただしい後悔と一緒に黄昏に似た沈黙がこの書斎に閉じ籠もるのを認められるに相違ない。
|
151
|
+
順って、このあわただしい風潮は、この部屋にある全ての物質を感化せしめずにおかなかったのである。
|
152
|
+
たとえば、時計はいそがしく十三時を打ち、礼節正しい来客がもじもじして腰を下そうとしない時に椅子は劇しい癇癪を鳴らし、物体の描く陰影は突如太陽に向って走り出すのである。
|
153
|
+
全てこれらの狼狽は極めて直線的な突風を描いて交錯する為に、部屋の中には何本もの飛ぶ矢に似た真空が閃光を散らして騒いでいる習慣であった。
|
154
|
+
時には部屋の中央に一陣の竜巻が彼自身も亦周章てふためいて湧き起ることもあったのである。
|
155
|
+
その刹那偉大なる博士は屡々この竜巻に巻きこまれて、拳を振りながら忙しく宙返りを打つのであった。
|
156
|
+
さて、事件の起った日は、丁度偉大なる博士の結婚式に相当していた。
|
157
|
+
花嫁は当年十七歳の大変美しい少女であった。
|
158
|
+
偉大なる博士が彼の女に目をつけたのは流石に偉大なる見識といわねばならない。
|
159
|
+
何となればこの少女は、街頭に立って花を売りながら、三日というもの一本の花も売れなかったにかかわらず、主として雲を眺め、時たまネオンサインを眺めたにすぎぬほど悲劇に対して無邪気であった。
|
160
|
+
偉大なる博士ならびに偉大なる博士等の描く旋風に対照して、これ程ふさわしい少女は稀にしか見当らないのである。
|
161
|
+
僕はこの幸福な結婚式を祝福して牧師の役をつとめ、同時に食卓給仕人となる約束であった。
|
162
|
+
僕は僕の書斎に祭壇をつくり花嫁と向き合せに端坐して偉大なる博士の来場を待ち構えていたのである。
|
163
|
+
そのうちに夜が明け放れたのである。
|
164
|
+
流石に花嫁は驚くような軽率はしなかったけれど、僕は内心穏かではなかったのである。
|
165
|
+
もしも偉大なる博士は間違えて外の人に結婚を申し込んでいるのかも知れない。
|
166
|
+
そしてその時どんな恥をかいて、地球一面にあわただしい旋風を巻き起すかも知れないのである。
|
167
|
+
僕は花嫁に理由を述べ、自動車をいそがせて恩師の書斎へ駆けつけた。
|
168
|
+
そして僕は深く安心したのである。
|
169
|
+
その時偉大なる博士は西南端の長椅子に埋もれて飽くことなく一書を貪り読んでいた。
|
170
|
+
そして、今、東北端の肱掛椅子から移転したばかりに相違ない証拠には、一陣の突風が東北から西南にかけて目に沁み渡る多くの矢を描きながら走っていたのである。
|
171
|
+
「先生約束の時間がすぎました」
|
172
|
+
僕はなるべく偉大なる博士を脅かさないように、特に静粛なポオズをとって口上を述べたのであるが、結果に於てそれは偉大なる博士を脅かすに充分であった。
|
173
|
+
なぜなら偉大なる博士は色は褪せていたけれど燕尾服を身にまとい、そのうえ膝頭にはシルクハットを載せて、大変立派なチューリップを胸のボタンにはさんでいたからである。
|
174
|
+
つまり偉大なる博士は深く結婚式を期待し、同時に深く結婚式を失念したに相違ない色々の条件を明示していた。
|
175
|
+
「POPOPO!」
|
176
|
+
偉大なる博士はシルクハットを被り直したのである。
|
177
|
+
そして数秒の間疑わしげに僕の顔を凝視めていたが、やがて失念していたものをありありと思い出した深い感動が表れたのであった。
|
178
|
+
「TATATATATAH!」
|
179
|
+
已にその瞬間、僕は鋭い叫び声をきいたのみで、偉大なる博士の姿は蹴飛ばされた扉の向う側に見失っていた。
|
180
|
+
僕はびっくりして追跡したのである。
|
181
|
+
そして奇蹟の起ったのは即ち丁度この瞬間であった。
|
182
|
+
偉大なる博士の姿は突然消え失せたのである。
|
183
|
+
諸君、開いた形跡のない戸口から、人間は絶対に出入しがたいものである。
|
184
|
+
順って偉大なる博士は外へ出なかったに相違ないのである。
|
185
|
+
そして偉大なる博士は邸宅の内部にも居なかったのである。
|
186
|
+
僕は階段の途中に凝縮して、まだ響き残っているその慌しい跫音を耳にしながら、ただ一陣の突風が階段の下に舞い狂うのを見たのみであった。
|
187
|
+
諸君、偉大なる博士は風となったのである。
|
188
|
+
果して風となったか?
|
189
|
+
然り、風となったのである。
|
190
|
+
何となればその姿が消え失せたではないか。
|
191
|
+
姿見えざるは之即ち風である乎?
|
192
|
+
然り、之即ち風である。
|
193
|
+
何となれば姿が見えないではない乎。
|
194
|
+
これ風以外の何物でもあり得ない。
|
195
|
+
風である。
|
196
|
+
然り風である風である風である。
|
197
|
+
諸氏は尚、この明白なる事実を疑るのであろうか。
|
198
|
+
それは大変残念である。
|
199
|
+
それでは僕は、さらに動かすべからざる科学的根拠を附け加えよう。
|
200
|
+
この日、かの憎むべき蛸博士は、恰もこの同じ瞬間に於て、インフルエンザに犯されたのである。
|
201
|
+
CONTENTS
|
202
|
+
lines.each do |line|
|
203
|
+
@sentence_map[line.size] << line
|
204
|
+
end
|
205
|
+
end
|
206
|
+
end
|
207
|
+
end
|
208
|
+
|
209
|
+
# register :kazehakase as word resource
|
210
|
+
::YaLoremJa::Kazehakase.register(:kazehakase)
|
@@ -0,0 +1,161 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
module YaLoremJa
|
3
|
+
|
4
|
+
##
|
5
|
+
# manage word resources
|
6
|
+
module WordResources
|
7
|
+
class << self
|
8
|
+
##
|
9
|
+
# retrun repository of word resource
|
10
|
+
def resource
|
11
|
+
@resource ||= { }
|
12
|
+
end
|
13
|
+
|
14
|
+
##
|
15
|
+
# register word resource
|
16
|
+
# @param [Symbol] name name of word resource
|
17
|
+
# @param [Class] namespace class of word resource
|
18
|
+
def register(name, namespace)
|
19
|
+
if resource.key?(name)
|
20
|
+
return
|
21
|
+
end
|
22
|
+
resource[name.to_sym] = namespace
|
23
|
+
end
|
24
|
+
|
25
|
+
##
|
26
|
+
# create a instance of word resource
|
27
|
+
# @param [Symbol] name name of word resource
|
28
|
+
# @param [Range] char_count_range range of character count in a word
|
29
|
+
# @param [Range] word_count_range range of word count in sentence
|
30
|
+
# @param [Range] sentence_count_range renage of sentence count in paragraph
|
31
|
+
# @return [WordResource] instance of word resource
|
32
|
+
def load(name, char_count_range, word_count_range, sentence_count_range)
|
33
|
+
kls = resource[name.to_sym]
|
34
|
+
unless kls
|
35
|
+
return nil
|
36
|
+
end
|
37
|
+
return kls.new(char_count_range, word_count_range, sentence_count_range)
|
38
|
+
end
|
39
|
+
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
##
|
44
|
+
# base class of word resource
|
45
|
+
class WordResource
|
46
|
+
|
47
|
+
##
|
48
|
+
# default line break character of sentence of paragraph
|
49
|
+
DEFAULT_LINE_BREAK = "\n"
|
50
|
+
|
51
|
+
attr_reader :sentence_end_chars, :sentence_map, :char_count_range_in_a_word, :word_count_range_in_a_sentence, :sentence_count_range_in_a_paragraph
|
52
|
+
attr_accessor :line_break
|
53
|
+
|
54
|
+
##
|
55
|
+
# @param [Range] char_count_range range of character count in a word
|
56
|
+
# @param [Range] word_count_range range of word count in sentence
|
57
|
+
# @param [Range] sentence_count_range renage of sentence count in paragraph
|
58
|
+
def initialize(char_count_range, word_count_range, sentence_count_range)
|
59
|
+
# 単語の文字数範囲の設定
|
60
|
+
@char_count_range_in_a_word = char_count_range
|
61
|
+
# 文の単語数範囲の設定
|
62
|
+
@word_count_range_in_a_sentence = word_count_range
|
63
|
+
# 段落の文数範囲の設定
|
64
|
+
@sentence_count_range_in_a_paragraph = sentence_count_range
|
65
|
+
# 改行文字
|
66
|
+
@line_break = DEFAULT_LINE_BREAK
|
67
|
+
end
|
68
|
+
|
69
|
+
def sentence_map_keys
|
70
|
+
@sentence_map_keys ||= sentence_map.keys.sort.reverse
|
71
|
+
end
|
72
|
+
|
73
|
+
##
|
74
|
+
# return a random word from word resource
|
75
|
+
# @return [String] word
|
76
|
+
def word
|
77
|
+
words(1)
|
78
|
+
end
|
79
|
+
|
80
|
+
##
|
81
|
+
# return rondom words from word resource
|
82
|
+
#
|
83
|
+
# @param [Fixnum] total count of word
|
84
|
+
# @return [String] words
|
85
|
+
def words(num_of_word)
|
86
|
+
target_len = num_of_word.times.inject(0){ |sum| sum + rand(@char_count_range_in_a_word) }
|
87
|
+
sentence_key = bsearch(sentence_map_keys, target_len)
|
88
|
+
unless sentence_key
|
89
|
+
sentence_key = sentence_map.keys.min
|
90
|
+
end
|
91
|
+
wk_word = sentence_map[sentence_key].sample
|
92
|
+
return wk_word.sub(/[#{ sentence_end_chars.join() }]$/, "")
|
93
|
+
end
|
94
|
+
|
95
|
+
##
|
96
|
+
# return a random sentence from word resource
|
97
|
+
# @return [String] sentence
|
98
|
+
def sentence
|
99
|
+
sentences(1)
|
100
|
+
end
|
101
|
+
|
102
|
+
##
|
103
|
+
# return rondom sentences from word resource
|
104
|
+
#
|
105
|
+
# @param [Fixnum] total count of sentence
|
106
|
+
# @return [String] words
|
107
|
+
def sentences(total)
|
108
|
+
list = []
|
109
|
+
total.times do
|
110
|
+
word_count = rand(word_count_range_in_a_sentence)
|
111
|
+
sentence_len = word_count.times.inject(0){ |sum| sum + rand(char_count_range_in_a_word) }
|
112
|
+
sentence_key = bsearch(sentence_map_keys, sentence_len)
|
113
|
+
unless sentence_key
|
114
|
+
sentence_key = sentence_map.keys.min
|
115
|
+
end
|
116
|
+
list << sentence_map[sentence_key].sample
|
117
|
+
end
|
118
|
+
return list.join(@line_break)
|
119
|
+
end
|
120
|
+
|
121
|
+
##
|
122
|
+
# return a random paragraph from word resource
|
123
|
+
# @return [String] sentence
|
124
|
+
def paragraph
|
125
|
+
paragraphs(1)
|
126
|
+
end
|
127
|
+
|
128
|
+
##
|
129
|
+
# return random paragraphs from word resource
|
130
|
+
# @param [Fixnum] total count of paragraph
|
131
|
+
# @return [String] paragraph
|
132
|
+
def paragraphs(total)
|
133
|
+
list = []
|
134
|
+
total.times do
|
135
|
+
sentence_count = rand(sentence_count_range_in_a_paragraph)
|
136
|
+
list << self.sentences(sentence_count)
|
137
|
+
end
|
138
|
+
return list.join(@line_break * 2)
|
139
|
+
end
|
140
|
+
|
141
|
+
private
|
142
|
+
|
143
|
+
def bsearch(array, val)
|
144
|
+
if array.respond_to?(:bsearch)
|
145
|
+
return array.bsearch{ |elm| elm <= val }
|
146
|
+
else
|
147
|
+
return array.find{ |elm| elm <= val }
|
148
|
+
end
|
149
|
+
end
|
150
|
+
|
151
|
+
class << self
|
152
|
+
##
|
153
|
+
# register word resource
|
154
|
+
def register(resource_name)
|
155
|
+
::YaLoremJa::WordResources.register(resource_name, self)
|
156
|
+
end
|
157
|
+
end
|
158
|
+
end
|
159
|
+
|
160
|
+
|
161
|
+
end
|
data/lib/ya_lorem_ja.rb
ADDED
@@ -0,0 +1,114 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
require "ya_lorem_ja/version"
|
3
|
+
require 'ya_lorem_ja/word_resource'
|
4
|
+
require 'ya_lorem_ja/resources/kazehakase'
|
5
|
+
|
6
|
+
|
7
|
+
##
|
8
|
+
# Yet Anothoer Japanese Lorem
|
9
|
+
#
|
10
|
+
module YaLoremJa
|
11
|
+
##
|
12
|
+
# Japanese Lorem
|
13
|
+
class Lorem
|
14
|
+
attr_reader :resource_name
|
15
|
+
|
16
|
+
##
|
17
|
+
# @param [Symbol] resource_name name of word resource
|
18
|
+
# @param [Range] char_count_range range of character count in a word
|
19
|
+
# @param [Range] word_count_range range of word count in sentence
|
20
|
+
# @param [Range] sentence_count_range renage of sentence count in paragraph
|
21
|
+
#
|
22
|
+
def initialize(resource_name=:kazehakase, char_count_range=2..6, word_count_range=6..20, sentence_count_range=2..5)
|
23
|
+
@resource_name = resource_name
|
24
|
+
# 文章辞書の読み込み
|
25
|
+
@resource = ::YaLoremJa::WordResources.load(resource_name, char_count_range, word_count_range, sentence_count_range)
|
26
|
+
end
|
27
|
+
|
28
|
+
##
|
29
|
+
# @return [Range] range of character count in a word
|
30
|
+
def char_count_range
|
31
|
+
return @resource.char_count_range_in_a_word
|
32
|
+
end
|
33
|
+
|
34
|
+
##
|
35
|
+
# @return [Range] range of word count in a sentence
|
36
|
+
def word_count_range
|
37
|
+
return @resource.word_count_range_in_a_sentence
|
38
|
+
end
|
39
|
+
|
40
|
+
##
|
41
|
+
# @return [Range] range of sentence count in a paragraph
|
42
|
+
def sentence_count_range
|
43
|
+
return @resource.sentence_count_range_in_a_paragraph
|
44
|
+
end
|
45
|
+
|
46
|
+
##
|
47
|
+
# @return [Array] return sentence end chars
|
48
|
+
def sentence_end_chars
|
49
|
+
return @resource.sentence_end_chars
|
50
|
+
end
|
51
|
+
|
52
|
+
##
|
53
|
+
# set line break character
|
54
|
+
# @param [String] char line break character
|
55
|
+
def line_break=(char)
|
56
|
+
@resource.line_break = char
|
57
|
+
end
|
58
|
+
|
59
|
+
##
|
60
|
+
# @return [String] line break character
|
61
|
+
def line_break
|
62
|
+
@resource.line_break
|
63
|
+
end
|
64
|
+
|
65
|
+
##
|
66
|
+
# return a random word from word resource
|
67
|
+
# @return [String] word
|
68
|
+
def word
|
69
|
+
# 1単語返却
|
70
|
+
@resource.word
|
71
|
+
end
|
72
|
+
|
73
|
+
##
|
74
|
+
# return rondom words from word resource
|
75
|
+
#
|
76
|
+
# @param [Fixnum] total count of word
|
77
|
+
# @return [String] words
|
78
|
+
def words(total)
|
79
|
+
@resource.words(total)
|
80
|
+
end
|
81
|
+
|
82
|
+
##
|
83
|
+
# return a random sentence from word resource
|
84
|
+
# @return [String] sentence
|
85
|
+
def sentence
|
86
|
+
@resource.sentence
|
87
|
+
end
|
88
|
+
|
89
|
+
##
|
90
|
+
# return rondom sentences from word resource
|
91
|
+
#
|
92
|
+
# @param [Fixnum] total count of sentence
|
93
|
+
# @return [String] words
|
94
|
+
def sentences(total)
|
95
|
+
@resource.sentences(total)
|
96
|
+
end
|
97
|
+
|
98
|
+
##
|
99
|
+
# return a random paragraph from word resource
|
100
|
+
# @return [String] sentence
|
101
|
+
def paragraph
|
102
|
+
@resource.paragraph
|
103
|
+
end
|
104
|
+
|
105
|
+
##
|
106
|
+
# return random paragraphs from word resource
|
107
|
+
# @param [Fixnum] total count of paragraph
|
108
|
+
# @return [String] paragraph
|
109
|
+
def paragraphs(total)
|
110
|
+
@resource.paragraphs(total)
|
111
|
+
end
|
112
|
+
|
113
|
+
end
|
114
|
+
end
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,94 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
require 'spec_helper'
|
3
|
+
|
4
|
+
describe YaLoremJa do
|
5
|
+
it 'should have a version number' do
|
6
|
+
expect(YaLoremJa::VERSION).not_to be_nil
|
7
|
+
end
|
8
|
+
|
9
|
+
it 'インスタンスを生成できること' do
|
10
|
+
lorem = YaLoremJa::Lorem.new
|
11
|
+
expect(lorem).not_to be_nil
|
12
|
+
end
|
13
|
+
|
14
|
+
it '1語を取得できること' do
|
15
|
+
lorem = YaLoremJa::Lorem.new
|
16
|
+
a_word = lorem.word
|
17
|
+
puts a_word
|
18
|
+
expect(a_word.size).to be <= lorem.char_count_range.max
|
19
|
+
end
|
20
|
+
|
21
|
+
it '2語を取得できること' do
|
22
|
+
lorem = YaLoremJa::Lorem.new
|
23
|
+
words = lorem.words(2)
|
24
|
+
puts words
|
25
|
+
expect(words.size).to be <= (lorem.char_count_range.max * 2)
|
26
|
+
end
|
27
|
+
|
28
|
+
it '10語を取得できること' do
|
29
|
+
lorem = YaLoremJa::Lorem.new
|
30
|
+
words = lorem.words(10)
|
31
|
+
puts words
|
32
|
+
expect(words.size).to be <= (lorem.char_count_range.max * 10)
|
33
|
+
end
|
34
|
+
|
35
|
+
it 'デフォルト改行文字は\nであること' do
|
36
|
+
lorem = YaLoremJa::Lorem.new
|
37
|
+
expect(lorem.line_break).to be == "\n"
|
38
|
+
end
|
39
|
+
|
40
|
+
it '1文を取得できること' do
|
41
|
+
lorem = YaLoremJa::Lorem.new
|
42
|
+
a_sentence = lorem.sentence
|
43
|
+
puts a_sentence
|
44
|
+
expect(a_sentence.size).to be <= (lorem.word_count_range.max * lorem.char_count_range.max)
|
45
|
+
end
|
46
|
+
|
47
|
+
it '3文を取得できること' do
|
48
|
+
lorem = YaLoremJa::Lorem.new
|
49
|
+
sentences = lorem.sentences(3)
|
50
|
+
puts sentences
|
51
|
+
expect(sentences.split("\n").count).to be == 3
|
52
|
+
end
|
53
|
+
|
54
|
+
it '1段落を取得できること' do
|
55
|
+
lorem = YaLoremJa::Lorem.new
|
56
|
+
a_para = lorem.paragraph
|
57
|
+
expect(a_para).not_to be_nil
|
58
|
+
puts a_para
|
59
|
+
expect(a_para.split(/\n{1}/).count).to be >= lorem.sentence_count_range.min
|
60
|
+
end
|
61
|
+
|
62
|
+
it '3段落を取得できること' do
|
63
|
+
lorem = YaLoremJa::Lorem.new
|
64
|
+
paras = lorem.paragraphs(3)
|
65
|
+
expect(paras).not_to be_nil
|
66
|
+
puts paras
|
67
|
+
expect(paras.split(/\n{2}/).count).to be == 3
|
68
|
+
paras.split(/\n{2}/).each do |a_para|
|
69
|
+
expect(a_para.split(/\n{1}/).count).to be >= lorem.sentence_count_range.min
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
it '改行文字を変更時、文の改行文字も変更されること' do
|
74
|
+
lorem = YaLoremJa::Lorem.new
|
75
|
+
lorem.line_break = "\r\n"
|
76
|
+
sentences = lorem.sentences(3)
|
77
|
+
p sentences
|
78
|
+
expect(sentences.split("\r\n").count).to be == 3
|
79
|
+
end
|
80
|
+
|
81
|
+
it '改行文字を変更時、段落の改行文字も変更されること' do
|
82
|
+
lorem = YaLoremJa::Lorem.new
|
83
|
+
lorem.line_break = "\r\n"
|
84
|
+
paras = lorem.paragraphs(3)
|
85
|
+
expect(paras).not_to be_nil
|
86
|
+
p paras
|
87
|
+
expect(paras.split("\r\n"*2).count).to be == 3
|
88
|
+
paras.split("\r\n"*2).each do |a_para|
|
89
|
+
expect(a_para.split("\r\n").count).to be >= lorem.sentence_count_range.min
|
90
|
+
end
|
91
|
+
|
92
|
+
end
|
93
|
+
|
94
|
+
end
|
data/ya_lorem_ja.gemspec
ADDED
@@ -0,0 +1,24 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require 'ya_lorem_ja/version'
|
5
|
+
|
6
|
+
Gem::Specification.new do |spec|
|
7
|
+
spec.name = "ya_lorem_ja"
|
8
|
+
spec.version = YaLoremJa::VERSION
|
9
|
+
spec.authors = ["kenji tanaka"]
|
10
|
+
#spec.email = ["tanalab2@gmail.com"]
|
11
|
+
spec.description = %q{Yet Another Japanese Lorem Ipsum generator}
|
12
|
+
spec.summary = %q{Yet Another Japanese Lorem Ipsum generator}
|
13
|
+
spec.homepage = "https://github.com/tanalab2/ya_lorem_ja"
|
14
|
+
spec.license = "MIT"
|
15
|
+
|
16
|
+
spec.files = `git ls-files`.split($/)
|
17
|
+
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
18
|
+
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
19
|
+
spec.require_paths = ["lib"]
|
20
|
+
|
21
|
+
spec.add_development_dependency "bundler", "~> 1.3"
|
22
|
+
spec.add_development_dependency "rake"
|
23
|
+
spec.add_development_dependency "rspec"
|
24
|
+
end
|
metadata
ADDED
@@ -0,0 +1,101 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: ya_lorem_ja
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- kenji tanaka
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2015-08-04 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: bundler
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '1.3'
|
20
|
+
type: :development
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '1.3'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: rake
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ">="
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: rspec
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ">="
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ">="
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
55
|
+
description: Yet Another Japanese Lorem Ipsum generator
|
56
|
+
email:
|
57
|
+
executables: []
|
58
|
+
extensions: []
|
59
|
+
extra_rdoc_files: []
|
60
|
+
files:
|
61
|
+
- ".gitignore"
|
62
|
+
- ".rspec"
|
63
|
+
- Gemfile
|
64
|
+
- LICENSE.txt
|
65
|
+
- README.md
|
66
|
+
- Rakefile
|
67
|
+
- lib/ya_lorem_ja.rb
|
68
|
+
- lib/ya_lorem_ja/resources/kazehakase.rb
|
69
|
+
- lib/ya_lorem_ja/version.rb
|
70
|
+
- lib/ya_lorem_ja/word_resource.rb
|
71
|
+
- spec/spec_helper.rb
|
72
|
+
- spec/ya_lorem_ja_spec.rb
|
73
|
+
- ya_lorem_ja.gemspec
|
74
|
+
homepage: https://github.com/tanalab2/ya_lorem_ja
|
75
|
+
licenses:
|
76
|
+
- MIT
|
77
|
+
metadata: {}
|
78
|
+
post_install_message:
|
79
|
+
rdoc_options: []
|
80
|
+
require_paths:
|
81
|
+
- lib
|
82
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
83
|
+
requirements:
|
84
|
+
- - ">="
|
85
|
+
- !ruby/object:Gem::Version
|
86
|
+
version: '0'
|
87
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
88
|
+
requirements:
|
89
|
+
- - ">="
|
90
|
+
- !ruby/object:Gem::Version
|
91
|
+
version: '0'
|
92
|
+
requirements: []
|
93
|
+
rubyforge_project:
|
94
|
+
rubygems_version: 2.2.2
|
95
|
+
signing_key:
|
96
|
+
specification_version: 4
|
97
|
+
summary: Yet Another Japanese Lorem Ipsum generator
|
98
|
+
test_files:
|
99
|
+
- spec/spec_helper.rb
|
100
|
+
- spec/ya_lorem_ja_spec.rb
|
101
|
+
has_rdoc:
|