]>
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 my $makevar_hash = {};
337 die "makefile variable '$varname' already defined\n"
338 if exists($makevar_hash->{$varname});
340 $makevar_hash->{$varname} = {};
343 sub makevar_list_add
{
344 my ($varname, $value) = @_;
346 die "makefile variable '$varname' not defined\n"
347 if !exists($makevar_hash->{$varname});
349 $makevar_hash->{$varname}->{$value} = 1;
355 foreach my $varname (sort keys %$makevar_hash) {
356 $txt .= "$varname =";
357 foreach my $value (sort keys %{$makevar_hash->{$varname}}) {
358 $txt .= " \\\n\t$value";
366 if ($generate_depends) {
368 my $tmpfilename = "${generate_depends}.tmp";
369 my $outfh = IO
::File-
>new($tmpfilename, "w") ||
370 die "unable to open temporary file '$tmpfilename'\n";
373 foreach my $e (@$start_env) {
374 my $env_data = $fileinfo->{include
}->{$e};
375 foreach my $fn (keys %$env_data) {
376 foreach my $dep (keys %{$env_data->{$fn}}) {
377 $depends->{$fn}->{$dep} = 1;
382 my $depend_varname_hash = {};
384 foreach my $fn (sort keys %$depends) {
385 my $basename = uc($fn);
386 $basename =~s/\.adoc$//i;
387 $basename =~s/[^A-Za-z0-9]/_/g;
389 my $varname1 = "${basename}_ADOCSOURCES";
390 my $varname2 = "${basename}_ADOCDEPENDS";
392 makevar_define
($varname1);
393 makevar_define
($varname2);
395 $depend_varname_hash->{$fn} = $varname2;
397 makevar_list_add
($varname1, $fn);
398 makevar_list_add
($varname2, "\$\{$varname1\}");
400 foreach my $dep (sort keys %{$depends->{$fn}}) {
401 if ($dep =~ m/-(opts|synopsis).adoc$/) {
402 makevar_list_add
($varname2, $dep);
404 makevar_list_add
($varname1, $dep);
409 my $man_sources_hash = {};
410 foreach my $sourcefile (keys %{$fileinfo->{outfile
}->{manvolnum
}}) {
411 $man_sources_hash->{$sourcefile} = 1;
412 my $ihash = $fileinfo->{include
}->{manvolnum
}->{$sourcefile};
413 foreach my $include (keys %$ihash) {
414 if ($include !~ m/-(opts|synopsis).adoc$/) {
415 $man_sources_hash->{$include} = 1;
420 my $varname = "MANUAL_SOURCES";
421 makevar_define
($varname);
422 foreach my $sourcefile (sort keys %$man_sources_hash) {
423 makevar_list_add
($varname, $sourcefile);
426 $varname = "CHAPTER_LIST";
427 makevar_define
($varname);
428 my $filelist = $fileinfo->{outfile
}->{default};
429 foreach my $sourcefile (sort keys %$filelist) {
430 my $target = $filelist->{$sourcefile};
431 makevar_list_add
($varname, $target);
434 $varname = "MANUAL_PAGES";
435 makevar_define
($varname);
436 $filelist = $fileinfo->{outfile
}->{manvolnum
};
437 foreach my $manpage (sort keys %$filelist) {
438 my $target = $filelist->{$manpage};
439 makevar_list_add
($varname, $target);
442 $varname = "WIKI_IMPORTS";
443 makevar_define
($varname);
444 $filelist = $fileinfo->{outfile
}->{wiki
};
445 foreach my $sourcefile (sort keys %$filelist) {
446 my $target = $filelist->{$sourcefile};
447 makevar_list_add
($varname, $target);
450 my $res = makevar_dump
();
452 my $make_targets = {};
453 foreach my $e (@$start_env) {
454 my $filelist = $fileinfo->{outfile
}->{$e};
455 foreach my $sourcefile (sort keys %$filelist) {
456 my $varname = $depend_varname_hash->{$sourcefile};
457 my $target = $filelist->{$sourcefile};
458 my $dep = "\$\{$varname\}";
459 $make_targets->{$target} = $dep;
460 if ($e eq 'manvolnum') {
461 $make_targets->{"$target.html"} = $dep;
462 $make_targets->{"$target-plain.html"} = $dep;
466 foreach my $target (sort keys%$make_targets) {
467 my $dep = $make_targets->{$target};
468 $res .= "$target: $dep\n\n";
474 rename($tmpfilename, $generate_depends) ||
475 die "rename failed - $!";
478 print to_json
($fileinfo, { pretty
=> 1, canonical
=> 1 } );