blib/lib/Text/Livedoor/Wiki.pm | |||
---|---|---|---|
Criterion | Covered | Total | % |
statement | 79 | 79 | 100.0 |
branch | 10 | 10 | 100.0 |
condition | 10 | 10 | 100.0 |
subroutine | 14 | 14 | 100.0 |
pod | 3 | 3 | 100.0 |
total | 116 | 116 | 100.0 |
line | stmt | bran | cond | sub | pod | time | code |
---|---|---|---|---|---|---|---|
1 | package Text::Livedoor::Wiki; | ||||||
2 | |||||||
3 | 10 | 10 | 589203 | use warnings; | |||
10 | 23 | ||||||
10 | 282 | ||||||
4 | 10 | 10 | 52 | use strict; | |||
10 | 18 | ||||||
10 | 314 | ||||||
5 | 10 | 10 | 54 | use Scalar::Util; | |||
10 | 21 | ||||||
10 | 651 | ||||||
6 | 10 | 10 | 11466 | use Text::Livedoor::Wiki::Block; | |||
10 | 29 | ||||||
10 | 140 | ||||||
7 | 10 | 10 | 7065 | use Text::Livedoor::Wiki::CatalogKeeper; | |||
10 | 28 | ||||||
10 | 121 | ||||||
8 | 10 | 10 | 6253 | use Text::Livedoor::Wiki::Function; | |||
10 | 28 | ||||||
10 | 112 | ||||||
9 | 10 | 10 | 5970 | use Text::Livedoor::Wiki::IDKeeper; | |||
10 | 30 | ||||||
10 | 110 | ||||||
10 | 10 | 10 | 6412 | use Text::Livedoor::Wiki::Inline; | |||
10 | 30 | ||||||
10 | 119 | ||||||
11 | 10 | 10 | 6133 | use Text::Livedoor::Wiki::Plugin; | |||
10 | 34 | ||||||
10 | 151 | ||||||
12 | |||||||
13 | our $VERSION ='0.02'; | ||||||
14 | |||||||
15 | # Everybody can not be happy but I am happy. | ||||||
16 | sub new { | ||||||
17 | 9 | 9 | 1 | 2444 | my $class = shift; | ||
18 | 9 | 100 | 52 | my $self = shift || {}; | |||
19 | # * god bless you | ||||||
20 | 9 | 30 | $self = bless $self, $class; | ||||
21 | |||||||
22 | # * initialize args | ||||||
23 | 9 | 100 | 107 | my $block_plugins = $self->{block_plugins} ? $self->{block_plugins} : Text::Livedoor::Wiki::Plugin->block_plugins; | |||
24 | 9 | 100 | 92 | my $inline_plugins = $self->{inline_plugins} ? $self->{inline_plugins} : Text::Livedoor::Wiki::Plugin->inline_plugins; | |||
25 | 9 | 100 | 93 | my $function_plugins= $self->{function_plugins} ? $self->{function_plugins} : Text::Livedoor::Wiki::Plugin->function_plugins; | |||
26 | 9 | 100 | 71 | my $on_mobile = $self->{on_mobile} || 0; | |||
27 | |||||||
28 | # * creating parser objects | ||||||
29 | 9 | 124 | my $function = Text::Livedoor::Wiki::Function->new( { plugins => $function_plugins , on_mobile => $on_mobile } ); | ||||
30 | |||||||
31 | 9 | 111 | $self->{inline} | ||||
32 | = Text::Livedoor::Wiki::Inline->new({ | ||||||
33 | plugins => $inline_plugins, | ||||||
34 | function => $function, | ||||||
35 | on_mobile => $on_mobile | ||||||
36 | }); | ||||||
37 | |||||||
38 | # nobody likes memory leak. | ||||||
39 | 9 | 65 | Scalar::Util::weaken($self->{inline}); | ||||
40 | |||||||
41 | 9 | 131 | $self->{block} | ||||
42 | = Text::Livedoor::Wiki::Block->new({ | ||||||
43 | block_plugins => $block_plugins , | ||||||
44 | inline => $self->{inline} , | ||||||
45 | on_mobile => $on_mobile | ||||||
46 | }); | ||||||
47 | |||||||
48 | |||||||
49 | # default options | ||||||
50 | 9 | 100 | 71 | $self->{opts} ||= {}; | |||
51 | 9 | 73 | return $self; | ||||
52 | } | ||||||
53 | |||||||
54 | 87 | 87 | 1 | 199 | sub opts { $Text::Livedoor::Wiki::opts } | ||
55 | |||||||
56 | sub parse { | ||||||
57 | 92 | 92 | 1 | 297921 | my $self = shift; | ||
58 | 92 | 271 | my $text = shift; | ||||
59 | 92 | 100 | 646 | my $opts = shift || {}; | |||
60 | 92 | 232 | %$opts = ( %{$self->{opts}}, %$opts ); | ||||
92 | 574 | ||||||
61 | |||||||
62 | 92 | 443 | my $want_pos = delete $opts->{want_pos} ; | ||||
63 | # * creating scrathpad and options which scorpe is only for this parse() , so that this module can be as a Singleton. | ||||||
64 | 92 | 100 | 626 | $opts->{name} = $opts->{name} || 'content'; | |||
65 | 92 | 821 | my $id_keeper = Text::Livedoor::Wiki::IDKeeper->new({ name => $opts->{name} } ); | ||||
66 | 92 | 801 | my $catalog_keeper = Text::Livedoor::Wiki::CatalogKeeper->new(); | ||||
67 | 92 | 269 | local $Text::Livedoor::Wiki::scratchpad = {}; | ||||
68 | 92 | 624 | local $Text::Livedoor::Wiki::opts = { id_keeper => $id_keeper , catalog_keeper => $catalog_keeper , %$opts }; | ||||
69 | 92 | 692 | $Text::Livedoor::Wiki::scratchpad->{core}{block_uid} = 0; | ||||
70 | 92 | 288 | $Text::Livedoor::Wiki::scratchpad->{core}{inline_uid} = 0; | ||||
71 | 92 | 566 | $Text::Livedoor::Wiki::scratchpad->{core}{block_trigger} = $self->{block}->trigger ; | ||||
72 | 92 | 270 | $Text::Livedoor::Wiki::scratchpad->{core}{current_pos} = 0; | ||||
73 | |||||||
74 | 92 | 323 | $self->_init_text( \$text ); | ||||
75 | 92 | 1397 | my $html = $self->{block}->parse( $text ); | ||||
76 | 90 | 588 | $html .= $self->{block}->footer_section(); | ||||
77 | |||||||
78 | 90 | 100 | 336 | if( $want_pos ) { | |||
79 | 3 | 64 | return $Text::Livedoor::Wiki::scratchpad->{core}{h3pos}; | ||||
80 | } | ||||||
81 | else { | ||||||
82 | 87 | 5117 | return $self->_build( $html ); | ||||
83 | } | ||||||
84 | } | ||||||
85 | |||||||
86 | sub _init_text() { | ||||||
87 | 92 | 92 | 188 | my $self = shift; | |||
88 | 92 | 165 | my $text = shift; | ||||
89 | 92 | 585 | $$text =~ s/\r//g; | ||||
90 | 92 | 458 | $$text =~ s/\n$//; | ||||
91 | } | ||||||
92 | sub _build { | ||||||
93 | 87 | 87 | 157 | my $self = shift; | |||
94 | 87 | 240 | my $sections = shift; | ||||
95 | 87 | 260 | my $opts = $self->opts; | ||||
96 | |||||||
97 | 87 | 320 | $sections =~ s/ \n$/\n/; |
||||
98 | # TODO customize class name | ||||||
99 | # * build sections | ||||||
100 | 87 | 185 | my $html = qq| \n|; |
||||
101 | 87 | 316 | $html .= $sections; | ||||
102 | 87 | 178 | $html .= qq|\n|; | ||||
103 | |||||||
104 | # * build contents | ||||||
105 | 87 | 100 | 294 | if( !$self->{on_mobile} ) { | |||
106 | 76 | 283 | my $catalog_keeper = $opts->{catalog_keeper}; | ||||
107 | 76 | 389 | my $contents = $catalog_keeper->contents(); | ||||
108 | 76 | 312 | $html =~ s/\n#contents/\n$contents\n/g; | ||||
109 | } | ||||||
110 | else { | ||||||
111 | 11 | 56 | $html =~ s/\n#contents \n/\n/g; |
||||
112 | } | ||||||
113 | |||||||
114 | 87 | 6499 | return $html; | ||||
115 | |||||||
116 | } | ||||||
117 | |||||||
118 | |||||||
119 | 1; | ||||||
120 | |||||||
121 | =head1 NAME | ||||||
122 | |||||||
123 | Text::Livedoor::Wiki - Perl extension for formatting text with livedoor Wiki Style. | ||||||
124 | |||||||
125 | =head1 SYNOPSIS | ||||||
126 | |||||||
127 | use Text::Livedoor::Wiki; | ||||||
128 | my $parser = Text::Livedoor::Wiki->new( { opts => { storage => 'http://static.wiki.livedoor.jp/formatter-storage' } } ); | ||||||
129 | |||||||
130 | my $data = "* ''polocky''"; | ||||||
131 | $html = $parser->parse( $data ); | ||||||
132 | |||||||
133 | =head1 DESCRIPTION | ||||||
134 | |||||||
135 | This is livedoor Wiki Style Parser. you can download CSS and images from http://static.wiki.livedoor.jp/download/livedoor-wiki.0.02.tar.gz | ||||||
136 | |||||||
137 | =head1 METHOD | ||||||
138 | |||||||
139 | =head2 new | ||||||
140 | |||||||
141 | constructor. you can set arguments as hash ref. | ||||||
142 | |||||||
143 | =over 4 | ||||||
144 | |||||||
145 | =item block_plugins | ||||||
146 | |||||||
147 | set list of block plugins you want to load. default is Text::Livedoor::Wiki::Plugin->block_plugins | ||||||
148 | |||||||
149 | =item inline_plugins | ||||||
150 | |||||||
151 | set list of inline plugins you want to load. default is Text::Livedoor::Wiki::Plugin->inline_plugins | ||||||
152 | |||||||
153 | =item function_plugins | ||||||
154 | |||||||
155 | set list of function plugins you want to load. default is Text::Livedoor::Wiki::Plugin->function_plugins | ||||||
156 | |||||||
157 | =item on_mobile | ||||||
158 | |||||||
159 | set 1 for mobile mode. | ||||||
160 | |||||||
161 | =back | ||||||
162 | |||||||
163 | =head2 parse | ||||||
164 | |||||||
165 | parse Wiki to HTML. | ||||||
166 | |||||||
167 | $parser->parse( $wiki, { your_options => 'hoge' } ); | ||||||
168 | |||||||
169 | =head2 opts | ||||||
170 | |||||||
171 | get options | ||||||
172 | |||||||
173 | =head1 AUTHOR | ||||||
174 | |||||||
175 | Polocky | ||||||
176 | |||||||
177 | =head1 SEE ALSO | ||||||
178 | |||||||
179 | http://wiki.livedoor.com (Japanese) | ||||||
180 | http://wiki.livedoor.jp/wiki_text/ (Japanese) | ||||||
181 | |||||||
182 | =cut |