diff options
-rw-r--r-- | perl/Locale/Po4a/Text.pm | 337 |
1 files changed, 322 insertions, 15 deletions
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; |