49 lines
1.5 KiB
Perl
49 lines
1.5 KiB
Perl
#!/usr/bin/env perl
|
|
#
|
|
# Parse .rst files and generate tags.
|
|
|
|
use strict;
|
|
use warnings;
|
|
|
|
my $id = '[a-zA-Z_0-9]';
|
|
my @tags;
|
|
for my $file (@ARGV) {
|
|
open my $fh, '<', $file
|
|
or die "Cannot open $file for reading: $!";
|
|
while (<$fh>) {
|
|
chomp;
|
|
if (m/^(\.\. function:: )(.+)/) {
|
|
my ($pfx, $val) = ($1, $2);
|
|
if ($val =~ m/($id+) \(/o) {
|
|
push @tags, "$1\t$file\t/^$pfx$val/\n";
|
|
} else {
|
|
warn "unknown pattern in $file:$.: $_\n";
|
|
}
|
|
} elsif (m/^(\s*\.\. (?:type|member):: )(.+)/) {
|
|
my ($pfx, $val) = ($1, $2);
|
|
if ($val =~ m/\(\*([^\)]+)\)/) {
|
|
push @tags, "$1\t$file\t/^$pfx$val/\n";
|
|
} elsif ($val =~ m/($id+)(?::\d+)?\s*$/o) {
|
|
push @tags, "$1\t$file\t/^$pfx$val/\n";
|
|
} else {
|
|
warn "unknown pattern in $file:$.: $_\n";
|
|
}
|
|
} elsif (m/^(\s*\.\. var:: )(.+)/) {
|
|
my ($pfx, $val) = ($1, $2);
|
|
if ($val =~ m/($id+)(?:\[[^\]]*\])?\s*$/o) {
|
|
push @tags, "$1\t$file\t/^$pfx$val/\n";
|
|
} else {
|
|
warn "unknown pattern in $file:$.: $_\n";
|
|
}
|
|
} elsif (m/^(\s*\.\. macro::\s+)(\S+)\s*$/) {
|
|
push @tags, "$2\t$file\t/^$1$2/\n";
|
|
} elsif (m/^\s*\.\. (?:toctree|image|highlight|code-block)::/) {
|
|
# Skip
|
|
} elsif (m/^\s*\.\.\s*\S+::/) {
|
|
warn "unknown pattern in $file:$.: $_\n";
|
|
}
|
|
}
|
|
}
|
|
|
|
print sort @tags;
|