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 (.*)/) {
61 unless (length $synopsis) {
65 push @funcdocs, " $1\n";
67 elsif (/^=order (.*)$/) {
70 or die "=order must specify a number for $func in $file\n";
78 die "Documentation for $func not followed by =cut or =head in $file\n";
83 open OUT, "> $outname"
84 or die "Cannot open $outname: $!";
86 # I keep this file in git and as part of the dist, make sure newlines
91 Do not edit this file, it is generated automatically by apidocs.perl
92 from Imager's source files.
94 Each function description has a comment listing the source file where
95 you can find the documentation.
99 Imager::APIRef - Imager's C API - reference.
104 color.rgba.r = 255; color.rgba.g = 0; color.rgba.b = 255;
108 for my $cat (sort { lc $a cmp lc $b } keys %cats) {
109 print OUT "\n # $cat\n";
110 for my $func (grep $funcsyns{$_}, sort { $order{$a} <=> $order{$b} } @{$cats{$cat}}) {
111 my $syn = $funcsyns{$func};
125 for my $cat (sort { lc $a cmp lc $b } keys %cats) {
126 print OUT "=head2 $cat\n\n=over\n\n";
127 my @ordered_funcs = sort {
128 $order{$a} <=> $order{$b}
131 for my $func (@ordered_funcs) {
132 print OUT @{$alldocs{$func}}, "\n";
133 print OUT "=for comment\nFrom: $from{$func}\n\n";
134 delete $undoc{$func};
136 print OUT "\n=back\n\n";
139 # see if we have an uncategorised section
140 if (grep $alldocs{$_}, keys %undoc) {
141 print OUT "=head2 Uncategorized functions\n\n=over\n\n";
142 #print join(",", grep !exists $order{$_}, @funcs), "\n";
143 for my $func (sort { $order{$a} <=> $order{$b} || $a cmp $b }
144 grep $undoc{$_} && $alldocs{$_}, @funcs) {
145 print OUT @{$alldocs{$func}}, "\n";
146 print OUT "=for comment\nFrom: $from{$func}\n\n";
147 delete $undoc{$func};
149 print OUT "\n\n=back\n\n";
157 The following API functions are undocumented so far, hopefully this
164 print OUT "=item *\n\nB<$_>\n\n" for sort keys %undoc;
166 print OUT "\n\n=back\n\n";
173 Tony Cook <tonyc@cpan.org>
177 Imager, Imager::ExtUtils, Imager::Inline
186 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 i_DF i_DFc i_DFp i_DFcp);
187 open FUNCS, "< imexttypes.h"
188 or die "Cannot open imexttypes.h: $!\n";
191 /^typedef struct/ && ++$in_struct;
192 if ($in_struct && /\(\*f_(io?_\w+)/) {
197 if (/^\} im_ext_funcs;$/) {
199 or die "Found end of functions structure but not the start";
206 die "Found start of the functions structure but not the end\n";
209 die "Found neither the start nor end of the functions structure\n";
215 apidocs.perl - parse Imager's source for POD documenting the C API
219 perl apidocs.perl lib/Imager/APIRef.pod
223 Parses Imager's C sources, including .c, .h and .im files searching
224 for function documentation.
226 Besides the normal POD markup, the following can be included:
230 =item =category I<category-name>
232 The category the function should be in.
234 =item =synopsis I<sample-code>
236 Sample code using the function to include in the Imager::APIRef SYNOPSIS
238 =item =order I<integer>
240 Allows a function to be listed out of order. If this isn't specified
241 it defaults to 50, so a value of 10 will cause the function to be
242 listed at the beginning of its category, or 90 to list at the end.
244 Functions with equal order are otherwise ordered by name.
250 Tony Cook <tonyc@cpan.org>