diff options
Diffstat (limited to 'upstream/mageia-cauldron/man3pm/Pod::Man.3pm')
-rw-r--r-- | upstream/mageia-cauldron/man3pm/Pod::Man.3pm | 704 |
1 files changed, 704 insertions, 0 deletions
diff --git a/upstream/mageia-cauldron/man3pm/Pod::Man.3pm b/upstream/mageia-cauldron/man3pm/Pod::Man.3pm new file mode 100644 index 00000000..ef22f8e8 --- /dev/null +++ b/upstream/mageia-cauldron/man3pm/Pod::Man.3pm @@ -0,0 +1,704 @@ +.\" -*- mode: troff; coding: utf-8 -*- +.\" Automatically generated by Pod::Man 5.01 (Pod::Simple 3.43) +.\" +.\" Standard preamble: +.\" ======================================================================== +.de Sp \" Vertical space (when we can't use .PP) +.if t .sp .5v +.if n .sp +.. +.de Vb \" Begin verbatim text +.ft CW +.nf +.ne \\$1 +.. +.de Ve \" End verbatim text +.ft R +.fi +.. +.\" \*(C` and \*(C' are quotes in nroff, nothing in troff, for use with C<>. +.ie n \{\ +. ds C` "" +. ds C' "" +'br\} +.el\{\ +. ds C` +. ds C' +'br\} +.\" +.\" Escape single quotes in literal strings from groff's Unicode transform. +.ie \n(.g .ds Aq \(aq +.el .ds Aq ' +.\" +.\" If the F register is >0, we'll generate index entries on stderr for +.\" titles (.TH), headers (.SH), subsections (.SS), items (.Ip), and index +.\" entries marked with X<> in POD. Of course, you'll have to process the +.\" output yourself in some meaningful fashion. +.\" +.\" Avoid warning from groff about undefined register 'F'. +.de IX +.. +.nr rF 0 +.if \n(.g .if rF .nr rF 1 +.if (\n(rF:(\n(.g==0)) \{\ +. if \nF \{\ +. de IX +. tm Index:\\$1\t\\n%\t"\\$2" +.. +. if !\nF==2 \{\ +. nr % 0 +. nr F 2 +. \} +. \} +.\} +.rr rF +.\" ======================================================================== +.\" +.IX Title "Pod::Man 3pm" +.TH Pod::Man 3pm 2023-11-28 "perl v5.38.2" "Perl Programmers Reference Guide" +.\" For nroff, turn off justification. Always turn off hyphenation; it makes +.\" way too many mistakes in technical documents. +.if n .ad l +.nh +.SH NAME +Pod::Man \- Convert POD data to formatted *roff input +.SH SYNOPSIS +.IX Header "SYNOPSIS" +.Vb 2 +\& use Pod::Man; +\& my $parser = Pod::Man\->new (release => $VERSION, section => 8); +\& +\& # Read POD from STDIN and write to STDOUT. +\& $parser\->parse_file (\e*STDIN); +\& +\& # Read POD from file.pod and write to file.1. +\& $parser\->parse_from_file (\*(Aqfile.pod\*(Aq, \*(Aqfile.1\*(Aq); +.Ve +.SH DESCRIPTION +.IX Header "DESCRIPTION" +Pod::Man is a module to convert documentation in the POD format (the +preferred language for documenting Perl) into *roff input using the man +macro set. The resulting *roff code is suitable for display on a terminal +using \fBnroff\fR\|(1), normally via \fBman\fR\|(1), or printing using \fBtroff\fR\|(1). +It is conventionally invoked using the driver script \fBpod2man\fR, but it can +also be used directly. +.PP +By default (on non-EBCDIC systems), Pod::Man outputs UTF\-8. Its output should +work with the \fBman\fR program on systems that use \fBgroff\fR (most Linux +distributions) or \fBmandoc\fR (most BSD variants), but may result in mangled +output on older UNIX systems. To choose a different, possibly more +backward-compatible output mangling on such systems, set the \f(CW\*(C`encoding\*(C'\fR +option to \f(CW\*(C`roff\*(C'\fR (the default in earlier Pod::Man versions). See the +\&\f(CW\*(C`encoding\*(C'\fR option and "ENCODING" for more details. +.PP +See "COMPATIBILTY" for the versions of Pod::Man with significant +backward-incompatible changes (other than constructor options, whose versions +are documented below), and the versions of Perl that included them. +.SH "CLASS METHODS" +.IX Header "CLASS METHODS" +.IP new(ARGS) 4 +.IX Item "new(ARGS)" +Create a new Pod::Man object. ARGS should be a list of key/value pairs, where +the keys are chosen from the following. Each option is annotated with the +version of Pod::Man in which that option was added with its current meaning. +.RS 4 +.IP center 4 +.IX Item "center" +[1.00] Sets the centered page header for the \f(CW\*(C`.TH\*(C'\fR macro. The default, if +this option is not specified, is \f(CW\*(C`User Contributed Perl Documentation\*(C'\fR. +.IP date 4 +.IX Item "date" +[4.00] Sets the left-hand footer for the \f(CW\*(C`.TH\*(C'\fR macro. If this option is not +set, the contents of the environment variable POD_MAN_DATE, if set, will be +used. Failing that, the value of SOURCE_DATE_EPOCH, the modification date of +the input file, or the current time if \fBstat()\fR can't find that file (which will +be the case if the input is from \f(CW\*(C`STDIN\*(C'\fR) will be used. If taken from any +source other than POD_MAN_DATE (which is used verbatim), the date will be +formatted as \f(CW\*(C`YYYY\-MM\-DD\*(C'\fR and will be based on UTC (so that the output will +be reproducible regardless of local time zone). +.IP encoding 4 +.IX Item "encoding" +[5.00] Specifies the encoding of the output. The value must be an encoding +recognized by the Encode module (see Encode::Supported), or the special +values \f(CW\*(C`roff\*(C'\fR or \f(CW\*(C`groff\*(C'\fR. The default on non-EBCDIC systems is UTF\-8. +.Sp +If the output contains characters that cannot be represented in this encoding, +that is an error that will be reported as configured by the \f(CW\*(C`errors\*(C'\fR option. +If error handling is other than \f(CW\*(C`die\*(C'\fR, the unrepresentable character will be +replaced with the Encode substitution character (normally \f(CW\*(C`?\*(C'\fR). +.Sp +If the \f(CW\*(C`encoding\*(C'\fR option is set to the special value \f(CW\*(C`groff\*(C'\fR (the default on +EBCDIC systems), or if the Encode module is not available and the encoding is +set to anything other than \f(CW\*(C`roff\*(C'\fR, Pod::Man will translate all non-ASCII +characters to \f(CW\*(C`\e[uNNNN]\*(C'\fR Unicode escapes. These are not traditionally part +of the *roff language, but are supported by \fBgroff\fR and \fBmandoc\fR and thus by +the majority of manual page processors in use today. +.Sp +If the \f(CW\*(C`encoding\*(C'\fR option is set to the special value \f(CW\*(C`roff\*(C'\fR, Pod::Man will +do its historic transformation of (some) ISO 8859\-1 characters into *roff +escapes that may be adequate in troff and may be readable (if ugly) in nroff. +This was the default behavior of versions of Pod::Man before 5.00. With this +encoding, all other non-ASCII characters will be replaced with \f(CW\*(C`X\*(C'\fR. It may +be required for very old troff and nroff implementations that do not support +UTF\-8, but its representation of any non-ASCII character is very poor and +often specific to European languages. +.Sp +If the output file handle has a PerlIO encoding layer set, setting \f(CW\*(C`encoding\*(C'\fR +to anything other than \f(CW\*(C`groff\*(C'\fR or \f(CW\*(C`roff\*(C'\fR will be ignored and no encoding +will be done by Pod::Man. It will instead rely on the encoding layer to make +whatever output encoding transformations are desired. +.Sp +WARNING: The input encoding of the POD source is independent from the output +encoding, and setting this option does not affect the interpretation of the +POD input. Unless your POD source is US-ASCII, its encoding should be +declared with the \f(CW\*(C`=encoding\*(C'\fR command in the source. If this is not done, +Pod::Simple will will attempt to guess the encoding and may be successful if +it's Latin\-1 or UTF\-8, but it will produce warnings. See \fBperlpod\fR\|(1) for +more information. +.IP errors 4 +.IX Item "errors" +[2.27] How to report errors. \f(CW\*(C`die\*(C'\fR says to throw an exception on any POD +formatting error. \f(CW\*(C`stderr\*(C'\fR says to report errors on standard error, but not +to throw an exception. \f(CW\*(C`pod\*(C'\fR says to include a POD ERRORS section in the +resulting documentation summarizing the errors. \f(CW\*(C`none\*(C'\fR ignores POD errors +entirely, as much as possible. +.Sp +The default is \f(CW\*(C`pod\*(C'\fR. +.IP fixed 4 +.IX Item "fixed" +[1.00] The fixed-width font to use for verbatim text and code. Defaults to +\&\f(CW\*(C`CW\*(C'\fR. Some systems prefer \f(CW\*(C`CR\*(C'\fR instead. Only matters for \fBtroff\fR output. +.IP fixedbold 4 +.IX Item "fixedbold" +[1.00] Bold version of the fixed-width font. Defaults to \f(CW\*(C`CB\*(C'\fR. Only matters +for \fBtroff\fR output. +.IP fixeditalic 4 +.IX Item "fixeditalic" +[1.00] Italic version of the fixed-width font (something of a misnomer, since +most fixed-width fonts only have an oblique version, not an italic version). +Defaults to \f(CW\*(C`CI\*(C'\fR. Only matters for \fBtroff\fR output. +.IP fixedbolditalic 4 +.IX Item "fixedbolditalic" +[1.00] Bold italic (in theory, probably oblique in practice) version of the +fixed-width font. Pod::Man doesn't assume you have this, and defaults to +\&\f(CW\*(C`CB\*(C'\fR. Some systems (such as Solaris) have this font available as \f(CW\*(C`CX\*(C'\fR. +Only matters for \fBtroff\fR output. +.IP guesswork 4 +.IX Item "guesswork" +[5.00] By default, Pod::Man applies some default formatting rules based on +guesswork and regular expressions that are intended to make writing Perl +documentation easier and require less explicit markup. These rules may not +always be appropriate, particularly for documentation that isn't about Perl. +This option allows turning all or some of it off. +.Sp +The special value \f(CW\*(C`all\*(C'\fR enables all guesswork. This is also the default for +backward compatibility reasons. The special value \f(CW\*(C`none\*(C'\fR disables all +guesswork. Otherwise, the value of this option should be a comma-separated +list of one or more of the following keywords: +.RS 4 +.IP functions 4 +.IX Item "functions" +Convert function references like \f(CWfoo()\fR to bold even if they have no markup. +The function name accepts valid Perl characters for function names (including +\&\f(CW\*(C`:\*(C'\fR), and the trailing parentheses must be present and empty. +.IP manref 4 +.IX Item "manref" +Make the first part (before the parentheses) of manual page references like +\&\f(CWfoo(1)\fR bold even if they have no markup. The section must be a single +number optionally followed by lowercase letters. +.IP quoting 4 +.IX Item "quoting" +If no guesswork is enabled, any text enclosed in C<> is surrounded by +double quotes in nroff (terminal) output unless the contents are already +quoted. When this guesswork is enabled, quote marks will also be suppressed +for Perl variables, function names, function calls, numbers, and hex +constants. +.IP variables 4 +.IX Item "variables" +Convert Perl variable names to a fixed-width font even if they have no markup. +This transformation will only be apparent in troff output, or some other +output format (unlike nroff terminal output) that supports fixed-width fonts. +.RE +.RS 4 +.Sp +Any unknown guesswork name is silently ignored (for potential future +compatibility), so be careful about spelling. +.RE +.IP language 4 +.IX Item "language" +[5.00] Add commands telling \fBgroff\fR that the input file is in the given +language. The value of this setting must be a language abbreviation for which +\&\fBgroff\fR provides supplemental configuration, such as \f(CW\*(C`ja\*(C'\fR (for Japanese) or +\&\f(CW\*(C`zh\*(C'\fR (for Chinese). +.Sp +Specifically, this adds: +.Sp +.Vb 2 +\& .mso <language>.tmac +\& .hla <language> +.Ve +.Sp +to the start of the file, which configure correct line breaking for the +specified language. Without these commands, groff may not know how to add +proper line breaks for Chinese and Japanese text if the manual page is +installed into the normal manual page directory, such as \fI/usr/share/man\fR. +.Sp +On many systems, this will be done automatically if the manual page is +installed into a language-specific manual page directory, such as +\&\fI/usr/share/man/zh_CN\fR. In that case, this option is not required. +.Sp +Unfortunately, the commands added with this option are specific to \fBgroff\fR +and will not work with other \fBtroff\fR and \fBnroff\fR implementations. +.IP lquote 4 +.IX Item "lquote" +.PD 0 +.IP rquote 4 +.IX Item "rquote" +.PD +[4.08] Sets the quote marks used to surround C<> text. \f(CW\*(C`lquote\*(C'\fR sets the +left quote mark and \f(CW\*(C`rquote\*(C'\fR sets the right quote mark. Either may also be +set to the special value \f(CW\*(C`none\*(C'\fR, in which case no quote mark is added on that +side of C<> text (but the font is still changed for troff output). +.Sp +Also see the \f(CW\*(C`quotes\*(C'\fR option, which can be used to set both quotes at once. +If both \f(CW\*(C`quotes\*(C'\fR and one of the other options is set, \f(CW\*(C`lquote\*(C'\fR or \f(CW\*(C`rquote\*(C'\fR +overrides \f(CW\*(C`quotes\*(C'\fR. +.IP name 4 +.IX Item "name" +[4.08] Set the name of the manual page for the \f(CW\*(C`.TH\*(C'\fR macro. Without this +option, the manual name is set to the uppercased base name of the file being +converted unless the manual section is 3, in which case the path is parsed to +see if it is a Perl module path. If it is, a path like \f(CW\*(C`.../lib/Pod/Man.pm\*(C'\fR +is converted into a name like \f(CW\*(C`Pod::Man\*(C'\fR. This option, if given, overrides +any automatic determination of the name. +.Sp +If generating a manual page from standard input, the name will be set to +\&\f(CW\*(C`STDIN\*(C'\fR if this option is not provided. In this case, providing this option +is strongly recommended to set a meaningful manual page name. +.IP nourls 4 +.IX Item "nourls" +[2.27] Normally, L<> formatting codes with a URL but anchor text are +formatted to show both the anchor text and the URL. In other words: +.Sp +.Vb 1 +\& L<foo|http://example.com/> +.Ve +.Sp +is formatted as: +.Sp +.Vb 1 +\& foo <http://example.com/> +.Ve +.Sp +This option, if set to a true value, suppresses the URL when anchor text +is given, so this example would be formatted as just \f(CW\*(C`foo\*(C'\fR. This can +produce less cluttered output in cases where the URLs are not particularly +important. +.IP quotes 4 +.IX Item "quotes" +[4.00] Sets the quote marks used to surround C<> text. If the value is a +single character, it is used as both the left and right quote. Otherwise, it +is split in half, and the first half of the string is used as the left quote +and the second is used as the right quote. +.Sp +This may also be set to the special value \f(CW\*(C`none\*(C'\fR, in which case no quote +marks are added around C<> text (but the font is still changed for troff +output). +.Sp +Also see the \f(CW\*(C`lquote\*(C'\fR and \f(CW\*(C`rquote\*(C'\fR options, which can be used to set the +left and right quotes independently. If both \f(CW\*(C`quotes\*(C'\fR and one of the other +options is set, \f(CW\*(C`lquote\*(C'\fR or \f(CW\*(C`rquote\*(C'\fR overrides \f(CW\*(C`quotes\*(C'\fR. +.IP release 4 +.IX Item "release" +[1.00] Set the centered footer for the \f(CW\*(C`.TH\*(C'\fR macro. By default, this is set +to the version of Perl you run Pod::Man under. Setting this to the empty +string will cause some *roff implementations to use the system default value. +.Sp +Note that some system \f(CW\*(C`an\*(C'\fR macro sets assume that the centered footer will be +a modification date and will prepend something like \f(CW\*(C`Last modified: \*(C'\fR. If +this is the case for your target system, you may want to set \f(CW\*(C`release\*(C'\fR to the +last modified date and \f(CW\*(C`date\*(C'\fR to the version number. +.IP section 4 +.IX Item "section" +[1.00] Set the section for the \f(CW\*(C`.TH\*(C'\fR macro. The standard section numbering +convention is to use 1 for user commands, 2 for system calls, 3 for functions, +4 for devices, 5 for file formats, 6 for games, 7 for miscellaneous +information, and 8 for administrator commands. There is a lot of variation +here, however; some systems (like Solaris) use 4 for file formats, 5 for +miscellaneous information, and 7 for devices. Still others use 1m instead of +8, or some mix of both. About the only section numbers that are reliably +consistent are 1, 2, and 3. +.Sp +By default, section 1 will be used unless the file ends in \f(CW\*(C`.pm\*(C'\fR in which +case section 3 will be selected. +.IP stderr 4 +.IX Item "stderr" +[2.19] If set to a true value, send error messages about invalid POD to +standard error instead of appending a POD ERRORS section to the generated +*roff output. This is equivalent to setting \f(CW\*(C`errors\*(C'\fR to \f(CW\*(C`stderr\*(C'\fR if +\&\f(CW\*(C`errors\*(C'\fR is not already set. +.Sp +This option is for backward compatibility with Pod::Man versions that did not +support \f(CW\*(C`errors\*(C'\fR. Normally, the \f(CW\*(C`errors\*(C'\fR option should be used instead. +.IP utf8 4 +.IX Item "utf8" +[2.21] This option used to set the output encoding to UTF\-8. Since this is +now the default, it is ignored and does nothing. +.RE +.RS 4 +.RE +.SH "INSTANCE METHODS" +.IX Header "INSTANCE METHODS" +As a derived class from Pod::Simple, Pod::Man supports the same methods and +interfaces. See Pod::Simple for all the details. This section summarizes +the most-frequently-used methods and the ones added by Pod::Man. +.IP output_fh(FH) 4 +.IX Item "output_fh(FH)" +Direct the output from \fBparse_file()\fR, \fBparse_lines()\fR, or \fBparse_string_document()\fR +to the file handle FH instead of \f(CW\*(C`STDOUT\*(C'\fR. +.IP output_string(REF) 4 +.IX Item "output_string(REF)" +Direct the output from \fBparse_file()\fR, \fBparse_lines()\fR, or \fBparse_string_document()\fR +to the scalar variable pointed to by REF, rather than \f(CW\*(C`STDOUT\*(C'\fR. For example: +.Sp +.Vb 4 +\& my $man = Pod::Man\->new(); +\& my $output; +\& $man\->output_string(\e$output); +\& $man\->parse_file(\*(Aq/some/input/file\*(Aq); +.Ve +.Sp +Be aware that the output in that variable will already be encoded in UTF\-8. +.IP parse_file(PATH) 4 +.IX Item "parse_file(PATH)" +Read the POD source from PATH and format it. By default, the output is sent +to \f(CW\*(C`STDOUT\*(C'\fR, but this can be changed with the \fBoutput_fh()\fR or \fBoutput_string()\fR +methods. +.IP "parse_from_file(INPUT, OUTPUT)" 4 +.IX Item "parse_from_file(INPUT, OUTPUT)" +.PD 0 +.IP "parse_from_filehandle(FH, OUTPUT)" 4 +.IX Item "parse_from_filehandle(FH, OUTPUT)" +.PD +Read the POD source from INPUT, format it, and output the results to OUTPUT. +.Sp +\&\fBparse_from_filehandle()\fR is provided for backward compatibility with older +versions of Pod::Man. \fBparse_from_file()\fR should be used instead. +.IP "parse_lines(LINES[, ...[, undef]])" 4 +.IX Item "parse_lines(LINES[, ...[, undef]])" +Parse the provided lines as POD source, writing the output to either \f(CW\*(C`STDOUT\*(C'\fR +or the file handle set with the \fBoutput_fh()\fR or \fBoutput_string()\fR methods. This +method can be called repeatedly to provide more input lines. An explicit +\&\f(CW\*(C`undef\*(C'\fR should be passed to indicate the end of input. +.Sp +This method expects raw bytes, not decoded characters. +.IP parse_string_document(INPUT) 4 +.IX Item "parse_string_document(INPUT)" +Parse the provided scalar variable as POD source, writing the output to either +\&\f(CW\*(C`STDOUT\*(C'\fR or the file handle set with the \fBoutput_fh()\fR or \fBoutput_string()\fR +methods. +.Sp +This method expects raw bytes, not decoded characters. +.SH ENCODING +.IX Header "ENCODING" +As of Pod::Man 5.00, the default output encoding for Pod::Man is UTF\-8. This +should work correctly on any modern system that uses either \fBgroff\fR (most +Linux distributions) or \fBmandoc\fR (Alpine Linux and most BSD variants, +including macOS). +.PP +The user will probably have to use a UTF\-8 locale to see correct output. This +may be done by default; if not, set the LANG or LC_CTYPE environment variables +to an appropriate local. The locale \f(CW\*(C`C.UTF\-8\*(C'\fR is available on most systems +if one wants correct output without changing the other things locales affect, +such as collation. +.PP +The backward-compatible output format used in Pod::Man versions before 5.00 is +available by setting the \f(CW\*(C`encoding\*(C'\fR option to \f(CW\*(C`roff\*(C'\fR. This may produce +marginally nicer results on older UNIX versions that do not use \fBgroff\fR or +\&\fBmandoc\fR, but none of the available options will correctly render Unicode +characters on those systems. +.PP +Below are some additional details about how this choice was made and some +discussion of alternatives. +.SS History +.IX Subsection "History" +The default output encoding for Pod::Man has been a long-standing problem. +\&\fBtroff\fR and \fBnroff\fR predate Unicode by a significant margin, and their +implementations for many UNIX systems reflect that legacy. It's common for +Unicode to not be supported in any form. +.PP +Because of this, versions of Pod::Man prior to 5.00 maintained the highly +conservative output of the original pod2man, which output pure ASCII with +complex macros to simulate common western European accented characters when +processed with troff. The nroff output was awkward and sometimes incorrect, +and characters not used in western European scripts were replaced with \f(CW\*(C`X\*(C'\fR. +This choice maximized backwards compatibility with \fBman\fR and +\&\fBnroff\fR/\fBtroff\fR implementations at the cost of incorrect rendering of many +POD documents, particularly those containing people's names. +.PP +The modern implementations, \fBgroff\fR (used in most Linux distributions) and +\&\fBmandoc\fR (used by most BSD variants), do now support Unicode. Other UNIX +systems often do not, but they're now a tiny minority of the systems people +use on a daily basis. It's increasingly common (for very good reasons) to use +Unicode characters for POD documents rather than using ASCII conversions of +people's names or avoiding non-English text, making the limitations in the old +output format more apparent. +.PP +Four options have been proposed to fix this: +.IP \(bu 2 +Optionally support UTF\-8 output but don't change the default. This is the +approach taken since Pod::Man 2.1.0, which added the \f(CW\*(C`utf8\*(C'\fR option. Some +Pod::Man users use this option for better output on platforms known to support +Unicode, but since the defaults have not changed, people continued to +encounter (and file bug reports about) the poor default rendering. +.IP \(bu 2 +Convert characters to troff \f(CW\*(C`\e(xx\*(C'\fR escapes. This requires maintaining a +large translation table and addresses only a tiny part of the problem, since +many Unicode characters have no standard troff name. \fBgroff\fR has the largest +list, but if one is willing to assume \fBgroff\fR is the formatter, the next +option is better. +.IP \(bu 2 +Convert characters to groff \f(CW\*(C`\e[uNNNN]\*(C'\fR escapes. This is implemented as the +\&\f(CW\*(C`groff\*(C'\fR encoding for those who want to use it, and is supported by both +\&\fBgroff\fR and \fBmandoc\fR. However, it is no better than UTF\-8 output for +portability to other implementations. See "Testing results" for more +details. +.IP \(bu 2 +Change the default output format to UTF\-8 and ask those who want maximum +backward compatibility to explicitly select the old encoding. This fixes the +issue for most users at the cost of backwards compatibility. While the +rendering of non-ASCII characters is different on older systems that don't +support UTF\-8, it's not always worse than the old output. +.PP +Pod::Man 5.00 and later makes the last choice. This arguably produces worse +output when manual pages are formatted with \fBtroff\fR into PostScript or PDF, +but doing this is rare and normally manual, so the encoding can be changed in +those cases. The older output encoding is available by setting \f(CW\*(C`encoding\*(C'\fR to +\&\f(CW\*(C`roff\*(C'\fR. +.SS "Testing results" +.IX Subsection "Testing results" +Here is the results of testing \f(CW\*(C`encoding\*(C'\fR values of \f(CW\*(C`utf\-8\*(C'\fR and \f(CW\*(C`groff\*(C'\fR on +various operating systems. The testing methodology was to create \fIman/man1\fR +in the current directory, copy \fIencoding.utf8\fR or \fIencoding.groff\fR from the +podlators 5.00 distribution to \fIman/man1/encoding.1\fR, and then run: +.PP +.Vb 1 +\& LANG=C.UTF\-8 MANPATH=$(pwd)/man man 1 encoding +.Ve +.PP +If the locale is not explicitly set to one that includes UTF\-8, the Unicode +characters were usually converted to ASCII (by, for example, dropping an +accent) or deleted or replaced with \f(CW\*(C`<?>\*(C'\fR if there was no conversion. +.PP +Tested on 2022\-09\-25. Many thanks to the GCC Compile Farm project for access +to testing hosts. +.PP +.Vb 12 +\& OS UTF\-8 groff +\& \-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\- \-\-\-\-\-\-\- \-\-\-\-\-\-\- +\& AIX 7.1 no [1] no [2] +\& Alpine 3.15.0 yes yes +\& CentOS 7.9 yes yes +\& Debian 7 yes yes +\& FreeBSD 13.0 yes yes +\& NetBSD 9.2 yes yes +\& OpenBSD 7.1 yes yes +\& openSUSE Leap 15.4 yes yes +\& Solaris 10 yes no [2] +\& Solaris 11 no [3] no [3] +.Ve +.PP +I did not have access to a macOS system for testing, but since it uses +\&\fBmandoc\fR, it's behavior is probably the same as the BSD hosts. +.PP +Notes: +.IP [1] 4 +.IX Item "[1]" +Unicode characters were converted to one or two random ASCII characters +unrelated to the original character. +.IP [2] 4 +.IX Item "[2]" +Unicode characters were shown as the body of the groff escape rather than the +indicated character (in other words, text like \f(CW\*(C`[u00EF]\*(C'\fR). +.IP [3] 4 +.IX Item "[3]" +Unicode characters were deleted entirely, as if they weren't there. Using +\&\f(CW\*(C`nroff \-man\*(C'\fR instead of \fBman\fR to format the page showed the same results as +Solaris 10. Using \f(CW\*(C`groff \-k \-man \-Tutf8\*(C'\fR to format the page produced the +correct output. +.PP +PostScript and PDF output using groff on a Debian 12 system do not support +combining accent marks or SMP characters due to a lack of support in the +default output font. +.PP +Testing on additional platforms is welcome. Please let the author know if you +have additional results. +.SH DIAGNOSTICS +.IX Header "DIAGNOSTICS" +.IP "roff font should be 1 or 2 chars, not ""%s""" 4 +.IX Item "roff font should be 1 or 2 chars, not ""%s""" +(F) You specified a *roff font (using \f(CW\*(C`fixed\*(C'\fR, \f(CW\*(C`fixedbold\*(C'\fR, etc.) that +wasn't either one or two characters. Pod::Man doesn't support *roff fonts +longer than two characters, although some *roff extensions do (the +canonical versions of \fBnroff\fR and \fBtroff\fR don't either). +.IP "Invalid errors setting ""%s""" 4 +.IX Item "Invalid errors setting ""%s""" +(F) The \f(CW\*(C`errors\*(C'\fR parameter to the constructor was set to an unknown value. +.IP "Invalid quote specification ""%s""" 4 +.IX Item "Invalid quote specification ""%s""" +(F) The quote specification given (the \f(CW\*(C`quotes\*(C'\fR option to the +constructor) was invalid. A quote specification must be either one +character long or an even number (greater than one) characters long. +.IP "POD document had syntax errors" 4 +.IX Item "POD document had syntax errors" +(F) The POD document being formatted had syntax errors and the \f(CW\*(C`errors\*(C'\fR +option was set to \f(CW\*(C`die\*(C'\fR. +.SH ENVIRONMENT +.IX Header "ENVIRONMENT" +.IP PERL_CORE 4 +.IX Item "PERL_CORE" +If set and Encode is not available, silently fall back to an encoding of +\&\f(CW\*(C`groff\*(C'\fR without complaining to standard error. This environment variable is +set during Perl core builds, which build Encode after podlators. Encode is +expected to not (yet) be available in that case. +.IP POD_MAN_DATE 4 +.IX Item "POD_MAN_DATE" +If set, this will be used as the value of the left-hand footer unless the +\&\f(CW\*(C`date\*(C'\fR option is explicitly set, overriding the timestamp of the input +file or the current time. This is primarily useful to ensure reproducible +builds of the same output file given the same source and Pod::Man version, +even when file timestamps may not be consistent. +.IP SOURCE_DATE_EPOCH 4 +.IX Item "SOURCE_DATE_EPOCH" +If set, and POD_MAN_DATE and the \f(CW\*(C`date\*(C'\fR options are not set, this will be +used as the modification time of the source file, overriding the timestamp of +the input file or the current time. It should be set to the desired time in +seconds since UNIX epoch. This is primarily useful to ensure reproducible +builds of the same output file given the same source and Pod::Man version, +even when file timestamps may not be consistent. See +<https://reproducible\-builds.org/specs/source\-date\-epoch/> for the full +specification. +.Sp +(Arguably, according to the specification, this variable should be used only +if the timestamp of the input file is not available and Pod::Man uses the +current time. However, for reproducible builds in Debian, results were more +reliable if this variable overrode the timestamp of the input file.) +.SH COMPATIBILITY +.IX Header "COMPATIBILITY" +Pod::Man 1.02 (based on Pod::Parser) was the first version included with +Perl, in Perl 5.6.0. +.PP +The current API based on Pod::Simple was added in Pod::Man 2.00. Pod::Man +2.04 was included in Perl 5.9.3, the first version of Perl to incorporate +those changes. This is the first version that correctly supports all modern +POD syntax. The \fBparse_from_filehandle()\fR method was re-added for backward +compatibility in Pod::Man 2.09, included in Perl 5.9.4. +.PP +Support for anchor text in L<> links of type URL was added in Pod::Man +2.23, included in Perl 5.11.5. +.PP +\&\fBparse_lines()\fR, \fBparse_string_document()\fR, and \fBparse_file()\fR set a default output +file handle of \f(CW\*(C`STDOUT\*(C'\fR if one was not already set as of Pod::Man 2.28, +included in Perl 5.19.5. +.PP +Support for SOURCE_DATE_EPOCH and POD_MAN_DATE was added in Pod::Man 4.00, +included in Perl 5.23.7, and generated dates were changed to use UTC instead +of the local time zone. This is also the first release that aligned the +module version and the version of the podlators distribution. All modules +included in podlators, and the podlators distribution itself, share the same +version number from this point forward. +.PP +Pod::Man 4.10, included in Perl 5.27.8, changed the formatting for manual page +references and function names to bold instead of italic, following the current +Linux manual page standard. +.PP +Pod::Man 5.00 changed the default output encoding to UTF\-8, overridable with +the new \f(CW\*(C`encoding\*(C'\fR option. It also fixed problems with bold or italic +extending too far when used with C<> escapes, and began converting Unicode +zero-width spaces (U+200B) to the \f(CW\*(C`\e:\*(C'\fR *roff escape. It also dropped +attempts to add subtle formatting corrections in the output that would only be +visible when typeset with \fBtroff\fR, which had previously been a significant +source of bugs. +.SH BUGS +.IX Header "BUGS" +There are numerous bugs and language-specific assumptions in the nroff +fallbacks for accented characters in the \f(CW\*(C`roff\*(C'\fR encoding. Since the point of +this encoding is backward compatibility with the output from earlier versions +of Pod::Man, and it is deprecated except when necessary to support old +systems, those bugs are unlikely to ever be fixed. +.PP +Pod::Man doesn't handle font names longer than two characters. Neither do +most \fBtroff\fR implementations, but groff does as an extension. It would be +nice to support as an option for those who want to use it. +.SH CAVEATS +.IX Header "CAVEATS" +.SS "Sentence spacing" +.IX Subsection "Sentence spacing" +Pod::Man copies the input spacing verbatim to the output *roff document. This +means your output will be affected by how \fBnroff\fR generally handles sentence +spacing. +.PP +\&\fBnroff\fR dates from an era in which it was standard to use two spaces after +sentences, and will always add two spaces after a line-ending period (or +similar punctuation) when reflowing text. For example, the following input: +.PP +.Vb 1 +\& =pod +\& +\& One sentence. +\& Another sentence. +.Ve +.PP +will result in two spaces after the period when the text is reflowed. If you +use two spaces after sentences anyway, this will be consistent, although you +will have to be careful to not end a line with an abbreviation such as \f(CW\*(C`e.g.\*(C'\fR +or \f(CW\*(C`Ms.\*(C'\fR. Output will also be consistent if you use the *roff style guide +(and XKCD 1285 <https://xkcd.com/1285/>) recommendation of putting a line +break after each sentence, although that will consistently produce two spaces +after each sentence, which may not be what you want. +.PP +If you prefer one space after sentences (which is the more modern style), you +will unfortunately need to ensure that no line in the middle of a paragraph +ends in a period or similar sentence-ending paragraph. Otherwise, \fBnroff\fR +will add a two spaces after that sentence when reflowing, and your output +document will have inconsistent spacing. +.SS Hyphens +.IX Subsection "Hyphens" +The handling of hyphens versus dashes is somewhat fragile, and one may get a +the wrong one under some circumstances. This will normally only matter for +line breaking and possibly for troff output. +.SH AUTHOR +.IX Header "AUTHOR" +Written by Russ Allbery <rra@cpan.org>, based on the original \fBpod2man\fR by +Tom Christiansen <tchrist@mox.perl.com>. +.PP +The modifications to work with Pod::Simple instead of Pod::Parser were +contributed by Sean Burke <sburke@cpan.org>, but I've since hacked them beyond +recognition and all bugs are mine. +.SH "COPYRIGHT AND LICENSE" +.IX Header "COPYRIGHT AND LICENSE" +Copyright 1999\-2010, 2012\-2020, 2022 Russ Allbery <rra@cpan.org> +.PP +Substantial contributions by Sean Burke <sburke@cpan.org>. +.PP +This program is free software; you may redistribute it and/or modify it +under the same terms as Perl itself. +.SH "SEE ALSO" +.IX Header "SEE ALSO" +Encode::Supported, Pod::Simple, \fBperlpod\fR\|(1), \fBpod2man\fR\|(1), +\&\fBnroff\fR\|(1), \fBtroff\fR\|(1), \fBman\fR\|(1), \fBman\fR\|(7) +.PP +Ossanna, Joseph F., and Brian W. Kernighan. "Troff User's Manual," +Computing Science Technical Report No. 54, AT&T Bell Laboratories. This is +the best documentation of standard \fBnroff\fR and \fBtroff\fR. At the time of +this writing, it's available at <http://www.troff.org/54.pdf>. +.PP +The manual page documenting the man macro set may be \fBman\fR\|(5) instead of +\&\fBman\fR\|(7) on your system. +.PP +See \fBperlpodstyle\fR\|(1) for documentation on writing manual pages in POD if +you've not done it before and aren't familiar with the conventions. +.PP +The current version of this module is always available from its web site at +<https://www.eyrie.org/~eagle/software/podlators/>. It is also part of the +Perl core distribution as of 5.6.0. |