Pod-2-DocBook-0.03/0000755000175200017530000000000011177047066012665 5ustar jozefjozefPod-2-DocBook-0.03/Build.PL0000444000175200017530000000216611177047066014164 0ustar jozefjozefuse strict; use warnings; use Module::Build; my $builder = Module::Build->new( module_name => 'Pod::2::DocBook', license => 'perl', dist_author => 'Jozef Kutej ', dist_version_from => 'lib/Pod/2/DocBook.pm', requires => { 'Digest::MD5' => 0, 'Pod::Parser' => 0, 'Pod::ParseLink' => 0, 'Text::ParseWords' => 0, 'Text::Wrap' => 0, 'List::MoreUtils' => 0, 'CPAN::Version' => 0, }, build_requires => { 'Test::More' => 0, 'XML::LibXML' => 0, }, script_files => [ 'pod2docbook', ], add_to_cleanup => [ 'Pod-2-DocBook-*', 't/*.out' ], create_makefile_pl => 'traditional', create_readme => 1, sign => 1, meta_merge => { resources => { repository => 'git://github.com/jozef/pod-2-docbook.git', bugtracker => 'http://rt.cpan.org/NoAuth/Bugs.html?Dist=Pod-2-DocBook', }, keywords => [ qw/ pod docbook / ], }, ); $builder->create_build_script(); Pod-2-DocBook-0.03/examples/0000755000175200017530000000000011177047066014503 5ustar jozefjozefPod-2-DocBook-0.03/examples/pod2docbook-docbook/0000755000175200017530000000000011177047066020326 5ustar jozefjozefPod-2-DocBook-0.03/examples/pod2docbook-docbook/catalog.xml0000444000175200017530000000123611177047066022462 0ustar jozefjozef Pod-2-DocBook-0.03/examples/pod2docbook-docbook/custom.dtd0000444000175200017530000000047011177047066022334 0ustar jozefjozef %docbook-lite; %entities; %xinclude; Pod-2-DocBook-0.03/examples/pod2docbook-docbook/code/0000755000175200017530000000000011177047066021240 5ustar jozefjozefPod-2-DocBook-0.03/examples/pod2docbook-docbook/code/DocBook.pm0000444000175200017530000014675011177047066023131 0ustar jozefjozefpackage Pod::2::DocBook; =head1 NAME Pod::2::DocBook - Convert Pod data to DocBook SGML =head1 SYNOPSIS use Pod::2::DocBook; my $parser = Pod::2::DocBook->new (title => 'My Article', doctype => 'article', fix_double_quotes => 1, spaces => 3); $parser->parse_from_file ('my_article.pod', 'my_article.sgml'); =head1 DESCRIPTION Pod::2::DocBook is a module for translating Pod-formatted documents to DocBook 4.2 SGML (see L). It is primarily a back end for B, but, as a Pod::Parser subclass, it can be used on its own. The only public extensions to the Pod::Parser interface are options available to C: =over =item doctype This option sets the output document's doctype. The currently supported types are B
, B, B and B
. Special processing is performed when the doctype is set to B (see L). You I set this option in order to get valid DocBook output. =item fix_double_quotes If this option is set to a true value, pairs of double quote characters ('"') in ordinary paragraphs will be replaced with BquoteE> and B/quoteE>. See L for details. =item header If this option is set to a true value, Pod::2::DocBook will emit a DOCTYPE as the first line of output. =item spaces Pod::2::DocBook produces pretty-printed output. This option sets the number of spaces per level of indentation in the output. =item title This option sets the output document's title. =back The rest of this document only describes issues specific to Pod::2::DocBook; for details on invoking the parser, specifically the C, C and C methods, see L. =cut use 5.006001; use strict; use warnings; use Digest::MD5 'md5_hex'; use Pod::Parser; use Pod::ParseLink; use Text::ParseWords; use Text::Wrap; =head1 METHODS our @ISA = qw(Pod::Parser); =cut our @ISA = qw(Pod::Parser); our $VERSION = '0.02_01'; #---------------------------------------------------------------------- # overridden Pod::Parser methods #---------------------------------------------------------------------- =head2 initialize() Initialize parser. =cut sub initialize { $_[0]->errorsub ('error_msg'); $_[0]->{'Pod::2::DocBook::errors'} = []; } =head2 begin_pod() Output docbook header stuff. =cut sub begin_pod { my ($parser) = @_; my $out_fh = $parser->output_handle (); print $out_fh <<"END_HEADER" if $parser->{header}; {doctype} PUBLIC "-//OASIS//DTD DocBook V4.2//EN" "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd" > END_HEADER print $out_fh join ("\n", '"), "\n"; $parser->{indentlevel} = 1; if ($parser->{doctype} eq 'refentry') { print $out_fh join ('', "\n", $parser->_indent (), "\n", $parser->_current_indent (), "$parser->{title}", "\n", $parser->_outdent (), "\n"); } else { print $out_fh "<$parser->{doctype}>$parser->{title}\n"; } } =head2 end_pod() Output docbook footer. Will print also errors if any in a comment block. =cut sub end_pod { my ($parser) = @_; my $out_fh = $parser->output_handle (); $parser->_transition ('THE END'); # end document print $out_fh "{doctype}>\n"; if (@{$parser->{'Pod::2::DocBook::errors'}}) { print $out_fh "\n\n"; } } =head2 commans($command, $paragraph, $line_num) Process POD commands. =cut sub command { my ($parser, $command, $paragraph, $line_num) = @_; my $out_fh = $parser->output_handle (); return if $command eq 'pod'; $paragraph =~ s/\s+$//s; $paragraph = $parser->interpolate ($paragraph, $line_num); # For blocks must be considered before we escape entries, otherwise # docbook markup will get mangled. if ($command eq 'for') { $parser->_transition ('for'); if ($paragraph =~ /^(:\S+|docbook)/) { $paragraph =~ s/$1\s+//; print $out_fh $paragraph, "\n"; } # If we've processed a docbook 'for', then we're done. # If we've process any other 'for', then it wasn't # intended for us, and we're also done. return; } # Now escape SGML-escape our text, and figure out what to do # with it. $paragraph = _fix_chars ($paragraph); if ($command =~ /^head[1-4]/) { $parser->_transition ($command); $parser->_handle_head ($command, $paragraph, $line_num); } elsif ($command eq 'begin') { $parser->_transition ("begin $paragraph"); push (@{$parser->{'Pod::2::DocBook::state'}}, "begin $paragraph"); } elsif ($command eq 'end') { $parser->_transition ("end $paragraph"); } elsif ($command eq 'over') { $parser->_transition ('over'); push @{$parser->{'Pod::2::DocBook::state'}}, 'over'; } elsif ($command eq 'item') { $parser->_transition ('item'); $parser->_handle_item ($paragraph, $line_num); } elsif ($command =~ /^back/) { $parser->_transition ('back'); } else { my $file = $parser->input_file (); $parser->error_msg ("unknown command `$command' at", "line $line_num in file $file"); } } =head2 textblock ($paragraph, $line_num) Process text block. =cut sub textblock { my ($parser, $paragraph, $line_num) = @_; my $out_fh = $parser->output_handle (); my $state = pop @{$parser->{'Pod::2::DocBook::state'}}; my $para_out = ''; $state = '' unless defined $state; $paragraph =~ s/\s+$//s unless $state eq 'begin docbook'; unless ($state eq 'begin docbook' || $state eq 'begin table') { $paragraph = $parser->interpolate ($paragraph, $line_num); $paragraph = _fix_chars ($paragraph); } if ($state eq 'name') { my ($name, $purpose) = split (/\s*-\s*/, $paragraph, 2); $para_out = join ('', $parser->_indent (), "\n", $parser->_current_indent (), "$name\n", "$purpose\n", $parser->_outdent (), "\n"); } elsif ($state eq 'synopsis+') { $para_out = join ('', $parser->_indent (), "\n", "$paragraph\n"); push @{$parser->{'Pod::2::DocBook::state'}}, 'synopsis'; } elsif ($state eq 'synopsis') { $para_out = "$paragraph\n"; push @{$parser->{'Pod::2::DocBook::state'}}, $state; } elsif ($state eq 'begin docbook') { push @{$parser->{'Pod::2::DocBook::dbpara'}}, $paragraph; push @{$parser->{'Pod::2::DocBook::state'}}, $state; } elsif ($state eq 'begin table') { $parser->_handle_table ($paragraph, $line_num); push @{$parser->{'Pod::2::DocBook::state'}}, $state; } elsif ($state =~ /^begin [^:]/) { push @{$parser->{'Pod::2::DocBook::state'}}, $state; } elsif ($state eq 'over') { local $Text::Wrap::huge = 'overflow'; # don't break tags $paragraph =~ s/\s*\n\s*/ /g; # don't just wrap, fill $para_out = join ('', $parser->_indent (), "
\n", $parser->_indent (), "\n", wrap (' ' x ($parser->{spaces} * $parser->{indentlevel}), ' ' x ($parser->{spaces} * $parser->{indentlevel}), $paragraph), "\n", $parser->_outdent (), "\n"); push @{$parser->{'Pod::2::DocBook::state'}}, 'indent'; } else { local $Text::Wrap::huge = 'overflow'; # don't break tags print $out_fh "]]>\n" if $state eq 'verbatim'; $paragraph =~ s/\s*\n\s*/ /g; # don't just wrap, fill { no warnings qw/ uninitialized /; $para_out = $parser->_indent; my $padding = ' ' x ($parser->{spaces} * $parser->{indentlevel}); $para_out .= join '', "\n", wrap ( $padding, $padding, $paragraph ), "\n", $parser->_outdent, "\n"; } $state =~ s/\+$//; push @{$parser->{'Pod::2::DocBook::state'}}, $state unless ($state eq 'verbatim' || $state eq ''); } # fix double quotes in ordinary paragraphs if asked to if ($state !~ /^begin/ && $parser->{fix_double_quotes} && $para_out =~ /"/) { my @protected; while ($para_out =~ m#(<[^>"]*".+?>)#s) { # don't modify things that look like tags with quotes inside my $protect = $1 || $2; my $replace = quotemeta ($protect); $para_out =~ s/$replace/\376/; push @protected, $protect; } $para_out =~ s!"(.+?)"!$1!sg; foreach my $protect (@protected) { $para_out =~ s/\376/$protect/; } } print $out_fh $para_out; } =head2 verbatim($paragraph, $line_num) Process verbatim text block. =cut sub verbatim { my ($parser, $paragraph, $line_num) = @_; my $out_fh = $parser->output_handle (); my $state = pop @{$parser->{'Pod::2::DocBook::state'}} || ''; my (@lines, $min_leader); $paragraph =~ s/\s+$//s unless $state eq 'begin docbook'; @lines = split (/\n/, $paragraph); foreach my $line (@lines) { # expand tabs (see perldoc -q 'expand tabs') 1 while $line =~ s/\t+/' ' x (length($&) * 8 - length($`) % 8)/e; # find the minimum-length whitespace leader for this paragraph my ($leader) = $line =~ /^( +)/; $leader ||= ''; $min_leader = $leader if (!defined $min_leader || length ($leader) < length ($min_leader)); } $paragraph = join ("\n", @lines); # strip the minimum-length whitespace leader from every line $min_leader ||= ''; $paragraph =~ s/^$min_leader//mg; if (!defined $state) { print $out_fh $parser->_current_indent (), "{'Pod::2::DocBook::state'}}, 'verbatim'; } elsif ($state eq 'name') { my ($name, $purpose) = split (/\s*-\s*/, $paragraph, 2); no warnings qw/ uninitialized /; # $purpose can be empty print $out_fh $parser->_indent, "\n", $parser->_current_indent, "$name\n", $parser->_current_indent, "$purpose\n", $parser->_outdent, "\n"; } elsif ($state eq 'synopsis+') { print $out_fh join ('', $parser->_indent (), "\n", "$paragraph\n"); push @{$parser->{'Pod::2::DocBook::state'}}, 'synopsis'; } elsif ($state eq 'synopsis') { print $out_fh "$paragraph\n"; push @{$parser->{'Pod::2::DocBook::state'}}, $state; } elsif ($state eq 'begin docbook') { push @{$parser->{'Pod::2::DocBook::dbpara'}}, $paragraph; push @{$parser->{'Pod::2::DocBook::state'}}, $state; } elsif ($state =~ /^begin [^:]/) { push @{$parser->{'Pod::2::DocBook::state'}}, $state; } elsif ($state eq 'over') { print $out_fh join ('', $parser->_indent (), "
\n", $parser->_current_indent (), "{'Pod::2::DocBook::state'}}, 'indent'; push @{$parser->{'Pod::2::DocBook::state'}}, 'verbatim'; } elsif ($state eq 'verbatim') { print $out_fh "\n\n$paragraph"; push @{$parser->{'Pod::2::DocBook::state'}}, $state; } else { print $out_fh $parser->_current_indent (), "{'Pod::2::DocBook::state'}}, $state; push @{$parser->{'Pod::2::DocBook::state'}}, 'verbatim'; } } =head2 interior_sequence($command, $argument, $seq) Process formatting commands. =cut sub interior_sequence { my ($parser, $command, $argument, $seq) = @_; my $out_fh = $parser->output_handle (); my ($string, @parents); # nothing is ever allowed to be nested inside of E<>, or Z<> if (my $parent = $seq->nested ()) { if ($parent->cmd_name () eq 'E' || $parent->cmd_name () eq 'Z') { my ($file, $line) = $seq->file_line (); $parser->error_msg ("formatting code `$command' nested within", "`" . $parent->cmd_name () . "'", "at line $line in file $file"); return $seq->raw_text (); } } $argument = '' unless defined $argument; # the substring "\37632\377" is a space character protected # against translation in S<>; other characters are protected at # the end of this function, and all protected characters are # de-protected in _fix_chars () if ($command eq 'I') { $string = qq!$argument!; } elsif ($command eq 'B') { $string = qq!$argument!; } elsif ($command eq 'C') { $string = qq!! . ""; } elsif ($command eq 'L') { $string = $parser->_handle_L ($argument, $seq); } elsif ($command eq 'E') { $string = $parser->_handle_E ($argument, $seq); } elsif ($command eq 'F') { $string = "$argument"; } elsif ($command eq 'S') { $argument =~ s/\s(?![^<]*>)/ /g; $string = $argument; } elsif ($command eq 'X') { $string = "$argument"; } elsif ($command eq 'Z') { $string = ''; } else { my ($file, $line) = $seq->file_line (); $parser->error_msg ("unknown formatting code `$command' at line", "in file $file"); $string = $seq->raw_text (); } # protect &, <, and > characters from later processing # I got this from the first edition Camel Book unless ($seq->nested ()) { # just do this once, at the top of a subtree so we can # report more meaningful errors along the way foreach my $char ('&', '<', '>') { $string =~ s/$char/"\376" . ord ($char) . "\377"/eg; } } return $string; } #---------------------------------------------------------------------- # other public methods #---------------------------------------------------------------------- =head2 error_msg Returns parser error message(s) if any occured. =cut sub error_msg { my $parser = shift; push (@{$parser->{'Pod::2::DocBook::errors'}}, join (' ', @_)); } #---------------------------------------------------------------------- # private methods and helper functions #---------------------------------------------------------------------- sub _indent { my ($parser) = @_; no warnings qw/ uninitialized /; return (' ' x ($parser->{spaces} * $parser->{indentlevel}++)); } sub _outdent { my ($parser) = @_; no warnings qw/ uninitialized /; return (' ' x (--$parser->{indentlevel} * $parser->{spaces})); } sub _current_indent { my $parser = shift; no warnings qw/ uninitialized /; return ' ' x ($parser->{spaces} * $parser->{indentlevel}); } sub _make_id { my $parser = shift; my $string = join ('-', $parser->{doctype}, $parser->{title}, $_[0]); $string =~ s//$1/g; $string =~ s/<.+?>//g; return 'ID-' . md5_hex ($string); } sub _handle_L { my ($parser, $argument, $seq) = @_; my $node = $seq; # look all the way up the subtree to see if any ancestor is an 'L' while ($node = $node->nested ()) { if ($node->cmd_name () eq 'L') { my ($file, $line) = $seq->file_line (); $parser->error_msg ("formatting code `L' nested within `L' at", "line $line in file $file"); return $seq->raw_text (); } } # the substring "\37632\377" is a space character protected # against translation in S<>; other characters are protected at # the end of interior_sequence (), and all protected characters # are de-protected in _fix_chars () my ($text, $inferred, $name, $section, $type) = parselink ($argument); return qq!$inferred! if $type eq 'url'; # types 'man' and 'pod' are handled the same way if (defined $section && ! defined $name) { my $id = $parser->_make_id ($section); $section = $text if defined $text; return (qq!$section! . ""); } return $text if defined $text; if (defined $name) { my $string = $name =~ /(.+?)\((.+)\)/ ? $parser->_manpage ($1, $2) : $parser->_manpage ($name) ; return defined $section ? "$section in $string" : $string ; } my ($file, $line) = $seq->file_line (); $parser->error_msg ("empty L<> at line", "$line in file $file\n"); return $seq->raw_text (); } sub _handle_E { my ($parser, $argument, $seq) = @_; if ($argument !~ /\A\w+\z/) { my ($file, $line) = $seq->file_line (); $parser->error_msg ("invalid escape `$argument'", "at line $line in file $file\n"); return $seq->raw_text (); } # careful! the order is important return $argument eq 'verbar' ? '|' : $argument eq 'sol' ? '/' : ( $argument eq 'lchevron' or $argument eq 'laquo' ) ? '«' : ( $argument eq 'rchevron' or $argument eq 'raquo' ) ? '»' : $argument =~ /^0x/ ? '&#' . hex ($argument) . ';' : $argument =~ /^0/ ? '&#' . oct ($argument) . ';' : $argument =~ /^\d+$/ ? "&#$argument;" : "&$argument;" ; } sub _handle_head { my ($parser, $command, $paragraph, $line_num) = @_; my $out_fh = $parser->output_handle (); if ($parser->{doctype} eq 'refentry' && $command eq 'head1' && $paragraph eq 'NAME') { push @{$parser->{'Pod::2::DocBook::state'}}, 'name'; } elsif ($parser->{doctype} eq 'refentry' && $command eq 'head1' && $paragraph eq 'SYNOPSIS') { push @{$parser->{'Pod::2::DocBook::state'}}, 'synopsis+'; } else { push @{$parser->{'Pod::2::DocBook::state'}}, "$command+"; my $id = $parser->_make_id ($paragraph); if ($parser->{doctype} eq 'refentry') { print $out_fh $parser->_indent (), qq!$paragraph\n!; } else { print $out_fh $parser->_indent (), qq!
$paragraph\n!; } } } sub _handle_item { my ($parser, $paragraph, $line_num) = @_; my $out_fh = $parser->output_handle (); my $state = pop @{$parser->{'Pod::2::DocBook::state'}}; $state = '' unless defined $state; if ($state eq 'verbatim') { print $out_fh "]]>\n"; $state = pop @{$parser->{'Pod::2::DocBook::state'}}; $state = '' unless defined $state; } if ($state =~ /list\+$/) { print $out_fh $parser->_current_indent (), "\n"; } if ($state eq 'over') { # first item if (!defined ($paragraph) || $paragraph =~ /^\s*$/ || $paragraph eq '*') { print $out_fh join ('', $parser->_indent (), "\n", $parser->_indent (), "\n", $parser->_indent (), "\n"); $state = 'list+'; } elsif ($paragraph =~ /^([1aAiI])\.?$/) { my $numeration = { 1 => 'arabic', a => 'loweralpha', A => 'upperalpha', i => 'lowerroman', I => 'upperroman' }->{$1}; print $out_fh join ('', $parser->_indent (), "\n", $parser->_indent (), qq!\n!, $parser->_indent (), "\n"); $state = 'olist+'; } else { my $id = $parser->_make_id ($paragraph); print $out_fh join ('', $parser->_indent (), "\n", $parser->_indent (), "\n", $parser->_indent (), "\n", $parser->_current_indent (), qq!$paragraph\n!, $parser->_indent (), qq!\n!); $state = 'vlist+'; } } elsif ($state =~ /^o?list/) { print $out_fh join ('', $parser->_outdent (), "\n", $parser->_indent (), "\n"); $state = "$state+" unless $state =~ /\+$/; } elsif ($state =~ /^vlist/) { my $id = $parser->_make_id ($paragraph); print $out_fh join ('', $parser->_outdent (), "\n", $parser->_outdent (), "\n", $parser->_indent (), "\n", $parser->_current_indent (), qq!$paragraph\n!, $parser->_indent (), "\n"); $state = 'vlist+'; } else { $parser->error_msg ('=item must be inside an', '=over ... =back region', "at line $line_num in file", $parser->input_file ()); } push @{$parser->{'Pod::2::DocBook::state'}}, $state; } sub _transition { my ($parser, $what) = @_; my $out_fh = $parser->output_handle (); my ($level); # $level helps us determine what to do when we see =head # 1-4 are the valid numbers after '=head', so 0 and 5 # are safe to use to mark out-of-bounds on either side if ($what eq 'THE END') { $level = 0; } elsif ($what =~ /^head(\d)/) { $level = $1; } else { $level = 5; } while (my $state = pop @{$parser->{'Pod::2::DocBook::state'}}) { if (($what eq 'item' || $what eq 'over') && ($state eq 'over' || $state =~ /^(o|v)?list/)) { # these are treated specially in _handle_item () push @{$parser->{'Pod::2::DocBook::state'}}, $state; last; } if ($state =~ /list\+$/) { print $out_fh $parser->_current_indent (), "\n"; $state =~ s/\+$//; } if ($state =~ /^head(\d)/) { my $prev_level = $1; if ($level > $prev_level) { # embed in a previously opened section (i.e. restore # state and continue processing the document) # the enclosing section is no longer empty $state =~ s/\+$//; push @{$parser->{'Pod::2::DocBook::state'}}, $state; last; } else { if ($state =~ /\+$/) { # prevent empty sections print $out_fh $parser->_current_indent (), "\n"; } # close the previous section and continue with the stack if ($parser->{doctype} eq 'refentry') { print $out_fh $parser->_outdent (), "\n"; } else { print $out_fh $parser->_outdent (), "
\n"; } } } elsif ($state eq 'indent') { print $out_fh $parser->_outdent (), "
\n"; push @{$parser->{'Pod::2::DocBook::state'}}, 'over' if ($what eq 'item'); last if $what eq 'back'; } elsif ($state eq 'list') { print $out_fh join ('', $parser->_outdent (), "\n", $parser->_outdent (), "\n", $parser->_outdent (), "\n"); last if $what eq 'back'; } elsif ($state eq 'olist') { print $out_fh join ('', $parser->_outdent (), "\n", $parser->_outdent (), "\n", $parser->_outdent (), "\n"); last if $what eq 'back'; } elsif ($state eq 'vlist') { print $out_fh join ('', $parser->_outdent (), "\n", $parser->_outdent (), "\n", $parser->_outdent (), "\n", $parser->_outdent (), "\n"); last if $what eq 'back'; } elsif ($state =~ /^synopsis/) { print $out_fh join ('', $parser->_indent (), "\n", $parser->_current_indent (), "\n") if $state eq 'synopsis+'; print $out_fh $parser->_outdent (), "\n"; } elsif ($state eq 'name') { print $out_fh join ('', $parser->_indent (), "\n", $parser->_indent (), "\n", $parser->_current_indent (), "\n", $parser->_outdent (), "\n"); } elsif ($state eq 'verbatim') { print $out_fh "]]>
\n"; } elsif ($state =~ /^begin (.+)/) { my $begin_format = $1; if ($what =~ /^end (.+)/) { my $end_format = $1; if ($end_format eq $begin_format) { if ($end_format eq 'docbook') { my $paragraph = join ('', @{$parser->{'Pod::2::DocBook::dbpara'}}); $paragraph =~ s/\s+$//; print $out_fh $paragraph, "\n"; $parser->{'Pod::2::DocBook::dbpara'} = []; } last; } else { # this is bad POD, but we do what we can # (maybe we'll find the begin we're looking for # deeper in the stack) $parser->error_msg ("`=end $end_format' found", 'but current region opened with', "`=begin $begin_format'"); } } elsif ($what eq 'THE END') { # this is bad POD, but we do what we can $parser->error_msg ("no matching `=end' for", "`=begin $begin_format'"); # we've got the data stored; might as well use it if ($begin_format eq 'docbook') { my $paragraph = join ('', @{$parser->{'Pod::2::DocBook::dbpara'}}); $paragraph =~ s/\s+$//; print $out_fh $paragraph, "\n"; $parser->{'Pod::2::DocBook::dbpara'} = []; } } else { push @{$parser->{'Pod::2::DocBook::state'}}, $state; last; } } elsif ($state eq 'over') { next; } else { $parser->error_msg ("encountered unknown state `$state'", '(this should never happen)'); } } } sub _handle_table { my ($parser, $paragraph, $line_num) = @_; my $out_fh = $parser->output_handle (); my (@rows, $columns, $title); foreach my $row (split (/\n/, $paragraph)) { my @fields = quotewords (',', 0, $row); $columns = @fields if (!defined $columns || @fields > $columns); push @rows, [@fields]; } # the first row specifies the title $title = $rows[0]->[0]; print $out_fh join ('', $parser->_indent (), "\n", $parser->_current_indent (), "$title\n", $parser->_indent (), qq!\n!); # the second row specifies column alignments foreach my $spec (@{$rows[1]}) { print $out_fh $parser->_current_indent (), '\n!; } else { print $out_fh qq!align="left">\n!; $parser->error_msg ("unknown colspec `$spec' in table", $title, "at line $line_num in file", $parser->input_file ()); } } # the third row (first row of data) is the table header print $out_fh join ('', $parser->_indent (), "\n", $parser->_indent (), "\n"); foreach my $field (@{$rows[2]}) { print $out_fh $parser->_current_indent (), "$field\n"; } print $out_fh join ('', $parser->_outdent (), "\n", $parser->_outdent (), "\n"); # the remaining rows are the table body print $out_fh $parser->_indent (), "\n"; foreach my $row (@rows[3..$#rows]) { print $out_fh $parser->_indent (), "\n"; foreach my $field (@$row) { print $out_fh $parser->_current_indent (), "$field\n"; } print $out_fh $parser->_outdent (), "\n"; } print $out_fh join ('', $parser->_outdent (), "\n", $parser->_outdent (), "\n", $parser->_outdent (), "
\n"); } sub _manpage { my ($parser, $title, $volnum) = @_; # the substring "\37632\377" is a space character protected # against translation in S<>; other characters are protected at # the end of interior_sequence (), and all protected characters # are de-protected in _fix_chars () my $manvol = $volnum ? "\37632\377" x $parser->{spaces} . "$volnum" : '' ; return join "\n" => '', "\37632\377" x $parser->{spaces} . "$title", $manvol, ''; } #---------------------------------------------------------------------- # helper functions #---------------------------------------------------------------------- sub _fix_chars { my ($paragraph) = @_; # fix characters that might annoy an SGML parser $paragraph =~ s/&/&/g; $paragraph =~ s//>/g; # finally, de-protect any characters that were protected # from the previous step $paragraph =~ s!\376(\d+)\377!pack ('C', $1)!eg; return $paragraph; } 1; __END__ =head1 POD TO DOCBOOK TRANSLATION Pod is a deceptively simple format; it is easy to learn and very straightforward to use, but it is suprisingly expressive. Nevertheless, it is not nearly as expressive or complex as DocBook. In most cases, given some Pod, the analogous DocBook markup is obvious, but not always. This section describes how Pod::2::DocBook treats Pod input so that Pod authors may make informed choices. In every case, Pod::2::DocBook strives to make easy things easy and hard things possible. The primary motivation behind Pod::2::DocBook is to facilitate single-source publishing. That is, you should be able to generate man pages, web pages, PDF and PostScript documents, or any other format your SGML and/or Pod tools can produce, from the same Pod source, without the need for hand-editing any intermediate files. This may not always be possible, or you may simply choose to render Pod to DocBook and use that as your single source. To satisfy the first requirement, Pod::2::DocBook always processes the entire Pod source and tries very hard to produce valid DocBook markup, even in the presence of malformed Pod (see L). To satisfy the second requirement (and to be a little nifty), Pod::2::DocBook pretty-prints its output. If you're curious about what specific output to expect, read on. =head2 Document Types DocBook's structure is very modular; many of its document types can be embedded directly into other documents. Accordingly, Pod::2::DocBook will generate four different document types: B
, B, B, and B
. This makes it easy, for instance, to write all the chapters of a book in separate Pod documents, translate them into DocBook markup and later glue them together before processing the entire book. You could do the same with each section in an article, or you could write the entire article in a single Pod document. Other document types, such as B and B, do not map easily from Pod, because they require structure for which there is no Pod equivalent. But given sections and chapters, making larger documents becomes much simpler. The B document type is a little different from the others. Sections, articles, and chapters are essentially composed of nested sections. But a refentry has specialized elements for the I and I sections. To accommodate this, Pod::2::DocBook performs extra processing on the Pod source when the B is set to B. You probably don't have to do anything to your document to assist the processing; typical man page conventions cover the requirements. Just make sure that the I and I headers are both B<=head1>s, that "NAME" and "SYNOPSIS" are both uppercase, and that B<=head1 NAME> is the first line of Pod source. =head2 Ordinary Paragraphs Ordinary paragraphs in a Pod document translate naturally to DocBook paragraphs. Specifically, after any formatting codes are processed, the characters C>, C> and C> are translated to their respective SGML character entities, and the paragraph is wrapped in BparaE> and B/paraE>. For example, given this Pod paragraph: Here is some text with I & an ampersand. Pod::2::DocBook would produce DocBook markup similar to this: Here is some text with italics & an ampersand. Depending on your final output format, you may sometimes want double quotes in ordinary paragraphs to show up ultimately as "smart quotes" (little 66s and 99s). Pod::2::DocBook offers a convenient mechanism for handling double quotes in ordinary paragraphs and letting your SGML toolchain manage their presentation: the B option to C. If this option is set to a true value, Pod::2::DocBook will replace pairs of double quotes in ordinary paragraphs (and I in ordinary paragraphs) with BquoteE> and B/quoteE>. For example, given this Pod paragraph: Here is some text with I & an "ampersand". Pod::2::DocBook, with B set, would produce DocBook markup similar to this: Here is some text with italics & an ampersand. If you have a paragraph with an odd number of double quotes, the last one will be left untouched, which may or may not be what you want. If you have such a document, replace the unpaired double quote character with B<< EEquotE >>, and Pod::2::DocBook should be able to give you the output you expect. Also, if you have any S<< B<=begin docbook> >> ... S<< B<=end docbook> >> regions (see L) in your Pod, you are responsible for managing your own quotes in those regions. =head2 Verbatim Paragraphs Verbatim paragraphs translate even more naturally; L mandates that absolutely no processing should be performed on them. So Pod::2::DocBook simply marks them as CDATA and wraps them in BscreenE> and B/screenE>. They are not indented the way ordinary paragraphs are, because they treat whitespace as significant. For example, given this verbatim paragraph (imagine there's leading whitespace in the source): my $i = 10; while (<> && $i--) { print "$i: $_"; } Pod::2::DocBook would produce DocBook markup similar to this: && $i--) { print "$i: $_"; }]] > Multiple contiguous verbatim paragraphs are treated as a single I element, with blank lines separating the paragraphs, as dictated by L. =head2 Command Paragraphs =over =item C<=head1 Heading Text> =item C<=head2 Heading Text> =item C<=head3 Heading Text> =item C<=head4 Heading Text> All of the Pod heading commands produce DocBook I
elements, with the heading text as titles. Pod::2::DocBook (L) only allows for 4 heading levels, but DocBook allows arbitrary nesting; see L if you need more than 4 levels. Pod::2::DocBook only looks at relative heading levels to determine nesting. For example, this bit of Pod: =head1 1 Contents of section 1 =head2 1.1 Contents of section 1.1 and this bit of Pod: =head1 1 Contents of section 1 =head3 1.1 Contents of section 1.1 both produce the same DocBook markup, which will look something like this:
1 Contents of section 1
1.1 Contents of section 1.1
Note that Pod::2::DocBook automatically generates section identifiers from your doctype, document title and section title. It does the same when you make internal links (see L, ensuring that if you supply the same link text as you did for the section title, the resulting identifiers will be the same. =item C<=over indentlevel> =item C<=item stuff...> =item C<=back> C<=over> ... C<=back> regions are somewhat complex, in that they can lead to a variety of DocBook constructs. In every case, I is ignored by Pod::2::DocBook, since that's best left to your stylesheets. An C<=over> ... C<=back> region with no C<=item>s represents indented text and maps directly to a DocBook I
element. Given this source: =over 4 This text should be indented. =back Pod::2::DocBook will produce DocBook markup similar to this:
This text should be indented.
Inside an C<=over> ... C<=back> region, C<=item> commands generate lists. The text that follows the first C<=item> determines the type of list that will be output: =over =item * "*" (an asterisk) produces BitemizedlistE> =item * "1" or "1." produces S<< Borderedlist numeration="arabic"E> >> =item * "a" or "a." produces S<< Borderedlist numeration="loweralpha"E> >> =item * "A" or "A." produces S<< Borderedlist numeration="upperalpha"E> >> =item * "i" or "i." produces S<< Borderedlist numeration="lowerroman"E> >> =item * "I" or "I." produces S<< Borderedlist numeration="upperroman"E> >> =item * anything else produces BvariablelistE> =back Since the output from each of these is relatively verbose, the best way to see examples is to actually render some Pod into DocBook. =item C<=pod> =item C<=cut> L recognizes these commands, and, therefore, so does Pod::2::DocBook, but they don't produce any output. =item C<=begin formatname> =item C<=end formatname> =item C<=for formatname text...> Pod::2::DocBook supports two formats: B, explained in L, and B, explained in L. =item C<=encoding encodingname> This command is currently not supported. If Pod::2::DocBook encounters a document that contains C<=encoding>, it will ignore the command and report an error (L). =back =head3 Embedded DocBook Markup There are a wide range of DocBook structures for which there is no Pod equivalent. For these, you will have to provide your own markup using B<=begin docbook> ... B<=end docbook> or B<=for docbook ...>. Pod::2::DocBook will directly output whatever text you provide, unprocessed, so it's up to you to ensure that it's valid DocBook. Images, footnotes and many inline elements are obvious candidates for embedded markup. Another possible use is nesting sections more than four-deep. For example, given this source: =head1 1 This is Section 1 =head2 1.1 This is Section 1.1 =head3 1.1.1 This is Section 1.1.1 =head4 1.1.1.1 This is Section 1.1.1.1 =begin docbook
1.1.1.1.1 This is Section 1.1.1.1.1
=end docbook Pod::2::DocBook will generate DocBook markup similar to this:
1 This is Section 1
1.1 This is Section 1.1
1.1.1 This is Section 1.1.1
1.1.1.1 This is Section 1.1.1.1
1.1.1.1.1 This is Section 1.1.1.1.1
=head3 Simple Tables Pod::2::DocBook also provides a mechanism for generating basic tables with S<< B<=begin table> >> and S<< B<=end docbook> >>. If you have simple tabular data or a CSV file exported from some application, Pod::2::DocBook makes it easy to generate a table from your data. The syntax is intended to be simple, so DocBook's entire table feature set is not represented, but even if you do need more complex table markup than Pod::2::DocBook produces, you can rapidly produce some markup which you can hand-edit and then embed directly in your Pod with S<< B<=begin docbook> >> ... S<< B<=end docbook> >>. Each table definition spans multiple lines, so there is no equivalent S<< B<=for table> >> command. The first line of a table definition gives the table's title. The second line gives a list of comma-separated column specifications (really just column alignments), each of which can be B, B
or B. The third line is a list of comma-separated column headings, and every subsequent line consists of comma-separated row data. If any of your data actually contain commas, you can enclose them in double quotes; if they also contain double quotes, you must escape the inner quotes with backslashes (typical CSV stuff). Here's an example: =begin table Sample Table left,center,right Powers of Ten,Planets,Dollars 10,Earth,$1 100,Mercury,$5 1000,Mars,$10 10000,Venus,$20 100000,"Jupiter, Saturn",$50 =end table And here's what Pod::2::DocBook would do with it:
Sample Table Powers of Ten Planets Dollars 10 Earth $1 100 Mercury $5 1000 Mars $10 10000 Venus $20 100000 Jupiter, Saturn $50
=head2 Formatting Codes Pod formatting codes render directly into DocBook as inline elements: =over =item * C<< IZ<> >> text =item * C<< BZ<> >> text =item * C<< CZ<> >> =item * C<< LZ<> >> name =item * C<< LZ<> >> name n =item * C<< LZ<> >> or C<< LZ<> >> sec in name =item * C<< LZ<> >> or C<< LZ<> >> sec in namen =item * C<< LZ<> >> or C<< LZ<> >> or C<< LZ<><"sec"> >> sec =item * C<< LZ<> >> text =item * C<< LZ<> >> or C<< LZ<> >> text =item * C<< LZ<> >> or C<< LZ<> >> or C<< LZ<> >> text =item * C<< LZ<> >> scheme:... =item * C<< EZ<> >> | =item * C<< EZ<> >> / =item * C<< EZ<> >> &#number; =item * any other C<< EZ<> >> &escape; =item * C<< FZ<> >> filename =item * C<< SZ<> >> text with spaces =item * C<< XZ<> >> topic name =back =head1 DIAGNOSTICS Pod::2::DocBook makes every possible effort to produce valid DocBook markup, even with malformed POD source. Any processing errors will be noted in comments at the end of the output document. Even when errors occur, Pod::2::DocBook always reads the entire input document and never exits with a non-zero status. =over =item unknown command `%s' at line %d in file %s See L for a list of valid commands. The command referenced in the error message was ignored. =item formatting code `%s' nested within `%s' at line %d in file %s See L for details on which formatting codes can be nested. The offending code was translated into the output document as the raw text inside its angle brackets. =item unknown formatting code `%s' at line in file %s The input contained a formatting code not listed in L; it was translated into the output document as the raw text inside the angle brackets. =item empty LZ<><> at line %d in file %s Self-explanatory. =item invalid escape `%s' at line %d in file %s Self-explanatory; it was translated into the output document as the raw text inside the angle brackets. =item =item must be inside an =over ... =back section at line %d in file %s Self-explanatory. The `=item' referenced in the error was ignored. =item `=end %s' found but current region opened with `=begin %s' The closest `=end' command to the referenced `=begin' didn't match; processing continued as if the mismatched `=end' wasn't there. =item no matching `=end' for `=begin %s' Pod::2::DocBook reached the end of its input without finding an `=end' command to match the `=begin' referenced in the error; end-of-file processing continued. =item unknown colspec `%s' in table at line %d in file %s See L for a list of supported column specifications. =item encountered unknown state `%s' (this should never happen) The state referred to is an internal variable used to properly manage nested DocBook structures. You should indeed never see this message, but if you do, you should contact the module's author. =back =head1 SEE ALSO L, L, L, SVN repo - L, L, F + F for Pod::2::DocBook DocBook documentation DocBook related links: L, L, L =head1 AUTHOR Alligator Descartes wrote a module called Pod::2::DocBook, which was later maintained by Jan Iven . That module was based on the original L by Tom Christiansen . Nandu Shah wrote Pod::DocBook, which is unrelated to the previous module (even though they both perform the same function). (L) Jozef Kutej renamed the module to Pod::2::DocBook because Nandus version was buried in the CPAN archive as an "UNAUTHORIZED RELEASE". =head1 COPYRIGHT Copyright 2004, Nandu Shah Copyright 2008, Jozef Kutej This library is free software; you may redistribute it and/or modify it under the same terms as Perl itself =cut Pod-2-DocBook-0.03/examples/pod2docbook-docbook/code/pod2docbook0000444000175200017530000000615111177047066023371 0ustar jozefjozef#!/usr/local/bin/perl use strict; use warnings; use Getopt::Long; use Pod::2::DocBook; use Pod::Usage; my $doctype = 'section'; my $spaces = 2; my ($title, $double_quotes, $help, $no_header); pod2usage unless GetOptions ('doctype=s' => \$doctype, 'title=s' => \$title, 'spaces=i' => \$spaces, 'fix-double-quotes' => \$double_quotes, 'no-header' => \$no_header, 'help' => \$help, ); pod2usage if $help; pod2usage unless grep { $doctype eq $_ } qw(article chapter refentry section); pod2usage unless $spaces =~ /^\d+$/; if (@ARGV == 0) { $title = '' unless defined $title; my $parser = Pod::2::DocBook->new (title => $title, doctype => $doctype, fix_double_quotes => $double_quotes, header => ! $no_header, spaces => $spaces); $parser->parse_from_filehandle(\*STDIN); } else { my ($infile, $outfile) = @ARGV; ($title) = $infile =~ m!([^/]+)\z! unless defined $title; my $parser = Pod::2::DocBook->new (title => $title, doctype => $doctype, fix_double_quotes => $double_quotes, header => ! $no_header, spaces => $spaces); if (defined $outfile) { $parser->parse_from_file ($infile, $outfile); } else { $parser->parse_from_file ($infile); } } =head1 NAME pod2docbook - Convert POD data to DocBook SGML =head1 SYNOPSIS pod2docbook [B<--help>] [B<--doctype>=B
|B|B
|B] [B<--title>=I] S<[B<--spaces>=I<# spaces per indent level>]> [B<--fix-double-quotes>] [B<--no-header>] S<[I<infile> [I<outfile>]]> =head1 DESCRIPTION B<pod2docbook> converts files from pod format (see L<perlpod>) to DocBook 4.2 SGML (see L<http://www.docbook.org/>). The program itself is merely a driver for the Pod::2::DocBook class; if you're interested in details of pod-to-SGML translation see L<Pod::2::DocBook>. =head1 OPTIONS AND ARGUMENTS =over =item [B<--help>] Print usage and exit. =item [B<--doctype>=B<article>|B<chapter>|B<section>|B<refentry>] Specifies the document type for the output file; the default is B<section>. =item [B<--title>=I<title>] Specifies the document title. The default is I<infile>, if it is supplied, or empty string otherwise. =item [B<--spaces>=I<# spaces per indent level>] Specifies the number of spaces per indent level in the SGML output; the default is 2. =item [B<--fix-double-quotes>] Replace pairs of double quotes in regular paragraphs with <quote> and </quote> (see L<Pod::2::DocBook> for details). =item [B<--no-header>] Omit the DOCTYPE line from the output. =item I<infile> The name of the file from which to read pod source; if not supplied, STDIN is used for input. =item I<outfile> The name of the file to which to write SGML; if not supplied, STDOUT is used for output. =back =head1 SEE ALSO L<perlpod>, L<Pod::2::DocBook> =head1 AUTHOR Nandu Shah <nandu@zvolve.com> =head1 COPYRIGHT Copyright 2004, Nandu Shah <nandu@zvolve.com> This program is free software; you may redistribute it and/or modify it under the same terms as Perl itself =cut �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Pod-2-DocBook-0.03/examples/pod2docbook-docbook/docbook.css�����������������������������������������0000444�0001752�0001753�00000005400�11177047066�022455� 0����������������������������������������������������������������������������������������������������ustar �jozef���������������������������jozef������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * Copyright (c) 2001, 2003 The FreeBSD Documentation Project * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * * $FreeBSD: /repoman/r/dcvs/doc/share/misc/docbook.css,v 1.8 2006/02/26 13:16:52 ceri Exp $ */ BODY ADDRESS { line-height: 1.3; margin: .6em 0; } BODY BLOCKQUOTE { margin-top: .75em; line-height: 1.5; margin-bottom: .75em; } HTML BODY { margin: 1em 8% 1em 10%; line-height: 1.2; } .LEGALNOTICE { font-size: small; font-variant: small-caps; } BODY DIV { margin: 0; } DL { margin: .8em 0; line-height: 1.2; } BODY FORM { margin: .6em 0; } H1, H2, H3, H4, H5, H6, DIV.EXAMPLE P B, .QUESTION, DIV.TABLE P B, DIV.PROCEDURE P B { color: #990000; } BODY H1, BODY H2, BODY H3, BODY H4, BODY H5, BODY H6 { line-height: 1.3; margin-left: 0; } BODY H1, BODY H2 { margin: .8em 0 0 -4%; } BODY H3, BODY H4 { margin: .8em 0 0 -3%; } BODY H5 { margin: .8em 0 0 -2%; } BODY H6 { margin: .8em 0 0 -1%; } BODY HR { margin: .6em; } BODY IMG.NAVHEADER { margin: 0 0 0 -4%; } OL { margin: 0 0 0 5%; line-height: 1.2; } BODY PRE { margin: .75em 0; line-height: 1.0; color: #461b7e; } BODY TD, BODY TH { line-height: 1.2; } UL, BODY DIR, BODY MENU { margin: 0 0 0 5%; line-height: 1.2; } HTML { margin: 0; padding: 0; } .FILENAME { color: #007a00; } .GUIMENU, .GUIMENUITEM, .GUISUBMENU, .GUILABEL, .INTERFACE, .GUIBUTTON, .SHORTCUT, .SHORTCUT .KEYCAP { background-color: #F0F0F0; } .ACCEL { background-color: #F0F0F0; text-decoration: underline; } .PROGRAMLISTING, .SCREEN { margin-left: 3ex; } ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Pod-2-DocBook-0.03/examples/pod2docbook-docbook/.gitignore������������������������������������������0000444�0001752�0001753�00000000114�11177047066�022310� 0����������������������������������������������������������������������������������������������������ustar �jozef���������������������������jozef������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������.validated Pod-2-DocBook.html Pod-2-DocBook.pdf book.fo chapters/pod/*.xml ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Pod-2-DocBook-0.03/examples/pod2docbook-docbook/Makefile��������������������������������������������0000444�0001752�0001753�00000003221�11177047066�021762� 0����������������������������������������������������������������������������������������������������ustar �jozef���������������������������jozef������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������BOOKNAME=Pod-2-DocBook #DRAFT=--stringparam draft.watermark.image images/draft.png XML=*.xml chapters/*.xml PODXML=chapters/pod/Pod-2-DocBook.xml chapters/pod/pod2docbook.xml IMAGES=images/*.png XINCLUDES=chapters/examples/* SOURCES=$(XML) $(PODXML) $(IMAGES) $(XINCLUDES) entities.mod Makefile POD2DOCBOOK=pod2docbook PODROOT=code FOP=fop ## Needed by xmllint and xsltproc in order to find the catalog export XML_CATALOG_FILES=/etc/xml/catalog catalog.xml all: $(BOOKNAME).html $(BOOKNAME).pdf .validated: $(SOURCES) xmllint --xinclude --postvalid --noout book.xml touch .validated $(BOOKNAME).html: .validated $(SOURCES) xsltproc --xinclude $(DRAFT) \ --stringparam draft.mode no \ --stringparam admon.graphics 1 \ --stringparam admon.graphics.extension .png \ --stringparam html.stylesheet docbook.css \ --output $@ html-stylesheet.xsl book.xml $(BOOKNAME).pdf: book.fo $(FOP) -fo $< -pdf $@ -d book.fo: .validated $(SOURCES) Makefile xsltproc --xinclude $(DRAFT) \ --stringparam paper.type A4 \ --stringparam draft.mode no \ --stringparam fop.extensions 1 \ --stringparam admon.graphics 1 \ --stringparam admon.graphics.extension .png \ --stringparam generate.toc "book toc,title" \ --output $@ fo-stylesheet.xsl book.xml # pod2docbook transformation chapters/pod/Pod-2-DocBook.xml: $(PODROOT)/DocBook.pm $(POD2DOCBOOK) --title='Pod-2-DocBook POD' --doctype=section $< $@ chapters/pod/pod2docbook.xml: $(PODROOT)/pod2docbook $(POD2DOCBOOK) --title='pod2docbook script' --doctype=section $< $@ .PHONY: clean clean: rm -f book.fo rm -f $(BOOKNAME).pdf rm -f $(BOOKNAME).html find $(PODROOT) -type f -exec touch {} \; rm -f .validated �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Pod-2-DocBook-0.03/examples/pod2docbook-docbook/xinclude.mod����������������������������������������0000444�0001752�0001753�00000000625�11177047066�022643� 0����������������������������������������������������������������������������������������������������ustar �jozef���������������������������jozef������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<!ELEMENT xi:include (xi:fallback?) > <!ATTLIST xi:include xmlns:xi CDATA #FIXED "http://www.w3.org/2001/XInclude" href CDATA #REQUIRED parse (xml|text) "xml" encoding CDATA #IMPLIED > <!ELEMENT xi:fallback ANY> <!ATTLIST xi:fallback xmlns:xi CDATA #FIXED "http://www.w3.org/2001/XInclude" > <!ENTITY % local.chapter.class "| xi:include"> �����������������������������������������������������������������������������������������������������������Pod-2-DocBook-0.03/examples/pod2docbook-docbook/chapters/�������������������������������������������0000755�0001752�0001753�00000000000�11177047066�022137� 5����������������������������������������������������������������������������������������������������ustar �jozef���������������������������jozef������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Pod-2-DocBook-0.03/examples/pod2docbook-docbook/chapters/introduction.xml���������������������������0000444�0001752�0001753�00000001505�11177047066�025401� 0����������������������������������������������������������������������������������������������������ustar �jozef���������������������������jozef������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE chapter PUBLIC "-//CUSTOM//DOCKBOOK 4.4//EN" "../custom.dtd"> <chapter id="chapter-intro"> <title>Introduction
Overview This document refers to &pod2docbook; version 0.01. &pod2docbook; Perl module helps to convert existing pod documentation to docbook xml format. For a full reasoning and detail description see . not complete, as any other documentation ;-)
Pod-2-DocBook-0.03/examples/pod2docbook-docbook/chapters/appendix-a.xml0000444000175200017530000000127611177047066024713 0ustar jozefjozef Appendix A
some terms used in this book terms POD Plain Old Documentation DocBook &tbd;
Pod-2-DocBook-0.03/examples/pod2docbook-docbook/chapters/examples/0000755000175200017530000000000011177047066023755 5ustar jozefjozefPod-2-DocBook-0.03/examples/pod2docbook-docbook/chapters/examples/empty0000444000175200017530000000000011177047066025022 0ustar jozefjozefPod-2-DocBook-0.03/examples/pod2docbook-docbook/chapters/usage.xml0000444000175200017530000000340711177047066023767 0ustar jozefjozef Usage
Instalation Installing of &pod2docbook; should be as easy and streight forward as executing cpan -i Pod::2::DocBook. This will add pod2docbook script to the system. See for description.
DocBook quick start guide In folder examples/pod2docbook-docbook/ of &pod2docbook; is the source of this document. To generate the HTML or PDF version from it you'll need: make, xmllint, xsltproc, fop and docbook xml+xsl. For Debian: apt-get install docbook-utils psutils docbook-xml docbook-xsl xsltproc fop make. To have images in the PDF you need to get jimi and copy jimi.jar to /usr/share/java/jimi-1.0.jar Then just do make or make Pod-2-DocBook.html or make Pod-2-DocBook.pdf to generate this "book".
Pod-2-DocBook-0.03/examples/pod2docbook-docbook/chapters/development.xml0000444000175200017530000000152311177047066025202 0ustar jozefjozef Developers documentation section
Overview It's aways nice to read some documentation but to write it's not so fun. And to write it and sync it on two different places it's just annoing. To make our life easy let's see how a docbook sections generated directly for Perl module can look like.
Modules
Scripts
Pod-2-DocBook-0.03/examples/pod2docbook-docbook/chapters/pod/0000755000175200017530000000000011177047066022721 5ustar jozefjozefPod-2-DocBook-0.03/examples/pod2docbook-docbook/chapters/pod/.placeholder0000444000175200017530000000000011177047066025170 0ustar jozefjozefPod-2-DocBook-0.03/examples/pod2docbook-docbook/entities.mod0000444000175200017530000000261611177047066022656 0ustar jozefjozef Pod::2::DocBook"> MindMap"> XML"> XPath"> CSV"> HTTPS"> SSL"> MD5"> URL"> css"> HTML"> Debian"> JAVA"> Perl"> CPAN"> --- uncomplete ---"> --- to be done ---"> ORM"> Object/Relation mapping"> DBIx::Class - Extensible and flexible object <-> relational mapper"> Catalyst"> Catalyst MVC Web Application Framework"> Pod-2-DocBook-0.03/examples/pod2docbook-docbook/book.xml0000444000175200017530000000354611177047066022010 0ustar jozefjozef %entities; %xinclude; ]> &pod2docbook; Jozef Kutej 2008 Jozef Kutej. All rights reserved. Copyright Notice: This document contains information about &pod2docbook; Perl module. All parts of this document may be photocopied, otherwise reproduced, or translated to another language without the prior written consent. 0.01 2008-07-03 Jozef Kutej Initial draft started. 0.02 2008-07-06 Jozef Kutej Added "Usage" chapter. Pod-2-DocBook-0.03/examples/pod2docbook-docbook/images/0000755000175200017530000000000011177047066021573 5ustar jozefjozefPod-2-DocBook-0.03/examples/pod2docbook-docbook/images/warning.png0000444000175200017530000000211211177047066023740 0ustar jozefjozef‰PNG  IHDRàw=øsBIT|dˆtEXtSoftwarewww.inkscape.org›î<ÜIDATH‰­•OHT[Ç?çÞñÎ\玎:¾JûG!´0,[ÑׯÑE?r„èÀnËÂÿäÉK ”¢§¢‚"¥ˆôõa=} ‰á3gÈ>~œ€®SÕÛ‹Ð6¿ç– þºŸB‡èÀY§Oc;tÛáçN±4<ŒÇ²ðÝ»·e‚M2‘`òÑ#²¾}C¦R˜--+‘…ÀlkC%“ÓÓL>|Hjyù×;:ø-?ŸèÐö³gÑöîEýÀìÕÕÄFGñØí|¼sç×Éh”Ù®.´ÏŸQ6ަ&¤”ô÷÷ÓßßgK JÓ°üýì‰p8sÁ7oR˜›ËÒ‡55è»v!¥¤¦¦†ºº:„hEE˜çÎóùðè:ïoÜÈLŸŸ'22ccàp`66"„À0 ÃÀ²,`eÎæfDv6Âï'üæ ±ÙÙíÃ×®á±Û‰c¯«C/(X:8εYx<˜õõ,ON’ŸJ1|õêÖ‚h0ˆ HŽŒ rsɾpaþCàr¹V÷B\—.!Ün”ßOb|œðׯ› †ZZÈ×4–ý~Ì‹ë`.—+-€–“ƒ«©‰äÌ î¥%››.ù|ØÂa–ß½Cb?> $„ ¼¼œ²²²´B¬úzô;‘_¾ ƒÌŽn ·¶âN¥HLMa66¢eg§Á…”––RZZºá\3MrÚÚH-,àŽD¾r%]0ûö-&D+.ÆQ[» imm¥¡¡………)jkÑ÷í#é÷cŸ›cæÕ«5ÁH{;¹KK$çæ0/_F3Œ4¸‚ââbª««ñz½¸Ýî Í0ÈkoGF£¸B!Þ_¿¾Âvu©àݻ载(‡¼®.„®oü{?}§'HNL=xâ[·°Þ¾ÍnM# a?yé÷o Z¶™È_Ú ””Èï€õ@𦭠÷GÕõ´~wI æŽüݘ§.GÉtÉIEND®B`‚Pod-2-DocBook-0.03/examples/pod2docbook-docbook/images/draft.png0000444000175200017530000002427411177047066023410 0ustar jozefjozef‰PNG  IHDRMJjUsBIT|dˆtEXtSoftwarewww.inkscape.org›î< IDATxœíÝ{ümw]ßùw € S"8*XA”RQŠ¿ãTª$"HA.uðFªe,âPZ¯ð¨h…qB*‚  "å*¢H¾©(—t¤ã…;µ@@¹ wrúÇÚ¿ðËIÎ9û³×Zûú|>yðà¸._ ¼ò]{­õ]g8q",çZ›À.M€Ñ(M€Ñ(M€Ñ(M€Ñ(M€Ñ(M€Ñ(M€Ñ(M€Ñ(M€Ñ(M€Ñ(M€Ñ(M€Ñ(M€Ñ(M€Ñ(M€Ñ(M€Ñ(M€Ñ(M€Ñ(M€Ñ(M€Ñ(M€Ñ(M€Ñ(M€Ñ(M€Ñ(M€Ñ(M€Ñ(M€Ñ(M€Ñ(M€Ñ(M€Ñ(M€Ñ(M€Ñ(M€Ñ(M€Ñ(M€Ñ(M€Ñ(M€Ñ(M€Ñ(M€Ñ(M€Ñ(M€Ñ(M€Ñ(M€Ñ(M€Ñ(M€Ñ(M€Ñ(M€Ñ(M€Ñ(M€Ñ(M€Ñ(M€Ñ(M€Ñ(M€Ñ(M€Ñ(M€Ñ(M€Ñ(M€Ñ(M€Ñ(M€Ñ(M€Ñ(M€Ñ(M€Ñ(M€Ñ(M€Ñ(M€Ñ(M€Ñ(M€Ñ(M€Ñ(M€Ñ(M€Ñ(M€Ñ(M€Ñ(M€Ñ(M€Ñ(M€Ñ(M€Ñ(M€Ñ(M€Ñ(M€Ñ(M€Ñ(M€Ñ(M€Ñ(M€Ñ(M€Ñ(M€Ñ(M€Ñ(M€Ñ(M€Ñ(M€Ñ(M€Ñ(M€Ñ(M€Ñ(M€Ñ(M€Ñ(M€Ñ(M€Ñ(M€Ñ(M€Ñ(M€Ñ(M€Ñ(M€Ñ(M€Ñ(M€Ñ(M€Ñ(M€Ñ(M€Ñ(M€Ñ(M€Ñ(M€Ñ(M€Ñ(M€Ñ(M€Ñ(M€Ñ(M€Ñ(M€Ñ(M€Ñ(M€Ñ(M€Ñ(M€Ñ(M€Ñ(M€Ñ(M€Ñ(M€Ñ(M€Ñ(M€Ñ(M€Ñ(M`v½÷ûöÞ|Ó㘂h³ê½ß7Éo&ùÉÞûOnzÐZ»"Ƀ"œW#š°G¦æÑç5MØ#‚ù†œÌ#Âyu¢ {`d0Ï»¦`ΫMØqsóˆp~–h›ã’üT„s š°£Fó‚ùþê9…S4a' æy«óÈ¡‡S4aÇl2˜G9œ¢ ;d‚yäPÃ)š°#¶)˜G1œ>¬; ÷~û$šz0ß”äÎsó¸Þûµ’<%É÷®°û‰$?ØZ»xÚQÍÃLv@kí I~©¸Û›2Ó ód‡4ãMØ­µ‡'ùKn~ÌËgÒUJ8EvHkíG’üÂ6[{0B8EvLkíI~þÿç˲¡`Ù÷pŠ&ì ÖÚ&yüI|Y†›> æ‘}§hÂé½ßvÙm[kÿW’Ÿ[üÛ­ æ‘} §h–X<‡ùÆÞûO,»Okí‘I~8¾$?•} §ç4a \Ãë?ÝZûñ iRûô§™&lØ)Þôù±ÞûOohH“Û§§hÂõÞï“S¿ùèÞûϬyH³Ù—pŠ&lÈ"˜ÏÎé_ü÷½÷Ÿ]Óf·áMØ€%ƒyäßõÞ;óÖf×Ã)š°fÅ`yTïýq3 iív9œ¢ k´b0Ü|qz/ìj8÷æol»‘Á|f’ï^„foìb8EÖ ÷þmÌÏL;ªí°káM˜Ù"˜Ï‰`žÒ.…S4aF‚¹¼] §hÂL³nÂ)š0¿a®nÛÃ)š0±cÁ¼Î »t0ls8E&$˜ÓÙÖpŠ&L¤÷~ï椶1œ¢ Xó9ÌÉm[8EFÌùmS8EFÌõÙ–pŠ&¬H0×oÂ)š°ÁÜœM‡S4¡¨÷~¯æFm2œ¢ ‹`þVsã6NÑ„% æöÙD8E– ˜ÛkÝáM8ÁÜ~„ó½÷k/³±hÂiæîΞä‚eÿ>‰&œBïýŸG0wÊ á< 懖=‡hÂ5Xó¹ÌSç%)3M¸ÁÜ}K„óµY!˜‰hÂUæþ8M8_›än­µ¯rܳNœ81vl°ö-˜½÷³“\œäâÖÚŸoz<›Ò{¿V’§$ùÞ$’äÂUƒ™ˆ&$ÙÛ`þf’û&ù»$wi­ýÙfGµ9‹pþH†€|ḏD“ƒ·§Á|V’ûûãƒçTü¦ÉAë½ß3ûÌ$¹Q’WôÞï¸þQíÑä`-‚ù¼ì0œ“äå½÷¯[ߨöhr0˜GÎIò2á\hrpè’üTŽfœçÎ7ªýåFåX0¯»ÂîÛÌg&¹ÿ »¿/É-ÇÞM>4fšŒÞûݳz0Ÿý æ'“ÁÜY¢ E„ó­ñæÎMXÁÈp®B0·„ß4a#ã¬Ì-"š°¢cá|ÿŒ§Ì-#š0Â"œwÎ<áÌ-$š0ÒLáÌ-%š0‰/Õs‹‰&L¤µöÆŒ§`n9Ñ„ MοNòêéFÄÔD&62œ·Í†¾«ÎrDf02œkÿ®:ËM˜‰pî'Ñ„ çþM˜™pî v°½÷{&y|’§%ùµÖÚû6<¤µë½M†E>>…Ý/MrAkíƒÓŽŠ*Ñdv‹`>7Éuô‰Å¿Rkí’ l„s÷‰&³º†`žì Iž”ä™­µ®m`$œ»M4™ÍÁ<îƒI~=Ãìóÿ›u`[@8w—h2‹b0OöÊ ³Ïßm­}zÒm‘Þû퓼"¹SD“É æqïNòä$¿ÚZûÛÑÛB¹{D“IMÌã>•ä…I.j­íÝ{Ù¹[D“ÉÌÌ“ýE†K÷g´Ö>4ãyÖJ8w‡h2‰Þû?Kò²ÌÌã>’ä72Ü8ºlMçœÕ"œ¯LrãvÎ5M&Ñ{¿M†YàY8ýk’\”äù­µOnàü“Îí'šL¦÷þâ$npïIò”$¿ÒZ{çÇ1Špn7Ñd2½÷»d¸Dß´Ï$yQ†ß>_ÞZÛ¹ÿ’ çöM&Õ{¿,ÉWmzÇüU’_Nò´ÖÚßmz0¹¬rÄÔžPØö-I澉së$¿äݽ÷_ë½íÌç›Lkí VGúÀ »[i&fšLª÷~½$ïHrÓ%6ÿh’[$¹M’‡&¹o’ëÍ7º+ý— —îÏi­}| çÅŒs»ˆ&“ë½ÿD’Ç,¹ù£[k?»Øï&I¾/É$¹å<£»Š÷gXªîâÖÚ[Öp¾• çöM&×{¿Y’·g¹Yãß&ù‡Ç꽟•ä‚ ³Ï»'¹öã<æD’—d˜}¾¸µvÅÌç[IïýŸdx^87H4™Eïý©I¾wÉÍ¿§µöë§8ÎÍ“<8Ƀ’|áDÃ;·%ù•léBɹy¢É,zï·Kò¦%7ckíög8Þu’Ü+Ãìó›GoŸHò¼ ï»oÕBɹY¢Élzï¯Èp÷wç·Ö^¹äqo“ä!I¾;É9+¯âh¡ägµÖþÿ5œïŒ„ssD“ÙôÞïžá!óe¼¸µv÷âñ¯ŸäfŸw,oG %_ÜZûok8ßi çfˆ&³YÜÐys’¯\bóIn»jŒzïwÌÏoOrƒUŽQôfŸ¿³É…’G„S4W$šÌª÷þ$/¹ù“[k?0ò|çd¸lH†ç?ç¶ñ…’WgÏ̽YZoD“YõÞoäYîÐKr‹ÖÚåû›3Ì>ï•ä:Só4>ä–ªûÙÏu5…p^’än‚¹:Ñdv½÷Ç&yÔ’›ÿxkí§'>ÿfxdéÁIn>å±Oá/2Ì®Ÿ¾Î8-ÎK2Ì0?¼®1í#Ñdv½÷/Êðüã2³½÷$ùÒÖÚ'fǵ3<,ÿÐ ÏϽöçÚJ>M8_›a†)˜#‰&kÑ{ÿ$ß¹äæß×Z{ÚÌã¹e†×5¿/ÉMæ<×Âk2Ü8úí¹J¾†pþI’ s¢ÉZ,VzÝ’›_ÖZûê9Çsd±ÀÈwd¸™söNùÞ|v¡äwÌu’cá|s†æGæ:סMÖ¦÷þê$wZró»¶Ö^>çx’¤÷~Ý ƒ»çÜç:Éì %÷Þÿq’· æ´D“µé½ß+Ãæe¼¤µ6ë§36Ì“ýu†G;·Pò!MÖ¦÷~­ +©/³ìÛ‰$_ÕZû‹™Æ²-Á<îcIžáÆÑ²?e°f¢ÉZõÞ–ä‰Knþ”ÖÚ¿œa ÛÌ“íÔBɇD4Y«Þû “¼+É2Ÿaøx†‡Ý'[¢mG‚yÜ’<5É/·ÖþfÓƒÁ7‚X³ÅM‰§,¹ùç$ùWS{‚`>9Ã×6×9Ó¸q’G$ù«Þûî½ëâg6ÄL“µë½ß"ÃGÕ–Y‘ý½f›£vŸ ˜?ÙZû‰Å±n™ä_fXdùfcƵ¢·gøÂæV.”¼ïü‹µ[<ŸøÛKn~Ó$ß5æ|S3IZkoi­=*Ã+™÷Kòò¬wöù¥I—ä]½÷³ÆóÑds~±°íÊa˜:˜ÇµÖ>ÕZ{^kí®>ü2ÌŒ×åõI~mç#.ÏÙ Þû%IÚ’›ß­µöÒâñg æiÎyôYŽHrçÌ÷~»åÝ6ÄL“MªÌ6^9ð&‚™\9û|nkíü$_‘äç2ýìS07ÈL“Y¬:ô–$·Xr—ÛµÖþëÇÝH0Ï0ž£Ùç7gÜìÓz˜&šlTïýI¿äæOm­}ÿŽ·UÁÙZ{NkíÎ~ûüù$§úÌÇŸD0·†™&×{¿U’¿Ìrÿ_†‡Ý¯|{ׂy*‹ÿß–aöùM‹?> ¦åݶ„h²zï/Èp³dn­ýêb¿½æÉzï_‘áÁù' ævM¶BïýNI^½äæoNò3|shï‚ÉvM¶FïýÏ’ÜaÉÍï•áû>‚ÉZ­ã›(Ìhñ]ñ;exûäË2¼«}³ +½7Ã×ÿG†¢_ÙZ{ÛfFº”_LòŒ%·ý­$×]ñ<‚ÉÊÌ4wÐâc`HòÀ$ßá®ò²þ&Éï$¹¨µö–†·²Å+ˆoKòE3žF0E4wHïýœ$ËðØÍØ%É®Èða¯'´Ö^5vlSé½?*Écg:¼`2šhîˆÞû]3<ÏøÅ3þ?'ù¡m˜yöÞoœäIn0ñ¡“Iˆæ–[üfùsf—s­˜“ Ÿ–xl’Ÿ»àïX½÷‹“É£*±<ÅÎNòKYíUÅ+’Ü¡µöÆ1c¨ê½¿<ÃÏ ËzO†Ïb|r¦!q Ì4×hD0O$ùW­µÌ$i­}ºµöÐ$Xa÷kexÝrÝþcqû›eø\LJ4×dD0?“ä­µ‹§SkíRQ’\¸G^’ä¿÷yØá°‰æŒæ'“ܯµöÓêJ?šäw‹û\'Ã7»×¦µv"ÃBçöÞÏc<.ќو`~4É=[k/˜~TŸÕZ»"ÉwfX¤£âþ3 çLžžáÉŠ=Ç@8\¢9£ÁüH†o]¿túQ]Ýâ±.îv^ïýóçÏ©´Ö>–äWŠ»Ý¿÷>v•{¸’hÎdd0/l­ýñô£:­§gX»sYgg3ïÉ_”á9Ìe]7?bB¢9ƒ ‚ùšéGuz‹Ëôêo†c_ý,k­ý÷$Ï)îöu¿Êþ͉íb0yq†ç0—µöh.Tvÿ_“ÜwŽpxDsB;Ì´Ö.ϰÐDz6ÍÖÚŸ'yuq71 ќȮó˜Ë Ûnj¦™Ôg›­÷~ÇYFÂAÍ ìQ0“äÃ…mW]øc ¿—äoŠûxüˆÑDs¤= fR‹æ‡fÅ,n\=±¸Û¿è½ßtŽñp8Ds„= fR[ÛscÑ\xZ’¿/l½$ži,Ñ\Ñž3IîPØö}³b ‹‡òŸRÜí¡‹Už`%¢¹‚} fïý¬$·¯ì2×X ~)Ieå§/JrŸ™ÆÂÍ¢} æÂ¹^Võ±ŸÉ->óñÛÅÝ<~ÄÊD³`σ™ +-ë“I.™k EÕǾ¡÷^ù®$šKÚ÷`öÞoÚro¿¿X@cãZk—¦p±Ñ\¾sá‘©ý÷¡ú¸Ïܪ³ÍôÞ¿`–‘°×Dó !˜½÷;§öµÇ7´Ö6þ{æIžŸäí…í¯—á³ÆP"š§Ñ{ÿÖ¬þ´ïÜ‘`ž“äדœUØ­:«›]kí3î¤Wxüˆ2Ñ<½÷&Yõw»Ÿè½ßxÊÁÌäII¾¤°ýë“Ìùù1ž’ÚMïÎjÿ@䀉æi,n0\äƒ+ìþO’¼b›ÃÙ{p’v9ú*feù¸µi­}0ÉS—ÜüÒ$´Ö>:ãØC¢yûÎÞû½2Ì2+žÖZÛ†ÚOçÿΙ×= æ*O9pg8qbÓcØ ½÷¯OòÒ¬¶²Ï드ßZûÀ´£ZMïýNþ³|Nq×ïOò§IÞÖZ«\¯Uïýù9õãS‚É(¢Y°áì½u’?ÊøeÝ>ämIÞºø×«üµx/|#zïߘá?ãÉ“ÑD³h—ÃÙ{¿M’W%ùÂ5œîò\5¤W‰ëÜ¿%öÞ_—äký‘`2 Ñ\Á.†sÍÁ\ÆûrͳԷ&yûØ·zïß™ÏÞåL&#š+Ú¥pna0—ñžœúòÿí­µŸnçÅ×'ßšä]L&$š#ìB8w4˜gr"ÉÿÈ©/ÿßÑZûÄâ W &SÍ‘¶9œ{ÌeœHòÂ$÷[¼)“Í lc88˜‰ß0™‘‡Û'°mÀ ¦`2ќȶ„S0“y‰æ„6ÎÁ<‘áMŸ­}Ëg ‚ÉZˆæÄ6ΑÁ|PkíÜ ¿ÉþÃ$ßšäQIž™äM>m±Í“µq#h&ë¼94A0O»2ÐbÍɯHòU‹¿n·ø×[fóÿàLÖJ4g´ŽpÎÌ3œûIn›«Çô‹V=f‘`²v¢9³9ùÉ`žÎâç…¯ÊÕcz΄§L6B4×`Žpnk0O§÷þÅùl@bú’\¿x(ÁdcDsM¦ ç.óTzï×Jr«\=¦·NríkØE0Ù(Ñ\£)™ä¦Ù“`žNïýzf¡ÇCz­$ß.˜l’h®ÙÈp¾1ÉͲçÁ„m&š02œU‚ Úô3viäð‚ Í YC8f°——ç½÷ëgø>Ì?:ö×­’œáó®G½'É›ýE’7¶ÖÞ»æ±Îq©.˜0“½‰fïýœ$÷Hòmfp7Xá0W$yu’ßLòÛküÅ”áL˜ÑÎG³÷~^’Éð8Îu&<ô§’¼$Ÿ 謋VLNÁ„™íd4Dß;É¿MrÇ5œò­Iþ]’ç´ÖfûØáüáÖÚ'p’»Ô{¿O†ßŸ—õ3I¾,ÃŒóÒÞû?›ë$Üz`ïýF 8ÉÎÌ4{ï·HrQ†ß-7í÷’<²µöæ9>rÆùç^¹ü»iG$;ÍÞûµ“üp’ŸLò¹ÎqŸÌÎ'Ìqpá„í´ÕÑì½ß*Éo%¹Ã¦Çr/Jò=­µ÷O}`á„í³µ¿iöÞï‘äuÙî`&ÃÏoì½ßiêüó>á7N˜ÐÖÍ4wÆ“äÇ’œµááT|&ÉO%ù™ÖÚSxäŒóÏ’ÜÅŒ¦±UÑ\ÌŠž•än›Ë/KrŸÖÚG¦<¨pÂvØšhöÞož!8·ÙôX&ðº$¶Ö.Ÿò Â ›·Ñ\¬Dþ²$7Ÿè'’\–ä3|Ïûã.Ÿþ:;Ãçrÿ·$çfÚo×ùË$wm­½}ʃNÎó[k?å˜àl<š½÷¯Kòâ$7y¨%yF’W$ù£ÂçoÏʰ Ç7&ù 1ÊÏði†ÿ:á1…6h£Ñ\¼7þÂ$7q˜Ë“<1Éÿ3Eoü<<Ã]ñ)ž.øû$÷h­ýÉǺÒÈp¾.Ã¥ºpBÑÆ¢Ù{¿g’ç&¹îЇxW’ŸOò«­µN6°…Þû—'ù7fŸ×ô¯Š%¹okíÅ£vŒpÂúm$šóW’<|ŽXžlñóÁJrÛ‘‡úx†H½fô ŽNX¯µGsd0?aé³L;ªÓ[|ñ§2,A7fÖùwI¾±µöÿN2°á„õYk4GóUIþÖÚ»§Õòzï-ìó+Gæ]I¾¡µöÎIµ02œšáN¿p¬í5ÊÁ<‘áí ó7Ì$i­õ wן?â0_’䥽÷O3ªÁÈW.¿.É˫ߧ±–™æˆ`~:É÷·Öž>ý¨V·xÕó‰I~hÄa.Ir^kícÓŒj0ÁŒó.­µ¹¿’ ;köhŽæÇ’ܯµöûÓj½÷G&y\VGþEIîÝZûôt£N˜Ó¬—ç#‚ùÁ ÿÃÝÚ`&Ikí?$ùî ßZÅ=2DwR\ª¿¼÷>å×1aoÌ6ÓÌe¸)qéô£šGïý.~ç\å!ý.Ó_5í¨FÏ8ÿK†¿fœpÌ,Ñ<¤`Y¼Iôâ¬öéàw&ùê9î^ 'LkòËó‘Á¼`ƒ™$­µW'¹W’O¬°ûÍ“Ì8{ï_œáõÇJ0“äá3 ˜ÈVF3ÙípöÞo˜!˜_\Üõ[k}†!ÙÚh&“…ó¼iGuz½÷k'ù­$_SÜõ’$œ~DÀ”¶:šÉ$áü½u…s±¸ð/'¹°¸ëåIîßZûÔô£¦´õÑLv#œ‹`^”äAÅ]¯Hò]‹ÿŒÀ–Û‰h&ÛÎcÁ|è »?¦µöÒ‰‡Ìd+9: GúÖÖÚ+'Ϙ`^ÔZû¡©ÆÌogfšG¶iÆ92˜ÏNò°)ƬÏÎÍ4lzÆ92˜/Éð¾?°cv6šÉæÂ92˜—$9¿µöÑö6lç.Ï›èRýΕFóÒ$ &쮎f2I8_´l8'æ­µ®°/°%v>šÉzÂ)˜@²'ÑLæ §`Gö&šÉ<áL฽Šf2íÍ!ÁN¶ÓÎÈÇ‘>šäžIîÁŽÙÛh&£ÃyEV›‰ &ì±½» image/svg+xml Dialog Warning 2005-10-14 Andreas Nilsson Jakub Steiner, Garrett LeSage dialog warning Pod-2-DocBook-0.03/examples/pod2docbook-docbook/images/draft.svg0000444000175200017530000001055311177047066023416 0ustar jozefjozef image/svg+xml Pod-2-DocBook-0.03/examples/pod2docbook-docbook/images/note.svg0000444000175200017530000003015411177047066023262 0ustar jozefjozef image/svg+xml Pod-2-DocBook-0.03/examples/pod2docbook-docbook/images/note.png0000444000175200017530000000222711177047066023247 0ustar jozefjozef‰PNG  IHDRàw=øsBIT|dˆtEXtSoftwarewww.inkscape.org›î<)IDATH‰¥•IoEÇU]Ýã·„88ÞPbOâpˆ—8åCpB¹"> çܸqBb  I“ØŽoÉÌx2ž­»«ºŠC÷ôØŒ#RÒÓk½åÿ¯z]õžpÎ9Þ`9çØYù†8<àüû_ ù囀ë¨Éêw)5¸èÄqô«?}…Õáÿ?Dˆ•›·ñ<ÅÊÏ÷P…iLâ˜{÷Sg¯ ú 6‰hìýÂÂòåŒZô÷pL;çhÖö˜8óó•[ˆäÚ¼M¡T¤< [kì¬?LЪ¯R*O1³xˆOÜuF¬?|ÊÜÅ[ŒMÀÜOA<‹_ð™™/Ñ<œ¥Ý®æ99A§±F¡XÊÀ‡ÿ{£zÀËÝ6nÜÁ—›`6sŸ‹òºíú0A·¹ÎH¹<î¬eóï ‚Ò*|‚0ý× ]„T%œsÈ  ÛÞ&èµ·˜˜›<–õBÖm0ùSÊãôýK‡}Eqì ½ö3”W$ÖIîʯ©îVËõý*[OjTnÞ¡\~æéÉà@’h #‚Ú^)!6ƒ*ä'HLH±`“›×(M\aùÆ50‚ÓÛ¶–(ìåb‰ÙzÞbz¡ƒur˜½Î!Ï=fñêg”Ê è߇€Ã# q£Â$а[cm«Á·ß­³T¹ŽÑ”?Ú'pà Ûë[Tn~Ž'6Á´rÐ8 3à­Á…Ö¯1ÛÏ÷ÙxVc¿Úes/¦§×nŒ÷j)Ab"Ö~ýšsK×9wþ˜p :ŽÃq¤ÑÆÇ^WQQgw·NµÞ¢Iê‡ RAP.²´<‚¦& ÄÝ:¥ñEÔê_²P¹ÈhÙaz+DaH¤F{ıO§Ù¥úb‡—Õ¡+¼‚Ç©™)Ná˜ú­)¨»ŸþOà)C³QEkI¯­ÆKª5Ú¿Tdòt™Ë³sHá‹s!i³x’–ËÈh@Ü}žŒOÄ“?î–nç¡|NŸà½g‘œKpÎæ‚çúv—‰MɲYiÖÒv¡f–oÓØýÓ3‚Rq4´¶‡Mì1ð£d¼Æîœ%ð$Z ®©ò%£ãSØÄg°E‹p.³ +‹s8l¦EJ†£ßq=5‰Ñ€à°öv#{ÞÙxp0èÔGìdPÿµ’ìm*€`l‘¥+%pG›˜!S‰2cíûı8—~‹";O·­®âl+M"K>:lDZqÜ‘Þ%5NüÁ^µƒ÷ €Å@ 2Kp}Þ´Ç)˜ôdÆHÐdw»Ê¥³™üboƒ^·ÖúµbŒ!Iú#\)…R ß÷Q~ª}ß'ð}‚  P(2»pq0ôsXks c Ƙ¼¯<ÏÃó¼AFÖÏó2=í?‡gu°–˜ÏIEND®B`‚Pod-2-DocBook-0.03/lib/0000755000175200017530000000000011177047066013433 5ustar jozefjozefPod-2-DocBook-0.03/lib/Pod/0000755000175200017530000000000011177047066014155 5ustar jozefjozefPod-2-DocBook-0.03/lib/Pod/2/0000755000175200017530000000000011177047066014316 5ustar jozefjozefPod-2-DocBook-0.03/lib/Pod/2/DocBook.pm0000444000175200017530000015640511177047066016205 0ustar jozefjozefpackage Pod::2::DocBook; =head1 NAME Pod::2::DocBook - Convert Pod data to DocBook SGML =head1 SYNOPSIS use Pod::2::DocBook; my $parser = Pod::2::DocBook->new( title => 'My Article', doctype => 'article', base_id => 'article42' fix_double_quotes => 1, spaces => 3, id_version => 2, ); $parser->parse_from_file ('my_article.pod', 'my_article.sgml'); =head1 DESCRIPTION Pod::2::DocBook is a module for translating Pod-formatted documents to DocBook 4.2 SGML (see L). It is primarily a back end for B, but, as a Pod::Parser subclass, it can be used on its own. The only public extensions to the Pod::Parser interface are options available to C: =over =item doctype This option sets the output document's doctype. The currently supported types are B
, B, B and B
. Special processing is performed when the doctype is set to B (see L). You I set this option in order to get valid DocBook output. =item fix_double_quotes If this option is set to a true value, pairs of double quote characters ('"') in ordinary paragraphs will be replaced with BquoteE> and B/quoteE>. See L for details. =item header If this option is set to a true value, Pod::2::DocBook will emit a DOCTYPE as the first line of output. =item spaces Pod::2::DocBook produces pretty-printed output. This option sets the number of spaces per level of indentation in the output. =item title This option sets the output document's title. =back The rest of this document only describes issues specific to Pod::2::DocBook; for details on invoking the parser, specifically the C, C and C methods, see L. =cut use 5.006001; use strict; use warnings; use Digest::MD5 'md5_hex'; use Pod::Parser; use Pod::ParseLink; use Text::ParseWords; use Text::Wrap; use List::MoreUtils 'any'; =head1 METHODS use base 'Pod::Parser'; =cut use base 'Pod::Parser'; our $VERSION = '0.03'; my $SPACE = q{ }; my $DOUBLE_QUOTE = q{"}; #---------------------------------------------------------------------- # overridden Pod::Parser methods #---------------------------------------------------------------------- =head2 initialize() Initialize parser. =cut sub initialize { my $parser = shift; $parser->errorsub('error_msg'); $parser->{'Pod::2::DocBook::errors'} = []; $parser->{title} ||= q{}; $parser->{spaces} ||= 0; $parser->{id_version} ||= 1; my $skip = $parser->{skip}; $parser->{skip} = []; push @{$parser->{skip}}, split(/\s*,\s*/, $skip || '') if $parser->{skip}; # if base_id not set, put title as base_id or a random number in worst case $parser->{base_id} ||= $parser->{title} || q{:}._big_random_number(); $parser->{base_id} = $parser->cleanup_id($parser->{base_id}); return; } =head2 begin_pod() Output docbook header stuff. =cut sub begin_pod { my ($parser) = @_; my $out_fh = $parser->output_handle(); print $out_fh <<"END_HEADER" if $parser->{header}; {doctype} PUBLIC "-//OASIS//DTD DocBook V4.2//EN" "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd" > END_HEADER print $out_fh join("\n", '"), "\n"; $parser->{indentlevel} = 1; if ($parser->{doctype} eq 'refentry') { print $out_fh join(q{}, "\n", $parser->_indent(), "\n", $parser->_current_indent(), "$parser->{title}", "\n", $parser->_outdent(), "\n"); } else { print $out_fh '<', $parser->{doctype}, ($parser->{base_id} ? ' id="' . $parser->{base_id} . $DOUBLE_QUOTE : ()), '>', $parser->{title}, '', "\n"; } return; } =head2 end_pod() Output docbook footer. Will print also errors if any in a comment block. =cut sub end_pod { my ($parser) = @_; my $out_fh = $parser->output_handle(); $parser->_transition('THE END'); # end document print $out_fh "{doctype}>\n"; if (@{ $parser->{'Pod::2::DocBook::errors'} }) { print $out_fh "\n\n"; } return; } =head2 commans($command, $paragraph, $line_num) Process POD commands. =cut sub command { my ($parser, $command, $paragraph, $line_num) = @_; my $out_fh = $parser->output_handle(); return if $command eq 'pod'; # check if we need to skip this heading if ($command =~ /^head[1-4]/xms) { $parser->{'skip_current'} = ( (any { $paragraph =~ m/^$_/ } @{$parser->{'skip'}}) ? 1 : 0 ); } $paragraph =~ s/\s+$//sx; $paragraph = $parser->interpolate($paragraph, $line_num); # For blocks must be considered before we escape entries, otherwise # docbook markup will get mangled. if ($command eq 'for') { $parser->_transition('for'); if ($paragraph =~ /^(:\S+|docbook)/xms) { $paragraph =~ s/$1\s+//xms; print $out_fh $paragraph, "\n"; } # If we've processed a docbook 'for', then we're done. # If we've process any other 'for', then it wasn't # intended for us, and we're also done. return; } # Now escape SGML-escape our text, and figure out what to do # with it. $paragraph = _fix_chars($paragraph); if ($command =~ /^head[1-4]/xms) { $parser->_transition($command); return if $parser->{'skip_current'}; $parser->_handle_head($command, $paragraph, $line_num); } elsif ($command eq 'begin') { $parser->_transition("begin $paragraph"); push(@{ $parser->{'Pod::2::DocBook::state'} }, "begin $paragraph"); } elsif ($command eq 'end') { $parser->_transition("end $paragraph"); } elsif ($command eq 'over') { $parser->_transition('over'); push @{ $parser->{'Pod::2::DocBook::state'} }, 'over'; } elsif ($command eq 'item') { $parser->_transition('item'); $parser->_handle_item($paragraph, $line_num); } elsif ($command =~ /^back/xms) { $parser->_transition('back'); } else { my $file = $parser->input_file(); $parser->error_msg("unknown command `$command' at", "line $line_num in file $file"); } return; } =head2 textblock ($paragraph, $line_num) Process text block. =cut sub textblock { my ($parser, $paragraph, $line_num) = @_; my $out_fh = $parser->output_handle(); my $state = pop @{ $parser->{'Pod::2::DocBook::state'} }; my $para_out = q{}; $state = q{} unless defined $state; $paragraph =~ s/\s+$//xms unless $state eq 'begin docbook'; $paragraph =~ s/&/&/xmsg unless $state eq 'begin docbook'; unless ($state eq 'begin docbook' || $state eq 'begin table') { $paragraph = $parser->interpolate($paragraph, $line_num); $paragraph = _fix_chars($paragraph); } if ($state eq 'name') { my ($name, $purpose) = split(/\s*-\s*/xms, $paragraph, 2); $para_out = join(q{}, $parser->_indent(), "\n", $parser->_current_indent(), "$name\n", "$purpose\n", $parser->_outdent(), "\n"); } elsif ($state eq 'synopsis+') { $para_out = join(q{}, $parser->_indent(), "\n", "$paragraph\n"); push @{ $parser->{'Pod::2::DocBook::state'} }, 'synopsis'; } elsif ($state eq 'synopsis') { $para_out = "$paragraph\n"; push @{ $parser->{'Pod::2::DocBook::state'} }, $state; } elsif ($state eq 'begin docbook') { push @{ $parser->{'Pod::2::DocBook::dbpara'} }, $paragraph; push @{ $parser->{'Pod::2::DocBook::state'} }, $state; } elsif ($state eq 'begin table') { $parser->_handle_table($paragraph, $line_num); push @{ $parser->{'Pod::2::DocBook::state'} }, $state; } elsif ($state =~ /^begin\s[^:]/xms) { push @{ $parser->{'Pod::2::DocBook::state'} }, $state; } elsif ($state eq 'over') { ## no critic (Variables::ProhibitPackageVars ) local $Text::Wrap::huge = 'overflow'; # don't break tags ## use critic $paragraph =~ s/\s*\n\s*/ /gx; # don't just wrap, fill $para_out = join( q{}, $parser->_indent(), "
\n", $parser->_indent(), "\n", wrap( ' ' x ($parser->{spaces} * $parser->{indentlevel}), ' ' x ($parser->{spaces} * $parser->{indentlevel}), $paragraph ), "\n", $parser->_outdent(), "\n" ); push @{ $parser->{'Pod::2::DocBook::state'} }, 'indent'; } else { ## no critic (Variables::ProhibitPackageVars ) local $Text::Wrap::huge = 'overflow'; # don't break tags ## use critic print $out_fh "]]>\n" if $state eq 'verbatim'; $paragraph =~ s/\s*\n\s*/ /gx; # don't just wrap, fill { $para_out = $parser->_indent; my $padding = ' ' x ($parser->{spaces} * $parser->{indentlevel}); $para_out .= join q{}, "\n", wrap($padding, $padding, $paragraph), "\n", $parser->_outdent, "\n"; } $state =~ s/\+$//xms; push @{ $parser->{'Pod::2::DocBook::state'} }, $state unless ($state eq 'verbatim' || $state eq q{}); } # fix double quotes in ordinary paragraphs if asked to if ($state !~ /^begin/xms && $parser->{fix_double_quotes} && $para_out =~ /"/xms) { my @protected; while ($para_out =~ m#(<[^>"]*".+?>)#sx) { # don't modify things that look like tags with quotes inside my $protect = $1 || $2; my $replace = quotemeta($protect); $para_out =~ s/$replace/\376/xms; push @protected, $protect; } $para_out =~ s!"(.+?)"!$1!sgx; foreach my $protect (@protected) { $para_out =~ s/\376/$protect/xms; } } print $out_fh $para_out if not $parser->{'skip_current'}; return; } =head2 verbatim($paragraph, $line_num) Process verbatim text block. =cut sub verbatim { my ($parser, $paragraph, $line_num) = @_; my $out_fh = $parser->output_handle(); my $state = pop @{ $parser->{'Pod::2::DocBook::state'} } || q{}; my @lines; my $min_leader; return if $parser->{'skip_current'}; $paragraph =~ s/\s+$//sx unless $state eq 'begin docbook'; @lines = split(/\n/xms, $paragraph); foreach my $line (@lines) { # expand tabs (see perldoc -q 'expand tabs') 1 while $line =~ s/\t+/' ' x (length($&) * 8 - length($`) % 8)/ex; # find the minimum-length whitespace leader for this paragraph my ($leader) = ($line =~ /^(\s+)/xms); $leader ||= q{}; $min_leader = length($leader) if ((not defined $min_leader) or (length($leader) < $min_leader)); } $paragraph = join("\n", @lines); # strip the minimum-length whitespace leader from every line $paragraph =~ s/^\s{$min_leader}//gxms if $min_leader; if (!defined $state) { print $out_fh $parser->_current_indent(), "{'Pod::2::DocBook::state'} }, 'verbatim'; } elsif ($state eq 'name') { my ($name, $purpose) = split(/\s*-\s*/xms, $paragraph, 2); $purpose ||= q{}; # $purpose can be empty print $out_fh $parser->_indent, "\n", $parser->_current_indent, "$name\n", $parser->_current_indent, "$purpose\n", $parser->_outdent, "\n"; } elsif ($state eq 'synopsis+') { print $out_fh join(q{}, $parser->_indent(), "\n", "$paragraph\n"); push @{ $parser->{'Pod::2::DocBook::state'} }, 'synopsis'; } elsif ($state eq 'synopsis') { print $out_fh "$paragraph\n"; push @{ $parser->{'Pod::2::DocBook::state'} }, $state; } elsif ($state eq 'begin docbook') { push @{ $parser->{'Pod::2::DocBook::dbpara'} }, $paragraph; push @{ $parser->{'Pod::2::DocBook::state'} }, $state; } elsif ($state =~ /^begin\s[^:]/xms) { push @{ $parser->{'Pod::2::DocBook::state'} }, $state; } elsif ($state eq 'over') { print $out_fh join(q{}, $parser->_indent(), "
\n", $parser->_current_indent(), "{'Pod::2::DocBook::state'} }, 'indent'; push @{ $parser->{'Pod::2::DocBook::state'} }, 'verbatim'; } elsif ($state eq 'verbatim') { print $out_fh "\n\n$paragraph"; push @{ $parser->{'Pod::2::DocBook::state'} }, $state; } else { print $out_fh $parser->_current_indent(), "{'Pod::2::DocBook::state'} }, $state; push @{ $parser->{'Pod::2::DocBook::state'} }, 'verbatim'; } return; } =head2 interior_sequence($command, $argument, $seq) Process formatting commands. =cut sub interior_sequence { my ($parser, $command, $argument, $seq) = @_; my $out_fh = $parser->output_handle(); my $string; # nothing is ever allowed to be nested inside of E<>, or Z<> if (my $parent = $seq->nested()) { if ($parent->cmd_name() eq 'E' || $parent->cmd_name() eq 'Z') { my ($file, $line) = $seq->file_line(); $parser->error_msg( "formatting code `$command' nested within", "`" . $parent->cmd_name() . "'", "at line $line in file $file" ); return $seq->raw_text(); } } $argument = q{} unless defined $argument; # the substring "\37632\377" is a space character protected # against translation in S<>; other characters are protected at # the end of this function, and all protected characters are # de-protected in _fix_chars () if ($command eq 'I') { $string = qq!$argument!; } elsif ($command eq 'B') { $string = qq!$argument!; } elsif ($command eq 'C') { $string = qq!! . ""; } elsif ($command eq 'L') { $string = $parser->_handle_L($argument, $seq); } elsif ($command eq 'E') { $string = $parser->_handle_E($argument, $seq); } elsif ($command eq 'F') { $string = "$argument"; } elsif ($command eq 'S') { $argument =~ s/\s(?![^<]*>)/ /gx; $string = $argument; } elsif ($command eq 'X') { $string = "$argument"; } elsif ($command eq 'Z') { $string = q{}; } else { my ($file, $line) = $seq->file_line(); $parser->error_msg("unknown formatting code `$command' at line", "in file $file"); $string = $seq->raw_text(); } # protect &, <, and > characters from later processing # I got this from the first edition Camel Book unless ($seq->nested()) { # just do this once, at the top of a subtree so we can # report more meaningful errors along the way foreach my $char ('&', '<', '>') { $string =~ s/$char/"\376" . ord ($char) . "\377"/egx; } } return $string; } #---------------------------------------------------------------------- # other public methods #---------------------------------------------------------------------- =head2 error_msg Returns parser error message(s) if any occured. =cut sub error_msg { my ($parser, @parts) = @_; push(@{ $parser->{'Pod::2::DocBook::errors'} }, join(' ', @parts)); return; } #---------------------------------------------------------------------- # private methods and helper functions #---------------------------------------------------------------------- sub _indent { my ($parser) = @_; return (' ' x ($parser->{spaces} * $parser->{indentlevel}++)); } sub _outdent { my ($parser) = @_; return (' ' x (--$parser->{indentlevel} * $parser->{spaces})); } sub _current_indent { my $parser = shift; return ' ' x ($parser->{spaces} * $parser->{indentlevel}); } =head2 make_id($text) default id format - Function will construct an element id string. Id string is composed of C<< join (':', $parser->{base_id}, $text) >>, where C<$text> in most cases is the pod heading text. version 2 id format - having ':' in id was not a best choice. (Xerces complains - Attribute value "lib.Moose.Manual.pod:NAME" of type ID must be an NCName when namespaces are enabled.) To not break backwards compatibity switch with F< 2>> in constructor for using '-' instead. The xml id string has strict format. Checkout L function for specification. =cut sub make_id { my $parser = shift; my $text = shift; my $base_id = $parser->{base_id}; # trim text spaces $text =~ s/^\s*//xms;$text =~ s/\s*$//xms; $base_id =~ s/^\s*//xms;$base_id =~ s/\s*$//xms; return $parser->cleanup_id(join ('-', $base_id, $text)) if $parser->{'id_version'} == 2; return $parser->cleanup_id(join (':', $base_id, $text)); } =head2 make_uniq_id($text) Calls C<< $parser->make_id($text) >> and checks if such id was already generated. If so, generates new one by adding _i1 (or _i2, i3, ...) to the id string. Return value is new uniq id string. =cut sub make_uniq_id { my $parser = shift; my $text = shift; my $id_string = $parser->make_id($text); # prevent duplicate ids my $ids_used = $parser->{'ids_used'} || {}; while (exists $ids_used->{$id_string}) { if ($id_string =~ m/_i(\d+)$/xms) { my $last_used_id_index = $1; substr($id_string, 0-length($last_used_id_index), length($id_string), $last_used_id_index + 1); } else { $id_string .= '_i1'; } } $ids_used->{$id_string} = 1; $parser->{'ids_used'} = $ids_used; return $id_string; } sub _handle_L { my ($parser, $argument, $seq) = @_; my $node = $seq; # look all the way up the subtree to see if any ancestor is an 'L' while ($node = $node->nested()) { if ($node->cmd_name() eq 'L') { my ($file, $line) = $seq->file_line(); $parser->error_msg("formatting code `L' nested within `L' at", "line $line in file $file"); return $seq->raw_text(); } } # the substring "\37632\377" is a space character protected # against translation in S<>; other characters are protected at # the end of interior_sequence (), and all protected characters # are de-protected in _fix_chars () my ($text, $inferred, $name, $section, $type) = parselink($argument); $inferred =~ s/&/&/xmsg if $inferred; $name =~ s/&/&/xmsg if $name; return qq!$inferred! if $type eq 'url'; # types 'man' and 'pod' are handled the same way if (defined $section && !defined $name) { my $id = $parser->make_id($section); $section = $text if defined $text; return (qq!$section! . ""); } return $text if defined $text; if (defined $name) { my $string = $name =~ /(.+?)\((.+)\)/xms ? $parser->_manpage($1, $2) : $parser->_manpage($name); return defined $section ? "$section in $string" : $string; } my ($file, $line) = $seq->file_line(); $parser->error_msg("empty L<> at line", "$line in file $file\n"); return $seq->raw_text(); } sub _handle_E { my ($parser, $argument, $seq) = @_; if ($argument !~ /\A\w+\z/xms) { my ($file, $line) = $seq->file_line(); $parser->error_msg("invalid escape `$argument'", "at line $line in file $file\n"); return $seq->raw_text(); } # careful! the order is important return $argument eq 'verbar' ? '|' : $argument eq 'sol' ? '/' : ( $argument eq 'lchevron' or $argument eq 'laquo') ? '«' : ( $argument eq 'rchevron' or $argument eq 'raquo') ? '»' : $argument =~ /^0x/xms ? '&#' . hex($argument) . ';' : $argument =~ /^0/xms ? '&#' . oct($argument) . ';' : $argument =~ /^\d+$/xms ? "&#$argument;" : "&$argument;"; } sub _handle_head { my ($parser, $command, $paragraph, $line_num) = @_; my $out_fh = $parser->output_handle(); if ( $parser->{doctype} eq 'refentry' && $command eq 'head1' && $paragraph eq 'NAME') { push @{ $parser->{'Pod::2::DocBook::state'} }, 'name'; } elsif ($parser->{doctype} eq 'refentry' && $command eq 'head1' && $paragraph eq 'SYNOPSIS') { push @{ $parser->{'Pod::2::DocBook::state'} }, 'synopsis+'; } else { push @{ $parser->{'Pod::2::DocBook::state'} }, "$command+"; my $id = $parser->make_uniq_id($paragraph); if ($parser->{doctype} eq 'refentry') { print $out_fh $parser->_indent(), qq!$paragraph\n!; } else { print $out_fh $parser->_indent(), qq!
$paragraph\n!; } } return; } sub _handle_item { my ($parser, $paragraph, $line_num) = @_; my $out_fh = $parser->output_handle(); my $state = pop @{ $parser->{'Pod::2::DocBook::state'} }; $state = q{} unless defined $state; if ($state eq 'verbatim') { print $out_fh "]]>\n"; $state = pop @{ $parser->{'Pod::2::DocBook::state'} }; $state = q{} unless defined $state; } if ($state =~ /list\+$/xms) { print $out_fh $parser->_current_indent(), "\n"; } if ($state eq 'over') { # first item if ( !defined($paragraph) || $paragraph =~ /^\s*$/xms || $paragraph eq q{*}) { print $out_fh join(q{}, $parser->_indent(), "\n", $parser->_indent(), "\n", $parser->_indent(), "\n"); $state = 'list+'; } elsif ($paragraph =~ /^([1aAiI])\.?$/xms) { my $numeration = { 1 => 'arabic', a => 'loweralpha', A => 'upperalpha', i => 'lowerroman', I => 'upperroman' }->{$1}; print $out_fh join(q{}, $parser->_indent(), "\n", $parser->_indent(), qq!\n!, $parser->_indent(), "\n"); $state = 'olist+'; } else { my $id = $parser->make_uniq_id($paragraph); print $out_fh join(q{}, $parser->_indent(), "\n", $parser->_indent(), "\n", $parser->_indent(), "\n", $parser->_current_indent(), qq!$paragraph\n!, $parser->_indent(), qq!\n!); $state = 'vlist+'; } } elsif ($state =~ /^o?list/xms) { print $out_fh join(q{}, $parser->_outdent(), "\n", $parser->_indent(), "\n"); $state = "$state+" unless $state =~ /\+$/xms; } elsif ($state =~ /^vlist/xms) { my $id = $parser->make_uniq_id($paragraph); print $out_fh join(q{}, $parser->_outdent(), "\n", $parser->_outdent(), "\n", $parser->_indent(), "\n", $parser->_current_indent(), qq!$paragraph\n!, $parser->_indent(), "\n"); $state = 'vlist+'; } else { $parser->error_msg( '=item must be inside an', '=over ... =back region', "at line $line_num in file", $parser->input_file() ); } push @{ $parser->{'Pod::2::DocBook::state'} }, $state; return; } sub _transition { my ($parser, $what) = @_; my $out_fh = $parser->output_handle(); my ($level); # $level helps us determine what to do when we see =head # 1-4 are the valid numbers after '=head', so 0 and 5 # are safe to use to mark out-of-bounds on either side if ($what eq 'THE END') { $level = 0; } elsif ($what =~ /^head(\d)/xms) { $level = $1; } else { $level = 5; } while (my $state = pop @{ $parser->{'Pod::2::DocBook::state'} }) { if ( ($what eq 'item' || $what eq 'over') && ($state eq 'over' || $state =~ /^(o|v)?list/xms)) { # these are treated specially in _handle_item () push @{ $parser->{'Pod::2::DocBook::state'} }, $state; last; } if ($state =~ /list\+$/xms) { print $out_fh $parser->_current_indent(), "\n"; $state =~ s/\+$//xms; } if ($state =~ /^head(\d)/xms) { my $prev_level = $1; if ($level > $prev_level) { # embed in a previously opened section (i.e. restore # state and continue processing the document) # the enclosing section is no longer empty $state =~ s/\+$//xms; push @{ $parser->{'Pod::2::DocBook::state'} }, $state; last; } else { if ($state =~ /\+$/xms) { # prevent empty sections print $out_fh $parser->_current_indent(), "\n"; } # close the previous section and continue with the stack if ($parser->{doctype} eq 'refentry') { print $out_fh $parser->_outdent(), "\n"; } else { print $out_fh $parser->_outdent(), "
\n"; } } } elsif ($state eq 'indent') { print $out_fh $parser->_outdent(), "
\n"; push @{ $parser->{'Pod::2::DocBook::state'} }, 'over' if ($what eq 'item'); last if $what eq 'back'; } elsif ($state eq 'list') { print $out_fh join(q{}, $parser->_outdent(), "\n", $parser->_outdent(), "\n", $parser->_outdent(), "\n"); last if $what eq 'back'; } elsif ($state eq 'olist') { print $out_fh join(q{}, $parser->_outdent(), "\n", $parser->_outdent(), "\n", $parser->_outdent(), "\n"); last if $what eq 'back'; } elsif ($state eq 'vlist') { print $out_fh join(q{}, $parser->_outdent(), "\n", $parser->_outdent(), "\n", $parser->_outdent(), "\n", $parser->_outdent(), "\n"); last if $what eq 'back'; } elsif ($state =~ /^synopsis/xms) { print $out_fh join(q{}, $parser->_indent(), "\n", $parser->_current_indent(), "\n") if $state eq 'synopsis+'; print $out_fh $parser->_outdent(), "\n"; } elsif ($state eq 'name') { print $out_fh join(q{}, $parser->_indent(), "\n", $parser->_indent(), "\n", $parser->_current_indent(), "\n", $parser->_outdent(), "\n"); } elsif ($state eq 'verbatim') { print $out_fh "]]>
\n"; } elsif ($state =~ /^begin\s(.+)/xms) { my $begin_format = $1; if ($what =~ /^end\s(.+)/xms) { my $end_format = $1; if ($end_format eq $begin_format) { if ($end_format eq 'docbook') { my $paragraph = join(q{}, @{ $parser->{'Pod::2::DocBook::dbpara'} }); $paragraph =~ s/\s+$//xms; print $out_fh $paragraph, "\n"; $parser->{'Pod::2::DocBook::dbpara'} = []; } last; } else { # this is bad POD, but we do what we can # (maybe we'll find the begin we're looking for # deeper in the stack) $parser->error_msg( "`=end $end_format' found", 'but current region opened with', "`=begin $begin_format'" ); } } elsif ($what eq 'THE END') { # this is bad POD, but we do what we can $parser->error_msg("no matching `=end' for", "`=begin $begin_format'"); # we've got the data stored; might as well use it if ($begin_format eq 'docbook') { my $paragraph = join(q{}, @{ $parser->{'Pod::2::DocBook::dbpara'} }); $paragraph =~ s/\s+$//xms; print $out_fh $paragraph, "\n"; $parser->{'Pod::2::DocBook::dbpara'} = []; } } else { push @{ $parser->{'Pod::2::DocBook::state'} }, $state; last; } } elsif ($state eq 'over') { next; } else { $parser->error_msg("encountered unknown state `$state'", '(this should never happen)'); } } return; } sub _handle_table { my ($parser, $paragraph, $line_num) = @_; my $out_fh = $parser->output_handle(); my (@rows, $columns, $title); my $TABLE_ROW_TITLE = 0; my $TABLE_ROW_ALIGNMENTS = 1; my $TABLE_ROW_HEADER = 2; my $TABLE_FIRST_DATA_ROW = 3; foreach my $row (split(/\n/xms, $paragraph)) { my @fields = quotewords(',', 0, $row); $columns = @fields if (!defined $columns || @fields > $columns); push @rows, [@fields]; } # the first row specifies the title $title = $rows[$TABLE_ROW_TITLE]->[0]; print $out_fh join(q{}, $parser->_indent(), "\n", $parser->_current_indent(), "$title\n", $parser->_indent(), qq!\n!); # the second row specifies column alignments foreach my $spec (@{ $rows[$TABLE_ROW_ALIGNMENTS] }) { print $out_fh $parser->_current_indent(), '\n!; } else { print $out_fh qq!align="left">\n!; $parser->error_msg( "unknown colspec `$spec' in table", $title, "at line $line_num in file", $parser->input_file() ); } } # the third row (first row of data) is the table header print $out_fh join(q{}, $parser->_indent(), "\n", $parser->_indent(), "\n"); foreach my $field (@{ $rows[$TABLE_ROW_HEADER] }) { print $out_fh $parser->_current_indent(), "$field\n"; } print $out_fh join(q{}, $parser->_outdent(), "\n", $parser->_outdent(), "\n"); # the remaining rows are the table body print $out_fh $parser->_indent(), "\n"; foreach my $row (@rows[ $TABLE_FIRST_DATA_ROW .. $#rows ]) { print $out_fh $parser->_indent(), "\n"; foreach my $field (@{$row}) { print $out_fh $parser->_current_indent(), "$field\n"; } print $out_fh $parser->_outdent(), "\n"; } print $out_fh join(q{}, $parser->_outdent(), "\n", $parser->_outdent(), "\n", $parser->_outdent(), "
\n"); return; } sub _manpage { my ($parser, $title, $volnum) = @_; # the substring "\37632\377" is a space character protected # against translation in S<>; other characters are protected at # the end of interior_sequence (), and all protected characters # are de-protected in _fix_chars () my $manvol = $volnum ? "\37632\377" x $parser->{spaces} . "$volnum" : q{}; return join "\n" => '', "\37632\377" x $parser->{spaces} . "$title", $manvol, ''; } #---------------------------------------------------------------------- # helper functions #---------------------------------------------------------------------- sub _fix_chars { my ($paragraph) = @_; # fix characters that might annoy an SGML parser $paragraph =~ s/&/&/gxms; $paragraph =~ s//>/gxms; # finally, de-protect any characters that were protected # from the previous step $paragraph =~ s!\376(\d+)\377!pack ('C', $1)!egxms; return $paragraph; } =head2 cleanup_id($id_string) This function is used internally to remove/change any illegal characters from the elements id string. (see http://www.w3.org/TR/2000/REC-xml-20001006#NT-Name for the id string specification) $id_string =~ s//$1/g; # keep just inside of CDATA $id_string =~ s/<.+?>//g; # remove tags $id_string =~ s/^\s*//; # ltrim spaces $id_string =~ s/\s*$//; # rtrim spaces $id_string =~ tr{/ }{._}; # replace / with . and spaces with _ $id_string =~ s/[^\-_a-zA-Z0-9\.: ]//g; # closed set of characters allowed in id string In the worst case when the C<$id_string> after clean up will not conform with the specification, warning will be printed out and random number with leading colon will be used. =cut sub cleanup_id { my $parser = shift; my $id_string = shift; $id_string =~ s//$1/gxms;# keep just inside of CDATA $id_string =~ s/<.+?>//gxms; # remove tags $id_string =~ s/^\s*//xms; # ltrim spaces $id_string =~ s/\s*$//xms; # rtrim spaces $id_string =~ tr{/ }{._}; # replace / with . and spaces with _ $id_string =~ s/[^\-_a-zA-Z0-9\.:]//gxms; # closed set of characters allowed in id string $id_string =~ s/^[^A-Za-z_:]+//xms; # remove invalid leading characters $id_string =~ s/:/_/xmsg # remove : in ids version 2 if $parser->{'id_version'} == 2; # check if the id string is valid (SEE http://www.w3.org/TR/2000/REC-xml-20001006#NT-Name) # TODO refactor to the function, we will need if also later and some tests will be handfull # we should also "die" if the base_id is set through the command line parameter if ($id_string !~ m/^[A-Za-z_:] [-A-Za-z0-9_.:]*/xms) { $id_string = q{:}._big_random_number(); warn 'wrong xml id string "', $id_string, '", throwing away and using ', $id_string, ' instead!', "\n"; } return $id_string; } sub _big_random_number { ## no critic ValuesAndExpressions::ProhibitMagicNumbers return int(rand(9e10)+10e10); ## use critic } 1; __END__ =head1 POD TO DOCBOOK TRANSLATION Pod is a deceptively simple format; it is easy to learn and very straightforward to use, but it is suprisingly expressive. Nevertheless, it is not nearly as expressive or complex as DocBook. In most cases, given some Pod, the analogous DocBook markup is obvious, but not always. This section describes how Pod::2::DocBook treats Pod input so that Pod authors may make informed choices. In every case, Pod::2::DocBook strives to make easy things easy and hard things possible. The primary motivation behind Pod::2::DocBook is to facilitate single-source publishing. That is, you should be able to generate man pages, web pages, PDF and PostScript documents, or any other format your SGML and/or Pod tools can produce, from the same Pod source, without the need for hand-editing any intermediate files. This may not always be possible, or you may simply choose to render Pod to DocBook and use that as your single source. To satisfy the first requirement, Pod::2::DocBook always processes the entire Pod source and tries very hard to produce valid DocBook markup, even in the presence of malformed Pod (see L). To satisfy the second requirement (and to be a little nifty), Pod::2::DocBook pretty-prints its output. If you're curious about what specific output to expect, read on. =head2 Document Types DocBook's structure is very modular; many of its document types can be embedded directly into other documents. Accordingly, Pod::2::DocBook will generate four different document types: B
, B, B, and B
. This makes it easy, for instance, to write all the chapters of a book in separate Pod documents, translate them into DocBook markup and later glue them together before processing the entire book. You could do the same with each section in an article, or you could write the entire article in a single Pod document. Other document types, such as B and B, do not map easily from Pod, because they require structure for which there is no Pod equivalent. But given sections and chapters, making larger documents becomes much simpler. The B document type is a little different from the others. Sections, articles, and chapters are essentially composed of nested sections. But a refentry has specialized elements for the I and I sections. To accommodate this, Pod::2::DocBook performs extra processing on the Pod source when the B is set to B. You probably don't have to do anything to your document to assist the processing; typical man page conventions cover the requirements. Just make sure that the I and I headers are both B<=head1>s, that "NAME" and "SYNOPSIS" are both uppercase, and that B<=head1 NAME> is the first line of Pod source. =head2 Ordinary Paragraphs Ordinary paragraphs in a Pod document translate naturally to DocBook paragraphs. Specifically, after any formatting codes are processed, the characters C>, C> and C> are translated to their respective SGML character entities, and the paragraph is wrapped in BparaE> and B/paraE>. For example, given this Pod paragraph: Here is some text with I & an ampersand. Pod::2::DocBook would produce DocBook markup similar to this: Here is some text with italics & an ampersand. Depending on your final output format, you may sometimes want double quotes in ordinary paragraphs to show up ultimately as "smart quotes" (little 66s and 99s). Pod::2::DocBook offers a convenient mechanism for handling double quotes in ordinary paragraphs and letting your SGML toolchain manage their presentation: the B option to C. If this option is set to a true value, Pod::2::DocBook will replace pairs of double quotes in ordinary paragraphs (and I in ordinary paragraphs) with BquoteE> and B/quoteE>. For example, given this Pod paragraph: Here is some text with I & an "ampersand". Pod::2::DocBook, with B set, would produce DocBook markup similar to this: Here is some text with italics & an ampersand. If you have a paragraph with an odd number of double quotes, the last one will be left untouched, which may or may not be what you want. If you have such a document, replace the unpaired double quote character with B<< EEquotE >>, and Pod::2::DocBook should be able to give you the output you expect. Also, if you have any S<< B<=begin docbook> >> ... S<< B<=end docbook> >> regions (see L) in your Pod, you are responsible for managing your own quotes in those regions. =head2 Verbatim Paragraphs Verbatim paragraphs translate even more naturally; L mandates that absolutely no processing should be performed on them. So Pod::2::DocBook simply marks them as CDATA and wraps them in BscreenE> and B/screenE>. They are not indented the way ordinary paragraphs are, because they treat whitespace as significant. For example, given this verbatim paragraph (imagine there's leading whitespace in the source): my $i = 10; while (<> && $i--) { print "$i: $_"; } Pod::2::DocBook would produce DocBook markup similar to this: && $i--) { print "$i: $_"; }]] > Multiple contiguous verbatim paragraphs are treated as a single I element, with blank lines separating the paragraphs, as dictated by L. =head2 Command Paragraphs =over =item C<=head1 Heading Text> =item C<=head2 Heading Text> =item C<=head3 Heading Text> =item C<=head4 Heading Text> All of the Pod heading commands produce DocBook I
elements, with the heading text as titles. Pod::2::DocBook (L) only allows for 4 heading levels, but DocBook allows arbitrary nesting; see L if you need more than 4 levels. Pod::2::DocBook only looks at relative heading levels to determine nesting. For example, this bit of Pod: =head1 1 Contents of section 1 =head2 1.1 Contents of section 1.1 and this bit of Pod: =head1 1 Contents of section 1 =head3 1.1 Contents of section 1.1 both produce the same DocBook markup, which will look something like this:
1 Contents of section 1
1.1 Contents of section 1.1
Note that Pod::2::DocBook automatically generates section identifiers from your doctype, document title and section title. It does the same when you make internal links (see L, ensuring that if you supply the same link text as you did for the section title, the resulting identifiers will be the same. =item C<=over indentlevel> =item C<=item stuff...> =item C<=back> C<=over> ... C<=back> regions are somewhat complex, in that they can lead to a variety of DocBook constructs. In every case, I is ignored by Pod::2::DocBook, since that's best left to your stylesheets. An C<=over> ... C<=back> region with no C<=item>s represents indented text and maps directly to a DocBook I
element. Given this source: =over 4 This text should be indented. =back Pod::2::DocBook will produce DocBook markup similar to this:
This text should be indented.
Inside an C<=over> ... C<=back> region, C<=item> commands generate lists. The text that follows the first C<=item> determines the type of list that will be output: =over =item * "*" (an asterisk) produces BitemizedlistE> =item * "1" or "1." produces S<< Borderedlist numeration="arabic"E> >> =item * "a" or "a." produces S<< Borderedlist numeration="loweralpha"E> >> =item * "A" or "A." produces S<< Borderedlist numeration="upperalpha"E> >> =item * "i" or "i." produces S<< Borderedlist numeration="lowerroman"E> >> =item * "I" or "I." produces S<< Borderedlist numeration="upperroman"E> >> =item * anything else produces BvariablelistE> =back Since the output from each of these is relatively verbose, the best way to see examples is to actually render some Pod into DocBook. =item C<=pod> =item C<=cut> L recognizes these commands, and, therefore, so does Pod::2::DocBook, but they don't produce any output. =item C<=begin formatname> =item C<=end formatname> =item C<=for formatname text...> Pod::2::DocBook supports two formats: B, explained in L, and B, explained in L. =item C<=encoding encodingname> This command is currently not supported. If Pod::2::DocBook encounters a document that contains C<=encoding>, it will ignore the command and report an error (L). =back =head3 Embedded DocBook Markup There are a wide range of DocBook structures for which there is no Pod equivalent. For these, you will have to provide your own markup using B<=begin docbook> ... B<=end docbook> or B<=for docbook ...>. Pod::2::DocBook will directly output whatever text you provide, unprocessed, so it's up to you to ensure that it's valid DocBook. Images, footnotes and many inline elements are obvious candidates for embedded markup. Another possible use is nesting sections more than four-deep. For example, given this source: =head1 1 This is Section 1 =head2 1.1 This is Section 1.1 =head3 1.1.1 This is Section 1.1.1 =head4 1.1.1.1 This is Section 1.1.1.1 =begin docbook
1.1.1.1.1 This is Section 1.1.1.1.1
=end docbook Pod::2::DocBook will generate DocBook markup similar to this:
1 This is Section 1
1.1 This is Section 1.1
1.1.1 This is Section 1.1.1
1.1.1.1 This is Section 1.1.1.1
1.1.1.1.1 This is Section 1.1.1.1.1
=head3 Simple Tables Pod::2::DocBook also provides a mechanism for generating basic tables with S<< B<=begin table> >> and S<< B<=end docbook> >>. If you have simple tabular data or a CSV file exported from some application, Pod::2::DocBook makes it easy to generate a table from your data. The syntax is intended to be simple, so DocBook's entire table feature set is not represented, but even if you do need more complex table markup than Pod::2::DocBook produces, you can rapidly produce some markup which you can hand-edit and then embed directly in your Pod with S<< B<=begin docbook> >> ... S<< B<=end docbook> >>. Each table definition spans multiple lines, so there is no equivalent S<< B<=for table> >> command. The first line of a table definition gives the table's title. The second line gives a list of comma-separated column specifications (really just column alignments), each of which can be B, B
or B. The third line is a list of comma-separated column headings, and every subsequent line consists of comma-separated row data. If any of your data actually contain commas, you can enclose them in double quotes; if they also contain double quotes, you must escape the inner quotes with backslashes (typical CSV stuff). Here's an example: =begin table Sample Table left,center,right Powers of Ten,Planets,Dollars 10,Earth,$1 100,Mercury,$5 1000,Mars,$10 10000,Venus,$20 100000,"Jupiter, Saturn",$50 =end table And here's what Pod::2::DocBook would do with it:
Sample Table Powers of Ten Planets Dollars 10 Earth $1 100 Mercury $5 1000 Mars $10 10000 Venus $20 100000 Jupiter, Saturn $50
=head2 Formatting Codes Pod formatting codes render directly into DocBook as inline elements: =over =item * C<< IZ<> >> text =item * C<< BZ<> >> text =item * C<< CZ<> >> =item * C<< LZ<> >> name =item * C<< LZ<> >> name n =item * C<< LZ<> >> or C<< LZ<> >> sec in name =item * C<< LZ<> >> or C<< LZ<> >> sec in namen =item * C<< LZ<> >> or C<< LZ<> >> or C<< LZ<><"sec"> >> sec =item * C<< LZ<> >> text =item * C<< LZ<> >> or C<< LZ<> >> text =item * C<< LZ<> >> or C<< LZ<> >> or C<< LZ<> >> text =item * C<< LZ<> >> scheme:... =item * C<< EZ<> >> | =item * C<< EZ<> >> / =item * C<< EZ<> >> &#number; =item * any other C<< EZ<> >> &escape; =item * C<< FZ<> >> filename =item * C<< SZ<> >> text with spaces =item * C<< XZ<> >> topic name =back =head1 DIAGNOSTICS Pod::2::DocBook makes every possible effort to produce valid DocBook markup, even with malformed POD source. Any processing errors will be noted in comments at the end of the output document. Even when errors occur, Pod::2::DocBook always reads the entire input document and never exits with a non-zero status. =over =item unknown command `%s' at line %d in file %s See L for a list of valid commands. The command referenced in the error message was ignored. =item formatting code `%s' nested within `%s' at line %d in file %s See L for details on which formatting codes can be nested. The offending code was translated into the output document as the raw text inside its angle brackets. =item unknown formatting code `%s' at line in file %s The input contained a formatting code not listed in L; it was translated into the output document as the raw text inside the angle brackets. =item empty LZ<><> at line %d in file %s Self-explanatory. =item invalid escape `%s' at line %d in file %s Self-explanatory; it was translated into the output document as the raw text inside the angle brackets. =item =item must be inside an =over ... =back section at line %d in file %s Self-explanatory. The `=item' referenced in the error was ignored. =item `=end %s' found but current region opened with `=begin %s' The closest `=end' command to the referenced `=begin' didn't match; processing continued as if the mismatched `=end' wasn't there. =item no matching `=end' for `=begin %s' Pod::2::DocBook reached the end of its input without finding an `=end' command to match the `=begin' referenced in the error; end-of-file processing continued. =item unknown colspec `%s' in table at line %d in file %s See L for a list of supported column specifications. =item encountered unknown state `%s' (this should never happen) The state referred to is an internal variable used to properly manage nested DocBook structures. You should indeed never see this message, but if you do, you should contact the module's author. =back =head1 SEE ALSO L, L, L, SVN repo - L, L, F + F for Pod::2::DocBook DocBook documentation DocBook related links: L, L, L =head1 AUTHOR Alligator Descartes wrote a module called Pod::2::DocBook, which was later maintained by Jan Iven . That module was based on the original L by Tom Christiansen . Nandu Shah wrote Pod::DocBook, which is unrelated to the previous module (even though they both perform the same function). (L) Jozef Kutej renamed the module to Pod::2::DocBook because Nandus version was buried in the CPAN archive as an "UNAUTHORIZED RELEASE". =head1 COPYRIGHT Copyright 2004, Nandu Shah Copyright 2008, Jozef Kutej This library is free software; you may redistribute it and/or modify it under the same terms as Perl itself =cut Pod-2-DocBook-0.03/MANIFEST0000444000175200017530000000370711177047066014023 0ustar jozefjozefBuild.PL Changes doc/docbook.css doc/Pod-2-DocBook.html doc/Pod-2-DocBook.pdf examples/pod2docbook-docbook/.gitignore examples/pod2docbook-docbook/book.xml examples/pod2docbook-docbook/catalog.xml examples/pod2docbook-docbook/chapters/appendix-a.xml examples/pod2docbook-docbook/chapters/development.xml examples/pod2docbook-docbook/chapters/examples/empty examples/pod2docbook-docbook/chapters/introduction.xml examples/pod2docbook-docbook/chapters/pod/.placeholder examples/pod2docbook-docbook/chapters/usage.xml examples/pod2docbook-docbook/code/DocBook.pm examples/pod2docbook-docbook/code/pod2docbook examples/pod2docbook-docbook/custom.dtd examples/pod2docbook-docbook/docbook.css examples/pod2docbook-docbook/entities.mod examples/pod2docbook-docbook/images/draft.png examples/pod2docbook-docbook/images/draft.svg examples/pod2docbook-docbook/images/note.png examples/pod2docbook-docbook/images/note.svg examples/pod2docbook-docbook/images/warning.png examples/pod2docbook-docbook/images/warning.svg examples/pod2docbook-docbook/Makefile examples/pod2docbook-docbook/xinclude.mod lib/Pod/2/DocBook.pm Makefile.PL MANIFEST META.yml pod2docbook README t/00-compile.t t/02-Pod-2-DocBook-make_id.t t/distribution.t t/docbook.pod t/docbook.sgml t/e_colspec.pod t/e_colspec.sgml t/e_command.pod t/e_command.sgml t/e_empty_l.pod t/e_empty_l.sgml t/e_escape.pod t/e_escape.sgml t/e_item.pod t/e_item.sgml t/e_mismatched_end.pod t/e_mismatched_end.sgml t/e_nested_fc.pod t/e_nested_fc.sgml t/e_no_end.pod t/e_no_end.sgml t/e_unknown_fc.pod t/e_unknown_fc.sgml t/for.pod t/for.sgml t/formatting_codes.pod t/formatting_codes.sgml t/head.pod t/head.sgml t/indent.pod t/indent.sgml t/lists.pod t/lists.sgml t/make_id.t t/no_header.pod t/no_header.sgml t/paragraphs.pod t/paragraphs.sgml t/perlcritic.t t/perlcriticrc t/perltidy.conf t/Pod-2-DocBook.t t/pod-coverage.t t/pod-spell.t t/pod.t t/refentry.t t/signature.t t/table.pod t/table.sgml t/valid_xml.t SIGNATURE Added here by Module::Build Pod-2-DocBook-0.03/doc/0000755000175200017530000000000011177047066013432 5ustar jozefjozefPod-2-DocBook-0.03/doc/Pod-2-DocBook.pdf0000444000175200017530000017112411177047066016330 0ustar jozefjozef%PDF-1.3 %ª«¬­ 4 0 obj << /Type /Info /Producer (FOP 0.20.5) >> endobj 5 0 obj << /Length 165 /Filter [ /ASCII85Decode /FlateDecode ] >> stream Gaq3]]+2\3&-R?0`Kj*3@@p8AE>\dGBIL#N<$=^4+ZId;opCMf[N"VXTOtb-i'8J-RZ/U$SW(P@37p7sjpFI@oTga,kRE;Z?VW%i9'\5AV-I4EU#W'4pmoKU?$beKa/\GSnCJ`)F3Z?Q*2T6rh;^\+IYj&Q(N9O$EW~> endstream endobj 6 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 595 842 ] /Resources 3 0 R /Contents 5 0 R >> endobj 7 0 obj << /Length 485 /Filter [ /ASCII85Decode /FlateDecode ] >> stream Gasal9lldX&A@Zcp1Vc/MBn9X\CGG;E+V/u%(ESK)2(ip=s??tm]S;67jK'%e)@%qZu81cMH(_RhT*DEP!E>B'XeSU3dqJSVhDobUkCJD>BlZd__TD[Q@6b^L%p!)59XBpH3*@mFOXZ2'1('c;7kN-iJ*8'HFCi.Wq,XfE9c%(fgUKPGtIK3]=lbLg3MWf/so/!de*JV`8cnQj1umU+(3VLqaZnsQnZ37+Bt"^?Yf.k'?14"^7s)1b!IS]FW]TUMkO-_+tM#"WQc\`RgO!_SOO:@EeD7tqeAd?Q*O,?>:bP!OcVUAF,$6mDUJ\h+`dT;9.TbgQV18_31IBShYsZILBVj)Poi,HY#]_DHPPtJZf;2-1sYs(ZdSK*FK,a/oOhkJ=Zt/'ZQ8*bW3OgS4rJarf3t^\L\5gk4/\#b`]a$j*Tr4M-'+XXs4G/=PR8&$GEC1=n>-+W"BYh-oK?C>QbeT5`,A0F"2OWr*r~> endstream endobj 8 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 595 842 ] /Resources 3 0 R /Contents 7 0 R >> endobj 9 0 obj << /Length 81 /Filter [ /ASCII85Decode /FlateDecode ] >> stream Garg^iGoCd.c`?]8EV`b1=.gRYV7c]1UaMe0JP941GUmh0[MUU-q[K1isOjf_GG&\U1]Eh,lhpD'$^~> endstream endobj 10 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 595 842 ] /Resources 3 0 R /Contents 9 0 R >> endobj 11 0 obj << /Length 677 /Filter [ /ASCII85Decode /FlateDecode ] >> stream Gb"/i:N)^V(rl#l$6PI!4o[HGZ`[1V:";(DRX.N@aj:ZjK#tb+0G$V+FOINf8Em0GdEdhuE=U=Tf<;k[UCT:';2n_;dS3-V2PQ#7+,Vnm"DO=_Qj]/HdJ$)@Ib^>;\mek'6rJROG4Vg2d?`(BY$Rh-PhrgA-).2pdRHDhV9F.^,fW7F;(;2nV!hXFQEIN=PI\PrD(h6up\Fphmm'-'mt7")=J>s>bTn$]&DfZ]*=V$.BW>QNIW[QCkFORC&CC>5dH;BN"e/oUkl/D:om5p[)+!KAo*5Lm]*>7[2CVW54"%KlnkYRq`0V]qs6akV@]#jB#rLS%qO3.o'e&CA%e[qnD,mAsbRfYhEl2`p&d<'b,g2%U>G^['XHlOWjkRT7>C+8T>9`o`jM&.m4Gd;X^29'P/<=XH^:]'+O8J+3GFb2oEcASSt%p+F,egtDc1\c endstream endobj 12 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 595 842 ] /Resources 3 0 R /Contents 11 0 R /Annots 13 0 R >> endobj 13 0 obj [ 14 0 R 16 0 R 18 0 R 20 0 R 22 0 R 24 0 R 26 0 R 28 0 R 30 0 R 32 0 R 34 0 R ] endobj 14 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 704.89 179.44 694.89 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 15 0 R /H /I >> endobj 16 0 obj << /Type /Annot /Subtype /Link /Rect [ 144.0 693.89 183.43 683.89 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 17 0 R /H /I >> endobj 18 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 682.89 154.99 672.89 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 19 0 R /H /I >> endobj 20 0 obj << /Type /Annot /Subtype /Link /Rect [ 144.0 671.89 186.22 661.89 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 21 0 R /H /I >> endobj 22 0 obj << /Type /Annot /Subtype /Link /Rect [ 144.0 660.89 251.49 650.89 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 23 0 R /H /I >> endobj 24 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 649.89 268.31 639.89 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 25 0 R /H /I >> endobj 26 0 obj << /Type /Annot /Subtype /Link /Rect [ 144.0 638.89 183.43 628.89 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 27 0 R /H /I >> endobj 28 0 obj << /Type /Annot /Subtype /Link /Rect [ 168.0 627.89 203.0 617.89 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 29 0 R /H /I >> endobj 30 0 obj << /Type /Annot /Subtype /Link /Rect [ 168.0 616.89 195.78 606.89 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 31 0 R /H /I >> endobj 32 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 605.89 191.94 595.89 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 33 0 R /H /I >> endobj 34 0 obj << /Type /Annot /Subtype /Link /Rect [ 144.0 594.89 260.39 584.89 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 35 0 R /H /I >> endobj 36 0 obj << /Length 753 /Filter [ /ASCII85Decode /FlateDecode ] >> stream GasambAQ&g&A7#6\k^i$"P:_Bal+!+88p=Kj"OBj;]L$8g:LTn.ab;>05cclV]W6n-IIg,6rh5YHpBmO!m[-+7"E)&aH2,^SbS6;X]rb[%ZHon:=:O"JU];`^>j>?>rtUY`[d$Dr#d!!;C1;$g)j[1AWtf8"))/Mk`$30Y2R^0c8._dXBddQ^#N1)N0(s$-7cnJ8T-s1c6:rig_\2UA(431<<=j6r;u%KsD:UtOG!SuK3\X#$d%/S(gpLMt`r\3t$h`:Z&^!9G=cBLf`'9ZJ!o%.glaI_.M`h]iNRWr&bSc>!(HH;Uq2LmZf*NHG,T])R5tpRJkn^WlcM3Z;* endstream endobj 37 0 obj <> stream Gat%`lVeHu(l/-\p/=3JK=0/=[:?lnhP^beX]R2b%>I,7&g.==U/&C]'jIcY=LG9dQ&?lL+I<3h#luq-fds[hh.3k&DV/5=OL9k>g.6!l4S-eBRmrfiPB6Df?]*D#V[f\Gi)1\&MSqL.mIlcgW[En70?8jo;Qa+oX!`Lp[>8Krg:;j,p,bk,H)E:kPI@1#kh)?9u"bc4#(>^_bVjJ[ti,78OMLRY(qO)n%ED4-tt!/@*\E3Y=+XEb0[U<]LUV(`'Cs1u[C!(j3.W=s6Uo+k&c:>)$!_6&.:M:,A-.?guqO%^8&N"'arS,^u>DEDuM0Nlgq`qq5@4Z;[B[m?*i84MZ8kSqauP[qSA>^4F6s3X!]P`.NS(E/n%0?j&*FE^Zf"r9?jKL\F2UO5MYg_.F&07\*2ol[n6S/,Q2aH468?C]5HeCH?B*G*-Ga9,'Q]sqTZ,^1Vcki>N4Qnj/\"r/,Y\Gg`i0Q4_iLT+17_cgN/&<[?sI*C#T.`hqMUJ#t`Xk-`glc\B&),6$;;YG_tGV:@Xa5J%>:?qAT<9_s."-T^&h*WeZL>I1oBZUbPYV!%l5,bM[XnWMIXX+t)S&\,QB#tuhO,UG)G[TLiprUYGrD2nLI,:-j=65jD6:>%.B_*fP/ttLHJW4CgMl>fn5;_ZB)>!0U&YZ:KbhVJSonZ?]\ITXAcXahNG<+ks7R6,.]KDfHS2g5-]^=GB$NTVno,C"e2Sl;mhL.83KFhuf03]n!\mV`*OsL>;i$a9DQ'2*n,okbogK6IK0TYR:N%f;aqE)8suFrKG-RT`^bmAclWG6a%B_T-?r.DP4_FZj.Z41PD"_=2.5C&E:qA;9'5'2BZW7NGP8U-!OLBH^;=["u!6t+'+"q=$tS@_sMWL/F?:F*[#^QJK(bb1I=0Dcp]4B&;;aj>S(!sH7HoboVgVmF*BaYSNUlaPQ235OX@b0.-8<*2#0]dIk9i[h'/d!t!ir.eJ4@,KW%,@C1LdiBQU'Mfl6]T^n[SNIfdD*<'X_Foh5UijpdMdj,D5tn@C0mAFf0k`c2q:)i6t7@2Olr_Vm17&/^/4>V95q31Wg*a+ND38Wo3,,T`#Q/A&@!p;ZS<8X)2g~> endstream endobj 38 0 obj <> stream Gat>S9ha#D(^KQ@R6f2UdqLX*Q>dCnkYPA>fL-FTqK3l&*_SmHee:SQ'=P!T.]"qR]NdY't]!$"()%qSsJV$'iP@a7ljIbV^_jb#*pZ_SKa,`scmcdZqB\[FS-F*=;cr[F!4[$7AmVO0T$mYFkpV)&n\X_mI87L6F*43FDGlBfK&ja?d\\JndZrthuGZ!fh;-D8g"@WCnfX5M0f`/YjeNQ.dEDQL$[h-l%n4dRd`;CUGTq(CKl!-/bqucc#]KC8o!kaXD.XLE$$/:S7V/j*dO@UW0VC6K:/l-2\7AK[K:B/RY$k2pcgYpX6>e_m6YT9-*VGJZ@M+48F=Nl9d-7kfi._MtRO2rfsgRFZq$3aR;bgNkK5T;!q-'aa\!YUR7@t=WjGH^o%_.em@,ng%0Z$($BiirnFo'#R!F)[9>.)&>&'Q]6?%_.@!i&S\H9h(rjtO66ABb*]Ut3HoV>]f&ki(J,[NO&B!QR:8\c>]3$WXqu&Nc&]4.(634RJ<`QP@[0dDpe0Or6!fnDa,I)%n#"*maABp.M^g^Ee@Y*O9VS^g2OdVW9eI!%tg#@0:'T_8\LEl&*VIjHWkN8/G^._1rV;j%j[B%JT?7u0J[TA\eL2+-a4*MYb*Fr(^g"8h\@qX-5l#^uMm;-(!;kn?4eP;CP;-iQKI2];h_NdajM%f[Sj7\?;*'s((a6_pL=EQKLmiIGO@m$?e=E;BMbqTol:/6Nk-FiScG&.R:1c?+urAl\g&Moj7.%7pM;^qsl:YBL_/H~> endstream endobj 39 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 595 842 ] /Resources 3 0 R /Contents 36 0 R /Annots 40 0 R >> endobj 40 0 obj [ 41 0 R 42 0 R 43 0 R 44 0 R 45 0 R 46 0 R ] endobj 41 0 obj << /Type /Annot /Subtype /Link /Rect [ 634.768 662.438 704.778 652.438 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A << /URI (http://search.cpan.org/dist/Pod-2-DocBook/) /S /URI >> /H /I >> endobj 42 0 obj << /Type /Annot /Subtype /Link /Rect [ 380.515 662.438 555.505 652.438 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A << /URI (http://search.cpan.org/dist/Pod-2-DocBook/) /S /URI >> /H /I >> endobj 43 0 obj << /Type /Annot /Subtype /Link /Rect [ 587.58 651.438 605.08 641.438 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A << /URI (http://search.cpan.org/~jkutej/Pod-2-DocBook-0.01/) /S /URI >> /H /I >> endobj 44 0 obj << /Type /Annot /Subtype /Link /Rect [ 670.91 651.438 685.35 641.438 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A << /URI (http://search.cpan.org/~jkutej/Pod-2-DocBook-0.01/) /S /URI >> /H /I >> endobj 45 0 obj << /Type /Annot /Subtype /Link /Rect [ 174.0 640.438 375.78 630.438 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A << /URI (http://search.cpan.org/~jkutej/Pod-2-DocBook-0.01/) /S /URI >> /H /I >> endobj 46 0 obj << /Type /Annot /Subtype /Link /Rect [ 304.97 598.438 487.44 588.438 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 25 0 R /H /I >> endobj 47 0 obj << /Length 1230 /Filter [ /ASCII85Decode /FlateDecode ] >> stream Gat%"99\*Y&AJ$C:q=MC)^C$m50hGKD,Qk'UnU"`F'p80BjqAPct):r#P9]X>Fo[,@(N&HIdf4sgO/,=#69N59`pLG[Br`>1E]`I"Ura>q"0[Tm4'4;Nk/4`7gpT9P<5\/-nULaRUUs<+d51YTNa*moWp_$N'th:#TYF8abkka_Lk`#]^DSX-*u/;[19nV8K5kA(J:$SdUM:YX=2T[e+.NNU=<`H+3)-`+X!JETk8+oVCOGh8]RKh$huc8@s'$$muIqe_1ku]:n3(/O1m5A6d*aESG1gOoCW:rFfsffifuq^cm,FS[[nipiC*om%m\//?CjUWT!-mqGETO`\Fchtb+5*lle`1h3QWkLjjo4sq+ffbn[[%CV6i,>+?Rl+GBQJu7Mm5[\NPs)DXdX%#k2k`Z#B3F+5/9%I$c(10Nd5[LRPU),LMZqeuC'TdaZ65o4PD-d`&6,+lFh_8uj?6+Pa(o>Yr`/j8.W^FkA4j[)75d>pd%2MR)siTR*^:XmqENLIcE7+]$@oXGgYa?rUo#j*Tn_bNHl65f74;EWN)m:sj40Qd+8Gp6)W/M(#aWKNQq+bci=m-_=KV`AQ-"m]Kt]msSne[Nc-J/TFl&q96,9oteuNg7n4fo$p+WGCGbJpX49S.8[38Srj2??876m&/Eo=&e'`&B6D&2=6)S;TZ("OtK\mU:nE9N%i0uG&8)2iW]3&6n#Y-AWG2a[p^S*V_-5_5RjhHp`C(NTc,[(rr!,6Ed&g[0LcVGp`HFu@9GBodYoF3;Wjdm@(amjad]i[s2nD-`inghA;VQJU_sG8!-&VP9gDIiDY89tS"Ca^6PqAE4Pi]-7SobM(Dop)g=UZL"\$GZ)Z~> endstream endobj 48 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 595 842 ] /Resources 3 0 R /Contents 47 0 R /Annots 49 0 R >> endobj 49 0 obj [ 50 0 R 51 0 R 52 0 R 53 0 R 54 0 R 55 0 R 56 0 R ] endobj 50 0 obj << /Type /Annot /Subtype /Link /Rect [ 474.225 676.572 543.655 666.572 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 31 0 R /H /I >> endobj 51 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 665.572 156.66 655.572 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 31 0 R /H /I >> endobj 52 0 obj << /Type /Annot /Subtype /Link /Rect [ 491.396 611.246 561.406 601.246 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A << /URI (http://search.cpan.org/dist/Pod-2-DocBook/) /S /URI >> /H /I >> endobj 53 0 obj << /Type /Annot /Subtype /Link /Rect [ 598.12 611.246 612.56 601.246 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A << /URI (http://search.cpan.org/dist/Pod-2-DocBook/) /S /URI >> /H /I >> endobj 54 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 600.246 287.21 590.246 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A << /URI (http://search.cpan.org/dist/Pod-2-DocBook/) /S /URI >> /H /I >> endobj 55 0 obj << /Type /Annot /Subtype /Link /Rect [ 338.62 557.246 354.74 547.246 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A << /URI (http://java.sun.com/products/jimi/) /S /URI >> /H /I >> endobj 56 0 obj << /Type /Annot /Subtype /Link /Rect [ 367.032 557.246 502.602 547.246 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A << /URI (http://java.sun.com/products/jimi/) /S /URI >> /H /I >> endobj 57 0 obj << /Length 2476 /Filter [ /ASCII85Decode /FlateDecode ] >> stream Gat$:gMZ&_nNC5&'EsX"#pY;E/'l5k=59jm-NlcWoZ+b]@%ao:4HGXqUDkKfjBfCZjRk?WWt:AUWfJqf0j.`(_K>K!R1Z-f8L/.Tn]?r'FuN>*c:(F&cO-s)DY#h\5*s/.=iiWf\/ZVj2@,gafZM;ak]Ed_I@-n1O&$>]+^qU#W\&L_+i\O,-,p`M$qCmb;fbCZMb=\I]^b-"*-R&tr@b\s?fV:nuV&gn(bQHJZ'Y]Jaoh'(UFG;5m_K#M7/%A-dT9(Ve%](e\S3D4+*?41I!1`P=ho[MpeRM-18\kKB^'_#]@l$B`F7iP@tcrO6R`=](J704,T+Aq]t`]LdcU=!LQ&9m\52!/%)RuIKpil"/fUdR&-epGa*?%crr$466_qV&qRpbB;,5t16OM$bl$NUBjAr8+_eZ+mL:HL=E$M=6DF"+)k':)\G!,p<;+:'f6JE_T_ZJGjlDK/cZ"KsoDI6[qXOCY[h$qF"@kp&b.bR^Df:JSA,A,9^T%o=5t`2tW:NG.&2L4oed"=0rq?:4+55bp//ml#qYB11n`g$e8!G(".7bWuL"<-(l*!$d#@4<[J!u=u!3RPA/bs^Ne:4Pfh<6&"&Uug`q>+%Cf?.Orq4c,<*G9A$8O)2%q0+%DF5>t]+j[@cFQ6Wl(-t[W<]Ei`M\/kCc35E.lgQ$lcl89mcUlo0H@*Tn%]KbC[DD>Y3LBdl=+EY"`Q7^g,k;$JY\+mE??DK54Rf7Y(demQA4q**,DW%">FCW)^dEjK2^;Q\OWe=+=_(goc\Z6HZ3%Y<;RJ+tj#YK_,3UB\RaZ?/2]cs%\^g7=cM;IP0Ys-/XhcAIh>8jFpW0L4jgH,FPJeCRAAd0dW#X(r#&g176V[XM[NHG$e8bl`XLG)1,r#9diLV.6`h8$*gg#ggM_+*GikWE.#_%Vs8HJ7#0/!V*4Om'PmXa4.[!;:%WEt8Z^N[\[1tI5ZgejS+6a^P-?3PLCq-Nj:_Qu38Y^,'U($UW?aC51ehfFNcSpIefZ6dm^4&7D0%#o9Cb`q"[SiE?e7h+<:8Qqgs2>`$+j_MB+"l1T#H[FEP""[1VC:)+I-?p#DZoOi$sVc/uc'd;D.qOhdR51G\!R%"WJK`/rg4gH<#k**p`8Wo\&BCH#7Fa/]0ghP8^o(BbZ/W:7cO`5L.J1H=FTHrSA`iu'h%qF6W(rHQTHT$U1RDQ?SBH+hn_AG3#iM48-fU/q*>j(K"pUc3aqkL'/Ya:O#F8#4q)nJV&,%KrNFXH/_.3:oaP"hKR^JHi$QqUPmpL4c4;_RB!mX_5!@#N=#h-jjKDQi"B;4?[0`UAHj#WmbMgV\GBfT'AUde6GH.jW#=fraGE]Md4&(0S/A#E/R#mPJ3U0'IN(_id3pM3AG3FHEh9*mt=K)AbolknZ%5Udl_o>T/TtQCo%;6n+JpA36_Z+cH10B4B"K`[,4[Zo\@AB\,.Tc-'\NQVCNDF%JpnVWfMaoOH9(c\Mj\lbh%9_i?;mK,e/bW#A'5q6&THPVqEPPk=WWDM"h84TV-J=,7\-'ns%l@kfm>Si]+]]HT`m)s5FE!1Uba@UajL!8S^"&i-+5=TXWr'-1,4?r~> endstream endobj 58 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 595 842 ] /Resources 3 0 R /Contents 57 0 R /Annots 59 0 R >> endobj 59 0 obj [ 60 0 R 61 0 R 63 0 R ] endobj 60 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 369.423 221.11 359.423 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A << /URI (http://www.docbook.org/) /S /URI >> /H /I >> endobj 61 0 obj << /Type /Annot /Subtype /Link /Rect [ 441.264 284.423 518.744 274.423 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 62 0 R /H /I >> endobj 63 0 obj << /Type /Annot /Subtype /Link /Rect [ 248.94 230.423 340.85 220.423 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 64 0 R /H /I >> endobj 65 0 obj << /Length 2847 /Filter [ /ASCII85Decode /FlateDecode ] >> stream Gatm=D/\Gm')nJ0i=?*\!01g-=L,4li-(TuQb.F)2?jYHb@)R;PYJ51H:_kX^0fb0?T]Q%Njj4d^Mk673%p^<%dA2\Msl+R-Xd_5-Hk[`2VD>gP8X;88_.>'Hksr3Gd?+!rdFUc&'M`Dh`b@@r\I^V*Vf1s34""(-]C)/Mt18AkE\]HnnN39cFSkU^YV,f"Y-*Hnh2uol1sT76*,!B*X\m6I(FWF'GJ4m@oQ+m71^hA$?*H:7EtkUSh?YSI4mL#X.L%X7r_cnS;")K_UA=Q5+0^O]K&qWq5M0ENnqEZ=a'cb0BN+aHNf-XqF&?B6iF-]WR)E-#X'9;(I23P>Xr*1p>!Ck!17314d>@lun>*^T'`unZ6Bc=W#ArpU`SG7Qk%+@n5j![p?H+[eg7QU"IFq^SP>_)tot>G@0B&:b24%*i(3P,3D)EhtCmfl0>qTOC6,UfBeDR7\bE.ItHC\"_Pg`[6'e+eE+dr_d*#]jJpRSpEsXCUa[Y=$Ve=-s&8Y;_*ilgAs*Pt6*X3;CJ$K+3/-.p?"d+E353D,.)tV#@8S?3Y0`UrS,XXPP$*HXDfY&-PYJ*CY$Pm7t!0)TO/MV$8pI>M`tFQ68eotRt2H=+[ZF@/GNhX6)j$6Y$W!m.Q6Z=X*1H9L`OM,")g[TO];e0L4UO,hMW.hOFk;Up(Dr`Hl=.&Sq.&kbA*E4,&Dr/Z,1K*a@$.0T`PQY-4DUJeohH^#G:P03:j7#hn^1%e@]R9]G!nu]-&@n6!5UJ/]s_-9J/8s8qWoP4,+G;-WpfE5b_qL>&6U-&9@%ZYUeeTG)nI-MoFs;#B$i\rPFS6%X#)BkMi-9"I<9'Q"$TPJf(b)fAhmY,pX6ua]GRu-AKY[68p0]OYC'NFE<'m\HsijTiH"S'"kJ4N?_.jiq^$:5/C7+H>D7M#OI/?c+U^FN1R]F`F!5YLi&hdfWDIj`\Pm>^*)N^FffS[+D,J@PG/ljj'm"_q-%;V?<3]dJiI3eN*cFP35k\%=b4o''o,8&T?>ooY&4[RTa2.Fr*Rs'PSi6%bJi'8W^!6K595\qD\@S].N%T18iYa7dK4oY)scU`V=h[)((o.mU('"('31d5ot?A`l0R[e@g-,ko6g=W`b.X(03$l]plRqE5MT[bE5C)A2>PrR`_3(J1/_8^9!k.\=Jo3gMfm6_sL4X_!\mU?30.ULjB6SMl#&[?J:!3V1mOf"<9Z.2+*cgYWj[UF`oMu-SOS!I`<6+%DA+L"Lm0eZ!(oV."sY3AF=i?FZdO6?k595]]b_>uP"*75\XT$8Uo?`.l06Io#BJ.UGQ9RspAaB)3d<-=j3#]%DU+u1J"27R2b68@VTYhuJkX5PTg4c99>No&OF"XB+e@S;52OG^Eg#YSQrFIP4"&rn'FX#n6>jUMd8<:gmiZB[*Z2(*1UU@F6eRZ[$c)4a%c9mq(=7=a&\b#+[fXmqG8qS2HILPVnmY4_=8GEBE\=9@nPN3GK7;1*`bp8@ZZO3>0(++[+g-K^hG\dEDE#nT&8!28,+fH01ND1is'fO>=\;q?jH"J:(X\"l/rm+^\gZVoCcWo94,4C(Yn)/2P+"Sbj[_mOap;@%>9#kQ+O+E1E@(m=5i8S#^BOcN!u\0-3pCO'4GZ4cdAle,mWDjL*uj:s<[&VES,g-*9s!;]gGKL)A)qB41U]nV;VK^T5VmUX#J46g8#eCiSjR"Y6.i10eK8\&YT%P03d'!CL.+\nn_7TsO3Bic,A%70?Sj!YT:IMY_e=ek[#d8kTi]#3/5/#!I,Xk7r::J`+c2d+r2A7]]=k<%#oJu`c[ds5seb?!3s"E.HK4<-`;c\e4DalCgSk:7Ck+,<3B/>!dRd#l($,P!>4@XS)[Sp?@:-[MSeodTTe=M0nk[,8?f6Jh:e\VJ@1FA*bBaT2_#LXOpgjCh[f6Bk$'`V\P0Do.b3%(8c6ncLWf(4;hCZ"2_Sn*07'IU+T"/cNTKTKtT$b:V]k@9oORLqMAUC(:$6#Fuh_i]!2OUI/P$.#UDY?0NCk=)~> endstream endobj 66 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 595 842 ] /Resources 3 0 R /Contents 65 0 R /Annots 67 0 R >> endobj 67 0 obj [ 68 0 R ] endobj 68 0 obj << /Type /Annot /Subtype /Link /Rect [ 399.77 213.029 475.31 203.029 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 69 0 R /H /I >> endobj 70 0 obj << /Length 3591 /Filter [ /ASCII85Decode /FlateDecode ] >> stream Gb!"sCN%udnp>i)_Dnn4Yb`Z2SN$Y59@?IQBm[((5]Jt%gg.'aLfWZY1W-s$km,CC>n3,ncY.)`i`U,I2iPD/$n9Kd_@a;V7>?pV5s#T&9kDLF,'XGsS4F_?WWl@Ko`PFu6;f1e=rDcPmCmW\JQG9gTjQIk.[+6buC18o:B$<]:2STrn@[JmkLrb63.a@?p$k'+,\FPYGl/_<_"ar3"/g`WiXM*iMgHAST6pmd\[#T'5HPnh.T[;P`3*+9/n9'!8DWk?o9+4\O-$qo8&5T.ClpOQ-*TS,e=eHqP&KdQ`R%u9j;g6PP^\RMN`\/MhALS-q)K"f(@]X!hE$2[emH7i*^%ut2kC@Qh4?muQ*,GD@V2Oq\Kk%BB_qD)MBI"dk?#KSWJ.ObJ]\kGL]Mn.*8q"^9K<2k3q\h3[CJtPFTMfRp#]nBF:6ee?FMplL=.CRI40#F6L+);BmWYs)W0tEQBuV>]F;_q!2)k*%=ZMP2a14iTm]DUTbD)sgAi/GNc[7s#=Zmq8n-i:;7W]&mrh`j%_!!;R1AB+&2QH\HW43LbdT%,#i`MEUi!8u:N`J?Z3Dd;0qnr'bV(l_$"!Pu7IFAmj"ZT(JkHn`$!57SB=n-IPf:kOK?Bg+2g_'g,@eIc,U_ei[j+Br?J#U:Osd48`h6,pH6GoQf8=FL54]C,MdN@CeV^MgCpGR0u+-Zd`frAr0[:4^K2FCIn#7pPR(`baHROTH)\'p3np2;m7`(?-i6'!4g+eJGiK@3[g*1qCJd`&kW"9X;<`1Uata`QQY15kT#Dp,^uLgP^h&Y[ZV8GCi`R"FWA]#NFJe2^6T^U.'"=,cm-6Td2E'\]9.)\&?nT4+m)Z0HjX#oj%a@0g5\i0.J`Kh^L!>;U<=1/%qf9]Z;E-!`ENBR9jAf9;CqFpl4=mDd#^/CJ;/@0lRKAlIFX0GL9=U^1Cg]02[G'iM\6lE[f)djT9&7$[S5$V]GR#.j9rVdO+ZmDQE:Q+b>rBAIR[8*I1C9+VQ?,BUN+HEU&op&a,kM`37jIVfLj(Brj<7/OIj@JL&$o`>"9L(qae\?ECC@\GNE/K2QS4-3,Sk=/pCQmY9]SM7i@`Z&D\tc*)O>bIe?E:Kf2End6",1qh=F*f%o-/[m>+K&TS75XcQ$joiT9W&jCS,=m-KhtRcr;UI*9=[8P$VH7+<`'VrubW9]3j\IUt&BPZ:RVoM-H<\Zsg7%(`BL)E9P@gAh=m+YadD@G;bqj)1c;l<66u#jfM4!hI<"gcY:4e@d7:YDm9uk(1Id?Wu",eN$K)Oc$t_3^ZU8.q'"Lk-:lS"-sB*O<3"8FcVXXhgSg\k)]jb#GuKmE&ju8iud_51:>kbNbS[%,n0l>u.Ee!Jtj5+ga`eN56_q#/n3fn)$5C_1>0K7:ffo&S9iP%02T]_S5OXb]%52*Y-H3H&6$OBGTWmGnt&AS,iuMf0pH`^!f;r)Dt?d<,lC!IYbUj/K.^M2HH*?Za=\D]e+JZoF3\k?*!e<=Z,q%OE`d<&]lgMhs^\:2Y?"ZGec!m#G*BFpk#&:=/b'Z+1?cr88o:+oa=e$QG0pMEP96[#[#`U^:F7pa\_W^3>6YAoZEHo?U3'A!I*?Xf1O7`-S(9oR_>s#$kR!WP)I%X&0QY%WH?2FjE-[^d9UB7C^*,-f3o%A5;m]d4IHAD0i2VhWtim@'Z(Z8-7f9ADj)6@rA>WaJan=cHnWAgAoK>beVImd/eKa$oU.Orc!]&`5JZEh+&nVOPlq/jXXa+[.2@J29M[!TfN;O8Ha&QRab:tPt[?iLFdD3s=85@\-F;icW.-uA:A+8i(PS(!_+9;1mbf"!p8)"3;t_?qG7kh'WC;ag8=k(jU%8Gd.R[Uu=WV$j?K`^Q-ZIV%DdE7%3@XFCgpI!k0&qmW-t;2De$nLip*B:T;7Ai40E[j*5:fr0)-e*ft/-c@etp@(Ki@\h7[VYVYG'/=,8fT5lbcoMg7hELr``Z-I6,4*p"6to/YUTohE0QfJ6NGu`5TlK=k8TfSTqc8?*[d4>2o--P)Re*.,[@a1m[86"dQa:)lG[sX3`DmEU!oW3[IBTj;CdnoHNu'%H,tdP4G7@5FAS)"4//rX>]HUPlI4M!7q_:['DsckYJaBQ_B2/f9^-Z3a8lU0eDc0/!OmHp]V:C!'Wfm8ZU;L@6WG$!UOI#IWf&_?h*5$t8%!=);TM+Sl;)m?om[Pf:8PQN6-l..qPRtWoUhc.*MM\Pk"c2IV&ZoTpTF$^\srVAgcLgh,H7XBa3rX6R3=RH~> endstream endobj 71 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 595 842 ] /Resources 3 0 R /Contents 70 0 R /Annots 72 0 R >> endobj 72 0 obj [ 73 0 R 75 0 R ] endobj 73 0 obj << /Type /Annot /Subtype /Link /Rect [ 445.654 214.039 533.694 204.039 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 74 0 R /H /I >> endobj 75 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 203.039 156.1 193.039 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 74 0 R /H /I >> endobj 76 0 obj << /Length 1611 /Filter [ /ASCII85Decode /FlateDecode ] >> stream Gau0DlVH8+&HC$_iBpTK&m;jX^X@W8V0#NCJ-48H4$Qh-8>mOLGcIDo%7M2=FNdV$^!f4W%!>16%tc_X=]-bnJd^:K\/T*hM)q'MQ#pjR^R8'WK[g't6?fk'*SL<7\$J6mh;q;X*/@G*`E5r;nYORQAJ;c#mu0=e.S``*2ZM&`_e4Dh-lu+:dp\a:gf$G`Q!Ts=.LI9GsebOd9LBmBk4Y,NlsOkAW("DkG0u&D]&t?CKlf@&D,NkIEn!$9Im9;?ZQ!X`9``sjp7T(%AU8+$l9V!m<9[gF#>Y:hpbCk3P<[m]o*?cZf1@^6i1]0`MdPn$q>fUmkDm,+sCHl?q78/TD#9@:^"ZFgR$/r@"R?n@p]XD`(dcIT!'Qjn"-LL"Nf%[n-pZUj1d?CE!aS%(`q5V7R[<*#A^?*o^!$f!JV^EbVG=B*hhpju*Ui(_aiiK39_d6j8WAF&'?HNH'#AR4[`09\67l=NjkC)Nm>$!c%&,m\=J*VtBuCNC!"'hF&df=?i-2;519b>I0\\ZX>=":ud2%=&?4$?e-eYI*pg.[_[2/\80H)"lAkmoqObSpmCNH`G0'[l/ef&8cMn;.dqea)ZF]W58pmR1Y1X^&:q%\QMD49<=Bl9=I\rWW6$NITHU;)6Wm)JR4OgSPUSrX(,ndN'*#%Ar8KPYBl(`OXPVBk#qXhH>/^=jD>Xe6dNc$bM$b`?kkEDq/T$teq^$'7uQfi'JM.fMtUmt]!p''QN8UX4$pKkMgP!/;7EsX1k4%7a??#[IO@0`/P+G3FfNH6KSr-_>uG57f+:`Ut]g$J1LL5]d5>MK3I6_M3$J??Lbc;:IjNYpJ3I/T]`[(#qY9\"&i#;98Z]#]'d2Elk2PpPopR_pP\l$drCWIuX`/@oeEAGn8Hpo"*!VZ*n'Am>g3&iM,]F"A8VIkIjYK>.mKVe?=J*/)XG2qZTll`\I&T#(28^;7,N\f>i[*N%u6ML?taTYYF7",B_@=cQ..=%db"fmg2m:T+~> endstream endobj 77 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 595 842 ] /Resources 3 0 R /Contents 76 0 R /Annots 78 0 R >> endobj 78 0 obj [ 79 0 R ] endobj 79 0 obj << /Type /Annot /Subtype /Link /Rect [ 368.212 492.619 494.852 482.619 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 74 0 R /H /I >> endobj 80 0 obj << /Length 2160 /Filter [ /ASCII85Decode /FlateDecode ] >> stream Gau/ZbAu>qnF!L*%Br0daF,[kZ(\d3qD$Q=]fUB+#/5\;_q@8[6;S)Ec0FX>bE?I_C,bMY`%A[(.l9$%N/44u-;.Tpr,X]S=Pr&c/"h4#h:G1>72FDqsCiFq..A>B`6j3A'DUV@=cRFieNZ>ZAdiU2N;K&f)\lW+g@+:!NUbR0[eu_'C"V@h+HnFEB\HBBl5umF58[ZQD?s0QJ<"@P7ZR0!99A"ffjj:p16#MU*c6n$F9B<5050\CeV`t6erZg)Y#'_ol.:;:Kr$PK=&5U="?TIZeZ3?52eXX+^uNAbq5pD_C;(h:co(6TfJZa5uD^37[0&uA[?uLbD?lF`mL#AM$Jk/cp==..--C$#\^a\cRu%GVNdQe,CV0U;n':)-@6n`]D6ut.;D]MJO,YAP"+pJThaU9j78&->')hoa;(k-Q/rf2*t_A%H(F6D:(p%PGVUEaPfKldg8)<$A,='%$"\deFD=5"I[IT$8oW6fp<=sP7a`KK'%TEtP(Ft;mY=gm;'FqJL[/la]"2?P=3_+Fr1`Mc'F:-m^%8bj$f)uULfHBP%ZA#l,I'5a8McZI[qgY'$ShF(N_^K8T?lmTREkAjYTfW9S?+-[^F3SjU(\9\$<"h0FXZ&0=TraUor$q6E\%jIkZ_^En_pOCTTX62L\f$$[bO*)"?4hoBPuXSSV@H,s.B%9JVhG)FcAVJ`o4,!.f#=I^,)V$Yf=!1@k:@t:^:`I9ubO;maM/k?tA]=2&8(]-n_"gEb-s'$&:.aU:53i_ajmnkJrE;FHTF=c=VArA)o9b]8Lo*QfqK]qc6Ac<7SEf9_8m%%Md"-J#@mCTEE_,6)AiI[Ga$FOE&T,,N.DQ&@'iYkLkp#FjSi`m_XHT,LlW>UhM:1[`Nf@KtZb1Ll,dF.*S^=:V5HB[-9P/Z2J9IXDl<7\HVPu(LUACgGnTt%XGITf!t]!';rBcC.d+16Y=9p7-'AqV1`(kDiSZi=2Iqm(8I,i"HONLMpG^_8<"(XMq#`B]53)L`9ji^i=*m+pu-IAA8a-WJ$&Uo?PIk53^q(?!Y[eXc*?L5FF(HUXocOZ@1?fr'<`54lGPlhL$4Va:_/S<@5)KLQhaDb6I%knu8R&'1!f#l~> endstream endobj 81 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 595 842 ] /Resources 3 0 R /Contents 80 0 R /Annots 82 0 R >> endobj 82 0 obj [ 83 0 R ] endobj 83 0 obj << /Type /Annot /Subtype /Link /Rect [ 268.0 726.889 348.83 716.889 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 84 0 R /H /I >> endobj 85 0 obj << /Length 1848 /Filter [ /ASCII85Decode /FlateDecode ] >> stream GatlQfl#P(n3(,%'I]CM#pW?t'r1k6Zj"$+JR-cDgBCW_BSWN<\iOm0r=29=*6OH!)@OYYk<3T-UQ35N`hJOKHVp(lAXZ(6%F1Nl(@e6"^NVbabV+S)VjHhSd#gD!CeA0&q,5u,INsm+)J:=P7RTcm2V+VbN7G#7Z!ZU9Ve'5?\2Rrl/)$Fdsp]lVujp-(-Xu!A8=,i;p@5J\[W?/F'h8BGUMhDA,r]Dc_@je5J4JAkLT5EN9$8\p<>A^A#?)DkN13oX]/-^7!aI9&cjrN@X/GKr^X*+9F"@W\@2rd&M]o%F]=5rPg$T^Gup.>DZcVZ>a/5U5qbXo%lbFE5s>/U5QU]ed,5*GBQS]7+9`CZL)DS31LjM"7$3&HuNKZ.jP^0V;)rgblQfo-Qe6U'FSp%:KRmAD8`9'?W8sE,ibCTh[I%9;8Di^r_P]a+4D\]hUUo=qT9sI>4#fn3[2Mn`X_%?#++T5P__Z)Wf6gIn+R.,ki["BJdfdWT+dgq'>gFH-i&S:/gS1XR`@+>kf=)O]D:]Y`$@t-8@2*k3ROT]B6;kSWM4rH4>47&l!/-.#Va]aeYr`PH>`,#>Z^\937r$7SSLk?./l7\^5]\V8KCrUSok2XA/lqQK%&)X'eUW'(MZ5+%/t(?ikO8(HUe)T#5Tlr/K$?NqiP&35?\L\3[aM6`^;U,\2WXc3_`j:goAkPS9Wr,pJC`Nf<*GjX7#^a&,'/=:m_@Rj!`r&@UI0iLop^/)-&nZT8\EHYj>CPjiNY#Nt"4MRp=pIClnGSoe-=V1]9f\@k(@M!cj7iXap<=3YZ9]%,8\`PaShV*.L.gBBtkC1rA-XW7#)@@nE`KA=UDJU34l3j+G^D&`?C4^aq$SrEf14C>gN*$0Ub8DA>aP/_h'gf@nQ=Q\-pMJc3OkTE.RJ2GrPBQIlc0us*5Y^ppQ2XRg+Y.0Tmk00g"e/o.X]#)0`Z!F2Z]Go?PE60>([gqk@.?@jF9],41rkEH1]ir)me6Y0;1[?OgGD/I,~> endstream endobj 86 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 595 842 ] /Resources 3 0 R /Contents 85 0 R /Annots 87 0 R >> endobj 87 0 obj [ 88 0 R 89 0 R 91 0 R 93 0 R ] endobj 88 0 obj << /Type /Annot /Subtype /Link /Rect [ 268.0 727.889 394.64 717.889 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 74 0 R /H /I >> endobj 89 0 obj << /Type /Annot /Subtype /Link /Rect [ 268.0 716.889 334.38 706.889 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 90 0 R /H /I >> endobj 91 0 obj << /Type /Annot /Subtype /Link /Rect [ 444.512 673.889 533.942 663.889 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 92 0 R /H /I >> endobj 93 0 obj << /Type /Annot /Subtype /Link /Rect [ 268.0 662.889 373.67 652.889 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 92 0 R /H /I >> endobj 94 0 obj << /Length 2356 /Filter [ /ASCII85Decode /FlateDecode ] >> stream Gasarh/D(,%"HT1ECufp'pa?dNh9\6rB3:j7_L+9=2MnZ8^P:KtTKOi/J11]YS%&$p9-S.,&KuS%l/pD_##?&(d;#2VW.JO:6^n6%Lg!2CraPZ<.Z\#RZ2][*@2/CYif\fK.XrF&?ld7o_fHDbW9Ws!/fc^]ZY8a3)Z8/i').R5iena'N`'kiA2_!eCJGA\UKc'V2e.!SWb1F=%T?9oAV"BB*S7YG6Ka/`B3NW`$BhNSDBh0)5Is_)dBC%Eq,5/>ml]rDjm-F4U3*@:39j1PB(=R`%=L0;]-l:'Pm=[d?8WNFg80gK5XW0.NS0ZXNE\&u28Ie`'Gliu$Ldb.E*jqei7$/b(WM8"7MO+6@4B&pE>0*<:[2JFVC_dO7N$KHldB1,b6oMnF^iCtkHJ_7//)%(:Orf5ijIXc-;nk8mPshJd.SAeic)R3i@%/I"/%\Og@5"]Y/FDPdVm[]\`VkAta9_'5Wd_qKnR`i5^1NDh!&OfK_/O-YTsCV[Fen\OXk'l%P5I.P9kT?CF2m\#1lKh.>l6kH1-,V^89\lZ5lA_59DCE.m%HVCN&G7%-9LX_+d>77`N9Deib!r)\>:GU0\71TNWpm#;!8(/XOGjq3cqf"]5EF0&*p)(6>Hgi(EqZHNS0_Vf_N'@=KoU8N4J+Q[;TYHOjCCAq]"PJCAAKQ_Y.,pM%35KRYhl?,`c6fAsKB\B*D)r;5$tUVlWoe1W<1aLp8%-p-Ni!%;Q=V,n7*+U3Y[FKc\M0H9!VKI,+kRLa+23!cj;K,t5YYrMc^:lDE*74Vg)Vh!6fIaf3c\QF7&+s,aq`_b8B8>oLr#2l6B5*9k*p_*AZ;ngn%(B#Y'jlBms+#RlOH1oslZc#Dsk_P-[SfI[UX(V^k\-]odFmiDqEDQ:92If/;.+gtNX"0J.fgaSG]@S<8B8:R\&e"bKXR#Ao%$3!'EZj'mWtS'"\N!Eu5N61Q$Amg_.$8blGY1#b;<*Ed'0)O96+,Jdu(hYbRD$ip"XpU:MGt#6pp&[[A385PLCjib/+$ueXe6=\[c8@]AIl4\(uN5F?P,JpAN[f0ZWgsme@5L6G,nj=7F<=)+s^CL)ao26e`?W5ZNlKo=)'J$e#Z'$O&/`1AC'AT0TC'(G*``9Mj,+=!R,d:N+R08:Xf\((IHDBS&?kkhSZ>uneiQ`kDiJ;:k/tL2]LJIsZ)N^-C'A3lJ]&+.SBsca9_O1!PZgE9T]6gE6cD+72IO@5"Qak/n"ZQR)"<9#q@oXkF\.Kbj8*'JFE0q_jS2fJ'5fCmGZ,USnm!=[:3DPb./VZHD7i!km_(\^dd:9a6d-%")cc#jdS*ffIUuHdY$Cp6DWG&ajS\c,SKi&_Uu]G0d=O/3Z&"rF/#]D`H,;m_mS:O[GKkboPBIQHPO4[%_A"jI&%p%d5QWFOac.nr8@SYn\7I9GZj+B8u^.e,g*l:\P/q_r0cQ5YfrrLqD?1@~> endstream endobj 95 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 595 842 ] /Resources 3 0 R /Contents 94 0 R >> endobj 96 0 obj << /Length 1052 /Filter [ /ASCII85Decode /FlateDecode ] >> stream Gatm;9lHLd&A@sB:oagkC5;cEV4s:8UlcS';QF!7,WQE_SYBRO_)Q<2I2?D/fRQ[2q8/0Sc+GtW$_C#smZlsC"NZu`#0;',?jG@,G-Ffo-oh=rH-UNrgl-V$Vod-WX%m9mjMc?7j-auO9X"21N.@^HgfrV>i?EnN!_O4>2_fecr!3IZ$bn$tS,oL;H(=t*#^+Tc'Ze#D+B`i=KL^U\CW3E42BmgK^eYLl,R&HuX:Q(FK@k(LJlD14eGdtfqM8Cr!:S)W8*!PPj:o.X!BWS"B#'ns*mol_LcrH'lc1^0ah'@l]g16hN.(oo3f,p#EK>Z3R-sATE5fWY/qGUUoogA7=TUOq2tOqCG#bWAi';PKq2h!:j+/`&6ugM'HBi8b+6gYk]qXTl:nZkr^28U4>L8X,Q9gsonUmqXO]`Dg(M9gOAJBS)AXhHBPUs\!1\2%$2jI_!@ck+%*j[gQ3hGZ53mY]3cdM$RZ@m44Wmdf49oSmR)1pDACD=e"3pTXa4Apfo>bV(_mk$dS'&,TQRcJ*@(uUg@bXu6CD:Q?SP_MC%i3:Qq!L=BDpsKMK^I#L&ib7:Ap=rAlHtNU2//#O,cL8Kd+H94e%nu^?XhJEBtot4A](g7CWW,``Y7_j#2]ZLBl![8+r4l#>(#:6l=V-*8"K"ZdH>,Mc endstream endobj 97 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 595 842 ] /Resources 3 0 R /Contents 96 0 R >> endobj 98 0 obj << /Length 1272 /Filter [ /ASCII85Decode /FlateDecode ] >> stream GatU3hiHJN&:WfGLcB*;V.*osLD/qsm<7`nVnHkAbJQp'5(m=Td3^SjP&<;QO$B*ZfOb6=W8bd+r6=u\G\.@CX3p:IB0dKhenR:PXfis_g#<)cLu]oV&?rjp>%Q:"PKsM[YH0D.l48FQO/O;?H%rgRZZ/:kn_siGT#1UOGUAC>9/IdrNq83"cs1$G/d-_]J-Ljo^4/ab6us!N"+_7H-V9cfO0>XaDp,=2d\?R"m5X*:&uTjJkC.a5/.WfD[u-Gm+kC1)0?Hn>/gda8+WCJ"%_7#l\/U6fp]nBaR/>SfHC_]c8CYB?#h(tqTR)ZUri\hP4F7uI(mAonL_3"m,9!,RDsWQ`F5T"Z3q&*&@IP?IRa#[B)'nXsl=+I;(Mjm._HX*69&W1=klqmEpt#R1_b"0j*T9@!l05&f9ESb3>066Fj4k)k3sP.\rgoLr.&liF:AmAo.0UMoud\K6:`E1"eA,jHMppVK2'_9*"/nM0Z'+>RQ=>7t,XdI,4@GE<2O>I%?'aaUoOFFc6H2%7EMZ;"5s5;Jd/2%VhVW,V-UbYDH7-l!9d5c$O$T%(ZkmE2?&Hr*kKMdfk3-PhR55Oc#ri[S:O]/S/(]rJpIW>7kP*Rqt2iZD((>nS[40?ZBjchu/q8b.iHJF[MBG!*kj^0e6RS&281UA^8!']M[FLk&/K/8aT[nJF5Ce*VqVhuEOt^\[Hf^,IbXGp$oLIU\fB*6mZU/A>OdN`!j;+LGu)=d(C_P_mu#W0hCJF)/gR,$Ci9jPY4)G\QT2libG`VM\0"hkN$]Qs44An],D=qO,"Ogh@,A!2e5jP)%CaM%T#/\iF#[r*;#Po^Ps""fllAJ_IVOL<[OG@>P%;P5MB7URX,H./PGb;e<)1>3FnEeTd9_X^dZ.1bU^F;5r,U`+aV0k(@NsS75L/X#(V3(0>-h@ll/!;M5J8YqZNcag+KaD*:&GehQU4AoV)Gf?3N[^\Wj:I>[_:OOImu8R<`KZ]i%^W\J'a;R5H_OIaD4API@Q*?l4SrK/pnfB6:H79W'bI/4rH9^NO*<)s09(m_5M\,$VErO5.SpE6hJO^Ec)9E#@_eCor^*o3p)hjORb"!gVHlQ&CY">:+^!S.B(CL$674*Be>G=_p>dHer]_r@&B7Q3~> endstream endobj 99 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 595 842 ] /Resources 3 0 R /Contents 98 0 R >> endobj 100 0 obj << /Length 2921 /Filter [ /ASCII85Decode /FlateDecode ] >> stream Gatm=D/\/g')nJ0@4\WRMQ:;]ZM]k[Ju!7pgKr;$)Xd]RQNKk'[&$5-[A&nPrG]OML?-Dq.T3i)?7fSY\?UdZ6*E5D/(pp2#:uB1p?7Rl$n8ASZBAS$[%Gid/C&:]mkQ+FJ$C2;i+JZ>I^@"MRV^Co0)WJsTU`aI%r8Xh\a/94_Z\Z*E\#QDHtMG\l#L4C,NR<-i6DiB[-G,PB0lH_QCGW9%:/Xk*aK]4O;todsa4,S^K,1MYLshW^Nj1Uh@ZTV&BDiC+-0/`R7F`5`h[`8K&u4<`6[lrf:H0;r`@!7$_%c`GOArKkCG(8/0!S_t3OG`E(E_lEY=hZh@BFb@S];Sql:K$^HJs@3n9O'LZ4AF_0[BM!H)-$)3jC27-n"Ua9R'T1.UM5uK8k("IpWq;LE$Y78+j%RMIHnSC#BpI3)B]eUa(=S.Q21](tpk8H#sEcQ9@qm^9]&.[3TgrGlR]#Yj>?Eo$WDef/%D3''JKdCp[[tO/l7@rssCH'mH4fG8u0B315*a-5ElXJ]dqaSW(,qtbhc;USDd8VTL/+Nfhs.o=QuK>R.9[EJD\nT_(n@`o:Ymk*CU%snkkK/]/\nYc8?NheJ6q4Yl*)hq&MU*tgJjHMAW8Tb+jmbofD/kL$$K>Z8N'=C9SoWF&!GJ>>KZcRtlHcB0#f>f#PhInaRP1^Cil*G]72h2MC$-&\s37"D"eMbgk%HFmZ[TRQAQHMLU3ZRhRC:0#'gu/N+=K(6RcYNZ"7(bQ*B-VQHCX4rML#MCcFLif_YrC#0cbAa>"M#V)GD7$;N'*fA4h%=\j2pE_I*ZA0"`ZJ=t"Oi`3qICYp^TOKEd8l%<-U"A,80Z#opBHA_e.RC+.jAicA14h*CX`FGDTs<`C64;!qp[8\t_Y4>lQ??&\&o1VPJ\UJU::buIdS1XdmXXbN6Y4-+j;lZ!1,'$OH3KNW%XYR(Z@\7:]l.2Vl+Qd/\q;LZIia9C0K3nNNHN:@p'2;ajWU-9W10o23lB%krYCn($R\FMo115jqn1.;Zs;Th8+E)>&dk+UOMl4O@(po$!@WE`l(;N+9nS,m/#eo=]Vgq5Zcn2F4.*db(/)8[,d.acFFQI/@>e1;,]pq$/QN\V527D6'a8c:($,_YOiD&E[rnZq?$hI`#F`AF`r!Q:Ft=EbEBUj)buj+i;(XG/]@2@!X^2?\b\qCT,&0iN+k/i'aE:\s1L;P5paE-1X/lI13hI>Mh2II);X@fbA"""<)/Y^q,Ze&\jkPm#M!%!S/U=9&23Kp!7h8jh?,WiD0$UJ[P$:Yq%05<14YeL3%P4p'9P@#2Ba0*^,F00>50YS^TnPu^_-GB`5,,SQ$$o4eE8rWXZ+W7P3mBe?0V[u3bj#m$F0XkoHIL6%qqB*^qKi(r/`IsYpn#n31qg]@>EWS":HDYBeZr2JAs-*r;*jV0*`'o;\T#\\*pXQh?Dri:ejFVq.J`EiT\4r)V.`37[aIgK?1tsq$L-*!RZi'flggB9PB)W'C_K-8SWQ]&b;+GPcuP%708[u7[plZLT0DY0S"H^mRjU-;9Bec)QJ-OHK!-5#q7Y(("F,.6>KFoFQ?t'rk:u$f02BeT\&0uKQY\^0irXfqZ?jK#gH*`Ng8"`&ThM-mAm)U,k+lHbLYkpCIodrB@7rm-.paSL<+IH$,q%g"#o)G-5Mq-n+>Tbi:6.>.=P`1[_X?$j--D,;C[GpF\Vd[CnGmqjQ>QF:CX]6l>9d.35:4pC6*X)Fr2hBi`J+,IE>(&\Jg=&74]Ij.ImUZ//rp%-N&$]gt47i:.[@[\C%nk@(\a]TK/T$!rlXSu:>QVOZm"%1rRR^i0l?:D7cWNG$85I`>/+S%20Mt#WiMLT]@PA`Ae4DuQ1F$IR5%i2g$6*-8$?ipu),[C.b1*[lB4D#.r>u9!R\enD3Z7j2mj(UScm2q>1PkSG-SEIuFT.`BkC(>Ci_@Q`]WCM(.nEWT.)rCPZnr8@<>^j2q\@VUs]Ck*PP_6/(IK&WW]:XRUih4KV_=-NYGk7R&@cG53A2&Q['?hYn6Sp4e?utguK3-7AU_ErQD__i2,iROJI1#?n+s&mdG*rG`1@28W5 endstream endobj 101 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 595 842 ] /Resources 3 0 R /Contents 100 0 R /Annots 102 0 R >> endobj 102 0 obj [ 103 0 R 104 0 R 105 0 R 106 0 R 107 0 R 108 0 R 109 0 R 110 0 R 111 0 R ] endobj 103 0 obj << /Type /Annot /Subtype /Link /Rect [ 291.714 427.889 358.094 417.889 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 90 0 R /H /I >> endobj 104 0 obj << /Type /Annot /Subtype /Link /Rect [ 341.84 308.389 527.67 298.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A << /URI (https://cle.sk/repos/pub/cpan/Pod-2-DocBook/) /S /URI >> /H /I >> endobj 105 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 297.389 303.88 287.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A << /URI (http://www.ohloh.net/projects/pod-2-docbook) /S /URI >> /H /I >> endobj 106 0 obj << /Type /Annot /Subtype /Link /Rect [ 263.54 265.389 364.65 255.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A << /URI (http://www.docbook.org/) /S /URI >> /H /I >> endobj 107 0 obj << /Type /Annot /Subtype /Link /Rect [ 393.785 265.389 539.345 255.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A << /URI (http://www.sagehill.net/docbookxsl/) /S /URI >> /H /I >> endobj 108 0 obj << /Type /Annot /Subtype /Link /Rect [ 568.48 265.389 579.59 255.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A << /URI (http://developers.cogentrts.com/cogent/prepdoc/pd-axfrequentlyuseddocbooktags.html) /S /URI >> /H /I >> endobj 109 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 254.389 459.12 244.389 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A << /URI (http://developers.cogentrts.com/cogent/prepdoc/pd-axfrequentlyuseddocbooktags.html) /S /URI >> /H /I >> endobj 110 0 obj << /Type /Annot /Subtype /Link /Rect [ 686.038 155.889 700.478 145.889 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A << /URI (http://search.cpan.org/~nandu/Pod-DocBook-1.2/) /S /URI >> /H /I >> endobj 111 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 144.889 310.11 134.889 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A << /URI (http://search.cpan.org/~nandu/Pod-DocBook-1.2/) /S /URI >> /H /I >> endobj 112 0 obj << /Length 1430 /Filter [ /ASCII85Decode /FlateDecode ] >> stream Gat=+968iG&AII3E2JEE1DN=;_2$K_&jMP!;Thh2*'1>71^R>Z."VIC43mK=G:?,g#YA"OiJ"n^[i]dufNk(D#G\cPnQb-9dqmr'pB/`]iUIlu2p-YZjKcjp/t=RbB;0^8q>FP=4%%5\cUZW1l#0`Fa(;j3iaa+V[Ieh!I!ttb5njhL-"?E-YqpHumqk\V*MNrOb4jmCcaL9=RoO!ooiL$'oU^"/U+nh[%LH&?m0=(8^d9GUT!Q&9/JK%F9)bf1`JC,,g8Ru/,g&t8@[kX*k^pTP%Uc9+2SIj\IPR%=)Kt[epX_aE&E-hVsVI8GKYh%>!c.0ch5i7s3P:R&i9LN?d$4m\QGgSid5=FH&NhmZ`spZea;4iG8B+L?TJoIpkRYfHma;WUKtbR"-Rq7WTG8jkCLN`_+T"S\dbT`U2j-)n5+q1lb.h(])FTQnr/p8.CAu/W/Di]hClqY$MT'[C1i:DsB=[,AaBf\6kHF&Y'XI0'?Z_.Yn876$eU?"8%aCq/lE3rFSfGoUl0BnH(!dmfab'>^G!WNE)7YP<_UG0*FaTRKWT4;Ad99Cfp'f9->/r'Dl/lQj5)<5.-TOE]`/Ut(r8>^KdLZkDN^DR0qpAtJY/ef`Bm55A:,#1&M#Hj6>>Q$=rrVbjJg.:MFpcl3H*2l`b6SOZm?stL7\e#E8$n:M1G=fLSQ1R'*[@mY@H<"`Dn6i%f0Ue&]o3b2Yo2u$j]]DP\E(VmQ=Kl^b5>[J("RCP$pg;?2^1CF_'^Tk*pX>.&_H\+K/q]R1j"UfVdUMDD_5tC%Eii/n5jta+!]J)sG0Rc4Dn:jODf13*6h.0dA7GN(5kCUba:U+0qkWbaP?+_b2VVc[>E;MFR[!BD/Fd`U8I endstream endobj 113 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 595 842 ] /Resources 3 0 R /Contents 112 0 R /Annots 114 0 R >> endobj 114 0 obj [ 115 0 R 116 0 R ] endobj 115 0 obj << /Type /Annot /Subtype /Link /Rect [ 549.914 505.751 561.024 495.751 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A << /URI (http://www.docbook.org/) /S /URI >> /H /I >> endobj 116 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 494.751 213.33 484.751 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A << /URI (http://www.docbook.org/) /S /URI >> /H /I >> endobj 117 0 obj << /Length 1460 /Filter [ /ASCII85Decode /FlateDecode ] >> stream Gat=+h/D%+&:aF]+^cr00JO45STMi>O0p">3_RtXUYDh/S#`=[]k^GKl'rOB,`aHR=U-Uj[DYO0tn\,HYhITnaAdjfVp9=4;R**,=Tkd4"]p3QKP"keCEuI%F_a+58'\\[j>2)N06de*SWs633(Ru&LgpA)drndDbI=,0tp/A20IRP]o;+7CnDH*,u"l&Bf2(]*4Ti8>[,0HO]>+Y0p;paEffVP>,[c06.5`C,2ZuUEKK5EntoR=3[]!1\3BIH?0diJ]KZE?7QAiX&)-LT'TR!OYZj**cXF;FY5mem%(aYcaGC*+@\?P81&abFFa&4W/UK%nBo^pM7&`l`DA3Ra^6sLl*bS-X)YsddkYI.oOX#H[r?&X3K4]O4u_CjF76Yp%AU$,Tmc-8@nqk$8Vt;Gr^-qq4,c+Lr*!?\XN^nF&T,Ib=-RgM*X("Z!nElk.YmUn5uR:]/Thp*%MKg6=(b'/p>%(g\62FRLTj?5YfW]Q#:kB:T/^]^]5eA4gcZ?JlgJDPW-jGrb\O6\^--.ULEh3).F2[R'kWSmJ-4"EO>6)L6T6i\DXk@B$lrV6@#EK%\J2%D(9ic51!TLq_]`39qHF!a78/:[WAA%kH>X8@_CR1Q`imZ@L[Q8'f0=?qY@?Qd7Tm?>0GRn99I2ucnhD>UPY"=ebFhGKb!hkHnbnd9,E4jc>jbD?5C@H7h&V%L.;N.+]?p!CbZU[sF2O^+.14F4S^\iQE6%h;t*>OITd'>4mX=07VLa,E@U?f(A[&S+VA:X9YVQ9CR*2_1i+JEjK2I]Xei@F^l;G9.BY@-CQ/*$=InA5jjh"VAkNA!MFSt6`m7FF=&8rFJdjTW(N\R'rRVBh;@^5J^+8j1]Je?e%/*u!]\,6=X0Z,4>@X3'3EaS1#QZ`jXh^VMIlHZ_Rl5`ZaQr4`$X.eJs2G-cdhoi#"Qc)0%[u3'3UL33_O1qSX+,MPQ9+F0mgD+rp@0#hgbtFYeCkV31ZYf#\Uh,*]BZd'!/Gj.g]~> endstream endobj 118 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 595 842 ] /Resources 3 0 R /Contents 117 0 R >> endobj 119 0 obj << /Length 432 /Filter [ /ASCII85Decode /FlateDecode ] >> stream Gas1[bAP0N&A7ljp)"9Br-!+WZr27%8s+FuH3dn$.Z&_0s0)#:+]2J>ZFeuHR9=m!OSOe7/hr4d,^Vl:5T!=I(`88IN/1=;%7q&%_:(,%=8"\-O;igl6t6[W`,WLPgL=Eugh^,)XsdrP"j'tA8^Z$tpCfS;0c$X_.p[&]P75tG!`,DSj3k':]5],I-D4j,_/,Y=m^3m>2=lG5k/C3E^7TVh45LI@JC.^9,!sgo?a#ce;fGoI"RB"?W_uR&3phZ4l*e(V(0+PAW8j8hAYu*c],-+rkCd)rIm)NX2Z[^fW+(Vs[Q0bjjrB\I]TYe4R[%CISElW\n%F55O7ZUd`ShoR/P*i#jW,%iiS^\U6bKZk]Q;%Zej'E]c/3:F7oZ1<@ZXP32[Ur_\6@Oo/gehHUA1LiQg9??s/VARg$Op$JbfVo$`[5~> endstream endobj 120 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 595 842 ] /Resources 3 0 R /Contents 119 0 R >> endobj 123 0 obj << /Title (\376\377\0\120\0\157\0\144\0\72\0\72\0\62\0\72\0\72\0\104\0\157\0\143\0\102\0\157\0\157\0\153) /Parent 121 0 R /Next 125 0 R /A 122 0 R >> endobj 125 0 obj << /Title (\376\377\0\124\0\141\0\142\0\154\0\145\0\40\0\157\0\146\0\40\0\103\0\157\0\156\0\164\0\145\0\156\0\164\0\163) /Parent 121 0 R /Prev 123 0 R /Next 126 0 R /A 124 0 R >> endobj 126 0 obj << /Title (\376\377\0\103\0\150\0\141\0\160\0\164\0\145\0\162\0\240\0\61\0\56\0\240\0\111\0\156\0\164\0\162\0\157\0\144\0\165\0\143\0\164\0\151\0\157\0\156) /Parent 121 0 R /First 127 0 R /Last 127 0 R /Prev 125 0 R /Next 128 0 R /Count -1 /A 15 0 R >> endobj 127 0 obj << /Title (\376\377\0\117\0\166\0\145\0\162\0\166\0\151\0\145\0\167) /Parent 126 0 R /A 17 0 R >> endobj 128 0 obj << /Title (\376\377\0\103\0\150\0\141\0\160\0\164\0\145\0\162\0\240\0\62\0\56\0\240\0\125\0\163\0\141\0\147\0\145) /Parent 121 0 R /First 129 0 R /Last 130 0 R /Prev 126 0 R /Next 131 0 R /Count -2 /A 19 0 R >> endobj 129 0 obj << /Title (\376\377\0\111\0\156\0\163\0\164\0\141\0\154\0\141\0\164\0\151\0\157\0\156) /Parent 128 0 R /Next 130 0 R /A 21 0 R >> endobj 130 0 obj << /Title (\376\377\0\104\0\157\0\143\0\102\0\157\0\157\0\153\0\40\0\161\0\165\0\151\0\143\0\153\0\40\0\163\0\164\0\141\0\162\0\164\0\40\0\147\0\165\0\151\0\144\0\145) /Parent 128 0 R /Prev 129 0 R /A 23 0 R >> endobj 131 0 obj << /Title (\376\377\0\103\0\150\0\141\0\160\0\164\0\145\0\162\0\240\0\63\0\56\0\240\0\104\0\145\0\166\0\145\0\154\0\157\0\160\0\145\0\162\0\163\0\40\0\144\0\157\0\143\0\165\0\155\0\145\0\156\0\164\0\141\0\164\0\151\0\157\0\156\0\40\0\163\0\145\0\143\0\164\0\151\0\157\0\156) /Parent 121 0 R /First 132 0 R /Last 132 0 R /Prev 128 0 R /Next 195 0 R /Count -36 /A 25 0 R >> endobj 132 0 obj << /Title (\376\377\0\117\0\166\0\145\0\162\0\166\0\151\0\145\0\167) /Parent 131 0 R /First 133 0 R /Last 178 0 R /Count -35 /A 27 0 R >> endobj 133 0 obj << /Title (\376\377\0\115\0\157\0\144\0\165\0\154\0\145\0\163) /Parent 132 0 R /First 135 0 R /Last 135 0 R /Next 178 0 R /Count -25 /A 29 0 R >> endobj 135 0 obj << /Title (\376\377\0\120\0\157\0\144\0\55\0\62\0\55\0\104\0\157\0\143\0\102\0\157\0\157\0\153\0\40\0\120\0\117\0\104) /Parent 133 0 R /First 137 0 R /Last 177 0 R /Count -24 /A 134 0 R >> endobj 137 0 obj << /Title (\376\377\0\116\0\101\0\115\0\105) /Parent 135 0 R /Next 139 0 R /A 136 0 R >> endobj 139 0 obj << /Title (\376\377\0\123\0\131\0\116\0\117\0\120\0\123\0\111\0\123) /Parent 135 0 R /Prev 137 0 R /Next 141 0 R /A 138 0 R >> endobj 141 0 obj << /Title (\376\377\0\104\0\105\0\123\0\103\0\122\0\111\0\120\0\124\0\111\0\117\0\116) /Parent 135 0 R /Prev 139 0 R /Next 143 0 R /A 140 0 R >> endobj 143 0 obj << /Title (\376\377\0\115\0\105\0\124\0\110\0\117\0\104\0\123) /Parent 135 0 R /First 145 0 R /Last 159 0 R /Prev 141 0 R /Next 161 0 R /Count -8 /A 142 0 R >> endobj 145 0 obj << /Title (\376\377\0\151\0\156\0\151\0\164\0\151\0\141\0\154\0\151\0\172\0\145\0\50\0\51) /Parent 143 0 R /Next 147 0 R /A 144 0 R >> endobj 147 0 obj << /Title (\376\377\0\142\0\145\0\147\0\151\0\156\0\137\0\160\0\157\0\144\0\50\0\51) /Parent 143 0 R /Prev 145 0 R /Next 149 0 R /A 146 0 R >> endobj 149 0 obj << /Title (\376\377\0\145\0\156\0\144\0\137\0\160\0\157\0\144\0\50\0\51) /Parent 143 0 R /Prev 147 0 R /Next 151 0 R /A 148 0 R >> endobj 151 0 obj << /Title (\376\377\0\143\0\157\0\155\0\155\0\141\0\156\0\163\0\50\0\44\0\143\0\157\0\155\0\155\0\141\0\156\0\144\0\54\0\40\0\44\0\160\0\141\0\162\0\141\0\147\0\162\0\141\0\160\0\150\0\54\0\40\0\44\0\154\0\151\0\156\0\145\0\137\0\156\0\165\0\155\0\51) /Parent 143 0 R /Prev 149 0 R /Next 153 0 R /A 150 0 R >> endobj 153 0 obj << /Title (\376\377\0\164\0\145\0\170\0\164\0\142\0\154\0\157\0\143\0\153\0\40\0\50\0\44\0\160\0\141\0\162\0\141\0\147\0\162\0\141\0\160\0\150\0\54\0\40\0\44\0\154\0\151\0\156\0\145\0\137\0\156\0\165\0\155\0\51) /Parent 143 0 R /Prev 151 0 R /Next 155 0 R /A 152 0 R >> endobj 155 0 obj << /Title (\376\377\0\166\0\145\0\162\0\142\0\141\0\164\0\151\0\155\0\50\0\44\0\160\0\141\0\162\0\141\0\147\0\162\0\141\0\160\0\150\0\54\0\40\0\44\0\154\0\151\0\156\0\145\0\137\0\156\0\165\0\155\0\51) /Parent 143 0 R /Prev 153 0 R /Next 157 0 R /A 154 0 R >> endobj 157 0 obj << /Title (\376\377\0\151\0\156\0\164\0\145\0\162\0\151\0\157\0\162\0\137\0\163\0\145\0\161\0\165\0\145\0\156\0\143\0\145\0\50\0\44\0\143\0\157\0\155\0\155\0\141\0\156\0\144\0\54\0\40\0\44\0\141\0\162\0\147\0\165\0\155\0\145\0\156\0\164\0\54\0\40\0\44\0\163\0\145\0\161\0\51) /Parent 143 0 R /Prev 155 0 R /Next 159 0 R /A 156 0 R >> endobj 159 0 obj << /Title (\376\377\0\145\0\162\0\162\0\157\0\162\0\137\0\155\0\163\0\147) /Parent 143 0 R /Prev 157 0 R /A 158 0 R >> endobj 161 0 obj << /Title (\376\377\0\120\0\117\0\104\0\40\0\124\0\117\0\40\0\104\0\117\0\103\0\102\0\117\0\117\0\113\0\40\0\124\0\122\0\101\0\116\0\123\0\114\0\101\0\124\0\111\0\117\0\116) /Parent 135 0 R /First 162 0 R /Last 170 0 R /Prev 143 0 R /Next 171 0 R /Count -7 /A 160 0 R >> endobj 162 0 obj << /Title (\376\377\0\104\0\157\0\143\0\165\0\155\0\145\0\156\0\164\0\40\0\124\0\171\0\160\0\145\0\163) /Parent 161 0 R /Next 163 0 R /A 62 0 R >> endobj 163 0 obj << /Title (\376\377\0\117\0\162\0\144\0\151\0\156\0\141\0\162\0\171\0\40\0\120\0\141\0\162\0\141\0\147\0\162\0\141\0\160\0\150\0\163) /Parent 161 0 R /Prev 162 0 R /Next 165 0 R /A 64 0 R >> endobj 165 0 obj << /Title (\376\377\0\126\0\145\0\162\0\142\0\141\0\164\0\151\0\155\0\40\0\120\0\141\0\162\0\141\0\147\0\162\0\141\0\160\0\150\0\163) /Parent 161 0 R /Prev 163 0 R /Next 167 0 R /A 164 0 R >> endobj 167 0 obj << /Title (\376\377\0\103\0\157\0\155\0\155\0\141\0\156\0\144\0\40\0\120\0\141\0\162\0\141\0\147\0\162\0\141\0\160\0\150\0\163) /Parent 161 0 R /First 168 0 R /Last 169 0 R /Prev 165 0 R /Next 170 0 R /Count -2 /A 166 0 R >> endobj 168 0 obj << /Title (\376\377\0\105\0\155\0\142\0\145\0\144\0\144\0\145\0\144\0\40\0\104\0\157\0\143\0\102\0\157\0\157\0\153\0\40\0\115\0\141\0\162\0\153\0\165\0\160) /Parent 167 0 R /Next 169 0 R /A 74 0 R >> endobj 169 0 obj << /Title (\376\377\0\123\0\151\0\155\0\160\0\154\0\145\0\40\0\124\0\141\0\142\0\154\0\145\0\163) /Parent 167 0 R /Prev 168 0 R /A 90 0 R >> endobj 170 0 obj << /Title (\376\377\0\106\0\157\0\162\0\155\0\141\0\164\0\164\0\151\0\156\0\147\0\40\0\103\0\157\0\144\0\145\0\163) /Parent 161 0 R /Prev 167 0 R /A 84 0 R >> endobj 171 0 obj << /Title (\376\377\0\104\0\111\0\101\0\107\0\116\0\117\0\123\0\124\0\111\0\103\0\123) /Parent 135 0 R /Prev 161 0 R /Next 173 0 R /A 69 0 R >> endobj 173 0 obj << /Title (\376\377\0\123\0\105\0\105\0\40\0\101\0\114\0\123\0\117) /Parent 135 0 R /Prev 171 0 R /Next 175 0 R /A 172 0 R >> endobj 175 0 obj << /Title (\376\377\0\101\0\125\0\124\0\110\0\117\0\122) /Parent 135 0 R /Prev 173 0 R /Next 177 0 R /A 174 0 R >> endobj 177 0 obj << /Title (\376\377\0\103\0\117\0\120\0\131\0\122\0\111\0\107\0\110\0\124) /Parent 135 0 R /Prev 175 0 R /A 176 0 R >> endobj 178 0 obj << /Title (\376\377\0\123\0\143\0\162\0\151\0\160\0\164\0\163) /Parent 132 0 R /First 180 0 R /Last 180 0 R /Prev 133 0 R /Count -8 /A 31 0 R >> endobj 180 0 obj << /Title (\376\377\0\160\0\157\0\144\0\62\0\144\0\157\0\143\0\142\0\157\0\157\0\153\0\40\0\163\0\143\0\162\0\151\0\160\0\164) /Parent 178 0 R /First 182 0 R /Last 194 0 R /Count -7 /A 179 0 R >> endobj 182 0 obj << /Title (\376\377\0\116\0\101\0\115\0\105) /Parent 180 0 R /Next 184 0 R /A 181 0 R >> endobj 184 0 obj << /Title (\376\377\0\123\0\131\0\116\0\117\0\120\0\123\0\111\0\123) /Parent 180 0 R /Prev 182 0 R /Next 186 0 R /A 183 0 R >> endobj 186 0 obj << /Title (\376\377\0\104\0\105\0\123\0\103\0\122\0\111\0\120\0\124\0\111\0\117\0\116) /Parent 180 0 R /Prev 184 0 R /Next 188 0 R /A 185 0 R >> endobj 188 0 obj << /Title (\376\377\0\117\0\120\0\124\0\111\0\117\0\116\0\123\0\40\0\101\0\116\0\104\0\40\0\101\0\122\0\107\0\125\0\115\0\105\0\116\0\124\0\123) /Parent 180 0 R /Prev 186 0 R /Next 190 0 R /A 187 0 R >> endobj 190 0 obj << /Title (\376\377\0\123\0\105\0\105\0\40\0\101\0\114\0\123\0\117) /Parent 180 0 R /Prev 188 0 R /Next 192 0 R /A 189 0 R >> endobj 192 0 obj << /Title (\376\377\0\101\0\125\0\124\0\110\0\117\0\122) /Parent 180 0 R /Prev 190 0 R /Next 194 0 R /A 191 0 R >> endobj 194 0 obj << /Title (\376\377\0\103\0\117\0\120\0\131\0\122\0\111\0\107\0\110\0\124) /Parent 180 0 R /Prev 192 0 R /A 193 0 R >> endobj 195 0 obj << /Title (\376\377\0\103\0\150\0\141\0\160\0\164\0\145\0\162\0\240\0\64\0\56\0\240\0\117\0\160\0\145\0\156\0\40\0\161\0\165\0\145\0\163\0\164\0\151\0\157\0\156\0\163) /Parent 121 0 R /First 196 0 R /Last 196 0 R /Prev 131 0 R /Count -1 /A 33 0 R >> endobj 196 0 obj << /Title (\376\377\0\163\0\157\0\155\0\145\0\40\0\164\0\145\0\162\0\155\0\163\0\40\0\165\0\163\0\145\0\144\0\40\0\151\0\156\0\40\0\164\0\150\0\151\0\163\0\40\0\142\0\157\0\157\0\153) /Parent 195 0 R /A 35 0 R >> endobj 197 0 obj << /Type /Font /Subtype /Type1 /Name /F3 /BaseFont /Helvetica-Bold /Encoding /WinAnsiEncoding >> endobj 198 0 obj << /Type /Font /Subtype /Type1 /Name /F5 /BaseFont /Times-Roman /Encoding /WinAnsiEncoding >> endobj 199 0 obj << /Type /Font /Subtype /Type1 /Name /F6 /BaseFont /Times-Italic /Encoding /WinAnsiEncoding >> endobj 200 0 obj << /Type /Font /Subtype /Type1 /Name /F1 /BaseFont /Helvetica /Encoding /WinAnsiEncoding >> endobj 201 0 obj << /Type /Font /Subtype /Type1 /Name /F9 /BaseFont /Courier /Encoding /WinAnsiEncoding >> endobj 202 0 obj << /Type /Font /Subtype /Type1 /Name /F7 /BaseFont /Times-Bold /Encoding /WinAnsiEncoding >> endobj 1 0 obj << /Type /Pages /Count 19 /Kids [6 0 R 8 0 R 10 0 R 12 0 R 39 0 R 48 0 R 58 0 R 66 0 R 71 0 R 77 0 R 81 0 R 86 0 R 95 0 R 97 0 R 99 0 R 101 0 R 113 0 R 118 0 R 120 0 R ] >> endobj 2 0 obj << /Type /Catalog /Pages 1 0 R /Outlines 121 0 R /PageMode /UseOutlines /Names << /Dests << /Names [ (chapter-intro) [ 39 0 R /XYZ 115.0 774.889 null ] (chapter-usage) [ 48 0 R /XYZ 115.0 774.889 null ] (chapter-dev) [ 58 0 R /XYZ 115.0 774.889 null ] (chapter-appendix-a) [ 120 0 R /XYZ 115.0 774.889 null ] (id2520858) [ 10 0 R /XYZ 115.0 774.889 null ] ] >> >> >> endobj 3 0 obj << /Font << /F3 197 0 R /F5 198 0 R /F1 200 0 R /F6 199 0 R /F9 201 0 R /F7 202 0 R >> /ProcSet [ /PDF /ImageC /Text ] /XObject <> >> endobj 15 0 obj << /S /GoTo /D [39 0 R /XYZ 115.0 774.889 null] >> endobj 17 0 obj << /S /GoTo /D [39 0 R /XYZ 115.0 736.898 null] >> endobj 19 0 obj << /S /GoTo /D [48 0 R /XYZ 115.0 774.889 null] >> endobj 21 0 obj << /S /GoTo /D [48 0 R /XYZ 115.0 736.898 null] >> endobj 23 0 obj << /S /GoTo /D [48 0 R /XYZ 115.0 660.572 null] >> endobj 25 0 obj << /S /GoTo /D [58 0 R /XYZ 115.0 774.889 null] >> endobj 27 0 obj << /S /GoTo /D [58 0 R /XYZ 115.0 708.907 null] >> endobj 29 0 obj << /S /GoTo /D [58 0 R /XYZ 115.0 632.581 null] >> endobj 31 0 obj << /S /GoTo /D [113 0 R /XYZ 115.0 700.889 null] >> endobj 33 0 obj << /S /GoTo /D [120 0 R /XYZ 115.0 774.889 null] >> endobj 35 0 obj << /S /GoTo /D [120 0 R /XYZ 115.0 736.898 null] >> endobj 62 0 obj << /S /GoTo /D [66 0 R /XYZ 115.0 186.029 null] >> endobj 64 0 obj << /S /GoTo /D [71 0 R /XYZ 115.0 665.889 null] >> endobj 69 0 obj << /S /GoTo /D [99 0 R /XYZ 115.0 172.289 null] >> endobj 74 0 obj << /S /GoTo /D [86 0 R /XYZ 115.0 647.889 null] >> endobj 84 0 obj << /S /GoTo /D [97 0 R /XYZ 115.0 547.829 null] >> endobj 90 0 obj << /S /GoTo /D [95 0 R /XYZ 115.0 666.149 null] >> endobj 92 0 obj << /S /GoTo /D [101 0 R /XYZ 115.0 744.889 null] >> endobj 121 0 obj << /First 123 0 R /Last 195 0 R >> endobj 122 0 obj << /S /GoTo /D [10 0 R /XYZ 115.0 774.889 null] >> endobj 124 0 obj << /S /GoTo /D [12 0 R /XYZ 115.0 764.889 null] >> endobj 134 0 obj << /S /GoTo /D [58 0 R /XYZ 115.0 603.142 null] >> endobj 136 0 obj << /S /GoTo /D [58 0 R /XYZ 115.0 576.943 null] >> endobj 138 0 obj << /S /GoTo /D [58 0 R /XYZ 115.0 532.443 null] >> endobj 140 0 obj << /S /GoTo /D [58 0 R /XYZ 115.0 419.923 null] >> endobj 142 0 obj << /S /GoTo /D [66 0 R /XYZ 115.0 774.889 null] >> endobj 144 0 obj << /S /GoTo /D [66 0 R /XYZ 115.0 721.529 null] >> endobj 146 0 obj << /S /GoTo /D [66 0 R /XYZ 115.0 679.279 null] >> endobj 148 0 obj << /S /GoTo /D [66 0 R /XYZ 115.0 637.029 null] >> endobj 150 0 obj << /S /GoTo /D [66 0 R /XYZ 115.0 594.779 null] >> endobj 152 0 obj << /S /GoTo /D [66 0 R /XYZ 115.0 552.529 null] >> endobj 154 0 obj << /S /GoTo /D [66 0 R /XYZ 115.0 510.279 null] >> endobj 156 0 obj << /S /GoTo /D [66 0 R /XYZ 115.0 468.029 null] >> endobj 158 0 obj << /S /GoTo /D [66 0 R /XYZ 115.0 425.779 null] >> endobj 160 0 obj << /S /GoTo /D [66 0 R /XYZ 115.0 383.529 null] >> endobj 164 0 obj << /S /GoTo /D [71 0 R /XYZ 115.0 198.039 null] >> endobj 166 0 obj << /S /GoTo /D [77 0 R /XYZ 115.0 612.869 null] >> endobj 172 0 obj << /S /GoTo /D [101 0 R /XYZ 115.0 347.889 null] >> endobj 174 0 obj << /S /GoTo /D [101 0 R /XYZ 115.0 249.389 null] >> endobj 176 0 obj << /S /GoTo /D [101 0 R /XYZ 115.0 107.889 null] >> endobj 179 0 obj << /S /GoTo /D [113 0 R /XYZ 115.0 671.45 null] >> endobj 181 0 obj << /S /GoTo /D [113 0 R /XYZ 115.0 645.251 null] >> endobj 183 0 obj << /S /GoTo /D [113 0 R /XYZ 115.0 600.751 null] >> endobj 185 0 obj << /S /GoTo /D [113 0 R /XYZ 115.0 545.251 null] >> endobj 187 0 obj << /S /GoTo /D [113 0 R /XYZ 115.0 478.751 null] >> endobj 189 0 obj << /S /GoTo /D [118 0 R /XYZ 115.0 551.889 null] >> endobj 191 0 obj << /S /GoTo /D [118 0 R /XYZ 115.0 507.389 null] >> endobj 193 0 obj << /S /GoTo /D [118 0 R /XYZ 115.0 462.889 null] >> endobj xref 0 203 0000000000 65535 f 0000053893 00000 n 0000054081 00000 n 0000054468 00000 n 0000000015 00000 n 0000000071 00000 n 0000000327 00000 n 0000000433 00000 n 0000001009 00000 n 0000001115 00000 n 0000001286 00000 n 0000001393 00000 n 0000002162 00000 n 0000002285 00000 n 0000002382 00000 n 0000054649 00000 n 0000002516 00000 n 0000054716 00000 n 0000002650 00000 n 0000054783 00000 n 0000002784 00000 n 0000054850 00000 n 0000002918 00000 n 0000054917 00000 n 0000003052 00000 n 0000054984 00000 n 0000003186 00000 n 0000055051 00000 n 0000003320 00000 n 0000055118 00000 n 0000003453 00000 n 0000055185 00000 n 0000003587 00000 n 0000055253 00000 n 0000003721 00000 n 0000055321 00000 n 0000003855 00000 n 0000004700 00000 n 0000006390 00000 n 0000007747 00000 n 0000007870 00000 n 0000007932 00000 n 0000008128 00000 n 0000008324 00000 n 0000008526 00000 n 0000008728 00000 n 0000008929 00000 n 0000009066 00000 n 0000010389 00000 n 0000010512 00000 n 0000010581 00000 n 0000010720 00000 n 0000010856 00000 n 0000011052 00000 n 0000011246 00000 n 0000011439 00000 n 0000011625 00000 n 0000011813 00000 n 0000014382 00000 n 0000014505 00000 n 0000014546 00000 n 0000014720 00000 n 0000055389 00000 n 0000014859 00000 n 0000055456 00000 n 0000014996 00000 n 0000017936 00000 n 0000018059 00000 n 0000018086 00000 n 0000055523 00000 n 0000018223 00000 n 0000021907 00000 n 0000022030 00000 n 0000022064 00000 n 0000055590 00000 n 0000022203 00000 n 0000022338 00000 n 0000024042 00000 n 0000024165 00000 n 0000024192 00000 n 0000024331 00000 n 0000026584 00000 n 0000026707 00000 n 0000026734 00000 n 0000055657 00000 n 0000026870 00000 n 0000028811 00000 n 0000028934 00000 n 0000028982 00000 n 0000029118 00000 n 0000055724 00000 n 0000029254 00000 n 0000055791 00000 n 0000029393 00000 n 0000029529 00000 n 0000031978 00000 n 0000032086 00000 n 0000033231 00000 n 0000033339 00000 n 0000034704 00000 n 0000034812 00000 n 0000037827 00000 n 0000037953 00000 n 0000038046 00000 n 0000038186 00000 n 0000038383 00000 n 0000038578 00000 n 0000038754 00000 n 0000038944 00000 n 0000039179 00000 n 0000039413 00000 n 0000039614 00000 n 0000039812 00000 n 0000041336 00000 n 0000041462 00000 n 0000041499 00000 n 0000041677 00000 n 0000041852 00000 n 0000043406 00000 n 0000043516 00000 n 0000044041 00000 n 0000055859 00000 n 0000055913 00000 n 0000044151 00000 n 0000055981 00000 n 0000044322 00000 n 0000044523 00000 n 0000044801 00000 n 0000044919 00000 n 0000045155 00000 n 0000045306 00000 n 0000045538 00000 n 0000045935 00000 n 0000046096 00000 n 0000056049 00000 n 0000046266 00000 n 0000056117 00000 n 0000046478 00000 n 0000056185 00000 n 0000046588 00000 n 0000056253 00000 n 0000046737 00000 n 0000056321 00000 n 0000046904 00000 n 0000056389 00000 n 0000047089 00000 n 0000056457 00000 n 0000047245 00000 n 0000056525 00000 n 0000047410 00000 n 0000056593 00000 n 0000047563 00000 n 0000056661 00000 n 0000047895 00000 n 0000056729 00000 n 0000048187 00000 n 0000056797 00000 n 0000048468 00000 n 0000056865 00000 n 0000048824 00000 n 0000056933 00000 n 0000048964 00000 n 0000049260 00000 n 0000049428 00000 n 0000057001 00000 n 0000049641 00000 n 0000057069 00000 n 0000049855 00000 n 0000050105 00000 n 0000050326 00000 n 0000050488 00000 n 0000050668 00000 n 0000057137 00000 n 0000050834 00000 n 0000057206 00000 n 0000050982 00000 n 0000057275 00000 n 0000051119 00000 n 0000051259 00000 n 0000057344 00000 n 0000051428 00000 n 0000057412 00000 n 0000051647 00000 n 0000057481 00000 n 0000051757 00000 n 0000057550 00000 n 0000051906 00000 n 0000057619 00000 n 0000052073 00000 n 0000057688 00000 n 0000052298 00000 n 0000057757 00000 n 0000052446 00000 n 0000057826 00000 n 0000052583 00000 n 0000052723 00000 n 0000052997 00000 n 0000053230 00000 n 0000053344 00000 n 0000053455 00000 n 0000053567 00000 n 0000053676 00000 n 0000053783 00000 n trailer << /Size 203 /Root 2 0 R /Info 4 0 R >> startxref 57895 %%EOF Pod-2-DocBook-0.03/doc/docbook.css0000444000175200017530000000540011177047066015561 0ustar jozefjozef/* * Copyright (c) 2001, 2003 The FreeBSD Documentation Project * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * * $FreeBSD: /repoman/r/dcvs/doc/share/misc/docbook.css,v 1.8 2006/02/26 13:16:52 ceri Exp $ */ BODY ADDRESS { line-height: 1.3; margin: .6em 0; } BODY BLOCKQUOTE { margin-top: .75em; line-height: 1.5; margin-bottom: .75em; } HTML BODY { margin: 1em 8% 1em 10%; line-height: 1.2; } .LEGALNOTICE { font-size: small; font-variant: small-caps; } BODY DIV { margin: 0; } DL { margin: .8em 0; line-height: 1.2; } BODY FORM { margin: .6em 0; } H1, H2, H3, H4, H5, H6, DIV.EXAMPLE P B, .QUESTION, DIV.TABLE P B, DIV.PROCEDURE P B { color: #990000; } BODY H1, BODY H2, BODY H3, BODY H4, BODY H5, BODY H6 { line-height: 1.3; margin-left: 0; } BODY H1, BODY H2 { margin: .8em 0 0 -4%; } BODY H3, BODY H4 { margin: .8em 0 0 -3%; } BODY H5 { margin: .8em 0 0 -2%; } BODY H6 { margin: .8em 0 0 -1%; } BODY HR { margin: .6em; } BODY IMG.NAVHEADER { margin: 0 0 0 -4%; } OL { margin: 0 0 0 5%; line-height: 1.2; } BODY PRE { margin: .75em 0; line-height: 1.0; color: #461b7e; } BODY TD, BODY TH { line-height: 1.2; } UL, BODY DIR, BODY MENU { margin: 0 0 0 5%; line-height: 1.2; } HTML { margin: 0; padding: 0; } .FILENAME { color: #007a00; } .GUIMENU, .GUIMENUITEM, .GUISUBMENU, .GUILABEL, .INTERFACE, .GUIBUTTON, .SHORTCUT, .SHORTCUT .KEYCAP { background-color: #F0F0F0; } .ACCEL { background-color: #F0F0F0; text-decoration: underline; } .PROGRAMLISTING, .SCREEN { margin-left: 3ex; } Pod-2-DocBook-0.03/doc/Pod-2-DocBook.html0000444000175200017530000015001011177047066016512 0ustar jozefjozefPod::2::DocBook

Pod::2::DocBook

Jozef Kutej

Copyright Notice: This document contains information about Pod::2::DocBook Perl module. All parts of this document may be photocopied, otherwise reproduced, or translated to another language without the prior written consent.

Revision History
Revision 0.012008-07-03Jozef Kutej
Initial draft started.
Revision 0.022008-07-06Jozef Kutej
Added "Usage" chapter.

Chapter 1. Introduction

Table of Contents

Overview

Overview

[Note]Note

This document refers to Pod::2::DocBook version 0.01.

Pod::2::DocBook Perl module helps to convert existing pod documentation to docbook xml format. For a full reasoning and detail description see Chapter 3, Developers documentation section.

[Warning]Warning

not complete, as any other documentation ;-)

