diff options
Diffstat (limited to 'IkiWiki')
-rw-r--r-- | IkiWiki/Plugin/smiley.pm | 34 |
1 files changed, 15 insertions, 19 deletions
diff --git a/IkiWiki/Plugin/smiley.pm b/IkiWiki/Plugin/smiley.pm index 7e0b54499..fcf3048b2 100644 --- a/IkiWiki/Plugin/smiley.pm +++ b/IkiWiki/Plugin/smiley.pm @@ -41,36 +41,32 @@ sub filter (@) { #{{{ return $_ unless length $smiley_regexp; MATCH: while (m{(?:^|(?<=\s))(\\?)$smiley_regexp(?:(?=\s)|$)}g) { + my $escape=$1; + my $smiley=$2; + # Smilies are not allowed inside <pre> or <code>. - # For each tag in turn, match forward to find <tag> or - # </tag>. If it's </tag>, then the smiley is inside the - # tag, and is not expanded. If it's <tag>, the smiley is - # outside the block. + # For each tag in turn, match forward to find the next <tag> + # or </tag> after the smiley. my $pos=pos; foreach my $tag ("pre", "code") { - if (m/.*?<(\/)?\s*$tag\s*>/isg) { - if (defined $1) { - # Inside tag, so do nothing. - # (Smiley hunting will continue after - # the tag.) - next MATCH; - } - else { - # Reset pos back to where it was before - # this test. - pos=$pos; - } + if (m/.*?<(\/)?\s*$tag\s*>/isg && defined $1) { + # </tag> found first, so the smiley is + # inside the tag, so do not expand it. + next MATCH; } + # Reset pos back to where it was before this test. + pos=$pos; } - if ($1) { + if ($escape) { # Remove escape. substr($_, $-[1], 1)=""; } else { # Replace the smiley with its expanded value. - substr($_, $-[2], length($2))= - htmllink($params{page}, $params{destpage}, $smileys{$2}, linktext => $2); + substr($_, $-[2], length($smiley))= + htmllink($params{page}, $params{destpage}, + $smileys{$smiley}, linktext => $smiley); } } |