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 () { #{{{
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 $file=$2;
@ -48,7 +48,7 @@ sub sanitize (@) { #{{{
$_=$params{content};
return $_ unless length $smiley_regexp;
MATCH: while (m{(?:^|(?<=\s|>))(\\?)$smiley_regexp(?:(?=\s|<)|$)}g) {
my $escape=$1;
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.
pos=$pos;
}
if ($escape) {
# Remove escape.
substr($_, $epos, 1)="";
pos=$epos+1;
}
else {
# Replace the smiley with its expanded value.
@ -79,6 +80,10 @@ MATCH: while (m{(?:^|(?<=\s|>))(\\?)$smiley_regexp(?:(?=\s|<)|$)}g) {
htmllink($params{page}, $params{destpage},
$smileys{$smiley}, linktext => $smiley);
}
# Breaks out at end, otherwise it will scan through again,
# replacing de-escaped ones.
last unless defined pos;
}
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.
* parentlinks: New plugin, split out of ikiwiki core and enabled by default,
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 ]
* 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.
Just write the text of a smiley to display it.
* \:) [[smileys/smile.png]]
* \:-) [[smileys/smile.png]]
* \:D [[smileys/biggrin.png]]
* \:-D [[smileys/biggrin.png]]
* \B) [[smileys/smile2.png]]
* \B-) [[smileys/smile2.png]]
* \:)) [[smileys/smile3.png]]
* \:-)) [[smileys/smile3.png]]
* \;) [[smileys/smile4.png]]
* \;-) [[smileys/smile4.png]]
* \:\ [[smileys/ohwell.png]]
* \:-\ [[smileys/ohwell.png]]
* \:/ [[smileys/ohwell.png]]
* \:-/ [[smileys/ohwell.png]]
* \:| [[smileys/neutral.png]]
* \:-| [[smileys/neutral.png]]
* \>:> [[smileys/devil.png]]
* \X-( [[smileys/angry.png]]
* \<:( [[smileys/frown.png]]
* \:( [[smileys/sad.png]]
* \:-( [[smileys/sad.png]]
* \:-? [[smileys/tongue.png]]
* \:-P [[smileys/tongue.png]]
* \:o [[smileys/redface.png]]
* \|) [[smileys/tired.png]]
* \|-) [[smileys/tired.png]]
* \{OK} [[smileys/thumbs-up.png]]
* \{X} [[smileys/icon-error.png]]
* \{i} [[smileys/icon-info.png]]
* \(./) [[smileys/checkmark.png]]
* \(!) [[smileys/idea.png]]
* \[!] [[smileys/attention.png]]
* \/!\ [[smileys/alert.png]]
* \(?) [[smileys/question.png]]
* \{*} [[smileys/star_on.png]]
* \{o} [[smileys/star_off.png]]
* \{1} [[smileys/prio1.png]]
* \{2} [[smileys/prio2.png]]
* \{3} [[smileys/prio3.png]]
* \\:) [[smileys/smile.png]]
* \\:-) [[smileys/smile.png]]
* \\:D [[smileys/biggrin.png]]
* \\:-D [[smileys/biggrin.png]]
* \\B) [[smileys/smile2.png]]
* \\B-) [[smileys/smile2.png]]
* \\:)) [[smileys/smile3.png]]
* \\:-)) [[smileys/smile3.png]]
* \\;) [[smileys/smile4.png]]
* \\;-) [[smileys/smile4.png]]
* \\:\ [[smileys/ohwell.png]]
* \\:-\ [[smileys/ohwell.png]]
* \\:/ [[smileys/ohwell.png]]
* \\:-/ [[smileys/ohwell.png]]
* \\:| [[smileys/neutral.png]]
* \\:-| [[smileys/neutral.png]]
* \\>:> [[smileys/devil.png]]
* \\X-( [[smileys/angry.png]]
* \\<:( [[smileys/frown.png]]
* \\:( [[smileys/sad.png]]
* \\:-( [[smileys/sad.png]]
* \\:-? [[smileys/tongue.png]]
* \\:-P [[smileys/tongue.png]]
* \\:o [[smileys/redface.png]]
* \\|) [[smileys/tired.png]]
* \\|-) [[smileys/tired.png]]
* \\{OK} [[smileys/thumbs-up.png]]
* \\{X} [[smileys/icon-error.png]]
* \\{i} [[smileys/icon-info.png]]
* \\(./) [[smileys/checkmark.png]]
* \\(!) [[smileys/idea.png]]
* \\[!] [[smileys/attention.png]]
* \\/!\ [[smileys/alert.png]]
* \\(?) [[smileys/question.png]]
* \\{*} [[smileys/star_on.png]]
* \\{o} [[smileys/star_off.png]]
* \\{1} [[smileys/prio1.png]]
* \\{2} [[smileys/prio2.png]]
* \\{3} [[smileys/prio3.png]]
For example: {*} B) {*}