Marek,

I have a new version of Pod::Text finished using Pod::Simple (modulo
figuring out the best way to support two spaces at the end of sentences in
the new parsing infrastructure, which some of us are a little anal about).
Unfortunately, when released this will break Pod::Usage as it stands now,
since Pod::Usage assumes that Pod::Text will inherit from Pod::Select.

I came up with the following rather scary patch which will fix this
problem; with this patch, Pod::Usage detects at runtime whether it is
running under the Pod::Simple-based version of Pod::Text or the
Pod::Parser-based one and does the right thing.  It implements a very
stripped down version of Pod::Select for the Pod::Simple case.

Would you be willing to take this patch as part of the Pod::Parser
distribution?  Alternately, I could take over maintenance of Pod::Usage as
part of podlators, since it relies pretty heavily on Pod::Text, but I've
been pretty busy and am not sure how much time I can devote to it on an
ongoing basis.

Here's the tested patch.  Note that it depends somewhat on the internals
of the new Pod::Text, but not in ways that I think will change.

--- PodParser-1.28/lib/Pod/Usage.pm.orig        2003-11-24 07:28:04.000000000 -0800
+++ PodParser-1.28/lib/Pod/Usage.pm     2004-06-08 23:09:25.000000000 -0700
@@ -531,10 +531,69 @@
     my %params = @_;
     my $self = {%params};
     bless $self, $class;
-    $self->initialize();
+    if ($self->can('initialize')) {
+        $self->initialize();
+    } else {
+        $self = $self->SUPER::new();
+        %$self = (%$self, %params);
+    }
     return $self;
 }
 
+sub select {
+    my ($self, @res) = @_;
+    if ($ISA[0]->can('select')) {
+        $self->SUPER::select(@_);
+    } else {
+        $self->{USAGE_SELECT} = [EMAIL PROTECTED];
+    }
+}
+
+# This overrides the Pod::Text method to do something very akin to what
+# Pod::Select did as well as the work done below by preprocess_paragraph.
+# Note that the below is very, very specific to Pod::Text.
+sub _handle_element_end {
+    my ($self, $element) = @_;
+    if ($element eq 'head1') {
+        $$self{USAGE_HEAD1} = $$self{PENDING}[-1][1];
+        $$self{PENDING}[-1][1] =~ s/^\s*SYNOPSIS\s*$/USAGE/;
+    } elsif ($element eq 'head2') {
+        $$self{USAGE_HEAD2} = $$self{PENDING}[-1][1];
+    }
+    if ($element eq 'head1' || $element eq 'head2') {
+        $$self{USAGE_SKIPPING} = 1;
+        my $heading = $$self{USAGE_HEAD1};
+        $heading .= '/' . $$self{USAGE_HEAD2} if defined $$self{USAGE_HEAD2};
+        for (@{ $$self{USAGE_SELECT} }) {
+            if ($heading =~ /^$_\s*$/) {
+                $$self{USAGE_SKIPPING} = 0;
+                last;
+            }
+        }
+
+        # Try to do some lowercasing instead of all-caps in headings, and use
+        # a colon to end all headings.
+        local $_ = $$self{PENDING}[-1][1];
+        s{([A-Z])([A-Z]+)}{((length($2) > 2) ? $1 : lc($1)) . lc($2)}ge;
+        s/\s*$/:/  unless (/:\s*$/);
+        $_ .= "\n";
+        $$self{PENDING}[-1][1] = $_;
+    }
+    if ($$self{USAGE_SKIPPING}) {
+        pop @{ $$self{PENDING} };
+    } else {
+        $self->SUPER::_handle_element_end($element);
+    }
+}
+
+sub start_document {
+    my $self = shift;
+    $self->SUPER::start_document();
+    my $msg = $self->{USAGE_OPTIONS}->{-message}  or  return 1;
+    my $out_fh = $self->output_fh();
+    print $out_fh "$msg\n";
+}
+
 sub begin_pod {
     my $self = shift;
     $self->SUPER::begin_pod();  ## Have to call superclass

-- 
Russ Allbery ([EMAIL PROTECTED])             <http://www.eyrie.org/~eagle/>

Reply via email to