Chapter 2. Usage

Instalation

Installing of Pod::2::DocBook should be as easy and streight forward as executing cpan -i Pod::2::DocBook. This will add pod2docbook script to the system. See the section called “Scripts” for description.

DocBook quick start guide

In folder examples/pod2docbook-docbook/ of Pod::2::DocBook is the source of this document. To generate the HTML or PDF version from it you'll need: make, xmllint, xsltproc, fop and docbook xml+xsl.

For Debian: apt-get install docbook-utils psutils docbook-xml docbook-xsl xsltproc fop make. To have images in the PDF you need to get jimi and copy jimi.jar to /usr/share/java/jimi-1.0.jar

Then just do make or make Pod-2-DocBook.html or make Pod-2-DocBook.pdf to generate this "book".

Chapter 3. Developers documentation section

Table of Contents

Overview
Modules
Scripts

Overview

It's aways nice to read some documentation but to write it's not so fun. And to write it and sync it on two different places it's just annoing. To make our life easy let's see how a docbook sections generated directly for Perl module can look like.

Modules

Pod-2-DocBook POD

NAME

Pod::2::DocBook - Convert Pod data to DocBook SGML

SYNOPSIS
use Pod::2::DocBook;
my $parser = Pod::2::DocBook->new (title             => 'My Article',
                                   doctype           => 'article',
                fix_double_quotes => 1,
                spaces            => 3);

