3 use ExtUtils::Manifest 'maniread';
5 my $outname = shift || '-';
7 my @funcs = make_func_list();
8 my %funcs = map { $_ => 1 } @funcs;
10 # look for files to parse
13 my @files = grep /\.(c|im|h)$/, keys %$mani;
15 # scan each file for =item <func>\b
28 for my $file (@files) {
30 or die "Cannot open $file for documentation: $!\n";
32 if (/^=item (\w+)\b/ && $funcs{$1}) {
37 elsif ($func && /^=(cut|head)/) {
38 if ($funcs{$func}) { # only save the API functions
39 $alldocs{$func} = [ @funcdocs ];
40 $from{$func} = "File $file";
42 $funccats{$func} = $category;
43 push @{$cats{$category}}, $func;
46 $funcsyns{$func} = $synopsis;
48 defined $order or $order = 50;
49 $order{$func} = $order;
57 if (/^=category (.*)/) {
60 elsif (/^=synopsis (.*)/) {
63 elsif (/^=order (.*)$/) {
66 or die "=order must specify a number for $func in $file\n";
74 die "Documentation for $func not followed by =cut or =head in $file\n";
79 open OUT, "> $outname"
80 or die "Cannot open $outname: $!";
83 Do not edit this file, it is generated automatically by apidocs.perl
84 from Imager's source files.
86 Each function description has a comment listing the source file where
87 you can find the documentation.
91 Imager::APIRef - Imager's C API - reference.
96 color.rgba.r = 255; color.rgba.g = 0; color.rgba.b = 255;
100 for my $cat (sort { lc $a cmp lc $b } keys %cats) {
101 print OUT "\n # $cat\n";
102 for my $func (grep $funcsyns{$_}, sort { $order{$a} <=> $order{$b} } @{$cats{$cat}}) {
103 my $syn = $funcsyns{$func};
117 for my $cat (sort { lc $a cmp lc $b } keys %cats) {
118 print OUT "=head2 $cat\n\n=over\n\n";
119 my @ordered_funcs = sort {
120 $order{$a} <=> $order{$b}
123 for my $func (@ordered_funcs) {
124 print OUT @{$alldocs{$func}}, "\n";
125 print OUT "=for comment\nFrom: $from{$func}\n\n";
126 delete $undoc{$func};
128 print OUT "\n=back\n\n";
131 # see if we have an uncategorised section
132 if (grep $alldocs{$_}, keys %undoc) {
133 print OUT "=head2 Uncategorized functions\n\n=over\n\n";
134 #print join(",", grep !exists $order{$_}, @funcs), "\n";
135 for my $func (sort { $order{$a} <=> $order{$b} || $a cmp $b }
136 grep $undoc{$_} && $alldocs{$_}, @funcs) {
137 print OUT @{$alldocs{$func}}, "\n";
138 print OUT "=for comment\nFrom: $from{$func}\n\n";
139 delete $undoc{$func};
141 print OUT "\n\n=back\n\n";
149 The following API functions are undocumented so far, hopefully this
156 print OUT "=item *\n\nB<$_>\n\n" for sort keys %undoc;
158 print OUT "\n\n=back\n\n";
165 Tony Cook <tony@imager.perl.org>
169 Imager, Imager::ExtUtils, Imager::Inline
178 my @funcs = qw(i_img i_color i_fcolor i_fill_t mm_log i_img_color_channels i_img_has_alpha i_img_dim);
179 open FUNCS, "< imexttypes.h"
180 or die "Cannot open imexttypes.h: $!\n";
183 /^typedef struct/ && ++$in_struct;
184 if ($in_struct && /\(\*f_(i_\w+)/) {
187 if (/^\} im_ext_funcs;$/) {
189 or die "Found end of functions structure but not the start";
196 die "Found start of the functions structure but not the end\n";
199 die "Found neither the start nor end of the functions structure\n";
205 apidocs.perl - parse Imager's source for POD documenting the C API
209 perl apidocs.perl lib/Imager/APIRef.pod
213 Parses Imager's C sources, including .c, .h and .im files searching
214 for function documentation.
216 Besides the normal POD markup, the following can be included:
220 =item =category I<category-name>
222 The category the function should be in.
224 =item =synopsis I<sample-code>
226 Sample code using the function to include in the Imager::APIRef SYNOPSIS
228 =item =order I<integer>
230 Allows a function to be listed out of order. If this isn't specified
231 it defaults to 50, so a value of 10 will cause the function to be
232 listed at the beginning of its category, or 90 to list at the end.
234 Functions with equal order are otherwise ordered by name.
240 Tony Cook <tonyc@cpan.org>