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"));
 
 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;
 
                my $smiley=$1;
                my $file=$2;
 
@@ -48,7 +48,7 @@ sub sanitize (@) { #{{{
        
        $_=$params{content};
        return $_ unless length $smiley_regexp;
        
        $_=$params{content};
        return $_ unless length $smiley_regexp;
-       
+                       
 MATCH: while (m{(?:^|(?<=\s|>))(\\?)$smiley_regexp(?:(?=\s|<)|$)}g) {
                my $escape=$1;
                my $smiley=$2;
 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;
                }
                        # Reset pos back to where it was before this test.
                        pos=$pos;
                }
-
+       
                if ($escape) {
                        # Remove escape.
                        substr($_, $epos, 1)="";
                if ($escape) {
                        # Remove escape.
                        substr($_, $epos, 1)="";
+                       pos=$epos+1;
                }
                else {
                        # Replace the smiley with its expanded value.
                }
                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);
                }
                                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 $_;
        }
 
        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)
     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
 
   [ 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.
 
 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) {*}
 
 
 For example: {*} B) {*}