From 77ef8cedae01eb924325a386777d203ab602e08d Mon Sep 17 00:00:00 2001
From: Jonas Smedegaard <dr@jones.dk>
Date: Mon, 25 May 2009 23:36:32 +0200
Subject: Sync with po4a 0.36.1.

---
 perl/Locale/Po4a/Text.pm | 337 ++++++++++++++++++++++++++++++++++++++++++++---
 1 file changed, 322 insertions(+), 15 deletions(-)

(limited to 'perl')

diff --git a/perl/Locale/Po4a/Text.pm b/perl/Locale/Po4a/Text.pm
index 32f9dec..d9fcc88 100644
--- a/perl/Locale/Po4a/Text.pm
+++ b/perl/Locale/Po4a/Text.pm
@@ -100,6 +100,18 @@ Handle some special markup in Markdown-formatted texts.
 
 my $markdown = 0;
 
+=item B<asciidoc>
+
+Handle documents in the asciidoc format.
+
+=cut
+
+my $asciidoc = 0;
+
+=back
+
+=cut
+
 sub initialize {
     my $self = shift;
     my %options = @_;
@@ -121,6 +133,8 @@ sub initialize {
     if (defined $options{'markdown'}) {
         $markdown=1;
     }
+
+    $asciidoc=1 if (defined $options{'asciidoc'});
 }
 
 sub parse {
@@ -143,7 +157,6 @@ sub parse {
             $expect_header = 1;
         }
 
-        # TODO: preserve original line ends throughout the code instead
         chomp($line);
         $self->{ref}="$ref";
         if ($debianchangelog and
@@ -166,19 +179,294 @@ sub parse {
                  $line =~ m/^%%?\s*$/) {
             # Found end of fortune
             do_paragraph($self,$paragraph,$wrapped_mode);
-            # FIXME: test if this is still needed when always adding
-            #        newline in do_paragraph()
             $self->pushline("\n") unless (   $wrapped_mode == 0
                                           or $paragraph eq "");
             $paragraph="";
             $wrapped_mode = 1;
             $self->pushline("$line\n");
+        } elsif (    (defined $self->{verbatim})
+                 and ($self->{verbatim} == 2)) {
+            # Untranslated blocks
+            $self->pushline($line."\n");
+            if ($asciidoc and
+                ($line =~ m/^(\/{4,}|~{4,})$/)) {
+                undef $self->{verbatim};
+                undef $self->{type};
+                $wrapped_mode = 1;
+            }
         } elsif ($line =~ /^\s*$/) {
             # Break paragraphs on lines containing only spaces
             do_paragraph($self,$paragraph,$wrapped_mode);
             $paragraph="";
+            $wrapped_mode = 1 unless defined($self->{verbatim});
+            $self->pushline($line."\n");
+        } elsif ($asciidoc and (not defined($self->{verbatim})) and
+                 ($line =~ m/^(\+|--)$/)) {
+            # List Item Continuation or List Block
+            do_paragraph($self,$paragraph,$wrapped_mode);
+            $paragraph="";
+            $self->pushline($line."\n");
+        } elsif ($asciidoc and (not defined($self->{verbatim})) and
+                 ($line =~ m/^(={4,}|-{4,}|~{4,}|\^{4,}|\+{4,})$/) and
+                 (defined($paragraph) )and
+                 ($paragraph =~ m/^[^\n]*\n$/s) and
+                 (length($paragraph) == (length($line)+1))) {
+            # Found title
+            $wrapped_mode = 0;
+            my $level = $line;
+            $level =~ s/^(.).*$/$1/;
+            my $t = $self->translate($paragraph,
+                                     $self->{ref},
+                                     "Title $level",
+                                     "wrap" => 0);
+            $self->pushline($t);
+            $paragraph="";
+            $wrapped_mode = 1;
+            $self->pushline(($level x (length($t)-1))."\n");
+        } elsif ($asciidoc and
+                 ($line =~ m/^(={1,5})( +)(.*?)( +\1)?$/)) {
+            my $titlelevel1 = $1;
+            my $titlespaces = $2;
+            my $title = $3;
+            my $titlelevel2 = $4||"";
+            # Found one line title
+            do_paragraph($self,$paragraph,$wrapped_mode);
+            $wrapped_mode = 0;
+            $paragraph="";
+            my $t = $self->translate($title,
+                                     $self->{ref},
+                                     "Title $titlelevel1",
+                                     "wrap" => 0);
+            $self->pushline($titlelevel1.$titlespaces.$t.$titlelevel2."\n");
+            $wrapped_mode = 1;
+        } elsif ($asciidoc and
+                 ($line =~ m/^(\/{4,}|\+{4,}|-{4,}|\.{4,}|\*{4,}|_{4,}|={4,}|~{4,})$/)) {
+            # Found one delimited block
+            my $t = $line;
+            $t =~ s/^(.).*$/$1/;
+            my $type = "delimited block $t";
+            if (defined $self->{verbatim} and ($self->{type} ne $type)) {
+                $paragraph .= "$line\n";
+            } else {
+            do_paragraph($self,$paragraph,$wrapped_mode);
+            if (    (defined $self->{type})
+                and ($self->{type} eq $type)) {
+                undef $self->{type};
+                undef $self->{verbatim};
+                $wrapped_mode = 1;
+            } else {
+                if ($t eq "\/") {
+                    # CommentBlock, should not be treated
+                    $self->{verbatim} = 2;
+                } elsif ($t eq "+") {
+                    # PassthroughBlock
+                    $wrapped_mode = 0;
+                    $self->{verbatim} = 1;
+                } elsif ($t eq "-") {
+                    # ListingBlock
+                    $wrapped_mode = 0;
+                    $self->{verbatim} = 1;
+                } elsif ($t eq ".") {
+                    # LiteralBlock
+                    $wrapped_mode = 0;
+                    $self->{verbatim} = 1;
+                } elsif ($t eq "*") {
+                    # SidebarBlock
+                    $wrapped_mode = 1;
+                } elsif ($t eq "_") {
+                    # QuoteBlock
+                    if (    (defined $self->{type})
+                        and ($self->{type} eq "verse")) {
+                        $wrapped_mode = 0;
+                        $self->{verbatim} = 1;
+                    } else {
+                        $wrapped_mode = 1;
+                    }
+                } elsif ($t eq "=") {
+                    # ExampleBlock
+                    $wrapped_mode = 1;
+                } elsif ($t eq "~") {
+                    # Filter blocks, TBC: not translated
+                    $wrapped_mode = 0;
+                    $self->{verbatim} = 2;
+                } 
+                $self->{type} = $type;
+            }
+            $paragraph="";
+            $self->pushline($line."\n");
+            }
+        } elsif ($asciidoc and not defined $self->{verbatim} and
+                 ($line =~ m/^\[\[([^\]]*)\]\]$/)) {
+            # Found BlockId
+            do_paragraph($self,$paragraph,$wrapped_mode);
+            $paragraph="";
+            $wrapped_mode = 1;
+            $self->pushline($line."\n");
+            undef $self->{bullet};
+            undef $self->{indent};
+        } elsif ($asciidoc and not defined $self->{verbatim} and
+                 ($paragraph eq "") and
+                 ($line =~ m/^((?:NOTE|TIP|IMPORTANT|WARNING|CAUTION):\s+)(.*)$/)) {
+            my $type = $1;
+            my $text = $2;
+            do_paragraph($self,$paragraph,$wrapped_mode);
+            $paragraph=$text."\n";
+            $wrapped_mode = 1;
+            $self->pushline($type);
+            undef $self->{bullet};
+            undef $self->{indent};
+        } elsif ($asciidoc and not defined $self->{verbatim} and
+                 ($line =~ m/^\[(NOTE|TIP|IMPORTANT|WARNING|CAUTION|verse|quote)\]$/)) {
+            my $type = $1;
+            do_paragraph($self,$paragraph,$wrapped_mode);
+            $paragraph="";
             $wrapped_mode = 1;
             $self->pushline($line."\n");
+            if ($type  eq "verse") {
+                $wrapped_mode = 0;
+            }
+            undef $self->{bullet};
+            undef $self->{indent};
+        } elsif ($asciidoc and not defined $self->{verbatim} and
+                 ($line =~ m/^\[(verse|quote), +(.*)\]$/)) {
+            my $type = $1;
+            my $arg = $2;
+            do_paragraph($self,$paragraph,$wrapped_mode);
+            $paragraph="";
+            my $t = $self->translate($arg,
+                                     $self->{ref},
+                                     "$type",
+                                     "wrap" => 0);
+            $self->pushline("[$type, $t]\n");
+            $wrapped_mode = 1;
+            if ($type  eq "verse") {
+                $wrapped_mode = 0;
+            }
+            $self->{type} = $type;
+            undef $self->{bullet};
+            undef $self->{indent};
+        } elsif ($asciidoc and not defined $self->{verbatim} and
+                 ($line =~ m/^\[icon="(.*)"\]$/)) {
+            my $arg = $1;
+            do_paragraph($self,$paragraph,$wrapped_mode);
+            $paragraph="";
+            my $t = $self->translate($arg,
+                                     $self->{ref},
+                                     "icon",
+                                     "wrap" => 0);
+            $self->pushline("[icon=\"$t\"]\n");
+            $wrapped_mode = 1;
+            undef $self->{bullet};
+            undef $self->{indent};
+        } elsif ($asciidoc and not defined $self->{verbatim} and
+                 ($line =~ m/^\[icons=None, +caption="(.*)"\]$/)) {
+            my $arg = $1;
+            do_paragraph($self,$paragraph,$wrapped_mode);
+            $paragraph="";
+            my $t = $self->translate($arg,
+                                     $self->{ref},
+                                     "caption",
+                                     "wrap" => 0);
+            $self->pushline("[icons=None, caption=\"$t\"]\n");
+            $wrapped_mode = 1;
+            undef $self->{bullet};
+            undef $self->{indent};
+        } elsif ($asciidoc and not defined $self->{verbatim} and
+                 ($line =~ m/^(\s*)([*_+`'#[:alnum:]].*)((?:::|;;|\?\?|:-)(?: *\\)?)$/)) {
+            my $indent = $1;
+            my $label = $2;
+            my $labelend = $3;
+            # Found labeled list
+            do_paragraph($self,$paragraph,$wrapped_mode);
+            $paragraph="";
+            $wrapped_mode = 1;
+            $self->{bullet} = "";
+            $self->{indent} = $indent;
+            my $t = $self->translate($label,
+                                     $self->{ref},
+                                     "Labeled list",
+                                     "wrap" => 0);
+            $self->pushline("$indent$t$labelend\n");
+        } elsif ($asciidoc and not defined $self->{verbatim} and
+                 ($line =~ m/^(\s*)(\S.*)((?:::|;;)\s+)(.*)$/)) {
+            my $indent = $1;
+            my $label = $2;
+            my $labelend = $3;
+            my $labeltext = $4;
+            # Found Horizontal Labeled Lists
+            do_paragraph($self,$paragraph,$wrapped_mode);
+            $paragraph=$labeltext."\n";
+            $wrapped_mode = 1;
+            $self->{bullet} = "";
+            $self->{indent} = $indent;
+            my $t = $self->translate($label,
+                                     $self->{ref},
+                                     "Labeled list",
+                                     "wrap" => 0);
+            $self->pushline("$indent$t$labelend");
+        } elsif ($asciidoc and not defined $self->{verbatim} and
+                 ($line =~ m/^\:(\S.*?)(:\s*)(.*)$/)) {
+            my $attrname = $1;
+            my $attrsep = $2;
+            my $attrvalue = $3;
+            # Found a Attribute entry
+            do_paragraph($self,$paragraph,$wrapped_mode);
+            $paragraph="";
+            $wrapped_mode = 1;
+            undef $self->{bullet};
+            undef $self->{indent};
+            my $t = $self->translate($attrvalue,
+                                     $self->{ref},
+                                     "Attribute :$attrname:",
+                                     "wrap" => 0);
+            $self->pushline(":$attrname$attrsep$t\n");
+        } elsif ($asciidoc and not defined $self->{verbatim} and
+                 ($line !~ m/^\.\./) and ($line =~ m/^\.(\S.*)$/)) {
+            my $title = $1;
+            # Found block title
+            do_paragraph($self,$paragraph,$wrapped_mode);
+            $paragraph="";
+            $wrapped_mode = 1;
+            undef $self->{bullet};
+            undef $self->{indent};
+            my $t = $self->translate($title,
+                                     $self->{ref},
+                                     "Block title",
+                                     "wrap" => 0);
+            $self->pushline(".$t\n");
+        } elsif ($asciidoc and not defined $self->{verbatim} and
+                 ($line =~ m/^(\s*)((?:[-*o+]|(?:[0-9]+[.\)])|(?:[a-z][.\)])|\([0-9]+\)|\.|\.\.)\s+)(.*)$/)) {
+            my $indent = $1||"";
+            my $bullet = $2;
+            my $text = $3;
+            do_paragraph($self,$paragraph,$wrapped_mode);
+            $paragraph = $text."\n";
+            $self->{indent} = $indent;
+            $self->{bullet} = $bullet;
+        } elsif ($asciidoc and not defined $self->{verbatim} and
+                 ($line =~ m/^((?:<?[0-9]+)?> +)(.*)$/)) {
+            my $bullet = $1;
+            my $text = $2;
+            do_paragraph($self,$paragraph,$wrapped_mode);
+            $paragraph = $text."\n";
+            $self->{indent} = "";
+            $self->{bullet} = $bullet;
+        } elsif ($asciidoc and not defined $self->{verbatim} and
+                 (defined $self->{bullet} and $line =~ m/^(\s+)(.*)$/)) {
+            my $indent = $1;
+            my $text = $2;
+            if (not defined $self->{indent}) {
+                $paragraph .= $text."\n";
+                $self->{indent} = $indent;
+            } elsif (length($paragraph) and (length($self->{bullet}) + length($self->{indent}) == length($indent))) {
+                $paragraph .= $text."\n";
+            } else {
+
+                do_paragraph($self,$paragraph,$wrapped_mode);
+                $paragraph = $text."\n";
+                $self->{indent} = $indent;
+                $self->{bullet} = "";
+            }
         } elsif ($line =~ /^-- $/) {
             # Break paragraphs on email signature hint
             do_paragraph($self,$paragraph,$wrapped_mode);
@@ -226,6 +514,9 @@ sub parse {
                       or $line =~ /"""$/)) { # """ textblock inside macro begin
                 # Markdown markup needing separation _after_ this line
                 $end_of_paragraph = 1;
+            } else {
+                undef $self->{bullet};
+                undef $self->{indent};
             }
             if ($fortunes) {
                 $line =~ s/%%(.*)$//;
@@ -265,9 +556,19 @@ sub parse {
 
 sub do_paragraph {
     my ($self, $paragraph, $wrap) = (shift, shift, shift);
+    my $type = shift || $self->{type} || "Plain text";
     return if ($paragraph eq "");
 
-    if ($bullets) {
+# DEBUG
+#    my $b;
+#    if (defined $self->{bullet}) {
+#            $b = $self->{bullet};
+#    } else {
+#            $b = "UNDEF";
+#    }
+#    $type .= " verbatim: '".($self->{verbatim}||"NONE")."' bullet: '$b' indent: '".($self->{indent}||"NONE")."' type: '".($self->{type}||"NONE")."'";
+
+    if ($bullets and not $wrap and not defined $self->{verbatim}) {
         # Detect bullets
         # |        * blah blah
         # |<spaces>  blah
@@ -312,18 +613,24 @@ TEST_BULLET:
             }
         }
     }
-    # TODO: detect indented paragraphs
 
-    my $transfinal = $self->translate($paragraph,
-                                      $self->{ref},
-                                      "Plain text",
-                                      "wrap" => $wrap);
-
-    # TODO: preserve original line ends throughout the code instead
-    chomp $transfinal;
-    $transfinal .= "\n";
-
-    $self->pushline( $transfinal );
+    my $end = "";
+    if ($wrap) {
+        $paragraph =~ s/^(.*?)(\n*)$/$1/s;
+        $end = $2 || "";
+    }
+    my $t = $self->translate($paragraph,
+                             $self->{ref},
+                             $type,
+                             "wrap" => $wrap);
+    if (defined $self->{bullet}) {
+        my $bullet = $self->{bullet};
+        my $indent1 = $self->{indent};
+        my $indent2 = $indent1.(' ' x length($bullet));
+        $t =~ s/^/$indent1$bullet/s;
+        $t =~ s/\n(.)/\n$indent2$1/sg;
+    }
+    $self->pushline( $t.$end );
 }
 
 1;
-- 
cgit v1.2.3