ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/deliantra/Deliantra-Client/bin/pod2wiki
(Generate patch)

Comparing deliantra/Deliantra-Client/bin/pod2wiki (file contents):
Revision 1.4 by root, Sun Aug 13 19:47:06 2006 UTC vs.
Revision 1.16 by root, Sun Mar 30 13:02:27 2008 UTC

1#! perl 1#! perl
2 2
3# convert given .pod files to wiki style
4
5# base path of arch tree, only used for new arch graphics
6my $ARCH = "/root/devel/cvs/cf.schmorp.de/arch";
7
8use strict;
9
3use Storable; 10use Storable;
4
5# convert given .pod files to wiki style
6
7use strict;
8
9use Pod::POM; 11use Pod::POM;
10 12
11our @result; 13our @result;
12our $indent; 14our $indent;
13our $level; 15our $level;
35 s/\s+/ /g; 37 s/\s+/ /g;
36 38
37 $_ 39 $_
38} 40}
39 41
42sub special {
43 $MA_BEG . (join $MA_SEP, @_) . $MA_END
44}
45
40package AsParagraphs; 46package AsParagraphs;
41 47
42use strict; 48use strict;
43 49
44use base "Pod::POM::View"; 50use base "Pod::POM::View";
51
52# nodes (order must stay as it is)
53sub N_PARENT (){ 0 }
54sub N_PAR (){ 1 }
55sub N_LEVEL (){ 2 }
56sub N_KW (){ 3 }
57sub N_DOC (){ 4 }
58
59# paragraphs (order must stay as it is)
60sub P_INDENT (){ 0 }
61sub P_LEVEL (){ 1 }
62sub P_MARKUP (){ 2 }
63sub P_INDEX (){ 3 }
45 64
46*view_seq_file = 65*view_seq_file =
47*view_seq_code = 66*view_seq_code =
48*view_seq_bold = sub { "<b>$_[1]</b>" }; 67*view_seq_bold = sub { "<b>$_[1]</b>" };
49*view_seq_italic = sub { "<i>$_[1]</i>" }; 68*view_seq_italic = sub { "<i>$_[1]</i>" };
50*view_seq_zero = sub { }; 69*view_seq_zero = sub { };
51*view_seq_space = sub { my $text = $_[1]; $text =~ s/ /&#160;/g; $text }; 70*view_seq_space = sub { my $text = $_[1]; $text =~ s/ /&#160;/g; $text };
52*view_seq_index = sub { push @{ $result[-1]{index} }, $_[1]; "" }; 71*view_seq_index = sub { push @{ $result[-1][P_INDEX] }, $_[1]; "" };
53 72
54sub view_seq_text { 73sub view_seq_text {
55 my $text = $_[1]; 74 my $text = $_[1];
56 $text =~ s/\s+/ /g; 75 $text =~ s/\s+/ /g;
57 ::asxml $text 76 ::asxml $text
62 81
63 my $text = $link =~ s/^(.*)\|// ? $1 : $link; 82 my $text = $link =~ s/^(.*)\|// ? $1 : $link;
64 83
65 if ($link =~ /http:/) { 84 if ($link =~ /http:/) {
66 "<u>" . (::asxml $link) . "</u>" 85 "<u>" . (::asxml $link) . "</u>"
86 } elsif ($link =~ /^\$ARCH\/(.+)$/) {
87 my $path = $1;
88 (my $base = $path) =~ s/.*\///;
89 -f "$ARCH/$path" && system "rsync -av -c \Q$ARCH/$path\E \Qresources/arch/$base";
90 ::special image => "arch/$base", 1;
67 } else { 91 } else {
68 "${MA_BEG}link$MA_SEP$text$MA_SEP$link$MA_END" 92 ::special link => $text, $link
69 }
70}
71
72sub view_item {
73 push @result, {
74 indent => $indent * 8,
75 level => $level,
76 }; 93 }
77 my $title = $_[1]->title->present ($_[0]);
78 $result[-1]{markup} = "$title\n\n" if length $title;
79 $title = ::flatten $title; unshift @{ $result[-1]{index} }, $title if length $title;
80 local $level = $level + 1;
81 $_[1]->content->present ($_[0]);
82 ()
83} 94}
84 95
85sub view_verbatim { 96sub view_verbatim {
86 push @result, { 97 push @result, [ $indent * 16, $level, "<tt>" . (::asxml $_[1]) . "</tt>\n" ];
87 indent => $indent * 16,
88 level => $level,
89 markup => "<tt>" . (::asxml $_[1]) . "</tt>\n",
90 };
91 () 98 ()
92} 99}
93 100
94sub view_textblock { 101sub view_textblock {
95 push @result, { 102 push @result, [ $indent * 16, $level, "$_[1]\n" ];
96 indent => $indent * 16,
97 level => $level,
98 markup => "$_[1]\n",
99 };
100 () 103 ()
101} 104}
102 105
103sub view_head1 { 106sub view_head1 {
104 push @result, { 107 push @result, [ $indent * 16, $level ];
105 indent => $indent * 16,
106 level => $level,
107 };
108 my $title = $_[1]->title->present ($_[0]); 108 my $title = $_[1]->title->present ($_[0]);
109 $result[-1]{markup} = "\n\n<span foreground='#ffff00' size='x-large'>$title</span>\n" if length $title; 109 $result[-1][P_MARKUP] = ::special h1 => $title if length $title;
110 $title = ::flatten $title; unshift @{ $result[-1]{index} }, $title if length $title; 110 $title = ::flatten $title;
111 unshift @{ $result[-1][P_INDEX] }, $title
112 if !$result[-1][P_INDEX];
111 local $level = $level + 1; 113 local $level = $level + 1;
112 $_[1]->content->present ($_[0]); 114 $_[1]->content->present ($_[0]);
113 () 115 ()
114}; 116};
115 117
116sub view_head2 { 118sub view_head2 {
117 push @result, { 119 push @result, [ $indent * 16, $level ];
118 indent => $indent * 16,
119 level => $level,
120 };
121 my $title = $_[1]->title->present ($_[0]); 120 my $title = $_[1]->title->present ($_[0]);
122 $result[-1]{markup} = "\n\n<span foreground='#ccccff' size='large'>$title</span>\n" if length $title; 121 $result[-1][P_MARKUP] = ::special h2 => $title if length $title;
123 $title = ::flatten $title; unshift @{ $result[-1]{index} }, $title if length $title; 122 $title = ::flatten $title;
123 unshift @{ $result[-1][P_INDEX] }, $title
124 if !$result[-1][P_INDEX];
124 local $level = $level + 1; 125 local $level = $level + 1;
125 $_[1]->content->present ($_[0]); 126 $_[1]->content->present ($_[0]);
126 () 127 ()
127}; 128};
128 129
129sub view_head3 { 130sub view_head3 {
130 push @result, { 131 push @result, [ $indent * 16, $level ];
131 indent => $indent * 16,
132 level => $level,
133 };
134 my $title = $_[1]->title->present ($_[0]); 132 my $title = $_[1]->title->present ($_[0]);
135 $result[-1]{markup} = "\n\n<span size='large'>$title</span>\n" if length $title; 133 $result[-1][P_MARKUP] = ::special h3 => $title if length $title;
136 $title = ::flatten $title; unshift @{ $result[-1]{index} }, $title if length $title; 134 $title = ::flatten $title;
135 unshift @{ $result[-1][P_INDEX] || [] }, $title
136 if !$result[-1][P_INDEX];
137 local $level = $level + 1; 137 local $level = $level + 1;
138 $_[1]->content->present ($_[0]); 138 $_[1]->content->present ($_[0]);
139 () 139 ()
140}; 140};
141 141
142sub view_over { 142sub view_over {
143 local $indent = $indent + $_[1]->indent; 143 local $indent = $indent + $_[1]->indent;
144 push @result, { indent => $indent }; 144 push @result, [ $indent, $level ];
145 $_[1]->content->present ($_[0]);
146 ()
147}
148
149sub view_item {
150 push @result, [ $indent * 8, $level ];
151 my $title = $_[1]->title->present ($_[0]);
152 $result[-1][P_MARKUP] = "$title\n" if length $title;
153 $title = ::flatten $title;
154 unshift @{ $result[-1][P_INDEX] || [] }, $title
155 if !$result[-1][P_INDEX];
156 local $level = $level + 1;
145 $_[1]->content->present ($_[0]); 157 $_[1]->content->present ($_[0]);
146 () 158 ()
147} 159}
148 160
149sub view_for { 161sub view_for {
150 if ($_[1]->format eq "image") { 162 if ($_[1]->format eq "image") {
151 push @result, { 163 push @result, [
152 indent => $indent * 16, 164 $indent * 16,
153 level => $level, 165 $level,
154 markup => "${MA_BEG}image${MA_SEP}pod/" . $_->text . $MA_END, 166 (::special image => "pod/" . $_->text),
155 }; 167 ];
156 } 168 }
169 ()
170}
171
172sub view_begin {
157 () 173 ()
158} 174}
159 175
160sub view { 176sub view {
161 my ($self, $type, $item) = @_; 177 my ($self, $type, $item) = @_;
167 183
168sub as_paragraphs($) { 184sub as_paragraphs($) {
169 my ($pom) = @_; 185 my ($pom) = @_;
170 186
171 local $indent = 0; 187 local $indent = 0;
172 local $level = 1; 188 local $level = 2;
173 local @result = ( { } ); 189 local @result = ( [] );
174 190
175 $pom->present ("AsParagraphs"); 191 $pom->present ("AsParagraphs");
176 192
177 [grep $_->{index} || exists $_->{markup}, @result] 193 [grep $_->[P_INDEX] || defined $_->[P_MARKUP], @result]
178} 194}
179 195
180############################################################################# 196#############################################################################
181 197
182my %wiki; 198my %wiki;
183 199
184sub add_node($) { 200sub add_node($) {
185 my ($node) = @_; 201 my ($node) = @_;
186 202
187 for (@{ $node->{kw} || {} }) { 203 for (@{ $node->[N_KW] || {} }) {
188 push @{$wiki{$_}}, $node; 204 push @{$wiki{lc $_}}, $node;
189 } 205 }
190} 206}
191 207
192my $root = { 208my $root;
193 kw => ["pod"], 209$root->[N_KW] = ["Documents", "pod"];
194}; 210$root->[N_DOC] = [[0, 0, ::special link => "All Documents", "pod/*"]];
195 211
196for my $path (@ARGV) { 212for my $path (@ARGV) {
197 $path =~ /([^\/\\]+)\.pod$/ or die "$path: illegal pathname"; 213 $path =~ /([^\/\\]+)\.pod$/ or die "$path: illegal pathname";
198 my $base = $1; 214 my $base = $1;
199 my $pom = Pod::POM->new->parse_text (do { 215 my $pom = Pod::POM->new->parse_text (do {
203 <$pod> 219 <$pod>
204 }); 220 });
205 221
206 my $para = as_paragraphs $pom; 222 my $para = as_paragraphs $pom;
207 223
224 my $pod;
225 $pod->[N_PARENT] = $root;
226 $pod->[N_PAR] = 0;
227 $pod->[N_LEVEL] = 1;
228 $pod->[N_KW] = [$base];
229 $pod->[N_DOC] = $para;
230
208 my @parent = ( 231 my @parent = ($pod);
209 { parent => $root, kw => [$base], doc => $para, par => 0, level => 0 },
210 );
211 add_node $parent[-1];
212 232
213 for my $idx (0 .. $#$para) { 233 for my $idx (0 .. $#$para) {
214 my $par = $para->[$idx]; 234 my $par = $para->[$idx];
215 235
216 while ($parent[-1]{level} >= $par->{level}) { 236 while ($parent[-1][N_LEVEL] >= $par->[P_LEVEL]) {
217 pop @parent; 237 pop @parent;
218 } 238 }
219 239
220 if ($par->{index}) { 240 if ($par->[P_INDEX]) {
221 my $node = { 241 my $node;
222 kw => $par->{index}, 242 $node->[N_PARENT] = $parent[-1];
223 parent => $parent[-1], 243 $node->[N_PAR] = $idx;
224 doc => $para, 244 $node->[N_LEVEL] = $par->[P_LEVEL];
225 par => $idx, 245 $node->[N_KW] = $par->[P_INDEX];
226 level => $par->{level}, 246 $node->[N_DOC] = $para;
227 };
228 push @parent, $node; 247 push @parent, $node;
229 add_node $node; 248 add_node $node;
230 } 249 }
231 } 250 }
251
252 add_node $pod;
232} 253}
254
255add_node $root;
233 256
234Storable::nstore \%wiki, "docwiki.pst"; 257Storable::nstore \%wiki, "docwiki.pst";
235 258

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines