]>
git.proxmox.com Git - pve-docs.git/blob - scan-adoc-refs
13 GetOptions
("depends=s" => \
$generate_depends) or
14 die("Error in command line arguments\n");
21 pvelogo
=> 0, # ignore
27 foreach my $e (keys %$environments) {
28 push @$start_env, $e if $environments->{$e};
31 my $env_stack = [$start_env];
32 my $env_name_stack = [];
34 sub reset_environment_stack
{
35 $env_stack = [$start_env];
39 sub push_environment
{
42 die "undefined environment '$env'\n" if !defined($environments->{$env});
44 # FIXME: this seems wrong (nested env?)?
45 return if !$environments->{$env}; # do not track
49 foreach my $e (@{$env_stack->[-1]}) {
54 die "empty environment" if !scalar($new_env);
55 push @$env_stack, $new_env;
57 push @$env_stack, [$env];
60 push @$env_name_stack, $env;
66 die "undefined environment '$env'\n" if !defined($environments->{$env});
68 return if !$environments->{$env}; # do not track
71 my $res = pop @$env_name_stack;
73 die "environment missmatch ($res != $env)\n" if $res ne $env;
76 sub register_include
{
77 my ($filename, $include_filename, $env_list) = @_;
79 foreach my $e (@$env_list) {
80 $fileinfo->{include
}->{$e}->{$filename}->{$include_filename} = 1;
84 sub register_blockid
{
85 my ($filename, $blockid, $reftext, $env_list) = @_;
87 foreach my $e (@$env_list) {
88 my $fn = $fileinfo->{blockid
}->{$e}->{$blockid};
89 die "blockid '$blockid' already defined in $fn"
91 $fileinfo->{blockid
}->{$e}->{$blockid} = $filename;
92 $fileinfo->{reftext
}->{$e}->{$blockid} = $reftext
98 my ($filename, $env, $doctype, $title, $blockid) = @_;
100 # fixme: what about other macros?
101 $title =~ s/\{pve\}/Proxmox VE/g;
102 $title =~ s!http://\S+\[(.*?)\]!$1!g;
104 # register document title (onyl once)
105 if (!defined($fileinfo->{titles
}->{$env}->{$filename})) {
107 $fileinfo->{titles
}->{$env}->{$filename} = $title;
109 if (defined($doctype)) {
110 $fileinfo->{doctype
}->{$env}->{$filename} = $doctype;
112 die "unable to change title (no doctype)"
113 if !defined($fileinfo->{doctype
}->{$env}->{$filename});
115 } elsif (!defined($doctype)) {
116 # change title via :title: attribute
117 $fileinfo->{titles
}->{$env}->{$filename} = $title;
120 if (defined($doctype) && ($env eq 'manvolnum') && ($doctype == 0)) {
121 if ($title =~ m/.*\(([1-8])\)\s*$/) {
122 $fileinfo->{mansection
}->{$env}->{$filename} = $1;
128 if !defined($fileinfo->{blockid
}->{$env}->{$blockid});
129 $fileinfo->{reftitle
}->{$env}->{$blockid} = $title;
136 reset_environment_stack
();
138 # print "SCAN $filename\n";
140 my $fh = IO
::File-
>new("$filename", "r") or
141 die "unable to open file '$filename' - $!\n";
143 my $env_last_line = {};
144 my $env_last_blockid = {};
146 while (defined (my $line = <$fh>)) {
147 if ($line =~ m/^if(n?)def::(\S+)\[(.*)\]\s*$/) {
148 my ($not, $env, $text) = ($1, $2, $3);
149 die "unsuported ifdef usage - implement me" if $text;
150 push_environment
($env, $not);
152 } elsif ($line =~ m/^endif::(\S+)\[(.*)\]\s*$/) {
153 my ($env, $text) = ($1, $2);
154 die "unsuported ifdef usage - implement me" if $text;
155 pop_environment
($env);
157 } elsif ($line =~ m/^include::(\S+)\[.*\]\s*$/) {
158 register_include
($filename, $1, $env_stack->[-1]);
162 # try to detect titles
163 foreach my $e (@{$env_stack->[-1]}) {
164 if ($line =~ m/^=====+$/) {
165 register_title
($filename, $e, 0, $env_last_line->{$e},
166 $env_last_blockid->{$e});
167 } elsif ($line =~ m/^-----+$/) {
168 register_title
($filename, $e, 1, $env_last_line->{$e},
169 $env_last_blockid->{$e});
170 } elsif ($line =~ m/^~~~~~+$/) {
171 register_title
($filename, $e, 2, $env_last_line->{$e},
172 $env_last_blockid->{$e});
173 } elsif ($line =~ m/^\^\^\^\^\^+$/) {
174 register_title
($filename, $e, 3, $env_last_line->{$e},
175 $env_last_blockid->{$e});
176 } elsif ($line =~ m/^= +(\S.*?)( +=)?$/) {
177 register_title
($filename, $e, 0, $1, $env_last_blockid->{$e});
178 } elsif ($line =~ m/^== +(\S.*?)( +==)?$/) {
179 register_title
($filename, $e, 1, $1, $env_last_blockid->{$e});
180 } elsif ($line =~ m/^=== +(\S.*?)( +===)?$/) {
181 register_title
($filename, $e, 2, $1, $env_last_blockid->{$e});
182 } elsif ($line =~ m/^==== +(\S.*?)( +====)?$/) {
183 register_title
($filename, $e, 3, $1, $env_last_blockid->{$e});
186 $env_last_line->{$e} = $line;
187 chomp $env_last_line->{$e};
190 if ($line =~ m/^:(\S+?):\s*(.*\S)?\s*$/) {
191 my ($key, $value) = ($1, $2);
192 if ($key eq 'pve-toplevel') {
194 foreach my $e (@{$env_stack->[-1]}) {
195 my $title = $fileinfo->{titles
}->{$e}->{$filename};
196 die "not title for toplevel file '$filename' (env=$e)\n"
198 $fileinfo->{toplevel
}->{$e}->{$filename} = 1;
200 } elsif ($key eq 'title') {
201 foreach my $e (@{$env_stack->[-1]}) {
202 register_title
($filename, $e, undef, $value);
207 if ($line =~ m/^\[\[(.*)\]\]\s*$/) {
209 die "implement me" if $blockid =~m/,/;
211 register_blockid
($filename, $blockid, $reftext, $env_stack->[-1]);
212 foreach my $e (@{$env_stack->[-1]}) {
213 $env_last_blockid->{$e} = $blockid;
217 if ($line =~ m/^\s*$/) {
218 foreach my $e (@{$env_stack->[-1]}) {
219 delete $env_last_blockid->{$e};
224 # bibliography anchors
225 if ($line =~ m/\[\[\[([^\]]*)\]\]\]/) {
227 die "implement me" if $blockid =~m/,/;
228 register_blockid
($filename, $blockid, "[$blockid]", $env_stack->[-1]);
233 my $scanned_files = {};
234 while (my $filename = shift) {
235 next if $filename !~ m/\.adoc$/; # skip attributes.txt
236 next if $scanned_files->{$filename};
238 scan_adoc_file
($filename);
239 $scanned_files->{$filename} = 1;
242 sub resolve_link_target
{
243 my ($env, $filename) = @_;
245 my $include_hash = $fileinfo->{include
}->{$env};
251 foreach my $fn (keys %$include_hash) {
252 if ($include_hash->{$fn}->{$filename}) {
253 next if ($fn eq 'pve-admin-guide.adoc') &&
254 $fileinfo->{outfile
}->{$env}->{$filename};
266 # try to generate output file mapping
267 foreach my $e (@$start_env) {
268 my $toplevel_hash = $fileinfo->{toplevel
}->{$e};
269 foreach my $fn (sort keys %$toplevel_hash) {
270 my $mansection = $fileinfo->{mansection
}->{manvolnum
}->{$fn};
273 $realfn =~ s/\.adoc$//;
274 if (defined($mansection) && ($mansection == 5)) {
275 $realfn .= ".$mansection";
277 $realfn = "$realfn-plain.html";
278 $fileinfo->{outfile
}->{$e}->{$fn} = $realfn;
279 } elsif ($e eq 'manvolnum') {
281 $realfn =~ s/\.adoc$//;
282 die "toplevel file '$fn' is not marked as manual page!" if !$mansection;
283 $realfn .= ".$mansection";
284 $fileinfo->{outfile
}->{$e}->{$fn} = $realfn;
285 } elsif ($e eq 'default') {
287 $realfn =~ s/\.adoc$//;
288 if (defined($mansection) && ($mansection == 5)) {
289 $realfn .= ".$mansection";
290 $realfn = "$realfn.html";
292 if (($fn ne 'pve-admin-guide.adoc') &&
293 $fileinfo->{doctype
}->{$e}->{$fn} == 0) {
294 $realfn = "chapter-$realfn.html";
296 $realfn = "$realfn.html";
299 $fileinfo->{outfile
}->{$e}->{$fn} = $realfn;
304 # now resolve blockids
305 foreach my $e (@$start_env) {
306 my $blockid_hash = $fileinfo->{blockid
}->{$e};
307 foreach my $blockid (keys %$blockid_hash) {
308 my $fn = resolve_link_target
($e, $blockid_hash->{$blockid});
310 my $title = $fileinfo->{titles
}->{$e}->{$fn};
312 die "found not title for '$fn' in env '$e'" if !$title;
313 $fileinfo->{blockid_target
}->{$e}->{$blockid} = "link:/wiki/$title#$blockid";
315 # we do not produce wiki pages for all content
316 #my $realfn = $fileinfo->{outfile}->{$e}->{$fn};
317 #warn "no output file mapping for '$fn' ($e)\n" if !$realfn;
319 } elsif ($e eq 'default') {
320 my $realfn = $fileinfo->{outfile
}->{$e}->{$fn} ||
321 die "no output file mapping for '$fn'\n";
322 $fileinfo->{blockid_target
}->{$e}->{$blockid} = "link:/pve-docs/$realfn#$blockid";
323 } elsif ($e eq 'manvolnum') {
324 # we do not produce manpages for all content
325 # my $realfn = $fileinfo->{outfile}->{$e}->{$fn} ||
326 # warn "no output file mapping for '$fn'\n";
327 $fileinfo->{blockid_target
}->{$e}->{$blockid} = $fn;
332 if ($generate_depends) {
334 my $tmpfilename = "${generate_depends}.tmp";
335 my $outfh = IO
::File-
>new($tmpfilename, "w") ||
336 die "unable to open temporary file '$tmpfilename'\n";
339 foreach my $e (@$start_env) {
340 my $env_data = $fileinfo->{include
}->{$e};
341 foreach my $fn (keys %$env_data) {
342 foreach my $dep (keys %{$env_data->{$fn}}) {
343 $depends->{$fn}->{$dep} = 1;
350 my $depend_varname_hash = {};
352 foreach my $fn (sort keys %$depends) {
353 my $basename = uc($fn);
354 $basename =~s/\.adoc$//i;
355 $basename =~s/[^A-Za-z0-9]/_/g;
357 my $var1text = "${basename}_ADOCSOURCES =";
358 my $var2text = "${basename}_ADOCDEPENDS = \$\{${basename}_ADOCSOURCES\}";
359 $depend_varname_hash->{$fn} = "${basename}_ADOCDEPENDS";
361 foreach my $dep (sort keys %{$depends->{$fn}}) {
362 if ($dep =~ m/-(opts|synopsis).adoc$/) {
363 $var2text .= " \\\n\t$dep";
365 $var1text .= " \\\n\t$dep";
368 $res .= "$var1text\n\n";
369 $res .= "$var2text\n\n";
372 my $man_sources_hash = {};
373 foreach my $e (@$start_env) {
374 my $filelist = $fileinfo->{outfile
}->{$e};
375 foreach my $sourcefile (sort keys %$filelist) {
376 my $varname = $depend_varname_hash->{$sourcefile};
377 my $target = $filelist->{$sourcefile};
378 $res .= "$target: \$\{$varname\}\n\n";
380 if ($e eq 'manvolnum') {
381 $man_sources_hash->{$sourcefile} = 1;
383 $res .= "$target.html: \$\{$varname\}\n\n";
384 $res .= "$target-plain.html: \$\{$varname\}\n\n";
389 my $varname = "MANUAL_SOURCES";
390 $res .= "$varname =";
391 foreach my $sourcefile (sort keys %$man_sources_hash) {
392 $res .= " \\\n\t$sourcefile";
396 $varname = "CHAPTER_LIST";
397 $res .= "$varname =";
398 my $filelist = $fileinfo->{outfile
}->{default};
399 foreach my $sourcefile (sort keys %$filelist) {
400 my $target = $filelist->{$sourcefile};
401 $res .= " \\\n\t$target";
405 $varname = "MANUAL_PAGES";
406 $res .= "$varname =";
407 $filelist = $fileinfo->{outfile
}->{manvolnum
};
408 foreach my $manpage (sort keys %$filelist) {
409 my $target = $filelist->{$manpage};
410 $res .= " \\\n\t$target";
414 $varname = "WIKI_IMPORTS";
415 $res .= "$varname =";
416 $filelist = $fileinfo->{outfile
}->{wiki
};
417 foreach my $sourcefile (sort keys %$filelist) {
418 my $target = $filelist->{$sourcefile};
419 $res .= " \\\n\t$target";
426 rename($tmpfilename, $generate_depends) ||
427 die "rename failed - $!";
430 print to_json
($fileinfo, { pretty
=> 1, canonical
=> 1 } );