1package Text::Greeking::zh_TW;
2use common::sense 2.02;
3use 5.008;
4use utf8;
5
6use List::Util qw(shuffle);
7
8our $VERSION = '1.0';
9
10sub new {
11    my $class =shift;
12    my $self = bless {}, $class;
13    srand;
14    $self->init;
15}
16
17sub init {
18    $_[0]->paragraphs(2,8);
19    $_[0]->sentences(2,8);
20    $_[0]->words(5,15);
21    $_[0];
22}
23
24sub paragraphs { $_[0]->{paragraphs} = [ $_[1], $_[2] ] }
25sub sentences { $_[0]->{sentences} = [ $_[1], $_[2] ] }
26sub words { $_[0]->{words} = [ $_[1], $_[2] ] }
27
28sub generate {
29    my $self = shift;
30    my($paramin,$paramax) = @{$self->{paragraphs}};
31    my($sentmin,$sentmax) = @{$self->{sentences}};
32    my $pcount = int(rand($paramax-$paramin+1)+$paramin);
33    my $out = "";
34    for (my $x=0; $x < $pcount; $x++) {
35        my $scount = int(rand($sentmax-$sentmin+1)+$sentmin);
36        for (my $y=0; $y < $scount; $y++) {
37            $out .= random_sentence();
38        }
39        $out .= "\n\n";
40    }
41    $out;
42}
43
44sub _generate {
45    my $template = corpus();
46    $template =~ s{ \p{Han} }{ random_word() }xegs;
47    return $template;
48}
49
50{
51    my @han = ();
52    sub random_word {
53        unless (@han) {
54            my @char = split "", corpus();
55            @han = shuffle grep /\p{Han}/, @char;
56        }
57        shift @han
58    }
59
60    my @text = ();
61    sub random_paragraph {
62        unless (@text) {
63            @text = shuffle split /\n+/, _generate();
64        }
65        shift @text;
66    }
67
68    my @sentence = ();
69    sub random_sentence {
70        unless (@sentence) {
71            @sentence = split /。|?/, random_paragraph()
72        }
73        (shift(@sentence) || random_sentence() ) . random_punct();
74    }
75
76    sub random_punct {
77        my $r = int(rand(20));
78        if ($r == 1) {
79            "!"
80        }
81        elsif ($r == 2) {
82            "?"
83        }
84        else {
85            "。"
86        }
87
88    }
89}
90
91my $corpus;
92sub add_source {
93    my ($self, $source) = @_;
94    if (ref $source) {
95        warn "err - source sould be a scalar.";
96        return;
97    }
98
99    $corpus .= $source;
100    return $self;
101}
102
103# lukhnos.org
104sub corpus {
105    if ($corpus) {
106        return $corpus;
107    } else {
108        return <<CORPUS;
109
110她終於有勇氣重新開箱,拾出當年所封存的那些記憶。只不過那也是最後一次,那些記憶在開箱之後,不再散發香水的味道;所拾出的東西,也就直接進了垃圾袋。
111
112她看著垃圾車的壓縮機輾壓過那些她曾經珍惜過的曾經,然後看著垃圾車駛離。「就這樣,」她想。
113
114因為那一年某堂粗淺的人類學課程,讓她心生一計,開始買一個又一個的箱子,把那些碰觸不得的潰爛和難堪,給一一封存起來。離別的痛苦,伴隨著的是碰不得的屍體:生存與死亡的界限,生食與熟食,潔淨與塵垢。葬禮與守喪的時間延遞,是一種轉化的過程:當不潔的屍身再度化為了塵土,不可碰觸的終將化為了無所謂的──可以如清掃家門般將之一掃而出。
115
116她花了整整一年的時間,把那些曾經有過的曾經給一一打包、整理、刷洗、更衣,她一邊整理一邊自言自語,哪些是她的初次、她的愚念、她的痴心、她的自甘墮落。來來往往這麼多年,她必須精心計算,購足相當數量的箱子、膠布、標籤紙,那些不可能再穿的衣服也得一一送洗、折疊、包裝。她編目,用圖書館員的耐心一一貼上標籤,空出架位,測量每件物品的大小──用了一半的香水瓶、一件毛衣、一本書、一張大頭照、一張小紙條、兩片CD、一盒太陽眼鏡…… 曾經她一度想將之一一整理販售,但是想到這世界之小,這些物品未來的主人將來說不定碰到原主,或者就只是那些人會在拍賣網站上看到。她雖然復仇心重,卻還是對散心大拍賣這種事有所保留。
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
142CORPUS
143    }
144}
145
1461; # Magic true value required at end of module
147__END__
148
149=head1 NAME
150
151Text::Greeking::zh_TW - A module for generating meaningless Chinese text that creates the illusion of the finished document.
152
153=head1 SYNOPSIS
154
155  my $g = Text::Greeking::zh_TW->new;
156  $g->paragraphs(3,15); # min of 1 paragraph and a max of 2
157  $g->sentences(1,10);  # min of 2 sentences per paragraph and a max of 5
158  $g->add_source($scalar); # use text yourself, not requisite
159  print $g->generate;
160
161=head1 DESCRIPTION
162
163This module is for Chinese speakers to generate vary meanless Chinese text.
164
165=head1 INTERFACE
166
167=over
168
169=item new()
170
171Constructor.
172
173=item paragraphs($min, $max)
174
175Sets the minimum and maximum number of paragraphs to generate. Default is a minimum of 2 and a maximum of 8.
176
177=item sentences($min, $max)
178
179Sets the minimum and maximum number of sentences to generate per paragraph. Default is a minimum of 2 and a maximum of 8.
180
181=item generate
182
183Returns a body of random text generated from a randomly selected source using the minimum and maximum values set by paragraphs, sentences, and words minimum and maximum values. If generate is called without any sources a standard Lorem Ipsum block is used added to the sources and then used for processing the random text.
184
185=item add_source($scalar)
186
187Add text of yourself as corpus. Return instance itself, so we can add source serially.
188
189    $g->add_source($source_one)->add_source($source_two);
190
191=back
192
193=head1 SEE ALSO
194
195L<http://en.wikipedia.org/wiki/Greeking>
196
197=head1 DEPENDENCIES
198
199None.
200
201=head1 INCOMPATIBILITIES
202
203None reported.
204
205=head1 BUGS AND LIMITATIONS
206
207No bugs have been reported.
208
209Please report any bugs or feature requests to
210C<bug-text-greeking-zh_tw@rt.cpan.org>, or through the web interface at
211L<http://rt.cpan.org>.
212
213
214=head1 AUTHORS
215
216Lukhnos D. Liu C<< <lukhnos@gmail.com> >>, Kang-min Liu  C<< <gugod@gugod.org> >>
217
218
219=head1 LICENCE AND COPYRIGHT
220
221Copyright (c) 2007, 2008, 2009 Kang-min Liu C<< <gugod@gugod.org> >>, Lukhnos D. Liu C<< <lukhnos@gmail.com> >>.
222
223This module is free software; you can redistribute it and/or
224modify it under the same terms as Perl itself. See L<perlartistic>.
225
226=head1 DISCLAIMER OF WARRANTY
227
228BECAUSE THIS SOFTWARE IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
229FOR THE SOFTWARE, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
230OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
231PROVIDE THE SOFTWARE "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER
232EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
233WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE
234ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE SOFTWARE IS WITH
235YOU. SHOULD THE SOFTWARE PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL
236NECESSARY SERVICING, REPAIR, OR CORRECTION.
237
238IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
239WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
240REDISTRIBUTE THE SOFTWARE AS PERMITTED BY THE ABOVE LICENCE, BE
241LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL,
242OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE
243THE SOFTWARE (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
244RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
245FAILURE OF THE SOFTWARE TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
246SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
247SUCH DAMAGES.
248