From 571ed1a9a73129dff78c4d04333949605b91c273 Mon Sep 17 00:00:00 2001 From: Mischa POSLAWSKY Date: Mon, 31 Oct 2022 15:33:19 +0100 Subject: [PATCH] static usage text, generation code into reformat-podusage script Significantly faster and less convoluted, at the small cost of tracking some documentation twice. --- Makefile | 2 ++ barcat | 59 +++++++++++++++++++++++++---------------------- reformat-podusage | 45 ++++++++++++++++++++++++++++++++++++ 3 files changed, 79 insertions(+), 27 deletions(-) create mode 100644 Makefile create mode 100755 reformat-podusage diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..ef60b50 --- /dev/null +++ b/Makefile @@ -0,0 +1,2 @@ +barcat: reformat-podusage + ./$< $@ diff --git a/barcat b/barcat index 0316b64..ce3f788 100755 --- a/barcat +++ b/barcat @@ -82,33 +82,7 @@ GetOptions(\%opt, exit; }, 'usage|h' => sub { - local $/ = undef; # slurp - my $pod = readline *DATA; - $pod =~ s/^=over\K/ 25/; # indent options list - $pod =~ s{ - ^=item \h \N*\n\n \N*\n \K # first line - (?: (?: ^=over .*? ^=back\n )? (?!=) \N*\n )* - }{\n}g; # abbreviate options - $pod =~ s/[.,](?=\n)//g; # trailing punctuation - $pod =~ s/^=item\ \K(?=--)/____/g; # align long options - # abbreviate indicators - $pod =~ s/\Q>.../s>/g; - $pod =~ s/<(?:number|count|seconds)>/N/g; - $pod =~ s//\Uchar$1/g; - $pod =~ s/\Q | /|/g; - $pod =~ s/(?/\U$1/g; # uppercase - - require Pod::Usage; - my $parser = Pod::Usage->new(USAGE_OPTIONS => { - -indent => 2, -width => 78, - }); - $parser->select('SYNOPSIS', 'OPTIONS'); - $parser->output_string(\my $contents); - $parser->parse_string_document($pod); - - $contents =~ s/\n(?=\n\h)//msg; # strip space between items - $contents =~ s/^\ \ \K____/ /g; # nbsp substitute - print $contents; + /^=/ ? last : print for readline *DATA; # text between __END__ and pod exit; }, 'help|?' => sub { @@ -362,6 +336,37 @@ sub show_exit { show_exit(); __END__ +Usage: + barcat [OPTIONS] [FILES|NUMBERS] + +Options: + -a, --[no-]ascii Restrict user interface to ASCII characters + -c, --[no-]color Force colored output of values and bar markers + -f, --field=(N|REGEXP) Compare values after a given number of whitespace + separators + --header Prepend a chart axis with minimum and maximum + values labeled + -H, --human-readable Format values using SI unit prefixes + -t, --interval[=(N|-LINES)] + Output partial progress every given number of + seconds or input lines + -l, --length=[-]SIZE[%] Trim line contents (between number and bars) + -L, --limit[=(N|-LAST|START-[END])] + Stop output after a number of lines + --graph-format=CHAR Glyph to repeat for the graph line + -m, --markers=FORMAT Statistical positions to indicate on bars + --min=N, --max=N Bars extend from 0 or the minimum value if lower + --palette=(PRESET|COLORS) + Override colors of parsed numbers + --spark[=CHARS] Replace lines by sparklines + -s, --stat Total statistics after all data + -u, --unmodified Do not reformat values, keeping leading whitespace + --value-length=SIZE Reserved space for numbers + -w, --width=COLUMNS Override the maximum number of columns to use + -h, --usage Overview of available options + --help Full documentation + --version Version information + =encoding utf8 =head1 NAME diff --git a/reformat-podusage b/reformat-podusage new file mode 100755 index 0000000..cbb25cc --- /dev/null +++ b/reformat-podusage @@ -0,0 +1,45 @@ +#!/usr/bin/env perl +use 5.014; +use warnings; +use open qw( :std :utf8 ); +use re '/msx'; + +our $VERSION = '1.00'; + +local $/ = undef; # slurp +my $source = readline; +my $pod = $source; +$pod =~ s/^=over\K/ 25/; # indent options list +$pod =~ s{ + ^=item \h \N*\n\n \N*\n \K # first line + (?: (?: ^=over .*? ^=back\n )? (?!=) \N*\n )* +}{\n}g; # abbreviate options +$pod =~ s/[.,](?=\n)//g; # trailing punctuation +$pod =~ s/^=item\ \K(?=--)/____/g; # align long options +# abbreviate indicators +$pod =~ s/\Q>.../s>/g; +$pod =~ s/<(?:number|count|seconds)>/N/g; +$pod =~ s//\Uchar$1/g; +$pod =~ s/\Q | /|/g; +$pod =~ s/(?/\U$1/g; # uppercase + +require Pod::Usage; +my $parser = Pod::Usage->new(USAGE_OPTIONS => { + -indent => 2, -width => 78, +}); +$parser->select('SYNOPSIS', 'OPTIONS'); +$parser->output_string(\my $usage); +$parser->parse_string_document($pod); + +$usage =~ s/\n(?=\n\h)//msg; # strip space between items +$usage =~ s/^\ \ \K____/ /g; # nbsp substitute + +if ($ARGV eq '-') { + # custom formatted minimal usage text from pod document + print $usage; +} +elsif (open my $rewrite, '>', $ARGV) { + # replace perl code between program end and pod start + $source =~ s/^__END__\n \K .*? (?=^=)/$usage/; + print {$rewrite} $source; +} -- 2.30.0