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

Comparing gvpe/doc/pod2texi (file contents):
Revision 1.5 by pcg, Sat Jan 22 17:39:07 2005 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;
24 26
25sub out { 27sub out {
26 $ctx[-1]{out} .= join "", @_; 28 $ctx[-1]{out} .= join "", @_;
27} 29}
28 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
29sub parse_pod { 57sub parse_pod {
30 my ($data) = @_; 58 my ($data) = @_;
31 local $out; 59 local $out;
32 60
61 local $Pod::POM::DEFAULT_VIEW = TEX::;
62
33 my $pod = new Pod::Tree; 63 my $parser = new Pod::POM;
34 $pod->load_string($data); 64 my $pod = $parser->parse_text ($data)
65 or die;
35 66
36 my $walker; $walker = sub { 67 my $walker; $walker = sub {
37 my $n = $_[0]; 68 my $n = $_[0];
38 if ($n->is_code) { 69 my $t = $n->type;
39 # nop 70
40 } elsif ($n->is_link) { 71 if ($t eq "text") {
41 my $target = $n->get_target; 72 out $n->text . "\n\@refill\n";
42 my $page = $target->get_page; 73
43 my $section = $target->get_section; 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};
44 83
84 out "\n\@section " . $n->title . "\n";
45 $walker->($_) for @{$n->get_children}; 85 $walker->($_) for $n->content;
46 } elsif ($n->is_text) {
47 out escape_texi $n->get_text;
48 } elsif ($n->is_verbatim) {
49 out example $n->get_text;
50 } elsif ($n->is_sequence) {
51 if ($n->get_letter eq "C") {
52 out "\@t{";
53 $walker->($_) for @{$n->get_children};
54 out "}"; 86 out "\n";
55 } elsif ($n->get_letter eq "B") { 87
56 out "\@strong{"; 88 } elsif ($t eq "head2") {
89 out "\n\n\@subsection " . $n->title . "\n";
57 $walker->($_) for @{$n->get_children}; 90 $walker->($_) for $n->content;
58 out "}"; 91
59 } elsif ($n->get_letter eq "I" or $n->get_letter eq "F") { 92 } elsif ($t eq "over") {
60 out "\@emph{"; 93 out "\n\n\@itemize\n";
61 $walker->($_) for @{$n->get_children}; 94 $walker->($_) for $n->content;
62 out "}"; 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;
63 } else { 113 } else {
64 # S would mean to use nbsp 114 out $n->content;
65 $walker->($_) for @{$n->get_children};
66 } 115 }
67 } elsif ($n->is_command) {
68 if ($n->is_c_head1) {
69 out "\n\@section ";
70 $walker->($_) for @{$n->get_children};
71 out "\n";
72 } elsif ($n->is_c_head2) {
73 out "\n\n\@subsection ";
74 $walker->($_) for @{$n->get_children};
75 out "\n";
76 } else {
77 # nop?
78 }
79 } elsif ($n->is_ordinary) {
80 $walker->($_) for @{$n->get_children};
81 out "\@refill\n";
82 } elsif ($n->is_root) {
83 $walker->($_) for @{$n->get_children};
84 } elsif ($n->is_list) {
85 out "\n\n\@itemize\n";
86 $walker->($_) for @{$n->get_children};
87 out "\@end itemize\n\n";
88 } elsif ($n->is_item) {
89 out "\n\n\@item\n";
90 out "\@b{";
91 $walker->($_) for @{$n->get_children};
92 out "}\n\n";
93 $walker->($_) for @{$n->get_siblings};
94 } elsif ($n->is_for) {
95 my $text = $n->get_text;
96 116
97 if ($n->get_command eq "begin") { 117 } elsif ($t eq "for") {
98 if ($n->{brackets}[0] =~ / header/) { 118 my $text = $n->text;
99 $header = $text;
100 } elsif ($n->{brackets}[0] =~ / footer/) {
101 $footer = $text;
102 } else {
103 out $text;
104 }
105 119
106 } elsif ($text =~ /^menu-begin/) { 120 if ($text =~ /^menu-begin/) {
107 out "\n\@menu\n"; 121 out "\n\@menu\n";
108 122
109 push @ctx, {}; # dummy node 123 push @ctx, {}; # dummy node
110 124
111 } elsif ($text =~ /^menu-item (.*?)::\s+(.*)/) { 125 } elsif ($text =~ /^menu-item (.*?)::\s+(.*)/) {
147 } else { 161 } else {
148 die "UNKNOWN for command <$text>\n"; 162 die "UNKNOWN for command <$text>\n";
149 } 163 }
150 164
151 } else { 165 } else {
152 die "UNKNOWN NODE $_[0]{type}\n"; 166 die "UNKNOWN NODE $t\n";
153 $walker->($_) for @{$n->get_children};
154 } 167 }
155 }; 168 };
156 169
157 $walker->($pod->get_root); 170 $walker->($pod);
158} 171}
159 172
160@ctx = @nodes = { 173@ctx = @nodes = {
161 up => "(dir)", 174 up => "(dir)",
162 name => "Top", 175 name => "Top",
168 181
169for (0 .. $#nodes) { 182for (0 .. $#nodes) {
170 my $node = $nodes[$_]; 183 my $node = $nodes[$_];
171 my $prev = $_ > 0 ? $nodes[$_-1] : undef; 184 my $prev = $_ > 0 ? $nodes[$_-1] : undef;
172 my $next = $nodes[$_+1]; 185 my $next = $nodes[$_+1];
186 my $chapter = $node->{name} eq "Top" ? "Introduction" : $node->{name};
173 187
174 print "\@node $node->{name},$next->{name},$prev->{name},$node->{up}\n\n", 188 print "\@node $node->{name},$next->{name},$prev->{name},$node->{up}\n\n",
175 "\@chapter $node->{name}\n", 189 "\@chapter $chapter\n",
176 "$node->{out}\n\n"; 190 "$node->{out}\n\n";
177} 191}
178 192
179print $footer; 193print $footer;
180 194

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines