Browse Source

* Text::Dokuwiki::Parser : 'given/when' still experimental

master
Alex 'AdUser' Z 10 years ago
parent
commit
2006bfb204
  1. 100
      lib/Text/Dokuwiki/Parser.pm

100
lib/Text/Dokuwiki/Parser.pm

@ -262,72 +262,58 @@ sub parse {
($buf, $mode, $attrs) = ('', '', {});
}
given ($line) {
# macro
when (m/~~NO(TOC|CACHE)~~/) {
next; # ignore
}
# macro
if ($line =~ m/~~NO(TOC|CACHE)~~/) {
next; # ignore
} elsif ($line =~ m/^\s?(={2,6}) (.+) \g{1}\s*/o) {
# header
when (m/^\s?(={2,6}) (.+) \g{1}\s*/o) {
my $level = $1 =~ tr/=/=/;
$level = 7 - $level; # invert
push @tree, ["h$level" => {}, $2];
next;
}
my $level = $1 =~ tr/=/=/;
$level = 7 - $level; # invert
push @tree, ["h$level" => {}, $2];
next;
} elsif ($line =~ m/^\s?<(code|file)(?:\s+(\S+)\s+(\S+))?>\s*$/o) {
# code/file block
when (m/^\s?<(code|file)(?:\s+(\S+)\s+(\S+))?>\s*$/o) {
$mode = "block/$1";
$attrs = ($2) ? {class => $2, file => $3} : {};
next;
}
$mode = "block/$1";
$attrs = ($2) ? {class => $2, file => $3} : {};
next;
} elsif ($line =~ m/\s?<nowiki>/o) {
# nowiki block
when (m/\s?<nowiki>/o) {
$mode = "block/nowiki";
next;
}
$mode = "block/nowiki";
next;
} elsif ($line = m/^(\s{2})+([\*-])\s+(.+)/o) {
# lists
when (m/^(\s{2})+([\*-])\s+(.+)/o) {
$mode = 'list';
$buf = [];
push @{ $buf }, $line;
next;
}
$mode = 'list';
$buf = [];
push @{ $buf }, $line;
next;
} elsif ($line = m/^\s?(>)+\s*(.+)/o) {
# quotes
when (m/^\s?(>)+\s*(.+)/o) {
my $level = $1 =~ tr/>/>/;
push @tree, [blockquote => {level => $level}, $2];
next;
}
my $level = $1 =~ tr/>/>/;
push @tree, [blockquote => {level => $level}, $2];
next;
} elsif ($line = m/^\s?[\|\^]/o) {
# table
when (m/^\s?[\|\^]/o) {
$mode = 'table';
$buf = [];
push @{ $buf }, $line;
next;
}
$mode = 'table';
$buf = [];
push @{ $buf }, $line;
next;
} elsif ($line = m/^\s{2}(\S.+)/o) {
# code idented with two spaces
when (m/^\s{2}(\S.+)/o) {
$mode = 'code';
$buf = $line . "\n";
next;
}
$mode = 'code';
$buf = $line . "\n";
next;
} elsif ($line =~ m/^\s?(\S.+)/o) {
# nonempty line
when (m/^\s?(\S.+)/o) {
push @tree, [p => {}, $self->_parse_text($1)];
next;
}
# empty lines;
when (m/^\s*$/) {
push @tree, [br => {}];
$mode = '';
next;
}
# catchall
default {
printf "Unmatched % 3d: %s\n", $linenum, $line;
continue;
}
push @tree, [p => {}, $self->_parse_text($1)];
next;
} elsif ($line =~ m/^\s*$/o) {
# empty lines
push @tree, [br => {}];
$mode = '';
next;
}
# catchall
printf "Unmatched % 3d: %s\n", $linenum, $line;
}
return [div => {}, @tree ];

Loading…
Cancel
Save