$parser->parse_from_file ('my_article.pod', 'my_article.sgml');
DESCRIPTION

Pod::2::DocBook is a module for translating Pod-formatted documents to DocBook 4.2 SGML (see http://www.docbook.org/). It is primarily a back end for pod2docbook, but, as a Pod::Parser subclass, it can be used on its own. The only public extensions to the Pod::Parser interface are options available to new():

doctype

This option sets the output document's doctype. The currently supported types are article, chapter, refentry and section. Special processing is performed when the doctype is set to refentry (see Document Types). You must set this option in order to get valid DocBook output.

fix_double_quotes

If this option is set to a true value, pairs of double quote characters ('"') in ordinary paragraphs will be replaced with <quote> and </quote>. See Ordinary Paragraphs for details.

header

If this option is set to a true value, Pod::2::DocBook will emit a DOCTYPE as the first line of output.

spaces

Pod::2::DocBook produces pretty-printed output. This option sets the number of spaces per level of indentation in the output.

title

This option sets the output document's title.

The rest of this document only describes issues specific to Pod::2::DocBook; for details on invoking the parser, specifically the new(), parse_from_file() and parse_from_filehandle() methods, see Pod::Parser.

METHODS
our @ISA     = qw(Pod::Parser);
initialize()

Initialize parser.

begin_pod()

Output docbook header stuff.

end_pod()

Output docbook footer. Will print also errors if any in a comment block.

commans($command, $paragraph, $line_num)

Process POD commands.

textblock ($paragraph, $line_num)

Process text block.

verbatim($paragraph, $line_num)

Process verbatim text block.

interior_sequence($command, $argument, $seq)

Process formatting commands.

error_msg

Returns parser error message(s) if any occured.

POD TO DOCBOOK TRANSLATION

Pod is a deceptively simple format; it is easy to learn and very straightforward to use, but it is suprisingly expressive. Nevertheless, it is not nearly as expressive or complex as DocBook. In most cases, given some Pod, the analogous DocBook markup is obvious, but not always. This section describes how Pod::2::DocBook treats Pod input so that Pod authors may make informed choices. In every case, Pod::2::DocBook strives to make easy things easy and hard things possible.

The primary motivation behind Pod::2::DocBook is to facilitate single-source publishing. That is, you should be able to generate man pages, web pages, PDF and PostScript documents, or any other format your SGML and/or Pod tools can produce, from the same Pod source, without the need for hand-editing any intermediate files. This may not always be possible, or you may simply choose to render Pod to DocBook and use that as your single source. To satisfy the first requirement, Pod::2::DocBook always processes the entire Pod source and tries very hard to produce valid DocBook markup, even in the presence of malformed Pod (see DIAGNOSTICS). To satisfy the second requirement (and to be a little nifty), Pod::2::DocBook pretty-prints its output. If you're curious about what specific output to expect, read on.

Document Types

DocBook's structure is very modular; many of its document types can be embedded directly into other documents. Accordingly, Pod::2::DocBook will generate four different document types: article, chapter, refentry, and section. This makes it easy, for instance, to write all the chapters of a book in separate Pod documents, translate them into DocBook markup and later glue them together before processing the entire book. You could do the same with each section in an article, or you could write the entire article in a single Pod document. Other document types, such as book and set, do not map easily from Pod, because they require structure for which there is no Pod equivalent. But given sections and chapters, making larger documents becomes much simpler.

The refentry document type is a little different from the others. Sections, articles, and chapters are essentially composed of nested sections. But a refentry has specialized elements for the NAME and SYNOPSIS sections. To accommodate this, Pod::2::DocBook performs extra processing on the Pod source when the doctype is set to refentry. You probably don't have to do anything to your document to assist the processing; typical man page conventions cover the requirements. Just make sure that the NAME and SYNOPSIS headers are both =head1s, that "NAME" and "SYNOPSIS" are both uppercase, and that =head1 NAME is the first line of Pod source.

Ordinary Paragraphs

Ordinary paragraphs in a Pod document translate naturally to DocBook paragraphs. Specifically, after any formatting codes are processed, the characters &lt;, &gt; and &amp; are translated to their respective SGML character entities, and the paragraph is wrapped in <para> and </para>.

For example, given this Pod paragraph:

Here is some text with I<italics> & an ampersand.

Pod::2::DocBook would produce DocBook markup similar to this:

<para>
  Here is some text with <emphasis role="italic">italics</emphasis>
  &amp; an ampersand.
</para>

Depending on your final output format, you may sometimes want double quotes in ordinary paragraphs to show up ultimately as "smart quotes" (little 66s and 99s). Pod::2::DocBook offers a convenient mechanism for handling double quotes in ordinary paragraphs and letting your SGML toolchain manage their presentation: the fix_double_quotes option to new(). If this option is set to a true value, Pod::2::DocBook will replace pairs of double quotes in ordinary paragraphs (and only in ordinary paragraphs) with <quote> and </quote>.

For example, given this Pod paragraph:

Here is some text with I<italics> & an "ampersand".

Pod::2::DocBook, with fix_double_quotes set, would produce DocBook markup similar to this:

<para>
  Here is some text with <emphasis role="italic">italics</emphasis>
  &amp; an <quote>ampersand</quote>.
</para>

If you have a paragraph with an odd number of double quotes, the last one will be left untouched, which may or may not be what you want. If you have such a document, replace the unpaired double quote character with E<quot>, and Pod::2::DocBook should be able to give you the output you expect. Also, if you have any =begin docbook ... =end docbook regions (see Embedded DocBook Markup) in your Pod, you are responsible for managing your own quotes in those regions.

Verbatim Paragraphs

Verbatim paragraphs translate even more naturally; perlpodspec mandates that absolutely no processing should be performed on them. So Pod::2::DocBook simply marks them as CDATA and wraps them in <screen> and </screen>. They are not indented the way ordinary paragraphs are, because they treat whitespace as significant.

For example, given this verbatim paragraph (imagine there's leading whitespace in the source):

my $i = 10;
while (<> && $i--) {
    print "$i: $_";
}

Pod::2::DocBook would produce DocBook markup similar to this:

<screen><![CDATA[my $i = 10;
while (<> && $i--) {
    print "$i: $_";
}]] ></screen>

Multiple contiguous verbatim paragraphs are treated as a single screen element, with blank lines separating the paragraphs, as dictated by perlpodspec.

Command Paragraphs

=head1 Heading Text

=head2 Heading Text

=head3 Heading Text

=head4 Heading Text

All of the Pod heading commands produce DocBook section elements, with the heading text as titles. Pod::2::DocBook (perlpod) only allows for 4 heading levels, but DocBook allows arbitrary nesting; see Embedded DocBook Markup if you need more than 4 levels. Pod::2::DocBook only looks at relative heading levels to determine nesting. For example, this bit of Pod:

=head1 1

Contents of section 1

=head2 1.1

Contents of section 1.1

and this bit of Pod:

=head1 1

Contents of section 1

=head3 1.1

Contents of section 1.1

both produce the same DocBook markup, which will look something like this:

<section id="article-My-Article-1"><title>1</title>
  <para>
    Contents of section 1
  </para>
  <section id="article-My-Article-1-1"><title>1.1</title>
    <para>
      Contents of section 1.1
    </para>
  </section>
</section>

Note that Pod::2::DocBook automatically generates section identifiers from your doctype, document title and section title. It does the same when you make internal links (see Formatting Codes, ensuring that if you supply the same link text as you did for the section title, the resulting identifiers will be the same.

=over indentlevel

=item stuff...

=back

=over ... =back regions are somewhat complex, in that they can lead to a variety of DocBook constructs. In every case, indentlevel is ignored by Pod::2::DocBook, since that's best left to your stylesheets.

An =over ... =back region with no =items represents indented text and maps directly to a DocBook blockquote element. Given this source:

=over 4

This text should be indented.

=back

Pod::2::DocBook will produce DocBook markup similar to this:

<blockquote>
  <para>
    This text should be indented.
  </para>
</blockquote>

Inside an =over ... =back region, =item commands generate lists. The text that follows the first =item determines the type of list that will be output:

  • "*" (an asterisk) produces <itemizedlist>

  • "1" or "1." produces <orderedlist numeration="arabic">

  • "a" or "a." produces <orderedlist numeration="loweralpha">

  • "A" or "A." produces <orderedlist numeration="upperalpha">

  • "i" or "i." produces <orderedlist numeration="lowerroman">

  • "I" or "I." produces <orderedlist numeration="upperroman">

  • anything else produces <variablelist>

Since the output from each of these is relatively verbose, the best way to see examples is to actually render some Pod into DocBook.

=pod

=cut

Pod::Parser recognizes these commands, and, therefore, so does Pod::2::DocBook, but they don't produce any output.

=begin formatname

=end formatname

=for formatname text...

Pod::2::DocBook supports two formats: docbook, explained in Embedded DocBook Markup, and table, explained in Simple Tables.

=encoding encodingname

This command is currently not supported. If Pod::2::DocBook encounters a document that contains =encoding, it will ignore the command and report an error (unknown command `%s' at line %d in file %s).

Embedded DocBook Markup

There are a wide range of DocBook structures for which there is no Pod equivalent. For these, you will have to provide your own markup using =begin docbook ... =end docbook or =for docbook .... Pod::2::DocBook will directly output whatever text you provide, unprocessed, so it's up to you to ensure that it's valid DocBook.

Images, footnotes and many inline elements are obvious candidates for embedded markup. Another possible use is nesting sections more than four-deep. For example, given this source:

=head1  1

This is Section 1

=head2 1.1

This is Section 1.1

=head3 1.1.1

This is Section 1.1.1

=head4 1.1.1.1

This is Section 1.1.1.1

=begin docbook

<section>
<title>1.1.1.1.1</title>
<para>This is Section 1.1.1.1.1</para>
</section>

=end docbook

Pod::2::DocBook will generate DocBook markup similar to this:


  <section id="article-My-Article-1"><title>1</title>
    <para>
      This is Section 1
    </para>
    <section id="article-My-Article-1-1"><title>1.1</title>
      <para>
    This is Section 1.1
      </para>
      <section id="article-My-Article-1-1-1"><title>1.1.1</title>
        <para>
      This is Section 1.1.1
        </para>
        <section id="article-My-Article-1-1-1-1"><title>1.1.1.1</title>
          <para>
        This is Section 1.1.1.1
          </para>
<section>
<title>1.1.1.1.1</title>
<para>This is Section 1.1.1.1.1</para>
</section>
        </section>
      </section>
    </section>
  </section>
Simple Tables

Pod::2::DocBook also provides a mechanism for generating basic tables with =begin table and =end docbook. If you have simple tabular data or a CSV file exported from some application, Pod::2::DocBook makes it easy to generate a table from your data. The syntax is intended to be simple, so DocBook's entire table feature set is not represented, but even if you do need more complex table markup than Pod::2::DocBook produces, you can rapidly produce some markup which you can hand-edit and then embed directly in your Pod with =begin docbook ... =end docbook. Each table definition spans multiple lines, so there is no equivalent =for table command.

The first line of a table definition gives the table's title. The second line gives a list of comma-separated column specifications (really just column alignments), each of which can be left, center or right. The third line is a list of comma-separated column headings, and every subsequent line consists of comma-separated row data. If any of your data actually contain commas, you can enclose them in double quotes; if they also contain double quotes, you must escape the inner quotes with backslashes (typical CSV stuff).

Here's an example:

=begin table

Sample Table
left,center,right
Powers of Ten,Planets,Dollars
10,Earth,$1
100,Mercury,$5
1000,Mars,$10
10000,Venus,$20
100000,"Jupiter, Saturn",$50

=end table

And here's what Pod::2::DocBook would do with it:

<table>
  <title>Sample Table</title>
  <tgroup cols="3">
    <colspec align="left">
    <colspec align="center">
    <colspec align="right">
    <thead>
      <row>
        <entry>Powers of Ten</entry>
        <entry>Planets</entry>
        <entry>Dollars</entry>
      </row>
    </thead>
    <tbody>
      <row>
        <entry>10</entry>
        <entry>Earth</entry>
        <entry>$1</entry>
      </row>
      <row>
        <entry>100</entry>
        <entry>Mercury</entry>
        <entry>$5</entry>
      </row>
      <row>
        <entry>1000</entry>
        <entry>Mars</entry>
        <entry>$10</entry>
      </row>
      <row>
        <entry>10000</entry>
        <entry>Venus</entry>
        <entry>$20</entry>
      </row>
      <row>
        <entry>100000</entry>
        <entry>Jupiter, Saturn</entry>
        <entry>$50</entry>
      </row>
    </tbody>
  </tgroup>
</table>
Formatting Codes

Pod formatting codes render directly into DocBook as inline elements:

  • I<text>

    <emphasis role="italic">text</emphasis>
  • B<text>

    <emphasis role="bold">text</emphasis>
  • C<code>

    <literal role="code"><![CDATA[code]] ></literal>
  • L<name>

    <citerefentry><refentrytitle>name</refentrytitle></citerefentry>
  • L<name(n)>

    <citerefentry><refentrytitle>name</refentrytitle>
    <manvolnum>n</manvolnum></citerefentry>
    
    
  • L<name/"sec"> or L<name/sec>

    <quote>sec</quote> in <citerefentry>
    <refentrytitle>name</refentrytitle></citerefentry>
  • L<name(n)/"sec"> or L<name(n)/sec>

    <quote>sec</quote> in <citerefentry>
    <refentrytitle>name</refentrytitle><manvolnum>n</manvolnum>
    </citerefentry>
  • L</"sec"> or L</sec> or L<"sec">

    <link linkend="article-My-Article-sec"><quote>sec</quote></link>
  • L<text|name>

    text
  • L<text|name/"sec"> or L<text|name/sec>

    text
  • L<text|/"sec"> or L<text|/sec> or L<text|"sec">

    <link linkend="article-My-Article-sec"><quote>text</quote></link>
  • L<scheme:...>

    <ulink url="scheme:...">scheme:...</ulink>
  • E<verbar>

    |
  • E<sol>

    /
  • E<number>

    &#number;
  • any other E<escape>

    &escape;
  • F<filename>

    <filename>filename</filename>

  • S<text with spaces>

    text&nbsp;with&nbsp;spaces
  • X<topic name>

    <indexterm><primary>topic name</primary></indexterm>

DIAGNOSTICS

Pod::2::DocBook makes every possible effort to produce valid DocBook markup, even with malformed POD source. Any processing errors will be noted in comments at the end of the output document. Even when errors occur, Pod::2::DocBook always reads the entire input document and never exits with a non-zero status.

unknown command `%s' at line %d in file %s

See “Command Paragraph” in perlpod for a list of valid commands. The command referenced in the error message was ignored.

formatting code `%s' nested within `%s' at line %d in file %s

See “Formatting Codes” in perlpod for details on which formatting codes can be nested. The offending code was translated into the output document as the raw text inside its angle brackets.

unknown formatting code `%s' at line in file %s

The input contained a formatting code not listed in perlpod; it was translated into the output document as the raw text inside the angle brackets.

empty L<> at line %d in file %s

Self-explanatory.

invalid escape `%s' at line %d in file %s

Self-explanatory; it was translated into the output document as the raw text inside the angle brackets.

=item must be inside an =over ... =back section at line %d in file %s

Self-explanatory. The `=item' referenced in the error was ignored.

`=end %s' found but current region opened with `=begin %s'

The closest `=end' command to the referenced `=begin' didn't match; processing continued as if the mismatched `=end' wasn't there.

no matching `=end' for `=begin %s'

Pod::2::DocBook reached the end of its input without finding an `=end' command to match the `=begin' referenced in the error; end-of-file processing continued.

unknown colspec `%s' in table at line %d in file %s

See Simple Tables for a list of supported column specifications.

encountered unknown state `%s' (this should never happen)

The state referred to is an internal variable used to properly manage nested DocBook structures. You should indeed never see this message, but if you do, you should contact the module's author.

SEE ALSO

pod2docbook, perlpod, Pod::DocBook, SVN repo - https://cle.sk/repos/pub/cpan/Pod-2-DocBook/, http://www.ohloh.net/projects/pod-2-docbook, doc/ + examples/pod2docbook-docbook/ for Pod::2::DocBook DocBook documentation

DocBook related links: http://www.docbook.org/, http://www.sagehill.net/docbookxsl/, http://developers.cogentrts.com/cogent/prepdoc/pd-axfrequentlyuseddocbooktags.html

AUTHOR

Alligator Descartes <descarte@symbolstone.org> wrote a module called Pod::2::DocBook, which was later maintained by Jan Iven <jan.iven@cern.ch>. That module was based on the original pod2html by Tom Christiansen <tchrist@mox.perl.com>.

Nandu Shah <nandu@zvolve.com> wrote Pod::DocBook, which is unrelated to the previous module (even though they both perform the same function). (http://search.cpan.org/~nandu/Pod-DocBook-1.2/)

Jozef Kutej <jkutej@cpan.org> renamed the module to Pod::2::DocBook because Nandus version was buried in the CPAN archive as an "UNAUTHORIZED RELEASE".

COPYRIGHT

Copyright 2004, Nandu Shah <nandu@zvolve.com>

Copyright 2008, Jozef Kutej <jkutej@cpan.org>

This library is free software; you may redistribute it and/or modify it under the same terms as Perl itself

Scripts

pod2docbook script

NAME

pod2docbook - Convert POD data to DocBook SGML

SYNOPSIS

pod2docbook [--help] [--doctype=article|chapter|section|refentry] [--title=title] [--spaces=# spaces per indent level] [--fix-double-quotes] [--no-header] [infile [outfile]]

DESCRIPTION

pod2docbook converts files from pod format (see perlpod) to DocBook 4.2 SGML (see http://www.docbook.org/). The program itself is merely a driver for the Pod::2::DocBook class; if you're interested in details of pod-to-SGML translation see Pod::2::DocBook.

OPTIONS AND ARGUMENTS

[--help]

Print usage and exit.

[--doctype=article|chapter|section|refentry]

Specifies the document type for the output file; the default is section.

[--title=title]

Specifies the document title. The default is infile, if it is supplied, or empty string otherwise.

[--spaces=# spaces per indent level]

Specifies the number of spaces per indent level in the SGML output; the default is 2.

[--fix-double-quotes]

Replace pairs of double quotes in regular paragraphs with <quote> and </quote> (see Pod::2::DocBook for details).

[--no-header]

Omit the DOCTYPE line from the output.

infile

The name of the file from which to read pod source; if not supplied, STDIN is used for input.

outfile

The name of the file to which to write SGML; if not supplied, STDOUT is used for output.

SEE ALSO

perlpod, Pod::2::DocBook

AUTHOR

Nandu Shah <nandu@zvolve.com>

COPYRIGHT

Copyright 2004, Nandu Shah <nandu@zvolve.com>

This program is free software; you may redistribute it and/or modify it under the same terms as Perl itself

Chapter 4. Open questions

some terms used in this book

terms

POD

Plain Old Documentation

DocBook

[Warning]Warning
--- to be done ---

Pod-2-DocBook-0.03/META.yml0000444000175200017530000000134711177047066014141 0ustar jozefjozef--- name: Pod-2-DocBook version: 0.03 author: - 'Jozef Kutej ' abstract: Convert Pod data to DocBook SGML license: perl resources: bugtracker: http://rt.cpan.org/NoAuth/Bugs.html?Dist=Pod-2-DocBook license: http://dev.perl.org/licenses/ repository: git://github.com/jozef/pod-2-docbook.git requires: CPAN::Version: 0 Digest::MD5: 0 List::MoreUtils: 0 Pod::ParseLink: 0 Pod::Parser: 0 Text::ParseWords: 0 Text::Wrap: 0 build_requires: Test::More: 0 XML::LibXML: 0 provides: Pod::2::DocBook: file: lib/Pod/2/DocBook.pm version: 0.03 generated_by: Module::Build version 0.3 meta-spec: url: http://module-build.sourceforge.net/META-spec-v1.2.html version: 1.2 keywords: - pod - docbook Pod-2-DocBook-0.03/README0000444000175200017530000005606311177047066013555 0ustar jozefjozefNAME Pod::2::DocBook - Convert Pod data to DocBook SGML SYNOPSIS use Pod::2::DocBook; my $parser = Pod::2::DocBook->new( title => 'My Article', doctype => 'article', base_id => 'article42' fix_double_quotes => 1, spaces => 3, id_version => 2, ); $parser->parse_from_file ('my_article.pod', 'my_article.sgml'); DESCRIPTION Pod::2::DocBook is a module for translating Pod-formatted documents to DocBook 4.2 SGML (see ). It is primarily a back end for pod2docbook, but, as a Pod::Parser subclass, it can be used on its own. The only public extensions to the Pod::Parser interface are options available to "new()": doctype This option sets the output document's doctype. The currently supported types are article, chapter, refentry and section. Special processing is performed when the doctype is set to refentry (see "Document Types"). You *must* set this option in order to get valid DocBook output. fix_double_quotes If this option is set to a true value, pairs of double quote characters ('"') in ordinary paragraphs will be replaced with and . See "Ordinary Paragraphs" for details. header If this option is set to a true value, Pod::2::DocBook will emit a DOCTYPE as the first line of output. spaces Pod::2::DocBook produces pretty-printed output. This option sets the number of spaces per level of indentation in the output. title This option sets the output document's title. The rest of this document only describes issues specific to Pod::2::DocBook; for details on invoking the parser, specifically the "new()", "parse_from_file()" and "parse_from_filehandle()" methods, see Pod::Parser. METHODS use base 'Pod::Parser'; initialize() Initialize parser. begin_pod() Output docbook header stuff. end_pod() Output docbook footer. Will print also errors if any in a comment block. commans($command, $paragraph, $line_num) Process POD commands. textblock ($paragraph, $line_num) Process text block. verbatim($paragraph, $line_num) Process verbatim text block. interior_sequence($command, $argument, $seq) Process formatting commands. error_msg Returns parser error message(s) if any occured. make_id($text) default id format - Function will construct an element id string. Id string is composed of "join (':', $parser->{base_id}, $text)", where $text in most cases is the pod heading text. version 2 id format - having ':' in id was not a best choice. (Xerces complains - Attribute value "lib.Moose.Manual.pod:NAME" of type ID must be an NCName when namespaces are enabled.) To not break backwards compatibity switch with > in constructor for using '-' instead. The xml id string has strict format. Checkout "cleanup_id" function for specification. make_uniq_id($text) Calls "$parser->make_id($text)" and checks if such id was already generated. If so, generates new one by adding _i1 (or _i2, i3, ...) to the id string. Return value is new uniq id string. cleanup_id($id_string) This function is used internally to remove/change any illegal characters from the elements id string. (see http://www.w3.org/TR/2000/REC-xml-20001006#NT-Name for the id string specification) $id_string =~ s//$1/g; # keep just inside of CDATA $id_string =~ s/<.+?>//g; # remove tags $id_string =~ s/^\s*//; # ltrim spaces $id_string =~ s/\s*$//; # rtrim spaces $id_string =~ tr{/ }{._}; # replace / with . and spaces with _ $id_string =~ s/[^\-_a-zA-Z0-9\.: ]//g; # closed set of characters allowed in id string In the worst case when the $id_string after clean up will not conform with the specification, warning will be printed out and random number with leading colon will be used. POD TO DOCBOOK TRANSLATION Pod is a deceptively simple format; it is easy to learn and very straightforward to use, but it is suprisingly expressive. Nevertheless, it is not nearly as expressive or complex as DocBook. In most cases, given some Pod, the analogous DocBook markup is obvious, but not always. This section describes how Pod::2::DocBook treats Pod input so that Pod authors may make informed choices. In every case, Pod::2::DocBook strives to make easy things easy and hard things possible. The primary motivation behind Pod::2::DocBook is to facilitate single-source publishing. That is, you should be able to generate man pages, web pages, PDF and PostScript documents, or any other format your SGML and/or Pod tools can produce, from the same Pod source, without the need for hand-editing any intermediate files. This may not always be possible, or you may simply choose to render Pod to DocBook and use that as your single source. To satisfy the first requirement, Pod::2::DocBook always processes the entire Pod source and tries very hard to produce valid DocBook markup, even in the presence of malformed Pod (see "DIAGNOSTICS"). To satisfy the second requirement (and to be a little nifty), Pod::2::DocBook pretty-prints its output. If you're curious about what specific output to expect, read on. Document Types DocBook's structure is very modular; many of its document types can be embedded directly into other documents. Accordingly, Pod::2::DocBook will generate four different document types: article, chapter, refentry, and section. This makes it easy, for instance, to write all the chapters of a book in separate Pod documents, translate them into DocBook markup and later glue them together before processing the entire book. You could do the same with each section in an article, or you could write the entire article in a single Pod document. Other document types, such as book and set, do not map easily from Pod, because they require structure for which there is no Pod equivalent. But given sections and chapters, making larger documents becomes much simpler. The refentry document type is a little different from the others. Sections, articles, and chapters are essentially composed of nested sections. But a refentry has specialized elements for the *NAME* and *SYNOPSIS* sections. To accommodate this, Pod::2::DocBook performs extra processing on the Pod source when the doctype is set to refentry. You probably don't have to do anything to your document to assist the processing; typical man page conventions cover the requirements. Just make sure that the *NAME* and *SYNOPSIS* headers are both =head1s, that "NAME" and "SYNOPSIS" are both uppercase, and that =head1 NAME is the first line of Pod source. Ordinary Paragraphs Ordinary paragraphs in a Pod document translate naturally to DocBook paragraphs. Specifically, after any formatting codes are processed, the characters "<", ">" and "&" are translated to their respective SGML character entities, and the paragraph is wrapped in and . For example, given this Pod paragraph: Here is some text with I & an ampersand. Pod::2::DocBook would produce DocBook markup similar to this: Here is some text with italics & an ampersand. Depending on your final output format, you may sometimes want double quotes in ordinary paragraphs to show up ultimately as "smart quotes" (little 66s and 99s). Pod::2::DocBook offers a convenient mechanism for handling double quotes in ordinary paragraphs and letting your SGML toolchain manage their presentation: the fix_double_quotes option to "new()". If this option is set to a true value, Pod::2::DocBook will replace pairs of double quotes in ordinary paragraphs (and *only* in ordinary paragraphs) with and . For example, given this Pod paragraph: Here is some text with I & an "ampersand". Pod::2::DocBook, with fix_double_quotes set, would produce DocBook markup similar to this: Here is some text with italics & an ampersand. If you have a paragraph with an odd number of double quotes, the last one will be left untouched, which may or may not be what you want. If you have such a document, replace the unpaired double quote character with E, and Pod::2::DocBook should be able to give you the output you expect. Also, if you have any =begin docbook ... =end docbook regions (see "Embedded DocBook Markup") in your Pod, you are responsible for managing your own quotes in those regions. Verbatim Paragraphs Verbatim paragraphs translate even more naturally; perlpodspec mandates that absolutely no processing should be performed on them. So Pod::2::DocBook simply marks them as CDATA and wraps them in and . They are not indented the way ordinary paragraphs are, because they treat whitespace as significant. For example, given this verbatim paragraph (imagine there's leading whitespace in the source): my $i = 10; while (<> && $i--) { print "$i: $_"; } Pod::2::DocBook would produce DocBook markup similar to this: && $i--) { print "$i: $_"; }]] > Multiple contiguous verbatim paragraphs are treated as a single *screen* element, with blank lines separating the paragraphs, as dictated by perlpodspec. Command Paragraphs "=head1 Heading Text" "=head2 Heading Text" "=head3 Heading Text" "=head4 Heading Text" All of the Pod heading commands produce DocBook *section* elements, with the heading text as titles. Pod::2::DocBook (perlpod) only allows for 4 heading levels, but DocBook allows arbitrary nesting; see "Embedded DocBook Markup" if you need more than 4 levels. Pod::2::DocBook only looks at relative heading levels to determine nesting. For example, this bit of Pod: =head1 1 Contents of section 1 =head2 1.1 Contents of section 1.1 and this bit of Pod: =head1 1 Contents of section 1 =head3 1.1 Contents of section 1.1 both produce the same DocBook markup, which will look something like this:
1 Contents of section 1
1.1 Contents of section 1.1
Note that Pod::2::DocBook automatically generates section identifiers from your doctype, document title and section title. It does the same when you make internal links (see "Formatting Codes", ensuring that if you supply the same link text as you did for the section title, the resulting identifiers will be the same. "=over indentlevel" "=item stuff..." "=back" "=over" ... "=back" regions are somewhat complex, in that they can lead to a variety of DocBook constructs. In every case, *indentlevel* is ignored by Pod::2::DocBook, since that's best left to your stylesheets. An "=over" ... "=back" region with no "=item"s represents indented text and maps directly to a DocBook *blockquote* element. Given this source: =over 4 This text should be indented. =back Pod::2::DocBook will produce DocBook markup similar to this:
This text should be indented.
Inside an "=over" ... "=back" region, "=item" commands generate lists. The text that follows the first "=item" determines the type of list that will be output: * "*" (an asterisk) produces * "1" or "1." produces * "a" or "a." produces * "A" or "A." produces * "i" or "i." produces * "I" or "I." produces * anything else produces Since the output from each of these is relatively verbose, the best way to see examples is to actually render some Pod into DocBook. "=pod" "=cut" Pod::Parser recognizes these commands, and, therefore, so does Pod::2::DocBook, but they don't produce any output. "=begin formatname" "=end formatname" "=for formatname text..." Pod::2::DocBook supports two formats: docbook, explained in "Embedded DocBook Markup", and table, explained in "Simple Tables". "=encoding encodingname" This command is currently not supported. If Pod::2::DocBook encounters a document that contains "=encoding", it will ignore the command and report an error ("unknown command `%s' at line %d in file %s"). Embedded DocBook Markup There are a wide range of DocBook structures for which there is no Pod equivalent. For these, you will have to provide your own markup using =begin docbook ... =end docbook or =for docbook .... Pod::2::DocBook will directly output whatever text you provide, unprocessed, so it's up to you to ensure that it's valid DocBook. Images, footnotes and many inline elements are obvious candidates for embedded markup. Another possible use is nesting sections more than four-deep. For example, given this source: =head1 1 This is Section 1 =head2 1.1 This is Section 1.1 =head3 1.1.1 This is Section 1.1.1 =head4 1.1.1.1 This is Section 1.1.1.1 =begin docbook
1.1.1.1.1 This is Section 1.1.1.1.1
=end docbook Pod::2::DocBook will generate DocBook markup similar to this:
1 This is Section 1
1.1 This is Section 1.1
1.1.1 This is Section 1.1.1
1.1.1.1 This is Section 1.1.1.1
1.1.1.1.1 This is Section 1.1.1.1.1
Simple Tables Pod::2::DocBook also provides a mechanism for generating basic tables with =begin table and =end docbook. If you have simple tabular data or a CSV file exported from some application, Pod::2::DocBook makes it easy to generate a table from your data. The syntax is intended to be simple, so DocBook's entire table feature set is not represented, but even if you do need more complex table markup than Pod::2::DocBook produces, you can rapidly produce some markup which you can hand-edit and then embed directly in your Pod with =begin docbook ... =end docbook. Each table definition spans multiple lines, so there is no equivalent =for table command. The first line of a table definition gives the table's title. The second line gives a list of comma-separated column specifications (really just column alignments), each of which can be left, center or right. The third line is a list of comma-separated column headings, and every subsequent line consists of comma-separated row data. If any of your data actually contain commas, you can enclose them in double quotes; if they also contain double quotes, you must escape the inner quotes with backslashes (typical CSV stuff). Here's an example: =begin table Sample Table left,center,right Powers of Ten,Planets,Dollars 10,Earth,$1 100,Mercury,$5 1000,Mars,$10 10000,Venus,$20 100000,"Jupiter, Saturn",$50 =end table And here's what Pod::2::DocBook would do with it: Sample Table Powers of Ten Planets Dollars 10 Earth $1 100 Mercury $5 1000 Mars $10 10000 Venus $20 100000 Jupiter, Saturn $50
Formatting Codes Pod formatting codes render directly into DocBook as inline elements: * "I" text * "B" text * "C" * "L" name * "L" name n * "L" or "L" sec in name * "L" or "L" sec in namen * "L" or "L" or "L<"sec">" sec * "L" text * "L" or "L" text * "L" or "L" or "L" text * "L" scheme:... * "E" | * "E" / * "E" &#number; * any other "E" &escape; * "F" filename * "S" text with spaces * "X" topic name DIAGNOSTICS Pod::2::DocBook makes every possible effort to produce valid DocBook markup, even with malformed POD source. Any processing errors will be noted in comments at the end of the output document. Even when errors occur, Pod::2::DocBook always reads the entire input document and never exits with a non-zero status. unknown command `%s' at line %d in file %s See "Command Paragraph" in perlpod for a list of valid commands. The command referenced in the error message was ignored. formatting code `%s' nested within `%s' at line %d in file %s See "Formatting Codes" in perlpod for details on which formatting codes can be nested. The offending code was translated into the output document as the raw text inside its angle brackets. unknown formatting code `%s' at line in file %s The input contained a formatting code not listed in perlpod; it was translated into the output document as the raw text inside the angle brackets. empty L<> at line %d in file %s Self-explanatory. invalid escape `%s' at line %d in file %s Self-explanatory; it was translated into the output document as the raw text inside the angle brackets. =item must be inside an =over ... =back section at line %d in file %s Self-explanatory. The `=item' referenced in the error was ignored. `=end %s' found but current region opened with `=begin %s' The closest `=end' command to the referenced `=begin' didn't match; processing continued as if the mismatched `=end' wasn't there. no matching `=end' for `=begin %s' Pod::2::DocBook reached the end of its input without finding an `=end' command to match the `=begin' referenced in the error; end-of-file processing continued. unknown colspec `%s' in table at line %d in file %s See "Simple Tables" for a list of supported column specifications. encountered unknown state `%s' (this should never happen) The state referred to is an internal variable used to properly manage nested DocBook structures. You should indeed never see this message, but if you do, you should contact the module's author. SEE ALSO pod2docbook, perlpod, Pod::DocBook, SVN repo - , , doc/ + examples/pod2docbook-docbook/ for Pod::2::DocBook DocBook documentation DocBook related links: , , AUTHOR Alligator Descartes wrote a module called Pod::2::DocBook, which was later maintained by Jan Iven . That module was based on the original pod2html by Tom Christiansen . Nandu Shah wrote Pod::DocBook, which is unrelated to the previous module (even though they both perform the same function). () Jozef Kutej renamed the module to Pod::2::DocBook because Nandus version was buried in the CPAN archive as an "UNAUTHORIZED RELEASE". COPYRIGHT Copyright 2004, Nandu Shah Copyright 2008, Jozef Kutej This library is free software; you may redistribute it and/or modify it under the same terms as Perl itself Pod-2-DocBook-0.03/t/0000755000175200017530000000000011177047066013130 5ustar jozefjozefPod-2-DocBook-0.03/t/make_id.t0000444000175200017530000000123611177047066014706 0ustar jozefjozefuse strict; use warnings; use Test::More; # last test to print use Pod::2::DocBook; eval "use XML::LibXML; 1" or plan skip_all => 'test requires XML::LibXML'; plan tests => 1; my $parser = Pod::2::DocBook->new( doctype => 'article' ); my $in = join '', ; open my $in_fh, '<', \$in; my $out; open my $out_fh, '>', \$out; $parser->parse_from_file( $in_fh, $out_fh ); my $dom = XML::LibXML->new->parse_string( $out ); my @ids = map $_->findvalue( '@id' ), $dom->findnodes( '//section' ); isnt $ids[0] => $ids[1], 'ids are different'; __END__ __DATA__ =head1 FOO This is the first one =head1 FOO And this is the second one Pod-2-DocBook-0.03/t/perltidy.conf0000444000175200017530000000011011177047066015621 0ustar jozefjozef# Container tightness -pt=2 # maximum 100 characters code width -l=100 Pod-2-DocBook-0.03/t/e_unknown_fc.pod0000444000175200017530000000002311177047066016300 0ustar jozefjozef=pod Q =cutPod-2-DocBook-0.03/t/refentry.t0000444000175200017530000000120711177047066015151 0ustar jozefjozefuse strict; use warnings; use Test::More; use Pod::2::DocBook; BEGIN { eval "require XML::LibXML" or plan skip_all => 'test requires XML::LibXML'; plan tests => 2; use_ok 'Pod::2::DocBook'; } my $parser = Pod::2::DocBook->new ( title => 'My Article', doctype => 'refentry', ); my $output; open my $output_fh, '>', \$output; my $input = join '', ; open my $input_fh, '<', \$input;; $parser->parse_from_filehandle( $input_fh, $output_fh ); eval { XML::LibXML->new->parse_string( $output ) }; ok !$@, 'refentry output is valid xml' or diag $@; __DATA__ =head1 NAME Hi there! This is some very simple pod =cut Pod-2-DocBook-0.03/t/e_escape.sgml0000444000175200017530000000075211177047066015562 0ustar jozefjozef
e_escape.pod E< >
Pod-2-DocBook-0.03/t/e_colspec.pod0000444000175200017530000000025611177047066015571 0ustar jozefjozef=begin table Sample Table left,middle,right Powers of Ten,Planets,Dollars 10,Earth,$1 100,Mercury,$5 1000,Mars,$10 10000,Venus,$20 100000,"Jupiter, Saturn",$50 =end table Pod-2-DocBook-0.03/t/e_mismatched_end.pod0000444000175200017530000000004711177047066017103 0ustar jozefjozef=pod =begin foo text =end bar =cut Pod-2-DocBook-0.03/t/docbook.sgml0000444000175200017530000000121211177047066015426 0ustar jozefjozef
docbook.pod Text before
A sample of markup that Pod::2::DocBook can't produce A simple section A very simple paragraph
Text after
Pod-2-DocBook-0.03/t/pod-spell.t0000444000175200017530000000046611177047066015220 0ustar jozefjozefuse Test::More; if (!$ENV{TEST_SPELLING}) { plan skip_all => "Set the environment variable TEST_SPELLING to enable this test."; } eval 'use Test::Spelling;'; plan skip_all => "Test::Spelling required for testing POD spelling" if $@; add_stopwords(qw( Jozef )); all_pod_files_spelling_ok(); Pod-2-DocBook-0.03/t/formatting_codes.pod0000444000175200017530000000035711177047066017166 0ustar jozefjozef=pod I B C L L L L L L L L L E E E<046> E<0x26> E<38> E F X =cut Pod-2-DocBook-0.03/t/no_header.pod0000444000175200017530000000035311177047066015557 0ustar jozefjozef=pod This is an ordinary paragraph. This is a verbatim paragraph. This is another ordinary paragraph. This is the first of two consecutive verbatim paragraphs. This is the second of two consecutive verbatim paragraphs. =cutPod-2-DocBook-0.03/t/indent.sgml0000444000175200017530000000071411177047066015275 0ustar jozefjozef
indent.pod
This text should be indented.
Pod-2-DocBook-0.03/t/docbook.pod0000444000175200017530000000042411177047066015252 0ustar jozefjozef=pod Text before =begin docbook
A sample of markup that Pod::2::DocBook can't produce A simple section A very simple paragraph
=end docbook Text after =cut Pod-2-DocBook-0.03/t/indent.pod0000444000175200017530000000005411177047066015112 0ustar jozefjozef=over This text should be indented. =back Pod-2-DocBook-0.03/t/distribution.t0000444000175200017530000000017211177047066016032 0ustar jozefjozefuse Test::More; eval 'use Test::Distribution not => "sig"'; plan( skip_all => 'Test::Distribution not installed') if $@; Pod-2-DocBook-0.03/t/Pod-2-DocBook.t0000444000175200017530000000503211177047066015512 0ustar jozefjozef# Before `make install' is performed this script should be runnable with # `make test'. After `make install' it should work as `perl Pod-2-DocBook.t' use strict; use warnings; use Test; BEGIN { plan tests => 19 }; use Pod::2::DocBook; ok 1; #----------------------------------------------------------------------- # test translation #----------------------------------------------------------------------- my @samples = qw(head paragraphs indent lists docbook table formatting_codes e_command e_nested_fc e_unknown_fc e_empty_l e_escape e_item e_mismatched_end e_no_end e_colspec for); foreach my $name (@samples) { my $parser = Pod::2::DocBook->new ( doctype => 'section', title => "$name.pod", fix_double_quotes => 1, header => 1, spaces => 2, skip => 'SKIP, SKIP2' ); $parser->parse_from_file ("t/$name.pod", "t/test-$name.out"); check_ok($name); } #----------------------------------------------------------------------- # test header option #----------------------------------------------------------------------- Pod::2::DocBook->new (doctype => 'section', title => "no_header.pod", fix_double_quotes => 1, header => 0, spaces => 2) ->parse_from_file ("t/no_header.pod", "t/test-no_header.out"); check_ok("no_header"); # Calls check(), and unlinks temp files on success. sub check_ok { my ($name) = @_; ok( check( "t/$name.sgml", "t/test-$name.out" ), 1, "t/test-$name.out differs from t/$name.sgml" ) && unlink("t/test-$name.out"); } # Checks files for differences. sub check { my ($file1, $file2) = @_; my (@file1, @file2); { open my $fh1, $file1 or die "couldn't open $file1: $!\n"; open my $fh2, $file2 or die "couldn't open $file2: $!\n"; # omit the module comment, because the local system's # modules may differ from the author's while (<$fh1>) { push @file1, $_ unless /^/; } while (<$fh2>) { push @file2, $_ unless /^/; } } # only files beginning with `e_' should have errors return 0 if $file2 !~ m!^t/test-e_! && grep /POD ERRORS/, @file2; # if one of the "good" sample files has an error, it's a problem # with the module distribution die "\n*** $file1 is bad in the distro--please contact the author ***\n" if $file1 !~ m!^t/e_! && grep /POD ERRORS/, @file1; return 0 if @file1 != @file2; for (@file1) { return 0 if $_ ne shift @file2 }; return 1; } Pod-2-DocBook-0.03/t/e_colspec.sgml0000444000175200017530000000267411177047066015757 0ustar jozefjozef
e_colspec.pod Sample Table Powers of Ten Planets Dollars 10 Earth $1 100 Mercury $5 1000 Mars $10 10000 Venus $20 100000 Jupiter, Saturn $50
Pod-2-DocBook-0.03/t/table.pod0000444000175200017530000000025611177047066014724 0ustar jozefjozef=begin table Sample Table left,center,right Powers of Ten,Planets,Dollars 10,Earth,$1 100,Mercury,$5 1000,Mars,$10 10000,Venus,$20 100000,"Jupiter, Saturn",$50 =end table Pod-2-DocBook-0.03/t/e_empty_l.sgml0000444000175200017530000000075111177047066015772 0ustar jozefjozef
e_empty_l.pod L<>
Pod-2-DocBook-0.03/t/lists.pod0000444000175200017530000000166511177047066015000 0ustar jozefjozef=over =item * Bullet 1 =item Bullet 2 =over =item * Bullet 2.1 =item Bullet 2.2 =back =item Bullet 3 =back =over =item 1 Item 1 =item Item 2 =over =item 1 Item 2.1 =item Item 2.2 =back =item Item 3 =back =over =item a Item a =item Item b =over =item a Item a.a =item Item a.b =back =item Item c =back =over =item A Item A =item Item B =over =item A Item B.A =item Item A.B =back =item Item C =back =over =item i Item i =item Item ii =over =item i Item ii.i =item Item ii.ii =back =item Item iii =back =over =item I Item I =item Item I =over =item I Item II.I =item Item II.II =back =item Item III =back =over =item The first First item =item The second Second item =over =item The first under the second First sub-item under the second item =item The second under the second Second sub-item under the second item =back =item The third Third item =back Pod-2-DocBook-0.03/t/signature.t0000444000175200017530000000170511177047066015317 0ustar jozefjozef#!/usr/bin/perl use strict; use Test::More; if (!$ENV{TEST_SIGNATURE}) { plan skip_all => "Set the environment variable TEST_SIGNATURE to enable this test."; } elsif (!eval { require Module::Signature; 1 }) { plan skip_all => "Next time around, consider installing Module::Signature, ". "so you can verify the integrity of this distribution."; } elsif ( !-e 'SIGNATURE' ) { plan skip_all => "SIGNATURE not found"; } elsif ( -s 'SIGNATURE' == 0 ) { plan skip_all => "SIGNATURE file empty"; } elsif (!eval { require Socket; Socket::inet_aton('pgp.mit.edu') }) { plan skip_all => "Cannot connect to the keyserver to check module ". "signature"; } else { plan tests => 1; } my $ret = Module::Signature::verify(); SKIP: { skip "Module::Signature cannot verify", 1 if $ret eq Module::Signature::CANNOT_VERIFY(); cmp_ok $ret, '==', Module::Signature::SIGNATURE_OK(), "Valid signature"; } Pod-2-DocBook-0.03/t/e_command.sgml0000444000175200017530000000073611177047066015742 0ustar jozefjozef
e_command.pod
Pod-2-DocBook-0.03/t/perlcriticrc0000444000175200017530000000136411177047066015542 0ustar jozefjozef#------------------------------------------------------------------------------ severity = 1 verbose = %f: %m at line %l. %e. (Severity: %s)\n %p near '%r'\n # PPI doesn't like the ::2:: ... + 2x TODO for the future... exclude = Modules::RequireFilenameMatchesPackage ControlStructures::ProhibitCascadingIfElse Subroutines::ProhibitExcessComplexity #------------------------------------------------------------------------------ [Documentation::RequirePodSections] lib_sections = NAME|DESCRIPTION|SYNOPSIS|AUTHOR|COPYRIGHT script_sections = NAME|DESCRIPTION|SYNOPSIS|AUTHOR|COPYRIGHT [-Miscellanea::RequireRcsKeywords] [ControlStructures::ProhibitPostfixControls] allow = if unless [CodeLayout::RequireTidyCode] perltidyrc = t/perltidy.conf Pod-2-DocBook-0.03/t/valid_xml.t0000444000175200017530000000124711177047066015276 0ustar jozefjozefuse strict; use warnings; use Test::More; BEGIN { eval "require XML::LibXML" or plan skip_all => 'test requires XML::LibXML'; plan tests => 2; use_ok 'Pod::2::DocBook'; } my $parser = Pod::2::DocBook->new( title => 'My Article', doctype => 'article', fix_double_quotes => 1, spaces => 3, header => 1 ); my $doc; open my $output_fh, '>', \$doc or die; $parser->parse_from_filehandle( *DATA, $output_fh ); my $dom = eval { XML::LibXML->new->parse_string($doc) }; ok !$@, "XML::LibXML doesn't complain"; diag $@ if $@; __DATA__ =head1 My Title =over =item Eeney =item Meeney =item Moe =back Pod-2-DocBook-0.03/t/e_no_end.pod0000444000175200017530000000003511177047066015376 0ustar jozefjozef=pod =begin foo text =cut Pod-2-DocBook-0.03/t/table.sgml0000444000175200017530000000247711177047066015113 0ustar jozefjozef
table.pod Sample Table Powers of Ten Planets Dollars 10 Earth $1 100 Mercury $5 1000 Mars $10 10000 Venus $20 100000 Jupiter, Saturn $50
Pod-2-DocBook-0.03/t/head.sgml0000444000175200017530000000256311177047066014721 0ustar jozefjozef
head.pod
1 Contents of section 1
1.1 Contents of section 1.1
1.1.1
1.1.1.1
2 Contents of section 2
2.1 Contents of section 2.1
2.1.1 Contents of section 2.1.1
2.2 Contents of section 2.2
3 Contents of section 3
Pod-2-DocBook-0.03/t/head.pod0000444000175200017530000000065511177047066014541 0ustar jozefjozef=head1 1 Contents of section 1 =head2 1.1 Contents of section 1.1 =head3 1.1.1 =head4 1.1.1.1 =head1 2 Contents of section 2 =head2 SKIP Contents to be skipped =head2 2.1 Contents of section 2.1 =head4 2.1.1 Contents of section 2.1.1 =head4 SKIP2 Contents to be skipped =head3 2.2 Contents of section 2.2 =head1 3 Contents of section 3 =head1 SKIP Contents to be skipped =begin testing =end testing =cut Pod-2-DocBook-0.03/t/e_nested_fc.sgml0000444000175200017530000000126311177047066016252 0ustar jozefjozef
e_nested_fc.pod EE<116>>
Pod-2-DocBook-0.03/t/perlcritic.t0000444000175200017530000000104011177047066015446 0ustar jozefjozef#!/usr/bin/perl use strict; use warnings; use File::Spec; use Test::More; use English qw(-no_match_vars); if ( not $ENV{TEST_AUTHOR} ) { my $msg = 'Author test. Set $ENV{TEST_AUTHOR} to a true value to run.'; plan( skip_all => $msg ); } eval { require Test::Perl::Critic; }; if ( $EVAL_ERROR ) { my $msg = 'Test::Perl::Critic required to criticise code'; plan( skip_all => $msg ); } my $rcfile = File::Spec->catfile( 't', 'perlcriticrc' ); Test::Perl::Critic->import( -profile => $rcfile ); all_critic_ok('pod2docbook'); Pod-2-DocBook-0.03/t/e_empty_l.pod0000444000175200017530000000002011177047066015577 0ustar jozefjozef=pod L<> =cut Pod-2-DocBook-0.03/t/02-Pod-2-DocBook-make_id.t0000444000175200017530000000237011177047066017322 0ustar jozefjozef#!/usr/bin/perl use strict; use warnings; use Test::More 'no_plan'; #use Test::More tests => 10; use FindBin qw($Bin); use lib "$Bin/lib"; BEGIN { use_ok ( 'Pod::2::DocBook' ) or exit; } exit main(); sub main { my $parser = Pod::2::DocBook->new( 'title' => '~!@#$$% pod file of M::O::Dule ""x' ); is($parser->make_id('&txt&'), '_pod_file_of_M::O::Dule_x:txt', 'check id string characters replacement'); is($parser->make_id('& txt&'), '_pod_file_of_M::O::Dule_x:_txt', 'check id string characters replacement'); is($parser->make_uniq_id('abc'), '_pod_file_of_M::O::Dule_x:abc', 'check id string characters replacement'); is($parser->make_uniq_id('abc'), '_pod_file_of_M::O::Dule_x:abc_i1', 'no duplicate ids'); is($parser->make_uniq_id('abc'), '_pod_file_of_M::O::Dule_x:abc_i2', 'no duplicate ids'); $parser->make_uniq_id('abc') foreach (1..10); is($parser->make_uniq_id('abc'), '_pod_file_of_M::O::Dule_x:abc_i13', 'no duplicate ids'); # different base_id $parser = Pod::2::DocBook->new( 'base_id' => 'some/file/somewhere.pm' ); is($parser->make_uniq_id('SYNOPSIS'), 'some.file.somewhere.pm:SYNOPSIS', 'check id string characters replacement'); return 0; } Pod-2-DocBook-0.03/t/e_item.pod0000444000175200017530000000002411177047066015070 0ustar jozefjozef=pod =item * =cut Pod-2-DocBook-0.03/t/no_header.sgml0000444000175200017530000000105511177047066015737 0ustar jozefjozef
no_header.pod This is an ordinary paragraph. This is another ordinary paragraph.
Pod-2-DocBook-0.03/t/pod-coverage.t0000444000175200017530000000104711177047066015670 0ustar jozefjozefuse strict; use warnings; use Test::More; # Ensure a recent version of Test::Pod::Coverage my $min_tpc = 1.08; eval "use Test::Pod::Coverage $min_tpc"; plan skip_all => "Test::Pod::Coverage $min_tpc required for testing POD coverage" if $@; # Test::Pod::Coverage doesn't require a minimum Pod::Coverage version, # but older versions don't recognize some common documentation styles my $min_pc = 0.18; eval "use Pod::Coverage $min_pc"; plan skip_all => "Pod::Coverage $min_pc required for testing POD coverage" if $@; all_pod_coverage_ok(); Pod-2-DocBook-0.03/t/e_nested_fc.pod0000444000175200017530000000003311177047066016064 0ustar jozefjozef=pod EE<116>> =cutPod-2-DocBook-0.03/t/e_item.sgml0000444000175200017530000000074611177047066015263 0ustar jozefjozef
e_item.pod
Pod-2-DocBook-0.03/t/paragraphs.pod0000444000175200017530000000035311177047066015763 0ustar jozefjozef=pod This is an ordinary paragraph. This is a verbatim paragraph. This is another ordinary paragraph. This is the first of two consecutive verbatim paragraphs. This is the second of two consecutive verbatim paragraphs. =cutPod-2-DocBook-0.03/t/for.pod0000444000175200017530000000013011177047066014412 0ustar jozefjozef=for docbook This is important. =for TODO This should be ignored. Pod-2-DocBook-0.03/t/e_unknown_fc.sgml0000444000175200017530000000100011177047066016454 0ustar jozefjozef
e_unknown_fc.pod Q
Pod-2-DocBook-0.03/t/paragraphs.sgml0000444000175200017530000000127511177047066016147 0ustar jozefjozef
paragraphs.pod This is an ordinary paragraph. This is another ordinary paragraph.
Pod-2-DocBook-0.03/t/00-compile.t0000444000175200017530000000033311177047066015157 0ustar jozefjozefuse strict; use Test::More; eval "use Test::Compile 0.08"; plan skip_all => "Test::Compile 0.08 required for testing compilation" if $@; my @pmdirs = qw(lib blib sbin bin); all_pm_files_ok(all_pm_files(@pmdirs)); Pod-2-DocBook-0.03/t/e_escape.pod0000444000175200017530000000002111177047066015367 0ustar jozefjozef=pod E< > =cut Pod-2-DocBook-0.03/t/formatting_codes.sgml0000444000175200017530000000323011177047066017337 0ustar jozefjozef
formatting_codes.pod text text name name n sec in name sec in name n sec text text text scheme:... | / & & & filename topic name
Pod-2-DocBook-0.03/t/lists.sgml0000444000175200017530000001247511177047066015161 0ustar jozefjozef
lists.pod Bullet 1 Bullet 2 Bullet 2.1 Bullet 2.2 Bullet 3 Item 1 Item 2 Item 2.1 Item 2.2 Item 3 Item a Item b Item a.a Item a.b Item c Item A Item B Item B.A Item A.B Item C Item i Item ii Item ii.i Item ii.ii Item iii Item I Item I Item II.I Item II.II Item III The first First item The second Second item The first under the second First sub-item under the second item The second under the second Second sub-item under the second item The third Third item
Pod-2-DocBook-0.03/t/pod.t0000444000175200017530000000035011177047066014073 0ustar jozefjozef#!perl -T use strict; use warnings; use Test::More; # Ensure a recent version of Test::Pod my $min_tp = 1.22; eval "use Test::Pod $min_tp"; plan skip_all => "Test::Pod $min_tp required for testing POD" if $@; all_pod_files_ok(); Pod-2-DocBook-0.03/t/e_mismatched_end.sgml0000444000175200017530000000074711177047066017272 0ustar jozefjozef
e_mismatched_end.pod
Pod-2-DocBook-0.03/t/for.sgml0000444000175200017530000000065311177047066014604 0ustar jozefjozef
for.pod This is important.
Pod-2-DocBook-0.03/t/e_command.pod0000444000175200017530000000001711177047066015552 0ustar jozefjozef=nosuchcommand Pod-2-DocBook-0.03/t/e_no_end.sgml0000444000175200017530000000067611177047066015571 0ustar jozefjozef
e_no_end.pod
Pod-2-DocBook-0.03/SIGNATURE0000644000175200017530000001454311177047066014160 0ustar jozefjozefThis file contains message digests of all files listed in MANIFEST, signed via the Module::Signature module, version 0.55. To verify the content in this distribution, first make sure you have Module::Signature installed, then type: % cpansign -v It will check each file's integrity, as well as the signature's validity. If "==> Signature verified OK! <==" is not displayed, the distribution may already have been compromised, and you should not run its Makefile.PL or Build.PL. -----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 SHA1 cf421e7152e131e496e9321282266a57e02c52a3 Build.PL SHA1 aa883fd6f237b9a3c32ef0b5a9c534f5e91506a2 Changes SHA1 1aca33c203779f2b2c739df4fcb90d4aa4c93640 MANIFEST SHA1 2861205cec931366c5fc8499cc3c7a3fe2769b4e META.yml SHA1 6813836f34679c5889b4f90963d80be1b5c2931d Makefile.PL SHA1 8c09cfe114aad4e918f8fd52d714c6425f5201ad README SHA1 67f2e4b37762f178008ed5379fce24ca449037ab doc/Pod-2-DocBook.html SHA1 212c6952540af848f50cb889ed454e7a1bf2d9cd doc/Pod-2-DocBook.pdf SHA1 a7661645db2095e29ebde300886b1a2ae87e325b doc/docbook.css SHA1 6235b2afa1721de5d194d7455f5138667a77fa30 examples/pod2docbook-docbook/.gitignore SHA1 cab8468a603ec5b8d0db8346002107427f71f5a0 examples/pod2docbook-docbook/Makefile SHA1 b12990063b4e0a666ec546a04c53774de763a72a examples/pod2docbook-docbook/book.xml SHA1 53a8e66ae7c270ee108457d0af7452f2d224b427 examples/pod2docbook-docbook/catalog.xml SHA1 7615e6c51ed6fc35f9cb77ff677beb74a015ade4 examples/pod2docbook-docbook/chapters/appendix-a.xml SHA1 595ade17a551f2de9c1ce3b470ff3b0874752987 examples/pod2docbook-docbook/chapters/development.xml SHA1 da39a3ee5e6b4b0d3255bfef95601890afd80709 examples/pod2docbook-docbook/chapters/examples/empty SHA1 327aeb0168e307025ec0d0be693aa23afbb0bc6f examples/pod2docbook-docbook/chapters/introduction.xml SHA1 da39a3ee5e6b4b0d3255bfef95601890afd80709 examples/pod2docbook-docbook/chapters/pod/.placeholder SHA1 7a0de8267baf5d49ddd0a52e4ba4e07c45846011 examples/pod2docbook-docbook/chapters/usage.xml SHA1 c67213f7651ff71198fce9a9226409e8271c1622 examples/pod2docbook-docbook/code/DocBook.pm SHA1 907624503872082dc8356880a44a5153d2969834 examples/pod2docbook-docbook/code/pod2docbook SHA1 2ba50d2cf711debe16c572ffb6c6e31a17b4a077 examples/pod2docbook-docbook/custom.dtd SHA1 a7661645db2095e29ebde300886b1a2ae87e325b examples/pod2docbook-docbook/docbook.css SHA1 00061b9e91eba6ee896b42b87b22fdddbf8d4949 examples/pod2docbook-docbook/entities.mod SHA1 4aa46e74dfbdb610e0b0b2bd75a98904c1aa7fc2 examples/pod2docbook-docbook/images/draft.png SHA1 55779b91b1f3faf8c5037e1223bfc2363106c476 examples/pod2docbook-docbook/images/draft.svg SHA1 2c41b33c63835022680518326bf168312d7f3f0c examples/pod2docbook-docbook/images/note.png SHA1 669364718285082670bf1e16347bd717f5934c2f examples/pod2docbook-docbook/images/note.svg SHA1 fa61be8935532c4b2b37d3d3e18e69f5c0c69cad examples/pod2docbook-docbook/images/warning.png SHA1 1b53e4cd84ede8267477cee6168efce3fef5c8b8 examples/pod2docbook-docbook/images/warning.svg SHA1 ea1fab12c887b8edd139b793fe9b26307331f7eb examples/pod2docbook-docbook/xinclude.mod SHA1 5f261b0ef300c56c2fe9aa0f1fb3d04a2a753b0c lib/Pod/2/DocBook.pm SHA1 837356391907a68bb83d0a56f136bd1101b09eae pod2docbook SHA1 605f05a5336cc37a476bb10b218f5ad1a2bd340d t/00-compile.t SHA1 4d2709e5fdc6d4fd185efc37258922c12fdeb02a t/02-Pod-2-DocBook-make_id.t SHA1 076a69f45d57c793ea467d43da679e5864f868d8 t/Pod-2-DocBook.t SHA1 41533fbd463e42d2ecf1e119eca910c16809d13e t/distribution.t SHA1 3b5a173c28fc02ab9285bb25421e551a1e04870e t/docbook.pod SHA1 cfb0724564a8b19b5c48a20a31651364e334c589 t/docbook.sgml SHA1 8ae09c390ecc8a7b4b086e9f4874634f2bbbcb2c t/e_colspec.pod SHA1 90dbfe5ce4b0ecb2c19420d40cbf5374ce120225 t/e_colspec.sgml SHA1 86fa7a3ef9d595d761f819b6befdadb5ac389752 t/e_command.pod SHA1 763a4fb761567f2754b53c9439ffed736cfebc96 t/e_command.sgml SHA1 d000546447127ec36f6fc2f58d5287ad743410df t/e_empty_l.pod SHA1 df3179bd0cd95f561ee806cc4149d2775cb0780f t/e_empty_l.sgml SHA1 eae7568c6524e5104df6ec832d8901a0f3b74937 t/e_escape.pod SHA1 57e17cd89d46598d21e7244b1fcf63091c463228 t/e_escape.sgml SHA1 b8438150c2ceac79d122ab8fe73023038c1f7be8 t/e_item.pod SHA1 03f4169fba297edbd088255fd0428feaebf5d0fc t/e_item.sgml SHA1 db02bc52c62cbe102a9d73b6a398ee8a8b8641ec t/e_mismatched_end.pod SHA1 45b8487a125c5a8a12edf341cdb23196c4b7fc29 t/e_mismatched_end.sgml SHA1 0bf7ae2965b34096063d1e1c6ca879a5a36c4eb8 t/e_nested_fc.pod SHA1 e722a3481ccfbe044cc448d18312ed549171721c t/e_nested_fc.sgml SHA1 515a059d9c0c62f132c4ca8d2e33936743fc7816 t/e_no_end.pod SHA1 d487edb39f8ea79b07720412da3496f242ad3282 t/e_no_end.sgml SHA1 97022192cf0c7605792c2bace7763f787c7f454b t/e_unknown_fc.pod SHA1 550327858acd9544c69c17316b4c60534e079aec t/e_unknown_fc.sgml SHA1 2405c4385dc40c2e78dfa56cd11ae831dfc72455 t/for.pod SHA1 f0a5c0787cb9572135e24a638a3335aa7233bfe1 t/for.sgml SHA1 09995acec1da0d303828ccf75c40f27a8a0f1e66 t/formatting_codes.pod SHA1 e183ba5766b088020c87651ec895f2146e8207d9 t/formatting_codes.sgml SHA1 8b7fbde8a1418fc8676dbbe87651f452c58fa61d t/head.pod SHA1 5f247b3a0f13e05a1d6b82884751dbe9113cdae3 t/head.sgml SHA1 d8680657894d4ea7929a8360ad66a44a5d70f36e t/indent.pod SHA1 754ead1b97ef0e16c204e0c2d49e86aa15ca77a2 t/indent.sgml SHA1 8e448d60d31c172bc5246c90625400583651f079 t/lists.pod SHA1 ef8865f3fe9f996061362b0d01279617007c6e43 t/lists.sgml SHA1 d8622106dce894fc17f9e1892e5b603b295bb2e7 t/make_id.t SHA1 ec7be9548d281ed0686799a7c2fec4bbb25ade31 t/no_header.pod SHA1 f435a48ffb0b7c9000ccd9fb3dcb5886c0333465 t/no_header.sgml SHA1 ec7be9548d281ed0686799a7c2fec4bbb25ade31 t/paragraphs.pod SHA1 137637eba8890e500115589c2c80526639a8613a t/paragraphs.sgml SHA1 491d4b09cb94c1e722f7437445a1b5353c52e07c t/perlcritic.t SHA1 aa3b8c1b81de9de8b414daf97e9f98e8cab12a7e t/perlcriticrc SHA1 5aa1ab0c95f16a7e29e92898ee97e9dccf15a9b7 t/perltidy.conf SHA1 0b1c5a2d59be6bfa7d60c64cd964fea6a0331705 t/pod-coverage.t SHA1 469afd9049b94527619a02194b0ccde0824f6c0a t/pod-spell.t SHA1 640935336dc1123c0069bcf5432bcaedc2cf22d3 t/pod.t SHA1 a5a7a6c165a8c56f9ab5619282a31eace11a5f2f t/refentry.t SHA1 4aeb184c9bed26ab6c3be1ebdb8470c0cb353b1f t/signature.t SHA1 8a09a3cf846e5209a7c0c13a3b30782c5ede809f t/table.pod SHA1 6515e07637410104d02f090e59a38a64d9b8013b t/table.sgml SHA1 0991a2f92c844fea6528d30c5a09d985fb9d9fbb t/valid_xml.t -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.9 (GNU/Linux) iEYEARECAAYFAkn8TjYACgkQC0OgUPgL2SfRCwCfaT1jEGUWa0ZaxdE93PiZPAd+ 6rIAoKXh/MxskIFXu+eUrHQ2sGjLYf4x =dfL7 -----END PGP SIGNATURE----- Pod-2-DocBook-0.03/Changes0000444000175200017530000000602211177047066014156 0ustar jozefjozef=head1 Pod::2::DocBook * 0.02 Thu 3 Jul 2008 - now using Module::Build instead of ExtUtils::MakeMaker - moved NAME, SYNOPSIS, DESCRIPTION on top of DocBook.pm - added METHODS POD - added 00-compile.t, distribution.t, pod-coverage.t, pod-spell.t, pod.t, signature.t - docbook in examples/ - "refnamediv>" xml typo fixed (yanick) - code cleanup (yanick, jk) - no more duplicated id-s (yanick) - added --base-id option for setting the id of the base element of generated xml - element id strings generated from base-id and the name of the pod heading * 0.01 Tue 10 Jun 2008 - Applied patches for =for blocks from Perl Training Australia's Pod::DocBook repository. (pjf) - Updated t/Pod-2-Docbook.t for more streamlined testing. (pjf) - Corrected POD errors in Changes file. (pjf) - xml validity fix, full DOCTYPE (yanick) =back =head1 OLD Pod::DocBook =head1 v1.2 =over =item Fri 6 Jun 2008 Renamed module to Pod::2::DocBook 0.01 =item Tue 16 Mar 2004 Released Pod::DocBook 1.2 Added missing test files =back =head1 v1.1 =over =item Tue 16 Mar 2004 Released Pod::DocBook 1.1 =item Wed 3 Mar 2004 F is now pod format (seemed appropriate) =item Tue 2 Mar 2004 F is now pod format (seemed appropriate) fixed doc: C<=item *> yields C<< >>, not C<< >> fixed bug in C<< >> output now uses MD5 hashes for fixed-length IDs (thanks to Jacques Supcik) added B<--no-header> option to B (thanks to Jacques Supcik) =item Thu 26 Feb 2004 fixed bug with blank lines in C<=begin docbook> ... C<=end docbook> regions (thanks to Garry Williams) =back =head1 v1.0 =over =item Thu 19 Feb 2004 released Pod::DocBook 1.0 =item Tue 30 Dec 2003 started rewrite of Pod::DocBook specialize Pod::Parser instead of parsing directly emit formatted DocBook 4.2 SGML =back =head1 OLD -- Pod::DocBook 0.6 and earlier 0.0.6 ===== o Support for L<> style linking, includes new Id naming scheme o additional styles, variable headx->secty mapping o removed unneccessary pairs o fixed index building (but don't use this) o general de-HTML-ization 0.0.5 ===== o Added an incremental fix from Pod::HTML which corrected bogus output in C<0>, B<0> and so on tags. 0.0.4 ===== o Added handling for auto-tag generation 0.0.3 ===== o POD files such as: =head1 Some Chapter Title blah will format the first =head1 tag as a tag and automatically fill in the final for you when run with --no-header and --no-footer o =over/=item/=back handling cleaned up a bit to produce correct , and constructs o Added basic auto-tagging handling. o Added --root-id argument to specify the root tag id o Removed tags which were an overhang from pod2html Pod-2-DocBook-0.03/pod2docbook0000555000175200017530000001475311177047066015030 0ustar jozefjozef#!/usr/bin/env perl use strict; use warnings; our $VERSION = '0.03'; use Getopt::Long; use Pod::2::DocBook 0.03; use Pod::Usage; use List::MoreUtils 'none'; use CPAN::Version; exit main(); sub main { my $doctype = 'section'; my $spaces = 2; my ($title, $double_quotes, $help, $no_header, $base_id, $id_version, $parse_title, $skip, $min_version); GetOptions( 'doctype=s' => \$doctype, 'base-id=s' => \$base_id, 'title=s' => \$title, 'spaces=i' => \$spaces, 'fix-double-quotes' => \$double_quotes, 'no-header' => \$no_header, 'help' => \$help, 'id-version=i' => \$id_version, 'parse-title' => \$parse_title, 'skip=s' => \$skip, 'min-version=s' => \$min_version, ) or pod2usage(); pod2usage if $help; pod2usage if none { $doctype eq $_ } qw(article chapter refentry section); pod2usage unless $spaces =~ /^\d+$/xms; die 'version "'.$min_version.'" required, this is just "'.$VERSION.'"'."\n" if ($min_version and CPAN::Version->vlt($VERSION, $min_version)); # TODO refactor this if so that there are no the same patterns in each of # the branch if (@ARGV == 0) { $title = q{} unless defined $title; my $parser = Pod::2::DocBook->new( title => $title, doctype => $doctype, base_id => $base_id, fix_double_quotes => $double_quotes, header => !$no_header, spaces => $spaces, id_version => $id_version, skip => $skip, ); $parser->parse_from_filehandle(\*STDIN); } else { my ($infile, $outfile) = @ARGV; # default doctype element id is the name of the input file $base_id ||= $infile; $title = parse_title($infile) if $parse_title; ($title) = $infile =~ m{([^/]+)\z}xms unless defined $title; my $parser = Pod::2::DocBook->new( title => $title, doctype => $doctype, base_id => $base_id, fix_double_quotes => $double_quotes, header => !$no_header, spaces => $spaces, id_version => $id_version, skip => $skip, ); if (defined $outfile) { $parser->parse_from_file($infile, $outfile); } else { $parser->parse_from_file($infile); } } return 0; } sub parse_title { my $filename = shift; open(my $fh, '<', $filename) or die 'failed to open "'.$filename.'"'; my $in_name = 0; my $line; while ($line = <$fh>) { # skip empty lines next if $line =~ m/^\s*$/; # we have the title, it's the first text line inside "=head1 NAME" last if ($in_name); # found "=head1 NAME" $in_name = 1 if $line =~ m/^=head1 \s+ NAME/xmsi; } close($filename); chomp($line); # remove formating codes from title and xml characters $line =~ s/[IBCLEFSXZ]<(.*)>/$1/xmsg; $line =~ s/&/&/; $line =~ s//>/; return $line if $line !~ m/^[^-]+-\s+(.+)$/; return $1; } __END__ =head1 NAME pod2docbook - Convert POD data to DocBook SGML =head1 SYNOPSIS pod2docbook [B<--help>] [B<--doctype>=B
|B|B
|B] [B<--title>=I] S<[B<--spaces>=I<# spaces per indent level>]> [B<--fix-double-quotes>] [B<--no-header>] [B<--base-id>=I<idstring>] S<[I<infile> [I<outfile>]]> =head1 DESCRIPTION B<pod2docbook> converts files from pod format (see L<perlpod>) to DocBook 4.2 SGML (see L<http://www.docbook.org/>). The program itself is merely a driver for the Pod::2::DocBook class; if you're interested in details of pod-to-SGML translation see L<Pod::2::DocBook>. =head1 OPTIONS AND ARGUMENTS =over =item [B<--help>] Print usage and exit. =item [B<--doctype>=B<article>|B<chapter>|B<section>|B<refentry>] Specifies the document type for the output file; the default is B<section>. =item [B<--title>=I<title>] Specifies the document title. The default is I<infile>, if it is supplied, or empty string otherwise. =item [B<--spaces>=I<# spaces per indent level>] Specifies the number of spaces per indent level in the SGML output; the default is 2. =item [B<--fix-double-quotes>] Replace pairs of double quotes in regular paragraphs with <quote> and </quote> (see L<Pod::2::DocBook> for details). =item [B<--no-header>] Omit the DOCTYPE line from the output. =item I<infile> The name of the file from which to read pod source; if not supplied, STDIN is used for input. =item I<outfile> The name of the file to which to write SGML; if not supplied, STDOUT is used for output. =item [B<--base-id>=I<idstring>] The root element of the B<--doctype> will have the I<idstring> set for attribute I<id>. The default is an input file name "cleaned up" to conform with XML restriction for characteds used in id strings. (SEE L<http://www.w3.org/TR/2000/REC-xml-20001006#NT-Name>) =back =head1 SEE ALSO L<pod2docbook>, L<perlpod>, L<Pod::DocBook>, SVN repo - L<https://cle.sk/repos/pub/cpan/Pod-2-DocBook/>, L<http://www.ohloh.net/projects/pod-2-docbook>, F<doc/> + F<examples/pod2docbook-docbook/> for Pod::2::DocBook DocBook documentation DocBook related links: L<http://www.docbook.org/>, L<http://www.sagehill.net/docbookxsl/>, L<http://developers.cogentrts.com/cogent/prepdoc/pd-axfrequentlyuseddocbooktags.html> =head1 AUTHOR Alligator Descartes <descarte@symbolstone.org> wrote a module called Pod::2::DocBook, which was later maintained by Jan Iven <jan.iven@cern.ch>. That module was based on the original L<pod2html> by Tom Christiansen <tchrist@mox.perl.com>. Nandu Shah <nandu@zvolve.com> wrote Pod::DocBook, which is unrelated to the previous module (even though they both perform the same function). (L<http://search.cpan.org/~nandu/Pod-DocBook-1.2/>) Jozef Kutej <jkutej@cpan.org> renamed the module to Pod::2::DocBook because Nandus version was buried in the CPAN archive as an "UNAUTHORIZED RELEASE". =head1 COPYRIGHT Copyright 2004, Nandu Shah <nandu@zvolve.com> Copyright 2008, Jozef Kutej <jkutej@cpan.org> This library is free software; you may redistribute it and/or modify it under the same terms as Perl itself =cut ���������������������Pod-2-DocBook-0.03/Makefile.PL����������������������������������������������������������������������0000444�0001752�0001753�00000001542�11177047066�014637� 0����������������������������������������������������������������������������������������������������ustar �jozef���������������������������jozef������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Note: this file was auto-generated by Module::Build::Compat version 0.30 use ExtUtils::MakeMaker; WriteMakefile ( 'NAME' => 'Pod::2::DocBook', 'VERSION_FROM' => 'lib/Pod/2/DocBook.pm', 'PREREQ_PM' => { 'CPAN::Version' => 0, 'Digest::MD5' => 0, 'List::MoreUtils' => 0, 'Pod::ParseLink' => 0, 'Pod::Parser' => 0, 'Test::More' => 0, 'Text::ParseWords' => 0, 'Text::Wrap' => 0, 'XML::LibXML' => 0 }, 'INSTALLDIRS' => 'site', 'EXE_FILES' => [ 'pod2docbook' ], 'PL_FILES' => {} ) ; ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������