smiley: Detect smileys inside pre and tags, and do not expand.

master
Joey Hess 2008-03-21 02:43:20 -04:00
parent 628467125c
commit 44824dba1b
5 changed files with 51 additions and 7 deletions

View File

@ -34,13 +34,47 @@ sub build_regexp () { #{{{
sub filter (@) { #{{{ sub filter (@) { #{{{
my %params=@_; my %params=@_;
build_regexp() unless defined $smiley_regexp;
$params{content} =~ s{(?:^|(?<=\s))(\\?)$smiley_regexp(?:(?=\s)|$)}{
$1 ? $2 : htmllink($params{page}, $params{destpage}, $smileys{$2}, linktext => $2)
}egs if length $smiley_regexp;
return $params{content}; build_regexp() unless defined $smiley_regexp;
$_=$params{content};
return $_ unless length $smiley_regexp;
MATCH: while (m{(?:^|(?<=\s))(\\?)$smiley_regexp(?:(?=\s)|$)}g) {
# 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.
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 ($1) {
# 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);
}
}
return $_;
} # }}} } # }}}
1 1

1
debian/changelog vendored
View File

@ -55,6 +55,7 @@ ikiwiki (2.41) UNRELEASED; urgency=low
* Store userinfo in network byte order for easy portability. * Store userinfo in network byte order for easy portability.
(Old files will be automatically converted.) (Old files will be automatically converted.)
* Close meta tag for redir properly. * Close meta tag for redir properly.
* smiley: Detect smileys inside pre and tags, and do not expand.
-- martin f. krafft <madduck@debian.org> Sun, 02 Mar 2008 17:46:38 +0100 -- martin f. krafft <madduck@debian.org> Sun, 02 Mar 2008 17:46:38 +0100

View File

@ -13,7 +13,7 @@ plugin which end up wrapped in a `<pre>` tag in the inline diff output.
`<img>` tags is not allowed within a `<pre>` block. Maybe the smiley `<img>` tags is not allowed within a `<pre>` block. Maybe the smiley
plugin should be disabled on [[RecentChanges]]? plugin should be disabled on [[RecentChanges]]?
> See [[Smileys_in_the_block_code]] --[[Joey]] > See [[Smileys_in_the_block_code]], which is now fixed. --[[Joey]]
See the [validator output][validate] for more details. See the [validator output][validate] for more details.
@ -51,4 +51,6 @@ after installing the most recent version of Text::Markdown from CPAN.
Note that the above patch for the redirect tag is still applicable and Note that the above patch for the redirect tag is still applicable and
the smiley issue remains open. --[[JasonBlevins]] the smiley issue remains open. --[[JasonBlevins]]
> This bug is [[done]], all issues are fixed. --[[Joey]]
[[tag patch]] [[tag patch]]

View File

@ -29,3 +29,6 @@ BTW, maybe converting smileys in the block code should be disabled at all?
> Looks similar to [[wiki_links_still_processed_inside_code_blocks]]; in both > Looks similar to [[wiki_links_still_processed_inside_code_blocks]]; in both
> cases, substitution happens in a code block, which it shouldn't. > cases, substitution happens in a code block, which it shouldn't.
> --[[JoshTriplett]] > --[[JoshTriplett]]
> [[fixed|done]], via some super duper regexp fun to notice if the smiley
> is inside a pre or code tag. --[[Joey]]

View File

@ -41,3 +41,7 @@ and have it render like:
> >
> In the case of either bug, no, I don't have an idea of a solution yet. > In the case of either bug, no, I don't have an idea of a solution yet.
> --[[Joey]] > --[[Joey]]
> I've now solved a similar bug involving the smiley plugin. The code used
> there should give some strong hints how to fix this bug, though I haven't
> tried to apply the method yet. --[[Joey]]