# Locale::Po4a::Colobothelp -- Convert Colobot help files # # This program is free software; you may redistribute it and/or modify it # under the terms of GPLv3. # use Locale::Po4a::TransTractor qw(process new); use Locale::Po4a::Common; use Locale::Po4a::Text; package Locale::Po4a::Colobothelp; use 5.006; use strict; use warnings; require Exporter; use vars qw(@ISA @EXPORT $AUTOLOAD); @ISA = qw(Locale::Po4a::TransTractor); @EXPORT = qw(); my @comments = (); sub initialize {} sub parse { my $self = shift; my ($line,$ref); my $paragraph=""; my $wrapped_mode = 1; my $s_mode = 0; my $expect_header = 1; my $end_of_paragraph = 0; ($line,$ref)=$self->shiftline(); while (defined($line)) { chomp($line); $self->{ref}="$ref"; ($paragraph,$wrapped_mode,$s_mode,$expect_header,$end_of_paragraph) = parse_colobothelp($self,$line,$ref,$paragraph,$wrapped_mode,$s_mode,$expect_header,$end_of_paragraph); if ($end_of_paragraph) { do_paragraph($self,offlink($paragraph),$wrapped_mode); $paragraph=""; $wrapped_mode = 1; $end_of_paragraph = 0; } ($line,$ref)=$self->shiftline(); } if (length $paragraph) { $paragraph =~ s/\n$//; do_paragraph($self,$paragraph,$wrapped_mode); $self->pushline("\n"); } } sub parse_colobothelp { my ($self,$line,$ref,$paragraph,$wrapped_mode,$s_mode,$expect_header,$end_of_paragraph) = @_; if (($s_mode == 1) and ($line !~ /^\\s;/)) { # Process the end of \s; blocks $s_mode = 0; # substr removes the last superfluous \n my $s_block = onlink($self->translate(substr(offlink($paragraph),0,-1),$ref,"\\s; block (usually verbatim code)")); $s_block =~ s/(\n|^)/$1\\s;/g; $self->pushline($s_block."\n"); $paragraph=""; $wrapped_mode = 0; } if ( $line =~ /^\s*$/ or $line =~ m/^\\[nctr];$/) { # Break paragraphs on lines containing only spaces or any of \n; \c; \t; \r; (alone) # Drop the latest EOL to avoid having it in the translation my $dropped_eol = ($paragraph =~ s/\n$//); do_paragraph($self,$paragraph,$wrapped_mode); $self->pushline("\n") if $dropped_eol; # Therefore only add it back if it was removed $paragraph=""; $wrapped_mode = 0; $self->pushline($line."\n"); } elsif ($line =~ s/^(\\s;)//) { # Lines starting with \s; are special (yellow-background, usually code-block) # Break paragraph before them if($s_mode == 0) { $s_mode = 1; my $dropped_eol = ($paragraph =~ s/\n$//); do_paragraph($self,$paragraph,$wrapped_mode); $self->pushline("\n") if $dropped_eol; # Therefore only add it back if it was removed $paragraph=""; $wrapped_mode = 0; } $paragraph .= $line."\n"; } elsif ($line =~ s/^(\\[bt];)//) { # Break paragraphs on \b; or \t; headers do_paragraph($self,$paragraph,$wrapped_mode); $paragraph=""; $wrapped_mode = 1; $self->pushline($1.onlink($self->translate(offlink($line),$ref,"$1 header")."\n")); } elsif ($line =~ /^\\image (.*) (\d*) (\d*);$/) { # Discard lines with \image name lx ly; tags do_paragraph($self,$paragraph,$wrapped_mode); $paragraph=""; $wrapped_mode = 1; $self->pushline("\\image ".$self->translate($1,$ref,'Image filename')." $2 $3;\n"); } elsif ( $line =~ /^=+$/ or $line =~ /^_+$/ or $line =~ /^-+$/) { $wrapped_mode = 0; $paragraph .= $line."\n"; do_paragraph($self,$paragraph,$wrapped_mode); $paragraph=""; $wrapped_mode = 1; } elsif ($line =~ s/^(\s*)([0-9]\)|[o-])(\s*)//) { # Break paragraphs on lines starting with either number + parenthesis or any of o- + space do_paragraph($self,$paragraph,$wrapped_mode); $paragraph=""; $wrapped_mode = 1; $self->pushline("$1$2$3".onlink($self->translate(offlink($line),$ref,"Bullet: '$2'")."\n")); } else { # All paragraphs are non-wrap paragraphs by default $wrapped_mode = 0; undef $self->{bullet}; undef $self->{indent}; $paragraph .= $line."\n"; } return ($paragraph,$wrapped_mode,$s_mode,$expect_header,$end_of_paragraph); } sub offlink { my ($paragraph) = @_; # Replace \button $id; as pseudo xHTML