smiley escaping fixes

Smileys need to be double-escaped to work, since the smiley plugin runs as
a sanitize hook, and markdown helpfully removes one level of escapes first.

There were some bugs in the smiley handling code that made escaped smileys
still be expanded. After unescaping a smiley, it needed to move pos forward
past it or the next pass would expand it.

Also, once the m//g got to the end, it seemed to loop back through and make
one more pass (a difference in perl 5.10's regexp exngine? I observed that
pos was undefined when this happened, so added a `last unless defined pos`.
master
Joey Hess 2008-07-17 12:34:38 -04:00
parent 4bc6f6cb96
commit df3a8b183c
3 changed files with 50 additions and 42 deletions

View File

@ -15,7 +15,7 @@ sub import { #{{{
sub build_regexp () { #{{{ sub build_regexp () { #{{{
my $list=readfile(srcfile("smileys.mdwn")); my $list=readfile(srcfile("smileys.mdwn"));
while ($list =~ m/^\s*\*\s+\\([^\s]+)\s+\[\[([^]]+)\]\]/mg) { while ($list =~ m/^\s*\*\s+\\\\([^\s]+)\s+\[\[([^]]+)\]\]/mg) {
my $smiley=$1; my $smiley=$1;
my $file=$2; my $file=$2;
@ -48,7 +48,7 @@ sub sanitize (@) { #{{{
$_=$params{content}; $_=$params{content};
return $_ unless length $smiley_regexp; return $_ unless length $smiley_regexp;
MATCH: while (m{(?:^|(?<=\s|>))(\\?)$smiley_regexp(?:(?=\s|<)|$)}g) { MATCH: while (m{(?:^|(?<=\s|>))(\\?)$smiley_regexp(?:(?=\s|<)|$)}g) {
my $escape=$1; my $escape=$1;
my $smiley=$2; my $smiley=$2;
@ -68,10 +68,11 @@ MATCH: while (m{(?:^|(?<=\s|>))(\\?)$smiley_regexp(?:(?=\s|<)|$)}g) {
# Reset pos back to where it was before this test. # Reset pos back to where it was before this test.
pos=$pos; pos=$pos;
} }
if ($escape) { if ($escape) {
# Remove escape. # Remove escape.
substr($_, $epos, 1)=""; substr($_, $epos, 1)="";
pos=$epos+1;
} }
else { else {
# Replace the smiley with its expanded value. # Replace the smiley with its expanded value.
@ -79,6 +80,10 @@ MATCH: while (m{(?:^|(?<=\s|>))(\\?)$smiley_regexp(?:(?=\s|<)|$)}g) {
htmllink($params{page}, $params{destpage}, htmllink($params{page}, $params{destpage},
$smileys{$smiley}, linktext => $smiley); $smileys{$smiley}, linktext => $smiley);
} }
# Breaks out at end, otherwise it will scan through again,
# replacing de-escaped ones.
last unless defined pos;
} }
return $_; return $_;

3
debian/changelog vendored
View File

@ -23,6 +23,9 @@ ikiwiki (2.54) UNRELEASED; urgency=low
and todo items from the html shipped in it. and todo items from the html shipped in it.
* parentlinks: New plugin, split out of ikiwiki core and enabled by default, * parentlinks: New plugin, split out of ikiwiki core and enabled by default,
and several new fields added to allow for advanced styling. (intrigeri) and several new fields added to allow for advanced styling. (intrigeri)
* smileys: Some fixes for escaped smileys.
* smileys: Note that smileys need to be double-escaped for the escaping to
work. Markdown removes one level of escaping.
[ Simon McVittie ] [ Simon McVittie ]
* meta, inline: Support guid options, to allow forcing a particular url or * meta, inline: Support guid options, to allow forcing a particular url or

View File

@ -1,45 +1,45 @@
This page is used to control what smileys are supported by the wiki. This page is used to control what smileys are supported by the wiki.
Just write the text of a smiley to display it. Just write the text of a smiley to display it.
* \:) [[smileys/smile.png]] * \\:) [[smileys/smile.png]]
* \:-) [[smileys/smile.png]] * \\:-) [[smileys/smile.png]]
* \:D [[smileys/biggrin.png]] * \\:D [[smileys/biggrin.png]]
* \:-D [[smileys/biggrin.png]] * \\:-D [[smileys/biggrin.png]]
* \B) [[smileys/smile2.png]] * \\B) [[smileys/smile2.png]]
* \B-) [[smileys/smile2.png]] * \\B-) [[smileys/smile2.png]]
* \:)) [[smileys/smile3.png]] * \\:)) [[smileys/smile3.png]]
* \:-)) [[smileys/smile3.png]] * \\:-)) [[smileys/smile3.png]]
* \;) [[smileys/smile4.png]] * \\;) [[smileys/smile4.png]]
* \;-) [[smileys/smile4.png]] * \\;-) [[smileys/smile4.png]]
* \:\ [[smileys/ohwell.png]] * \\:\ [[smileys/ohwell.png]]
* \:-\ [[smileys/ohwell.png]] * \\:-\ [[smileys/ohwell.png]]
* \:/ [[smileys/ohwell.png]] * \\:/ [[smileys/ohwell.png]]
* \:-/ [[smileys/ohwell.png]] * \\:-/ [[smileys/ohwell.png]]
* \:| [[smileys/neutral.png]] * \\:| [[smileys/neutral.png]]
* \:-| [[smileys/neutral.png]] * \\:-| [[smileys/neutral.png]]
* \>:> [[smileys/devil.png]] * \\>:> [[smileys/devil.png]]
* \X-( [[smileys/angry.png]] * \\X-( [[smileys/angry.png]]
* \<:( [[smileys/frown.png]] * \\<:( [[smileys/frown.png]]
* \:( [[smileys/sad.png]] * \\:( [[smileys/sad.png]]
* \:-( [[smileys/sad.png]] * \\:-( [[smileys/sad.png]]
* \:-? [[smileys/tongue.png]] * \\:-? [[smileys/tongue.png]]
* \:-P [[smileys/tongue.png]] * \\:-P [[smileys/tongue.png]]
* \:o [[smileys/redface.png]] * \\:o [[smileys/redface.png]]
* \|) [[smileys/tired.png]] * \\|) [[smileys/tired.png]]
* \|-) [[smileys/tired.png]] * \\|-) [[smileys/tired.png]]
* \{OK} [[smileys/thumbs-up.png]] * \\{OK} [[smileys/thumbs-up.png]]
* \{X} [[smileys/icon-error.png]] * \\{X} [[smileys/icon-error.png]]
* \{i} [[smileys/icon-info.png]] * \\{i} [[smileys/icon-info.png]]
* \(./) [[smileys/checkmark.png]] * \\(./) [[smileys/checkmark.png]]
* \(!) [[smileys/idea.png]] * \\(!) [[smileys/idea.png]]
* \[!] [[smileys/attention.png]] * \\[!] [[smileys/attention.png]]
* \/!\ [[smileys/alert.png]] * \\/!\ [[smileys/alert.png]]
* \(?) [[smileys/question.png]] * \\(?) [[smileys/question.png]]
* \{*} [[smileys/star_on.png]] * \\{*} [[smileys/star_on.png]]
* \{o} [[smileys/star_off.png]] * \\{o} [[smileys/star_off.png]]
* \{1} [[smileys/prio1.png]] * \\{1} [[smileys/prio1.png]]
* \{2} [[smileys/prio2.png]] * \\{2} [[smileys/prio2.png]]
* \{3} [[smileys/prio3.png]] * \\{3} [[smileys/prio3.png]]
For example: {*} B) {*} For example: {*} B) {*}