From 92655603877e0743516b2218cf67cb011afcc7b5 Mon Sep 17 00:00:00 2001
From: Andreas Gohr <andi@splitbrain.org>
Date: Sat, 11 Oct 2008 20:47:17 +0200
Subject: [PATCH] recognize smileys with proper boundaries only FS#1489

darcs-hash:20081011184717-7ad00-0f910f4d061e00ccfdf722a3f971656da1b7979b.gz
---
 .../inc/parser/parser_replacements.test.php   | 66 +++++++++++++++----
 inc/parser/parser.php                         |  2 +-
 2 files changed, 56 insertions(+), 12 deletions(-)

diff --git a/_test/cases/inc/parser/parser_replacements.test.php b/_test/cases/inc/parser/parser_replacements.test.php
index efd20f397..1534f9ce8 100644
--- a/_test/cases/inc/parser/parser_replacements.test.php
+++ b/_test/cases/inc/parser/parser_replacements.test.php
@@ -59,18 +59,32 @@ class TestOfDoku_Parser_Replacements extends TestOfDoku_Parser {
         $this->assertEqual(array_map('stripbyteindex',$this->H->calls),$calls);
 
     }
-    //
 
-    function testSingleSmiley() {
+    function testSingleSmileyFail() {
         $this->P->addMode('smiley',new Doku_Parser_Mode_Smiley(array(':-)')));
         $this->P->parse('abc:-)xyz');
 
         $calls = array (
             array('document_start',array()),
             array('p_open',array()),
-            array('cdata',array("\n".'abc')),
+            array('cdata',array("\nabc:-)xyz\n")),
+            array('p_close',array()),
+            array('document_end',array()),
+        );
+
+        $this->assertEqual(array_map('stripbyteindex',$this->H->calls),$calls);
+    }
+
+    function testSingleSmiley() {
+        $this->P->addMode('smiley',new Doku_Parser_Mode_Smiley(array(':-)')));
+        $this->P->parse('abc :-) xyz');
+
+        $calls = array (
+            array('document_start',array()),
+            array('p_open',array()),
+            array('cdata',array("\n".'abc ')),
             array('smiley',array(':-)')),
-            array('cdata',array('xyz'."\n")),
+            array('cdata',array(' xyz'."\n")),
             array('p_close',array()),
             array('document_end',array()),
         );
@@ -78,37 +92,67 @@ class TestOfDoku_Parser_Replacements extends TestOfDoku_Parser {
         $this->assertEqual(array_map('stripbyteindex',$this->H->calls),$calls);
     }
 
-    function testMultipleSmileys() {
+    function testMultipleSmileysFail() {
         $this->P->addMode('smiley',new Doku_Parser_Mode_Smiley(array(':-)','^_^')));
         $this->P->parse('abc:-)x^_^yz');
 
         $calls = array (
             array('document_start',array()),
             array('p_open',array()),
-            array('cdata',array("\n".'abc')),
+            array('cdata',array("\nabc:-)x^_^yz\n")),
+            array('p_close',array()),
+            array('document_end',array()),
+        );
+
+        $this->assertEqual(array_map('stripbyteindex',$this->H->calls),$calls);
+    }
+
+    function testMultipleSmileys() {
+        $this->P->addMode('smiley',new Doku_Parser_Mode_Smiley(array(':-)','^_^')));
+        $this->P->parse('abc :-) x ^_^ yz');
+
+        $calls = array (
+            array('document_start',array()),
+            array('p_open',array()),
+            array('cdata',array("\n".'abc ')),
             array('smiley',array(':-)')),
-            array('cdata',array('x')),
+            array('cdata',array(' x ')),
             array('smiley',array('^_^')),
-            array('cdata',array('yz'."\n")),
+            array('cdata',array(' yz'."\n")),
             array('p_close',array()),
             array('document_end',array()),
         );
 
         $this->assertEqual(array_map('stripbyteindex',$this->H->calls),$calls);
+    }
+
+    function testBackslashSmileyFail() {
+        // This smiley is really :-\\ but escaping makes like interesting
+        $this->P->addMode('smiley',new Doku_Parser_Mode_Smiley(array(':-\\\\')));
+        $this->P->parse('abc:-\\\xyz');
+
+        $calls = array (
+            array('document_start',array()),
+            array('p_open',array()),
+            array('cdata',array("\nabc".':-\\\\'."xyz\n")),
+            array('p_close',array()),
+            array('document_end',array()),
+        );
 
+        $this->assertEqual(array_map('stripbyteindex',$this->H->calls),$calls);
     }
 
     function testBackslashSmiley() {
         // This smiley is really :-\\ but escaping makes like interesting
         $this->P->addMode('smiley',new Doku_Parser_Mode_Smiley(array(':-\\\\')));
-        $this->P->parse('abc:-\\\xyz');
+        $this->P->parse('abc :-\\\ xyz');
 
         $calls = array (
             array('document_start',array()),
             array('p_open',array()),
-            array('cdata',array("\n".'abc')),
+            array('cdata',array("\n".'abc ')),
             array('smiley',array(':-\\\\')),
-            array('cdata',array('xyz'."\n")),
+            array('cdata',array(' xyz'."\n")),
             array('p_close',array()),
             array('document_end',array()),
         );
diff --git a/inc/parser/parser.php b/inc/parser/parser.php
index 37da712cc..58c0c4623 100644
--- a/inc/parser/parser.php
+++ b/inc/parser/parser.php
@@ -652,7 +652,7 @@ class Doku_Parser_Mode_smiley extends Doku_Parser_Mode {
 
         $sep = '';
         foreach ( $this->smileys as $smiley ) {
-            $this->pattern .= $sep.Doku_Lexer_Escape($smiley);
+            $this->pattern .= $sep.'(?<=\W)'.Doku_Lexer_Escape($smiley).'(?=\W)';
             $sep = '|';
         }
     }
-- 
GitLab