the-bastion/doc/sphinx/build-config-doc-ref.pl
2022-07-01 10:21:19 +02:00

125 lines
3.4 KiB
Perl

#! /usr/bin/env perl
# vim: set filetype=perl ts=4 sw=4 sts=4 et:
use strict;
use warnings;
use FindBin;
my %h;
my @header;
my @out;
my $section;
my %sections;
my %sectiondesc;
my @orderedsections;
my $document = $ARGV[0] || 'unknown';
sub dumpdoc {
if (!%h) {
; # nothing to do
}
elsif (defined $h{param} && defined $h{default} && defined $h{desc} && defined $h{type}) {
die "attempting to dump data but section=$section" if !$section;
push @{$sections{$section}}, $h{param};
push @out, (".. _$h{param}:\n", "\n") if $ENV{'GLOBAL_REFS'};
push @out, "$h{param}\n", "*" x length($h{param}) . "\n", "\n", ":Type: ``$h{type}``\n", "\n",
":Default: ``$h{default}``\n", "\n";
push @out, (":Example: ``$h{example}``\n", "\n") if $h{example};
push @out, "$h{desc}\n", "\n";
}
else {
die "something is missing: "
. ($h{param} ? "" : "param ")
. ($h{default} ? "" : "default ")
. ($h{desc} ? "" : "desc ")
. ($h{type} ? "" : "type") . "\n";
}
%h = ();
return;
}
my $state = 'start';
while (<STDIN>) {
printf STDERR "%9s line=%s", $state, $_ if $ENV{'DEBUG'};
next if /^\s*$/;
if ($state eq 'start') {
if (m{^###}) {
$state = '' if @header;
}
elsif (m{^#@(.*)$}) {
push @header, $1;
}
}
elsif (m{^# ([a-zA-Z0-9_]+) \((.+)\)}) {
$h{param} = $1;
$h{type} = $2;
$state = 'name';
}
elsif (m{^#\s+DESC:\s+(.+)$}) {
$h{desc} = $1;
$state = 'desc';
}
elsif (m{^#\s+EXAMPLE:\s+(.+)$}) {
$h{example} = $1;
$state = 'example';
}
elsif (m{^#\s+DEFAULT:\s+(.+)$}) {
$h{default} = $1;
$state = 'default';
}
elsif (m{^#\s{0,11}(.*)$} && exists $h{desc} && $state eq 'desc') {
$h{desc} .= "\n$1";
}
elsif ((m{^"([^"]+)"} && $h{param} eq $1) || (m{^([A-Za-z0-9_]+)=} && $h{param} eq $1)) {
$state = 'param';
}
elsif (m{^#$} && $state eq 'param') {
$state = '';
dumpdoc();
}
elsif ($state eq 'param') {
}
elsif (m{^# > (.+)$}) {
if (%h or $state) { die "new section '$1' but we have pending data"; }
$section = $1;
$state = 'section';
push @orderedsections, $section;
push @out, $section, "\n", "-" x (length($section)), "\n\n";
}
elsif (m{^# >> (.+)$} and $state eq 'section' and $section) {
$sectiondesc{$section} = $1;
}
elsif (!/^##|^[{}]|^#\s*$/) {
die("$_^^^ lost here, state='$state'");
}
}
dumpdoc();
if (open(my $fh, "<", "$FindBin::Bin/../sphinx-reference-headers/$document.header")) {
my $contents = do { local $/; <$fh>; };
close($fh);
print $contents;
}
elsif (@header) {
print "=" x length($document) . "\n";
print "$document\n";
print "=" x length($document) . "\n\n";
print join("\n", @header);
print "\n\nOption List\n===========\n";
}
else {
print STDERR "No header found in '$FindBin::Bin/../sphinx-reference-headers/$document.header'\n";
}
foreach my $section (@orderedsections) {
die "no description for section $section" if !$sectiondesc{$section};
print "\n", "$section options\n", "-" x length("$section options"), "\n\n", $sectiondesc{$section}, "\n\n";
print "- `$_`_\n" for @{$sections{$section}};
}
print <<'EOF', join('', @out);
Option Reference
================
EOF