smiley escaping fixes
authorJoey Hess <joey@kodama.kitenet.net>
Thu, 17 Jul 2008 16:34:38 +0000 (12:34 -0400)
committerJoey Hess <joey@kodama.kitenet.net>
Thu, 17 Jul 2008 16:34:38 +0000 (12:34 -0400)
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
debian/changelog
doc/smileys.mdwn

index 51b32b28fa1a1a18823ef3fed6206b53c8faffb3..96d7f5900b2f0b109b89dc804db31a596c826edc 100644 (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 $_;
index 070f92a04fb31b596d752d01e88715d62a354dbf..c3a2632c938d11ab12184f2cacdf934cd4f84829 100644 (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
index 54ac53979b27324180f04d62ece427faf690f916..65d088326505bee4c3a40b6d9df74f2c37021267 100644 (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) {*}