You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

107 lines
2.3 KiB

package Text::Dokuwiki::Render::Markdown;
use strict;
use warnings;
use utf8;
use base 'Text::Dokuwiki::Render';
sub _header {
my ($self, $tag, $attrs, $content) = @_;
my $title = $content;
utf8::decode($title);
my $text = $content . "\n";
$text .= (($tag eq 'h1') ? "=" : "-") x length($title);
$text .= "\n\n";
return $text;
}
sub h1 { my $self = shift; $self->_header('h1', @_); };
sub h2 { my $self = shift; $self->_header('h2', @_); };
sub h3 { my $self = shift; $self->_header('h3', @_); };
sub h4 { my $self = shift; $self->_header('h4', @_); };
sub h5 { my $self = shift; $self->_header('h5', @_); };
sub h6 { my $self = shift; $self->_header('h6', @_); };
sub div {
my ($self, $attrs, $content) = @_;
return $content;
}
sub br { return "\n"; };
sub ul {
my ($self, $attrs, $content) = @_;
$self->{list_depth} += 1;
my $text = $self->treewalk($content);
$self->{list_depth} -= 1;
return $text;
}
sub li {
my ($self, $attrs, $content) = @_;
my $text = " " x $self->{list_depth};
$text .= "* ";
$text .= $self->treewalk($content);
$text .= "\n";
return $text;
}
sub a {
my ($self, $attrs, $content) = @_;
return sprintf("[%s](%s)", $self->treewalk($content), $attrs->{href});
}
sub p {
my ($self, $attrs, $content) = @_;
return $self->treewalk($content) . "\n";
}
sub img {
my ($self, $attrs, $content) = @_;
my $title = ($attrs->{title}) ? qq( "$attrs->{title}") : "";
my $alt = $attrs->{alt} || $attrs->{title} || '';
return sprintf("![%s](%s%s)", $alt, $attrs->{src}, $title);
}
sub span {
my ($self, $attrs, $content) = @_;
return sprintf "``%s``", $content
if ($attrs->{'font-family'} and $attrs->{'font-family'} eq 'monospace');
$content = $self->treewalk($content);
return sprintf "__%s__", $content
if ($attrs->{'text-decoration'} and $attrs->{'text-decoration'} eq 'underline');
return sprintf "**%s**", $content
if ($attrs->{'font-weight'} and $attrs->{'font-weight'} eq 'bold');
return sprintf "//%s//", $content
if ($attrs->{'font-family'} and $attrs->{'font-family'} eq 'italic');
return $content;
}
sub sup {
my ($self, $attrs, $content) = @_;
return "<sup>" . $self->treewalk($content) . "</sup>";
}
sub blockquote {
my ($self, $attrs, $content) = @_;
my @out = map { "> $_\n" } split /\r?\n/, $content;
return join("\n", @out);
}
1;