[ Index ] |
PHP Cross Reference of Unnamed Project |
[Summary view] [Print] [Text view]
1 ############################################################################# 2 # Pod/Usage.pm -- print usage messages for the running script. 3 # 4 # Copyright (C) 1996-2000 by Bradford Appleton. All rights reserved. 5 # This file is part of "PodParser". PodParser is free software; 6 # you can redistribute it and/or modify it under the same terms 7 # as Perl itself. 8 ############################################################################# 9 10 package Pod::Usage; 11 12 use vars qw($VERSION); 13 $VERSION = "1.35"; ## Current version of this package 14 require 5.005; ## requires this Perl version or later 15 16 =head1 NAME 17 18 Pod::Usage, pod2usage() - print a usage message from embedded pod documentation 19 20 =head1 SYNOPSIS 21 22 use Pod::Usage 23 24 my $message_text = "This text precedes the usage message."; 25 my $exit_status = 2; ## The exit status to use 26 my $verbose_level = 0; ## The verbose level to use 27 my $filehandle = \*STDERR; ## The filehandle to write to 28 29 pod2usage($message_text); 30 31 pod2usage($exit_status); 32 33 pod2usage( { -message => $message_text , 34 -exitval => $exit_status , 35 -verbose => $verbose_level, 36 -output => $filehandle } ); 37 38 pod2usage( -msg => $message_text , 39 -exitval => $exit_status , 40 -verbose => $verbose_level, 41 -output => $filehandle ); 42 43 pod2usage( -verbose => 2, 44 -noperldoc => 1 ) 45 46 =head1 ARGUMENTS 47 48 B<pod2usage> should be given either a single argument, or a list of 49 arguments corresponding to an associative array (a "hash"). When a single 50 argument is given, it should correspond to exactly one of the following: 51 52 =over 4 53 54 =item * 55 56 A string containing the text of a message to print I<before> printing 57 the usage message 58 59 =item * 60 61 A numeric value corresponding to the desired exit status 62 63 =item * 64 65 A reference to a hash 66 67 =back 68 69 If more than one argument is given then the entire argument list is 70 assumed to be a hash. If a hash is supplied (either as a reference or 71 as a list) it should contain one or more elements with the following 72 keys: 73 74 =over 4 75 76 =item C<-message> 77 78 =item C<-msg> 79 80 The text of a message to print immediately prior to printing the 81 program's usage message. 82 83 =item C<-exitval> 84 85 The desired exit status to pass to the B<exit()> function. 86 This should be an integer, or else the string "NOEXIT" to 87 indicate that control should simply be returned without 88 terminating the invoking process. 89 90 =item C<-verbose> 91 92 The desired level of "verboseness" to use when printing the usage 93 message. If the corresponding value is 0, then only the "SYNOPSIS" 94 section of the pod documentation is printed. If the corresponding value 95 is 1, then the "SYNOPSIS" section, along with any section entitled 96 "OPTIONS", "ARGUMENTS", or "OPTIONS AND ARGUMENTS" is printed. If the 97 corresponding value is 2 or more then the entire manpage is printed. 98 99 The special verbosity level 99 requires to also specify the -sections 100 parameter; then these sections are extracted (see L<Pod::Select>) 101 and printed. 102 103 =item C<-sections> 104 105 A string representing a selection list for sections to be printed 106 when -verbose is set to 99, e.g. C<"NAME|SYNOPSIS|DESCRIPTION|VERSION">. 107 108 =item C<-output> 109 110 A reference to a filehandle, or the pathname of a file to which the 111 usage message should be written. The default is C<\*STDERR> unless the 112 exit value is less than 2 (in which case the default is C<\*STDOUT>). 113 114 =item C<-input> 115 116 A reference to a filehandle, or the pathname of a file from which the 117 invoking script's pod documentation should be read. It defaults to the 118 file indicated by C<$0> (C<$PROGRAM_NAME> for users of F<English.pm>). 119 120 =item C<-pathlist> 121 122 A list of directory paths. If the input file does not exist, then it 123 will be searched for in the given directory list (in the order the 124 directories appear in the list). It defaults to the list of directories 125 implied by C<$ENV{PATH}>. The list may be specified either by a reference 126 to an array, or by a string of directory paths which use the same path 127 separator as C<$ENV{PATH}> on your system (e.g., C<:> for Unix, C<;> for 128 MSWin32 and DOS). 129 130 =item C<-noperldoc> 131 132 By default, Pod::Usage will call L<perldoc> when -verbose >= 2 is 133 specified. This does not work well e.g. if the script was packed 134 with L<PAR>. The -noperldoc option suppresses the external call to 135 L<perldoc> and uses the simple text formatter (L<Pod::Text>) to 136 output the POD. 137 138 =back 139 140 =head1 DESCRIPTION 141 142 B<pod2usage> will print a usage message for the invoking script (using 143 its embedded pod documentation) and then exit the script with the 144 desired exit status. The usage message printed may have any one of three 145 levels of "verboseness": If the verbose level is 0, then only a synopsis 146 is printed. If the verbose level is 1, then the synopsis is printed 147 along with a description (if present) of the command line options and 148 arguments. If the verbose level is 2, then the entire manual page is 149 printed. 150 151 Unless they are explicitly specified, the default values for the exit 152 status, verbose level, and output stream to use are determined as 153 follows: 154 155 =over 4 156 157 =item * 158 159 If neither the exit status nor the verbose level is specified, then the 160 default is to use an exit status of 2 with a verbose level of 0. 161 162 =item * 163 164 If an exit status I<is> specified but the verbose level is I<not>, then the 165 verbose level will default to 1 if the exit status is less than 2 and 166 will default to 0 otherwise. 167 168 =item * 169 170 If an exit status is I<not> specified but verbose level I<is> given, then 171 the exit status will default to 2 if the verbose level is 0 and will 172 default to 1 otherwise. 173 174 =item * 175 176 If the exit status used is less than 2, then output is printed on 177 C<STDOUT>. Otherwise output is printed on C<STDERR>. 178 179 =back 180 181 Although the above may seem a bit confusing at first, it generally does 182 "the right thing" in most situations. This determination of the default 183 values to use is based upon the following typical Unix conventions: 184 185 =over 4 186 187 =item * 188 189 An exit status of 0 implies "success". For example, B<diff(1)> exits 190 with a status of 0 if the two files have the same contents. 191 192 =item * 193 194 An exit status of 1 implies possibly abnormal, but non-defective, program 195 termination. For example, B<grep(1)> exits with a status of 1 if 196 it did I<not> find a matching line for the given regular expression. 197 198 =item * 199 200 An exit status of 2 or more implies a fatal error. For example, B<ls(1)> 201 exits with a status of 2 if you specify an illegal (unknown) option on 202 the command line. 203 204 =item * 205 206 Usage messages issued as a result of bad command-line syntax should go 207 to C<STDERR>. However, usage messages issued due to an explicit request 208 to print usage (like specifying B<-help> on the command line) should go 209 to C<STDOUT>, just in case the user wants to pipe the output to a pager 210 (such as B<more(1)>). 211 212 =item * 213 214 If program usage has been explicitly requested by the user, it is often 215 desirable to exit with a status of 1 (as opposed to 0) after issuing 216 the user-requested usage message. It is also desirable to give a 217 more verbose description of program usage in this case. 218 219 =back 220 221 B<pod2usage> doesn't force the above conventions upon you, but it will 222 use them by default if you don't expressly tell it to do otherwise. The 223 ability of B<pod2usage()> to accept a single number or a string makes it 224 convenient to use as an innocent looking error message handling function: 225 226 use Pod::Usage; 227 use Getopt::Long; 228 229 ## Parse options 230 GetOptions("help", "man", "flag1") || pod2usage(2); 231 pod2usage(1) if ($opt_help); 232 pod2usage(-verbose => 2) if ($opt_man); 233 234 ## Check for too many filenames 235 pod2usage("$0: Too many files given.\n") if (@ARGV > 1); 236 237 Some user's however may feel that the above "economy of expression" is 238 not particularly readable nor consistent and may instead choose to do 239 something more like the following: 240 241 use Pod::Usage; 242 use Getopt::Long; 243 244 ## Parse options 245 GetOptions("help", "man", "flag1") || pod2usage(-verbose => 0); 246 pod2usage(-verbose => 1) if ($opt_help); 247 pod2usage(-verbose => 2) if ($opt_man); 248 249 ## Check for too many filenames 250 pod2usage(-verbose => 2, -message => "$0: Too many files given.\n") 251 if (@ARGV > 1); 252 253 As with all things in Perl, I<there's more than one way to do it>, and 254 B<pod2usage()> adheres to this philosophy. If you are interested in 255 seeing a number of different ways to invoke B<pod2usage> (although by no 256 means exhaustive), please refer to L<"EXAMPLES">. 257 258 =head1 EXAMPLES 259 260 Each of the following invocations of C<pod2usage()> will print just the 261 "SYNOPSIS" section to C<STDERR> and will exit with a status of 2: 262 263 pod2usage(); 264 265 pod2usage(2); 266 267 pod2usage(-verbose => 0); 268 269 pod2usage(-exitval => 2); 270 271 pod2usage({-exitval => 2, -output => \*STDERR}); 272 273 pod2usage({-verbose => 0, -output => \*STDERR}); 274 275 pod2usage(-exitval => 2, -verbose => 0); 276 277 pod2usage(-exitval => 2, -verbose => 0, -output => \*STDERR); 278 279 Each of the following invocations of C<pod2usage()> will print a message 280 of "Syntax error." (followed by a newline) to C<STDERR>, immediately 281 followed by just the "SYNOPSIS" section (also printed to C<STDERR>) and 282 will exit with a status of 2: 283 284 pod2usage("Syntax error."); 285 286 pod2usage(-message => "Syntax error.", -verbose => 0); 287 288 pod2usage(-msg => "Syntax error.", -exitval => 2); 289 290 pod2usage({-msg => "Syntax error.", -exitval => 2, -output => \*STDERR}); 291 292 pod2usage({-msg => "Syntax error.", -verbose => 0, -output => \*STDERR}); 293 294 pod2usage(-msg => "Syntax error.", -exitval => 2, -verbose => 0); 295 296 pod2usage(-message => "Syntax error.", 297 -exitval => 2, 298 -verbose => 0, 299 -output => \*STDERR); 300 301 Each of the following invocations of C<pod2usage()> will print the 302 "SYNOPSIS" section and any "OPTIONS" and/or "ARGUMENTS" sections to 303 C<STDOUT> and will exit with a status of 1: 304 305 pod2usage(1); 306 307 pod2usage(-verbose => 1); 308 309 pod2usage(-exitval => 1); 310 311 pod2usage({-exitval => 1, -output => \*STDOUT}); 312 313 pod2usage({-verbose => 1, -output => \*STDOUT}); 314 315 pod2usage(-exitval => 1, -verbose => 1); 316 317 pod2usage(-exitval => 1, -verbose => 1, -output => \*STDOUT}); 318 319 Each of the following invocations of C<pod2usage()> will print the 320 entire manual page to C<STDOUT> and will exit with a status of 1: 321 322 pod2usage(-verbose => 2); 323 324 pod2usage({-verbose => 2, -output => \*STDOUT}); 325 326 pod2usage(-exitval => 1, -verbose => 2); 327 328 pod2usage({-exitval => 1, -verbose => 2, -output => \*STDOUT}); 329 330 =head2 Recommended Use 331 332 Most scripts should print some type of usage message to C<STDERR> when a 333 command line syntax error is detected. They should also provide an 334 option (usually C<-H> or C<-help>) to print a (possibly more verbose) 335 usage message to C<STDOUT>. Some scripts may even wish to go so far as to 336 provide a means of printing their complete documentation to C<STDOUT> 337 (perhaps by allowing a C<-man> option). The following complete example 338 uses B<Pod::Usage> in combination with B<Getopt::Long> to do all of these 339 things: 340 341 use Getopt::Long; 342 use Pod::Usage; 343 344 my $man = 0; 345 my $help = 0; 346 ## Parse options and print usage if there is a syntax error, 347 ## or if usage was explicitly requested. 348 GetOptions('help|?' => \$help, man => \$man) or pod2usage(2); 349 pod2usage(1) if $help; 350 pod2usage(-verbose => 2) if $man; 351 352 ## If no arguments were given, then allow STDIN to be used only 353 ## if it's not connected to a terminal (otherwise print usage) 354 pod2usage("$0: No files given.") if ((@ARGV == 0) && (-t STDIN)); 355 __END__ 356 357 =head1 NAME 358 359 sample - Using GetOpt::Long and Pod::Usage 360 361 =head1 SYNOPSIS 362 363 sample [options] [file ...] 364 365 Options: 366 -help brief help message 367 -man full documentation 368 369 =head1 OPTIONS 370 371 =over 8 372 373 =item B<-help> 374 375 Print a brief help message and exits. 376 377 =item B<-man> 378 379 Prints the manual page and exits. 380 381 =back 382 383 =head1 DESCRIPTION 384 385 B<This program> will read the given input file(s) and do something 386 useful with the contents thereof. 387 388 =cut 389 390 =head1 CAVEATS 391 392 By default, B<pod2usage()> will use C<$0> as the path to the pod input 393 file. Unfortunately, not all systems on which Perl runs will set C<$0> 394 properly (although if C<$0> isn't found, B<pod2usage()> will search 395 C<$ENV{PATH}> or else the list specified by the C<-pathlist> option). 396 If this is the case for your system, you may need to explicitly specify 397 the path to the pod docs for the invoking script using something 398 similar to the following: 399 400 pod2usage(-exitval => 2, -input => "/path/to/your/pod/docs"); 401 402 In the pathological case that a script is called via a relative path 403 I<and> the script itself changes the current working directory 404 (see L<perlfunc/chdir>) I<before> calling pod2usage, Pod::Usage will 405 fail even on robust platforms. Don't do that. 406 407 =head1 AUTHOR 408 409 Please report bugs using L<http://rt.cpan.org>. 410 411 Brad Appleton E<lt>bradapp@enteract.comE<gt> 412 413 Based on code for B<Pod::Text::pod2text()> written by 414 Tom Christiansen E<lt>tchrist@mox.perl.comE<gt> 415 416 =head1 ACKNOWLEDGMENTS 417 418 Steven McDougall E<lt>swmcd@world.std.comE<gt> for his help and patience 419 with re-writing this manpage. 420 421 =cut 422 423 ############################################################################# 424 425 use strict; 426 #use diagnostics; 427 use Carp; 428 use Config; 429 use Exporter; 430 use File::Spec; 431 432 use vars qw(@ISA @EXPORT); 433 @EXPORT = qw(&pod2usage); 434 BEGIN { 435 if ( $] >= 5.005_58 ) { 436 require Pod::Text; 437 @ISA = qw( Pod::Text ); 438 } 439 else { 440 require Pod::PlainText; 441 @ISA = qw( Pod::PlainText ); 442 } 443 } 444 445 446 ##--------------------------------------------------------------------------- 447 448 ##--------------------------------- 449 ## Function definitions begin here 450 ##--------------------------------- 451 452 sub pod2usage { 453 local($_) = shift; 454 my %opts; 455 ## Collect arguments 456 if (@_ > 0) { 457 ## Too many arguments - assume that this is a hash and 458 ## the user forgot to pass a reference to it. 459 %opts = ($_, @_); 460 } 461 elsif (!defined $_) { 462 $_ = ""; 463 } 464 elsif (ref $_) { 465 ## User passed a ref to a hash 466 %opts = %{$_} if (ref($_) eq 'HASH'); 467 } 468 elsif (/^[-+]?\d+$/) { 469 ## User passed in the exit value to use 470 $opts{"-exitval"} = $_; 471 } 472 else { 473 ## User passed in a message to print before issuing usage. 474 $_ and $opts{"-message"} = $_; 475 } 476 477 ## Need this for backward compatibility since we formerly used 478 ## options that were all uppercase words rather than ones that 479 ## looked like Unix command-line options. 480 ## to be uppercase keywords) 481 %opts = map { 482 my $val = $opts{$_}; 483 s/^(?=\w)/-/; 484 /^-msg/i and $_ = '-message'; 485 /^-exit/i and $_ = '-exitval'; 486 lc($_) => $val; 487 } (keys %opts); 488 489 ## Now determine default -exitval and -verbose values to use 490 if ((! defined $opts{"-exitval"}) && (! defined $opts{"-verbose"})) { 491 $opts{"-exitval"} = 2; 492 $opts{"-verbose"} = 0; 493 } 494 elsif (! defined $opts{"-exitval"}) { 495 $opts{"-exitval"} = ($opts{"-verbose"} > 0) ? 1 : 2; 496 } 497 elsif (! defined $opts{"-verbose"}) { 498 $opts{"-verbose"} = (lc($opts{"-exitval"}) eq "noexit" || 499 $opts{"-exitval"} < 2); 500 } 501 502 ## Default the output file 503 $opts{"-output"} = (lc($opts{"-exitval"}) eq "noexit" || 504 $opts{"-exitval"} < 2) ? \*STDOUT : \*STDERR 505 unless (defined $opts{"-output"}); 506 ## Default the input file 507 $opts{"-input"} = $0 unless (defined $opts{"-input"}); 508 509 ## Look up input file in path if it doesnt exist. 510 unless ((ref $opts{"-input"}) || (-e $opts{"-input"})) { 511 my ($dirname, $basename) = ('', $opts{"-input"}); 512 my $pathsep = ($^O =~ /^(?:dos|os2|MSWin32)$/) ? ";" 513 : (($^O eq 'MacOS' || $^O eq 'VMS') ? ',' : ":"); 514 my $pathspec = $opts{"-pathlist"} || $ENV{PATH} || $ENV{PERL5LIB}; 515 516 my @paths = (ref $pathspec) ? @$pathspec : split($pathsep, $pathspec); 517 for $dirname (@paths) { 518 $_ = File::Spec->catfile($dirname, $basename) if length; 519 last if (-e $_) && ($opts{"-input"} = $_); 520 } 521 } 522 523 ## Now create a pod reader and constrain it to the desired sections. 524 my $parser = new Pod::Usage(USAGE_OPTIONS => \%opts); 525 if ($opts{"-verbose"} == 0) { 526 $parser->select('SYNOPSIS\s*'); 527 } 528 elsif ($opts{"-verbose"} == 1) { 529 my $opt_re = '(?i)' . 530 '(?:OPTIONS|ARGUMENTS)' . 531 '(?:\s*(?:AND|\/)\s*(?:OPTIONS|ARGUMENTS))?'; 532 $parser->select( 'SYNOPSIS', $opt_re, "DESCRIPTION/$opt_re" ); 533 } 534 elsif ($opts{"-verbose"} >= 2 && $opts{"-verbose"} != 99) { 535 $parser->select('.*'); 536 } 537 elsif ($opts{"-verbose"} == 99) { 538 $parser->select( $opts{"-sections"} ); 539 $opts{"-verbose"} = 1; 540 } 541 542 ## Now translate the pod document and then exit with the desired status 543 if ( !$opts{"-noperldoc"} 544 and $opts{"-verbose"} >= 2 545 and !ref($opts{"-input"}) 546 and $opts{"-output"} == \*STDOUT ) 547 { 548 ## spit out the entire PODs. Might as well invoke perldoc 549 my $progpath = File::Spec->catfile($Config{scriptdir}, "perldoc"); 550 system($progpath, $opts{"-input"}); 551 if($?) { 552 # RT16091: fall back to more if perldoc failed 553 system($ENV{PAGER} || 'more', $opts{"-input"}); 554 } 555 } 556 else { 557 $parser->parse_from_file($opts{"-input"}, $opts{"-output"}); 558 } 559 560 exit($opts{"-exitval"}) unless (lc($opts{"-exitval"}) eq 'noexit'); 561 } 562 563 ##--------------------------------------------------------------------------- 564 565 ##------------------------------- 566 ## Method definitions begin here 567 ##------------------------------- 568 569 sub new { 570 my $this = shift; 571 my $class = ref($this) || $this; 572 my %params = @_; 573 my $self = {%params}; 574 bless $self, $class; 575 if ($self->can('initialize')) { 576 $self->initialize(); 577 } else { 578 $self = $self->SUPER::new(); 579 %$self = (%$self, %params); 580 } 581 return $self; 582 } 583 584 sub select { 585 my ($self, @res) = @_; 586 if ($ISA[0]->can('select')) { 587 $self->SUPER::select(@_); 588 } else { 589 $self->{USAGE_SELECT} = \@res; 590 } 591 } 592 593 # Override Pod::Text->seq_i to return just "arg", not "*arg*". 594 sub seq_i { return $_[1] } 595 596 # This overrides the Pod::Text method to do something very akin to what 597 # Pod::Select did as well as the work done below by preprocess_paragraph. 598 # Note that the below is very, very specific to Pod::Text. 599 sub _handle_element_end { 600 my ($self, $element) = @_; 601 if ($element eq 'head1') { 602 $$self{USAGE_HEAD1} = $$self{PENDING}[-1][1]; 603 if ($self->{USAGE_OPTIONS}->{-verbose} < 2) { 604 $$self{PENDING}[-1][1] =~ s/^\s*SYNOPSIS\s*$/USAGE/; 605 } 606 } elsif ($element eq 'head2') { 607 $$self{USAGE_HEAD2} = $$self{PENDING}[-1][1]; 608 } 609 if ($element eq 'head1' || $element eq 'head2') { 610 $$self{USAGE_SKIPPING} = 1; 611 my $heading = $$self{USAGE_HEAD1}; 612 $heading .= '/' . $$self{USAGE_HEAD2} if defined $$self{USAGE_HEAD2}; 613 if (!$$self{USAGE_SELECT} || !@{ $$self{USAGE_SELECT} }) { 614 $$self{USAGE_SKIPPING} = 0; 615 } else { 616 for (@{ $$self{USAGE_SELECT} }) { 617 if ($heading =~ /^$_\s*$/) { 618 $$self{USAGE_SKIPPING} = 0; 619 last; 620 } 621 } 622 } 623 624 # Try to do some lowercasing instead of all-caps in headings, and use 625 # a colon to end all headings. 626 if($self->{USAGE_OPTIONS}->{-verbose} < 2) { 627 local $_ = $$self{PENDING}[-1][1]; 628 s{([A-Z])([A-Z]+)}{((length($2) > 2) ? $1 : lc($1)) . lc($2)}ge; 629 s/\s*$/:/ unless (/:\s*$/); 630 $_ .= "\n"; 631 $$self{PENDING}[-1][1] = $_; 632 } 633 } 634 if ($$self{USAGE_SKIPPING}) { 635 pop @{ $$self{PENDING} }; 636 } else { 637 $self->SUPER::_handle_element_end($element); 638 } 639 } 640 641 sub start_document { 642 my $self = shift; 643 $self->SUPER::start_document(); 644 my $msg = $self->{USAGE_OPTIONS}->{-message} or return 1; 645 my $out_fh = $self->output_fh(); 646 print $out_fh "$msg\n"; 647 } 648 649 sub begin_pod { 650 my $self = shift; 651 $self->SUPER::begin_pod(); ## Have to call superclass 652 my $msg = $self->{USAGE_OPTIONS}->{-message} or return 1; 653 my $out_fh = $self->output_handle(); 654 print $out_fh "$msg\n"; 655 } 656 657 sub preprocess_paragraph { 658 my $self = shift; 659 local $_ = shift; 660 my $line = shift; 661 ## See if this is a heading and we arent printing the entire manpage. 662 if (($self->{USAGE_OPTIONS}->{-verbose} < 2) && /^=head/) { 663 ## Change the title of the SYNOPSIS section to USAGE 664 s/^=head1\s+SYNOPSIS\s*$/=head1 USAGE/; 665 ## Try to do some lowercasing instead of all-caps in headings 666 s{([A-Z])([A-Z]+)}{((length($2) > 2) ? $1 : lc($1)) . lc($2)}ge; 667 ## Use a colon to end all headings 668 s/\s*$/:/ unless (/:\s*$/); 669 $_ .= "\n"; 670 } 671 return $self->SUPER::preprocess_paragraph($_); 672 } 673 674 1; # keep require happy
title
Description
Body
title
Description
Body
title
Description
Body
title
Body
Generated: Tue Mar 17 22:47:18 2015 | Cross-referenced by PHPXref 0.7.1 |