From df3a8b183c4e6b50b05ba3c4514563619927c924 Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Thu, 17 Jul 2008 12:34:38 -0400 Subject: [PATCH] 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`. --- IkiWiki/Plugin/smiley.pm | 11 ++++-- debian/changelog | 3 ++ doc/smileys.mdwn | 78 ++++++++++++++++++++-------------------- 3 files changed, 50 insertions(+), 42 deletions(-) diff --git a/IkiWiki/Plugin/smiley.pm b/IkiWiki/Plugin/smiley.pm index 51b32b28f..96d7f5900 100644 --- a/IkiWiki/Plugin/smiley.pm +++ b/IkiWiki/Plugin/smiley.pm @@ -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 $_; diff --git a/debian/changelog b/debian/changelog index 070f92a04..c3a2632c9 100644 --- a/debian/changelog +++ b/debian/changelog @@ -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 diff --git a/doc/smileys.mdwn b/doc/smileys.mdwn index 54ac53979..65d088326 100644 --- a/doc/smileys.mdwn +++ b/doc/smileys.mdwn @@ -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) {*} -- 2.26.2