Zubrikhin Alexey
10 years ago
2 changed files with 97 additions and 0 deletions
@ -0,0 +1,36 @@
|
||||
package Text::Dokuwiki::Render; |
||||
|
||||
use strict; |
||||
use warnings; |
||||
use utf8; |
||||
|
||||
sub new { |
||||
my ($class) = @_; |
||||
my $self = {}; |
||||
|
||||
return bless($self, $class); |
||||
} |
||||
|
||||
sub treewalk { |
||||
my ($self, @tree) = @_; |
||||
my $output = ""; |
||||
|
||||
foreach my $part (@tree) { |
||||
if (ref $part eq 'ARRAY') { |
||||
my ($tag, $attrs, @rest) = @{$part}; |
||||
if ($self->SUPER::can($tag)) { |
||||
$output .= $self->$tag($attrs, $self->treewalk(@rest)); |
||||
} elsif ($self->SUPER::can('default')){ |
||||
$output .= $self->default($tag, $attrs, $self->treewalk(@rest)); |
||||
} else { |
||||
die("Unimplemented handler for tag: $tag\n"); |
||||
} |
||||
next; |
||||
} |
||||
$output .= $part; |
||||
} |
||||
|
||||
return $output; |
||||
} |
||||
|
||||
1; |
@ -0,0 +1,61 @@
|
||||
package Text::Dokuwiki::Render::HTML; |
||||
|
||||
use strict; |
||||
use warnings; |
||||
use utf8; |
||||
|
||||
use base 'Text::Dokuwiki::Render'; |
||||
|
||||
my $noclose = { |
||||
br => 1, |
||||
hr => 1, |
||||
}; |
||||
|
||||
my $display = { |
||||
div => 'block', |
||||
ul => 'block', |
||||
h1 => 'line', |
||||
h2 => 'line', |
||||
h3 => 'line', |
||||
p => 'line', |
||||
br => 'block', |
||||
}; |
||||
|
||||
sub _escape { |
||||
my ($text) = @_; |
||||
|
||||
$text =~ s{\\}{\\\\}go; |
||||
$text =~ s{"} {\\"}go; |
||||
return $text; |
||||
} |
||||
|
||||
sub _attrs { |
||||
my ($attrs) = @_; |
||||
my $text = ""; |
||||
|
||||
while (my ($key, $value) = each($attrs)) { |
||||
$text .= sprintf ' %s="%s"', $key, _escape($value); |
||||
} |
||||
|
||||
return $text; |
||||
} |
||||
|
||||
sub default { |
||||
my ($self, $tag, $attrs, $content) = @_; |
||||
my $c = $noclose->{$tag} // 0; |
||||
my $d = $display->{$tag} // 'inline'; |
||||
|
||||
my $text = "<$tag" . _attrs($attrs) . ">"; |
||||
$text .= "\n" if ($d eq 'block'); |
||||
return $text if ($c); |
||||
|
||||
$text .= $content; |
||||
$text .= "\n" if ($d eq 'block'); |
||||
|
||||
$text .= "</$tag>"; |
||||
$text .= "\n" if ($d eq 'block' or $d eq 'line'); |
||||
|
||||
return $text; |
||||
} |
||||
|
||||
1; |
Loading…
Reference in new issue