ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/gvpe/doc/pod2texi
(Generate patch)

Comparing gvpe/doc/pod2texi (file contents):
Revision 1.4 by pcg, Wed Jul 7 00:28:20 2004 UTC vs.
Revision 1.9 by root, Tue Feb 15 13:31:22 2011 UTC

1#!/usr/bin/perl 1#!/usr/bin/perl
2 2
3use Pod::Tree; 3# TODO: texinfo fails on @cindex in title elements etc. *sigh*
4
5use Pod::POM;
4 6
5sub escape_texi($) { 7sub escape_texi($) {
6 local $_ = shift; 8 local $_ = shift;
7 s/([\@\{\}])/\@$1/g; 9 s/([\@\{\}])/\@$1/g;
8 s/\n+/ /g; 10 s/\n+/ /g;
9 $_; 11 $_;
10} 12}
11 13
12sub example { 14sub example {
13 my $text = $_[0]; 15 my $text = $_[0];
14 print "\n\n\@example\n";
15 $text =~ s/\n+$//; 16 $text =~ s/\n+$//;
16 $text =~ s/([\@\{\}])/\@$1/g; 17 $text =~ s/([\@\{\}])/\@$1/g;
17 print $text; 18
19 "\n\n\@example\n"
20 . $text
18 print "\n\@end example\n\n"; 21 . "\n\@end example\n\n";
19} 22}
20 23
21while (<>) { 24my @nodes; # nodelist
22 if (/^\@c INCLUDE-(\S+) (\S+)/) { 25my @ctx; # curstack
23 my $type = $1;
24 my $name = $2;
25 my $path = $2;
26 26
27 $name =~ s/\.(\d)$/($1)/; 27sub out {
28 28 $ctx[-1]{out} .= join "", @_;
29 print "\@chapter $name\n\n";
30
31 if ($type eq "POD") {
32 open my $x, "<$path.pod" or die "$path.pod: $!";
33 my $data = do { local $/; <$x> };
34
35 my $pod = new Pod::Tree;
36 $pod->load_string($data);
37
38 my $walker; $walker = sub {
39 my $n = $_[0];
40 if ($n->is_code) {
41 # nop
42 } elsif ($n->is_link) {
43 my $target = $n->get_target;
44 my $page = $target->get_page;
45 my $section = $target->get_section;
46
47 #print "<b>";
48 $walker->($_) for @{$n->get_children};
49 #print "</b>";
50 } elsif ($n->is_text) {
51 print escape_texi $n->get_text;
52 } elsif ($n->is_verbatim) {
53 example $n->get_text;
54 } elsif ($n->is_sequence) {
55 if ($n->get_letter eq "C") {
56 print "\@t{";
57 $walker->($_) for @{$n->get_children};
58 print "}";
59 } elsif ($n->get_letter eq "B") {
60 print "\@strong{";
61 $walker->($_) for @{$n->get_children};
62 print "}";
63 } elsif ($n->get_letter eq "I" or $n->get_letter eq "F") {
64 print "\@emph{";
65 $walker->($_) for @{$n->get_children};
66 print "}";
67 } else {
68 # S would mean to use nbsp
69 $walker->($_) for @{$n->get_children};
70 }
71 } elsif ($n->is_command) {
72 if ($n->is_c_head1) {
73 print "\n\@section ";
74 $walker->($_) for @{$n->get_children};
75 print "\n";
76 } elsif ($n->is_c_head2) {
77 print "\n\n\@subsection ";
78 $walker->($_) for @{$n->get_children};
79 print "\n";
80 } else {
81 # nop?
82 }
83 } elsif ($n->is_ordinary) {
84 $walker->($_) for @{$n->get_children};
85 print "\@refill\n";
86 } elsif ($n->is_root) {
87 $walker->($_) for @{$n->get_children};
88 } elsif ($n->is_list) {
89 print "\n\n\@itemize\n";
90 $walker->($_) for @{$n->get_children};
91 print "\@end itemize\n\n";
92 } elsif ($n->is_item) {
93 print "\n\n\@item\n";
94 print "\@b{";
95 $walker->($_) for @{$n->get_children};
96 print "}\n\n";
97 $walker->($_) for @{$n->get_siblings};
98 } else {
99 die "UNKNOWN NODE $_[0]{type}<br/>";
100 $walker->($_) for @{$n->get_children};
101 }
102 };
103
104 $walker->($pod->get_root);
105 } elsif ($type eq "TEXT") {
106 open my $x, "<$path" or die "$path: $!";
107 my $data = do { local $/; <$x> };
108
109 print $data;
110 } elsif ($type eq "EXAMPLE") {
111 open my $x, "<$path" or die "$path: $!";
112 my $data = do { local $/; <$x> };
113
114 example $data;
115 }
116 } else {
117 print;
118 }
119} 29}
120 30
31sub TEX::view_seq_code { "\@t{$_[1]}" }
32sub TEX::view_seq_file { "\@file{$_[1]}" }
33sub TEX::view_seq_bold { "\@strong{$_[1]}" }
34sub TEX::view_seq_italic { "\@emph{$_[1]}" }
35
36sub TEX::view_seq_space { escape_texi $_[1] }
37sub TEX::view_seq_text { escape_texi $_[1] }
38
39sub TEX::view_seq_link { $_[1] }
40sub TEX::view_seq_index {
41 "\n\@cindex $_[1]\n$_[1]"
42}
43
44*TXT::view_seq_code =
45*TXT::view_seq_bold =
46*TXT::view_seq_italic =
47*TXT::view_seq_space =
48*TXT::view_seq_text =
49*TXT::view_seq_link =
50*TXT::view_seq_index = sub { $_[1] };
51
52my %ignore = (
53 "SEE ALSO" => 1,
54 "AUTHOR" => 1,
55);
56
57sub parse_pod {
58 my ($data) = @_;
59 local $out;
60
61 local $Pod::POM::DEFAULT_VIEW = TEX::;
62
63 my $parser = new Pod::POM;
64 my $pod = $parser->parse_text ($data)
65 or die;
66
67 my $walker; $walker = sub {
68 my $n = $_[0];
69 my $t = $n->type;
70
71 if ($t eq "text") {
72 out $n->text . "\n\@refill\n";
73
74 } elsif ($t eq "pod") {
75 $walker->($_) for $n->content;
76
77 } elsif ($t eq "verbatim") {
78 out example $n->text;
79
80 } elsif ($t eq "head1") {
81
82 return if $ignore{$n->title};
83
84 out "\n\@section " . $n->title . "\n";
85 $walker->($_) for $n->content;
86 out "\n";
87
88 } elsif ($t eq "head2") {
89 out "\n\n\@subsection " . $n->title . "\n";
90 $walker->($_) for $n->content;
91
92 } elsif ($t eq "over") {
93 out "\n\n\@itemize\n";
94 $walker->($_) for $n->content;
95 out "\@end itemize\n\n";
96
97 } elsif ($t eq "item") {
98 out "\n\n\@item\n" . $n->title . "\n\n";
99
100 if ($n->title->present (TXT::) =~ /^\s*([a-zA-Z0-9\-\_]+)\s*=/) {
101 out "\@cindex $1\n";
102 }
103 $walker->($_) for $n->content;
104
105 } elsif ($t eq "begin") {
106 local $Pod::POM::DEFAULT_VIEW = Pod::POM::View::Pod;
107 my $format = $n->format;
108
109 if ($format =~ /texinfo\s+header/) {
110 $header = $n->content;
111 } elsif ($format =~ /texinfo\s+footer/) {
112 $footer = $n->content;
113 } else {
114 out $n->content;
115 }
116
117 } elsif ($t eq "for") {
118 my $text = $n->text;
119
120 if ($text =~ /^menu-begin/) {
121 out "\n\@menu\n";
122
123 push @ctx, {}; # dummy node
124
125 } elsif ($text =~ /^menu-item (.*?)::\s+(.*)/) {
126 my ($name, $desc) = ($1, $2);
127
128 push @{ $ctx[-2]{menu} }, [$name, $desc];
129 $ctx[-2]{width} = length $name if $ctx[-2]{width} < length $name;
130
131 my $ctx = {
132 name => $name,
133 up => $ctx[-2]{name},
134 };
135 push @nodes, $ctx;
136 $ctx[-1] = $ctx;
137
138 } elsif ($text =~ /^menu-end/) {
139 pop @ctx;
140
141 for (@{ $ctx[-1]{menu} }) {
142 out sprintf "* %-*s %s\n", $ctx[-1]{width} + 2, "$_->[0]::", $_->[1];
143 }
144
145 out "\@end menu\n";
146
147 } elsif ($text =~ /^include (\S+) (.*)/) {
148 my ($type, $path) = ($1, $2);
149
150 open my $x, "<$path" or die "$path: $!";
151 my $data = do { local $/; <$x> };
152
153 if ($type eq "pod") {
154 out parse_pod ($data);
155 } elsif ($type eq "text") {
156 out $data;
157 } elsif ($type eq "example") {
158 out example $data;
159 }
160
161 } else {
162 die "UNKNOWN for command <$text>\n";
163 }
164
165 } else {
166 die "UNKNOWN NODE $t\n";
167 }
168 };
169
170 $walker->($pod);
171}
172
173@ctx = @nodes = {
174 up => "(dir)",
175 name => "Top",
176};
177
178parse_pod do { local $/; <> };
179
180print $header;
181
182for (0 .. $#nodes) {
183 my $node = $nodes[$_];
184 my $prev = $_ > 0 ? $nodes[$_-1] : undef;
185 my $next = $nodes[$_+1];
186 my $chapter = $node->{name} eq "Top" ? "Introduction" : $node->{name};
187
188 print "\@node $node->{name},$next->{name},$prev->{name},$node->{up}\n\n",
189 "\@chapter $chapter\n",
190 "$node->{out}\n\n";
191}
192
193print $footer;
194

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines