Revision 1.5 by

Revision 1.6 by

1 | #!/usr/bin/perl | 1 | #!/usr/bin/perl |
---|---|---|---|

2 | 2 | ||

3 | use Pod::Tree; | 3 | # TODO: texinfo fails on @cinde xin title elements etc. *sigh* |

4 | |||

5 | use Pod::POM; | ||

4 | 6 | ||

5 | sub escape_texi($) { | 7 | sub 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 | ||

25 | sub out { | 27 | sub out { |

26 | $ctx[-1]{out} .= join "", @_; | 28 | $ctx[-1]{out} .= join "", @_; |

27 | } | 29 | } |

28 | 30 | ||

31 | 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 | |||

29 | sub parse_pod { | 56 | sub parse_pod { |

30 | my ($data) = @_; | 57 | my ($data) = @_; |

31 | local $out; | 58 | local $out; |

32 | 59 | ||

60 | local $Pod::POM::DEFAULT_VIEW = TEX::; | ||

61 | |||

33 | my $pod = new Pod::Tree; | 62 | my $parser = new Pod::POM; |

34 | $pod->load_string($data); | 63 | my $pod = $parser->parse_text ($data) |

64 | or die; | ||

35 | 65 | ||

36 | my $walker; $walker = sub { | 66 | my $walker; $walker = sub { |

37 | my $n = $_[0]; | 67 | my $n = $_[0]; |

38 | if ($n->is_code) { | 68 | my $t = $n->type; |

39 | # nop | 69 | |

40 | } elsif ($n->is_link) { | 70 | if ($t eq "text") { |

41 | my $target = $n->get_target; | 71 | out $n->text . "\n\@refill\n"; |

42 | my $page = $target->get_page; | 72 | |

43 | my $section = $target->get_section; | 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}; | ||

44 | 82 | ||

83 | out "\n\@section " . $n->title . "\n"; | ||

45 | $walker->($_) for @{$n->get_children}; | 84 | $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 "}"; | 85 | out "\n"; |

55 | } elsif ($n->get_letter eq "B") { | 86 | |

56 | out "\@strong{"; | 87 | } elsif ($t eq "head2") { |

88 | out "\n\n\@subsection " . $n->title . "\n"; | ||

57 | $walker->($_) for @{$n->get_children}; | 89 | $walker->($_) for $n->content; |

58 | out "}"; | 90 | |

59 | } elsif ($n->get_letter eq "I" or $n->get_letter eq "F") { | 91 | } elsif ($t eq "over") { |

60 | out "\@emph{"; | 92 | out "\n\n\@itemize\n"; |

61 | $walker->($_) for @{$n->get_children}; | 93 | $walker->($_) for $n->content; |

62 | out "}"; | 94 | out "\@end itemize\n\n"; |

95 | |||

96 | } elsif ($t eq "item") { | ||

97 | out "\n\n\@item\n\@b{" . $n->title . "}\n\n"; | ||

98 | |||

99 | if ($n->title->present (TXT::) =~ /^\s*([a-zA-Z0-9\-\_]+)\s*=/) { | ||

100 | out "\@cindex $1\n"; | ||

101 | } | ||

102 | $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; | ||

63 | } else { | 112 | } else { |

64 | # S would mean to use nbsp | 113 | out $n->content; |

65 | $walker->($_) for @{$n->get_children}; | ||

66 | } | 114 | } |

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 | 115 | ||

97 | if ($n->get_command eq "begin") { | 116 | } elsif ($t eq "for") { |

98 | if ($n->{brackets}[0] =~ / header/) { | 117 | my $text = $n->text; |

99 | $header = $text; | ||

100 | } elsif ($n->{brackets}[0] =~ / footer/) { | ||

101 | $footer = $text; | ||

102 | } else { | ||

103 | out $text; | ||

104 | } | ||

105 | 118 | ||

106 | } elsif ($text =~ /^menu-begin/) { | 119 | if ($text =~ /^menu-begin/) { |

107 | out "\n\@menu\n"; | 120 | out "\n\@menu\n"; |

108 | 121 | ||

109 | push @ctx, {}; # dummy node | 122 | push @ctx, {}; # dummy node |

110 | 123 | ||

111 | } elsif ($text =~ /^menu-item (.*?)::\s+(.*)/) { | 124 | } elsif ($text =~ /^menu-item (.*?)::\s+(.*)/) { |

… | … | ||

147 | } else { | 160 | } else { |

148 | die "UNKNOWN for command <$text>\n"; | 161 | die "UNKNOWN for command <$text>\n"; |

149 | } | 162 | } |

150 | 163 | ||

151 | } else { | 164 | } else { |

152 | die "UNKNOWN NODE $_[0]{type}\n"; | 165 | die "UNKNOWN NODE $t\n"; |

153 | $walker->($_) for @{$n->get_children}; | ||

154 | } | 166 | } |

155 | }; | 167 | }; |

156 | 168 | ||

157 | $walker->($pod->get_root); | 169 | $walker->($pod); |

158 | } | 170 | } |

159 | 171 | ||

160 | @ctx = @nodes = { | 172 | @ctx = @nodes = { |

161 | up => "(dir)", | 173 | up => "(dir)", |

162 | name => "Top", | 174 | name => "Top", |

… | … | ||

168 | 180 | ||

169 | for (0 .. $#nodes) { | 181 | for (0 .. $#nodes) { |

170 | my $node = $nodes[$_]; | 182 | my $node = $nodes[$_]; |

171 | my $prev = $_ > 0 ? $nodes[$_-1] : undef; | 183 | my $prev = $_ > 0 ? $nodes[$_-1] : undef; |

172 | my $next = $nodes[$_+1]; | 184 | my $next = $nodes[$_+1]; |

185 | my $chapter = $node->{name} eq "Top" ? "Introduction" : $node->{name}; | ||

173 | 186 | ||

174 | print "\@node $node->{name},$next->{name},$prev->{name},$node->{up}\n\n", | 187 | print "\@node $node->{name},$next->{name},$prev->{name},$node->{up}\n\n", |

175 | "\@chapter $node->{name}\n", | 188 | "\@chapter $chapter\n", |

176 | "$node->{out}\n\n"; | 189 | "$node->{out}\n\n"; |

177 | } | 190 | } |

178 | 191 | ||

179 | print $footer; | 192 | print $footer; |

180 | 193 |

– |
Removed lines |

+ |
Added lines |

< |
Changed lines |

> |
Changed lines |