aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJoey Hess <joey@kodama.kitenet.net>2008-07-17 12:34:38 -0400
committerJoey Hess <joey@kodama.kitenet.net>2008-07-17 12:34:38 -0400
commitdf3a8b183c4e6b50b05ba3c4514563619927c924 (patch)
treecf26a75910f51a0297c8d23cf758b1b38babc536
parent4bc6f6cb961232dc1b30224e1c7fc875f3bc65f4 (diff)
downloadikiwiki-df3a8b183c4e6b50b05ba3c4514563619927c924.tar
ikiwiki-df3a8b183c4e6b50b05ba3c4514563619927c924.tar.gz
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`.
-rw-r--r--IkiWiki/Plugin/smiley.pm11
-rw-r--r--debian/changelog3
-rw-r--r--doc/smileys.mdwn78
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) {*}