ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/deliantra/server/lib/cf/pod.pm
(Generate patch)

Comparing deliantra/server/lib/cf/pod.pm (file contents):
Revision 1.1 by root, Tue Mar 6 19:02:36 2007 UTC vs.
Revision 1.20 by root, Wed Oct 21 00:44:39 2009 UTC

1package cf::pod;
2
3use common::sense;
4
5use Pod::POM;
6
7our $indent;
8our $level;
9our @result;
10
11package cf::pod::AsParagraphs;
12
13use common::sense;
14
15use base "Pod::POM::View";
16
17my %E = (
18 "<" => "E<lt>",
19 ">" => "E<gt>",
20);
21
22sub aspod($) {
23 local $_ = $_[0];
24
25 s/[<>]/$E{$1}/g;
26
27 $_
28}
29
30sub flatten($) {
31 local $_ = $_[0];
32
33 s/^\s+//;
34 s/\s+$//;
35 s/\s+/ /g;
36
37 $_
38}
39
40*view_seq_file = sub { "C<$_[1]>" };
41*view_seq_code = sub { "C<$_[1]>" };
42*view_seq_bold = sub { "B<$_[1]>" };
43*view_seq_italic = sub { "I<$_[1]>" };
44*view_seq_T = sub { "T<$_[1]>" };
45*view_seq_G = sub { "G<$_[1]>" };
46*view_seq_zero = sub { "Z<>" };
47*view_seq_space = sub { my $text = $_[1]; $text =~ s/ /\xa0/g; $text };
48*view_seq_index = sub { push @{ $result[-1]{index} }, $_[1]; "" };
49
50sub view_seq_text {
51 my $text = $_[1];
52 $text =~ s/\s+/ /g;
53 aspod $text
54}
55
56sub view_seq_link {
57 my (undef, $link) = @_;
58
59 my $text = $link =~ s/^(.*)\|// ? $1 : $link;
60
61 if ($link =~ /http:/) {
62 "U<" . (aspod $link) . ">"
63 } else {
64 ()
65 }
66}
67
68sub view_item {
69 push @result, {
70 type => "item",
71 indent => $indent * 8,
72 level => $level,
73 };
74 my $title = $_[1]->title->present ($_[0]);
75 $result[-1]{markup} = $title if length $title;
76 $title = flatten $title; unshift @{ $result[-1]{index} }, $title if length $title;
77 local $level = $level + 1;
78 $_[1]->content->present ($_[0]);
79 ()
80}
81
82sub view_verbatim {
83 push @result, {
84 type => "verbatim",
85 indent => $indent * 16,
86 level => $level,
87 markup => $_[1],
88 };
89 ()
90}
91
92sub view_textblock {
93 push @result, {
94 indent => $indent * 16,
95 level => $level,
96 markup => flatten $_[1],
97 };
98 ()
99}
100
101sub view_head1 {
102 push @result, {
103 type => "head1",
104 indent => $indent * 16,
105 level => $level,
106 };
107 my $title = $_[1]->title->present ($_[0]);
108 $result[-1]{markup} = $title if length $title;
109 $title = flatten $title; unshift @{ $result[-1]{index} }, $title if length $title;
110 local $level = $level + 1;
111 $_[1]->content->present ($_[0]);
112 ()
113};
114
115sub view_head2 {
116 push @result, {
117 type => "head2",
118 indent => $indent * 16,
119 level => $level,
120 };
121 my $title = $_[1]->title->present ($_[0]);
122 $result[-1]{markup} = $title if length $title;
123 $title = flatten $title; unshift @{ $result[-1]{index} }, $title if length $title;
124 local $level = $level + 1;
125 $_[1]->content->present ($_[0]);
126 ()
127};
128
129sub view_head3 {
130 push @result, {
131 type => "head3",
132 indent => $indent * 16,
133 level => $level,
134 };
135 my $title = $_[1]->title->present ($_[0]);
136 $result[-1]{markup} = $title if length $title;
137 $title = flatten $title; unshift @{ $result[-1]{index} }, $title if length $title;
138 local $level = $level + 1;
139 $_[1]->content->present ($_[0]);
140 ()
141};
142
143sub view_over {
144 local $indent = $indent + $_[1]->indent;
145 push @result, { indent => $indent };
146 $_[1]->content->present ($_[0]);
147 ()
148}
149
150sub view_for {
151 if ($_[1]->format eq "image") {
152# push @result, {
153# indent => $indent * 16,
154# level => $level,
155# markup => (::special image => "pod/" . $_->text),
156# };
157 }
158 ()
159}
160
161sub view_begin {
162 ()
163}
164
165sub view {
166 my ($self, $type, $item) = @_;
167
168 $item->content->present ($self);
169}
170
171#############################################################################
172
173package cf::pod;
174
175sub pom_as_paragraphs($) {
176 my ($pom) = @_;
177
178 # we suckers use global variables, unfortunately.
179 my $guard = cf::lock_acquire "cf::pod::as_paragraphs";
180
181 local $indent = 0;
182 local $level = 1;
183 local @result = ( { } );
184
185 $pom->present ("cf::pod::AsParagraphs");
186
187 [grep $_->{index} || exists $_->{markup}, @result]
188}
189
190sub load_pod($) {
191 my ($path) = @_;
192
193 Coro::Storable::thaw cf::cache "cf::pod::as_paragraphs/$path" => [$path],
194 7 => sub {
195 my ($src) = @_;
196
197 cf::fork_call {
198 my $pod = $src->[0];
199 utf8::decode $pod;
200 Coro::Storable::blocking_nfreeze pom_as_paragraphs +(Pod::POM->new->parse_text ($pod))
201 }
202 };
203}
204
205# format as cfpod-style text
206sub as_cfpod($) {
207 my ($pars) = @_;
208
209 my $res;
210
211 for my $par (@$pars) {
212 if ($par->{type} =~ /^head\d+$/) {
213 $res .= "B<$par->{markup}>\n\n";
214 } elsif ($par->{type} eq "verbatim") {
215 $res .= "$par->{markup}\n\n";
216 } elsif ($par->{type} eq "item") {
217 $res .= "* I<$par->{markup}>\n\n";
218 } else {
219 $res .= "$par->{markup}\n\n";
220 }
221 }
222
223 $res
224}
225
2261;
227

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines