ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/gvpe/doc/pod2texi
Revision: 1.8
Committed: Wed Aug 27 22:14:03 2008 UTC (16 years, 1 month ago) by pcg
Branch: MAIN
CVS Tags: rel-2_2, rel-2_21, rel-2_22
Changes since 1.7: +1 -1 lines
Log Message:
*** empty log message ***

File Contents

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