################################################## package Quark; ################################################## use Pod::Parser; use constant MAX_VERBATIM_LEN => 35; our @ISA = qw(Pod::Parser); ################################################## sub initialize { ################################################## my ($parser) = @_; $parser->{Intro} = 1; } ################################################## sub command { ################################################## my ($parser, $command, $para, $line) = @_; my $tag = ""; my $quark = 0; $parser->{InVerbatim} = 0; return if $command eq 'pod'; return if $command eq 'over'; if ($command eq 'head1') { $tag = '@T:'; } elsif ($command eq 'head2') { $tag = '@ZT:'; } elsif ($command eq 'item') { $para =~ s/\s+$//s; $parser->{Item} = $para; return; } elsif ($command eq 'for') { return unless $para =~ /^quark/; $quark = 1; $para =~ s/^quark\s*\n//; } my $text = $parser->interpolate($para, $line); $text = quark_esc($text, '@\\') unless $quark; $parser->output("$tag$text"); } ################################################## sub verbatim { ################################################## my($parser, $text) = @_; return if $text =~ /^\s*$/s; # Zeilenlänge prüfen while($text =~ /(.*)/g) { if(length($1) > MAX_VERBATIM_LEN) { warn "Verbatim line too long: $1"; } } $text = quark_esc($text, '<@\\'); $text =~ s/^ {4}//mg; # Absatz im Verbatim-Stück? if($parser->{InVerbatim}) { $parser->output("$text"); return 1; } $parser->{InVerbatim} = 1; $parser->output("\@LI:\n$text"); } ################################################## sub interior_sequence { ################################################## my ($parser, $cmd, $arg) = @_; # B<.>, I<.> und C<.> wird . if($cmd =~ /B|I|C/) { return "$arg"; } # E<.> Notierung für Sonderzeichen in POD if($cmd eq "E") { $arg eq "gt" && return ">"; $arg eq "lt" && return quark_esc('<','<'); } } ################################################## sub textblock { ################################################## my ($parser, $para, $line) = @_; my $tag = ""; if(exists $parser->{Item}) { $para = "$parser->{Item} $para"; delete $parser->{Item}; } else { $tag = '@L:'; } my $text = $parser->interpolate($para, $line); $text = quark_esc($text, '@\\'); if($parser->{Intro}) { $tag = "\@V:"; $parser->{Intro} = 0; } $parser->{InVerbatim} = 0; $parser->output("$tag$text"); } ################################################## sub output { ################################################## my($parser, $text) = @_; my $out_fh = $parser->output_handle; print $out_fh $text; } ################################################## sub quark_esc { ################################################## my ($string, $chars) = @_; # Backslash drin oder nicht? my $backslash = ($chars =~ s-\\--); # Alles ausser Backslashes ersetzen $string =~ s-([$chars])-<\\$1>-g; if($backslash) { # Sonderbehandlung $string =~ s-(?-g; } return $string; }