ya_lorem_ja 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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
@@ -0,0 +1,17 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ Gemfile.lock
7
+ InstalledFiles
8
+ _yardoc
9
+ coverage
10
+ doc/
11
+ lib/bundler/man
12
+ pkg
13
+ rdoc
14
+ spec/reports
15
+ test/tmp
16
+ test/version_tmp
17
+ tmp
data/.rspec ADDED
@@ -0,0 +1,2 @@
1
+ --format documentation
2
+ --color
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in ya_lorem_ja.gemspec
4
+ gemspec
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,6 @@
1
+ require "bundler/gem_tasks"
2
+ require "rspec/core/rake_task"
3
+
4
+ RSpec::Core::RakeTask.new(:spec)
5
+
6
+ task :default => :spec
@@ -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,5 @@
1
+ module YaLoremJa
2
+ ##
3
+ # version
4
+ VERSION = "0.0.1"
5
+ end
@@ -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
@@ -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
@@ -0,0 +1,2 @@
1
+ $LOAD_PATH.unshift File.expand_path('../../lib', __FILE__)
2
+ require 'ya_lorem_ja'
@@ -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
@@ -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: