]>
git.proxmox.com Git - pve-docs.git/blob - scan-adoc-refs
14 pvelogo
=> 0, # ignore
17 my $resolve_skip_files = {
19 wiki
=> { 'pve-admin-guide.adoc' => 1 },
26 foreach my $e (keys %$environments) {
27 push @$start_env, $e if $environments->{$e};
30 my $env_stack = [$start_env];
31 my $env_name_stack = [];
33 sub reset_environment_stack
{
34 $env_stack = [$start_env];
38 sub push_environment
{
41 die "undefined environment '$env'\n" if !defined($environments->{$env});
43 return if !$environments->{$env}; # do not track
47 foreach my $e (@{$env_stack->[-1]}) {
52 die "empty environment" if !scalar($new_env);
53 push @$env_stack, $new_env;
55 push @$env_stack, [$env];
58 push @$env_name_stack, $env;
64 die "undefined environment '$env'\n" if !defined($environments->{$env});
66 return if !$environments->{$env}; # do not track
69 my $res = pop @$env_name_stack;
71 die "environment missmatch ($res != $env)\n" if $res ne $env;
74 sub register_include
{
75 my ($filename, $include_filename, $env_list) = @_;
77 return if $include_filename !~ m/\.adoc$/; # skip attributes.txt
79 foreach my $e (@$env_list) {
80 $fileinfo->{include
}->{$e}->{$filename}->{$include_filename} = 1;
84 sub register_blockid
{
85 my ($filename, $blockid, $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;
98 reset_environment_stack
();
100 # print "SCAN $filename\n";
102 my $fh = IO
::File-
>new("$filename", "r") or
103 die "unable to open file '$filename' - $!\n";
105 my $env_last_line = {};
107 while (defined (my $line = <$fh>)) {
108 if ($line =~ m/^if(n?)def::(\S+)\[(.*)\]\s*$/) {
109 my ($not, $env, $text) = ($1, $2);
110 die "unsuported ifdef usage - implement me" if $text;
111 push_environment
($env, $not);
113 } elsif ($line =~ m/^endif::(\S+)\[(.*)\]\s*$/) {
114 my ($env, $text) = ($1, $2);
115 die "unsuported ifdef usage - implement me" if $text;
116 pop_environment
($env);
118 } elsif ($line =~ m/^include::(\S+)\[.*\]\s*$/) {
119 register_include
($filename, $1, $env_stack->[-1]);
123 # try to detect titles
124 foreach my $e (@{$env_stack->[-1]}) {
125 my $title = $fileinfo->{titles
}->{$e}->{$filename};
126 next if defined($title);
128 if (($line =~ m/^=====+/) || ($line =~ m/^-----+/)) {
129 $fileinfo->{titles
}->{$e}->{$filename} = $env_last_line->{$e};
131 $env_last_line->{$e} = $line;
132 chomp $env_last_line->{$e};
135 # fixme: also scan <<>>
137 while ($line =~ m/xref:([^\s\[\]]+)\[([^\]]*)\]/g) {
138 # print "$filename xref:$1 [$2]\n";
141 if ($line =~ m/^\[\[(.*)\]\]\s*$/) {
143 die "implement me" if $blockid =~m/,/;
144 register_blockid
($filename, $blockid, $env_stack->[-1]);
149 my $scanned_files = {};
150 while (my $filename = shift) {
151 next if $filename !~ m/\.adoc$/; # skip attributes.txt
152 next if $scanned_files->{$filename};
154 scan_adoc_file
($filename);
155 $scanned_files->{$filename} = 1;
158 sub resolve_link_target
{
159 my ($env, $filename) = @_;
161 my $include_hash = $fileinfo->{include
}->{$env};
167 foreach my $fn (keys %$include_hash) {
168 next if $resolve_skip_files->{$env}->{$fn};
169 if ($include_hash->{$fn}->{$filename}) {
180 # now resolve blockids
181 foreach my $e (@$start_env) {
182 my $blockid_hash = $fileinfo->{blockid
}->{$e};
183 foreach my $blockid (keys %$blockid_hash) {
184 my $fn = resolve_link_target
($e, $blockid_hash->{$blockid});
186 my $title = $fileinfo->{titles
}->{$e}->{$fn};
188 $title =~ s/\{pve\}/Proxmox VE/g;
189 die "found not title for '$fn' in env '$e'" if !$title;
190 $fileinfo->{blockid_target
}->{$e}->{$blockid} = "link:/wiki/$title#$blockid";
192 $fileinfo->{blockid_target
}->{$e}->{$blockid} = $fn;
198 print to_json
($fileinfo, { pretty
=> 1 } );