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 = sort 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 my @funcs = @{$cats{$cat}};
112 @orig{@funcs} = 0 .. $#funcs;
113 @funcs = sort { $order{$a} <=> $order{$b} || $orig{$a} <=> $orig{$b} } @funcs;
114 for my $func (grep $funcsyns{$_}, @funcs) {
115 my $syn = $funcsyns{$func};
129 for my $cat (sort { lc $a cmp lc $b } keys %cats) {
130 print OUT "=head2 $cat\n\n=over\n\n";
131 my @ordered_funcs = sort {
132 $order{$a} <=> $order{$b}
135 for my $func (@ordered_funcs) {
136 print OUT @{$alldocs{$func}}, "\n";
137 print OUT "=for comment\nFrom: $from{$func}\n\n";
138 delete $undoc{$func};
140 print OUT "\n=back\n\n";
143 # see if we have an uncategorised section
144 if (grep $alldocs{$_}, keys %undoc) {
145 print OUT "=head2 Uncategorized functions\n\n=over\n\n";
146 #print join(",", grep !exists $order{$_}, @funcs), "\n";
147 for my $func (sort { $order{$a} <=> $order{$b} || $a cmp $b }
148 grep $undoc{$_} && $alldocs{$_}, @funcs) {
149 print OUT @{$alldocs{$func}}, "\n";
150 print OUT "=for comment\nFrom: $from{$func}\n\n";
151 delete $undoc{$func};
153 print OUT "\n\n=back\n\n";
161 The following API functions are undocumented so far, hopefully this
168 print OUT "=item *\n\nB<$_>\n\n" for sort keys %undoc;
170 print OUT "\n\n=back\n\n";
177 Tony Cook <tonyc@cpan.org>
181 Imager, Imager::ExtUtils, Imager::Inline
190 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 i_psamp_bits i_gsamp_bits i_psamp i_psampf);
191 open FUNCS, "< imexttypes.h"
192 or die "Cannot open imexttypes.h: $!\n";
195 /^typedef struct/ && ++$in_struct;
196 if ($in_struct && /\(\*f_(io?_\w+)/) {
201 if (/^\} im_ext_funcs;$/) {
203 or die "Found end of functions structure but not the start";
210 die "Found start of the functions structure but not the end\n";
213 die "Found neither the start nor end of the functions structure\n";
219 apidocs.perl - parse Imager's source for POD documenting the C API
223 perl apidocs.perl lib/Imager/APIRef.pod
227 Parses Imager's C sources, including .c, .h and .im files searching
228 for function documentation.
230 Besides the normal POD markup, the following can be included:
234 =item =category I<category-name>
236 The category the function should be in.
238 =item =synopsis I<sample-code>
240 Sample code using the function to include in the Imager::APIRef SYNOPSIS
242 =item =order I<integer>
244 Allows a function to be listed out of order. If this isn't specified
245 it defaults to 50, so a value of 10 will cause the function to be
246 listed at the beginning of its category, or 90 to list at the end.
248 Functions with equal order are otherwise ordered by name.
254 Tony Cook <tonyc@cpan.org>