]> git.mxchange.org Git - friendica.git/commitdiff
Refine BBCode::expandTags regular expression
authorHypolite Petovan <hypolite@mrpetovan.com>
Sun, 12 Sep 2021 04:06:14 +0000 (00:06 -0400)
committerHypolite Petovan <hypolite@mrpetovan.com>
Sun, 12 Sep 2021 04:06:14 +0000 (00:06 -0400)
- Now requires the tag to be preceded by either a non-word character or a start of a line
- Added corresponding tests

src/Content/Text/BBCode.php
tests/src/Content/Text/BBCodeTest.php

index 5a2b966dd57c2ce6501522409e111e84d9c263ed..4d495a72b5146ae2f31042714555d5e182f5ec57 100644 (file)
@@ -2289,14 +2289,14 @@ class BBCode
        }
 
        /**
-        * Expand tags to URLs
+        * Expand tags to URLs, checks the tag is at the start of a line or preceded by a non-word character
         *
         * @param string $body
         * @return string body with expanded tags
         */
        public static function expandTags(string $body)
        {
-               return preg_replace_callback("/([!#@])([^\^ \x0D\x0A,;:?\']*[^\^ \x0D\x0A,;:?!\'.])/",
+               return preg_replace_callback("/(?<=\W|^)([!#@])([^\^ \x0D\x0A,;:?'\"]*[^\^ \x0D\x0A,;:?!'\".])/",
                        function ($match) {
                                switch ($match[1]) {
                                        case '!':
@@ -2309,6 +2309,7 @@ class BBCode
                                                }
                                                break;
                                        case '#':
+                                       default:
                                                return $match[1] . '[url=' . 'https://' . DI::baseUrl() . '/search?tag=' . $match[2] . ']' . $match[2] . '[/url]';
                                }
                        }, $body);
index 2fcf5a5fa33882ad08292bfeeaba7bb95d928d4e..e2c4d928823f2782ab630628b2809870c5bebc5c 100644 (file)
@@ -75,6 +75,7 @@ class BBCodeTest extends MockedTest
                           ->andReturn($baseUrlMock);
                $baseUrlMock->shouldReceive('getHostname')->withNoArgs()->andReturn('friendica.local');
                $baseUrlMock->shouldReceive('getUrlPath')->withNoArgs()->andReturn('');
+               $baseUrlMock->shouldReceive('__toString')->withNoArgs()->andReturn('friendica.local');
 
                $config = \HTMLPurifier_HTML5Config::createDefault();
                $config->set('HTML.Doctype', 'HTML5');
@@ -339,4 +340,31 @@ class BBCodeTest extends MockedTest
 
                self::assertEquals($expected, $actual);
        }
+
+       public function dataExpandTags()
+       {
+               return [
+                       'bug-10692-non-word' => [
+                               '[url=https://github.com/friendica/friendica/blob/2021.09-rc/src/Util/Logger/StreamLogger.php#L160]https://github.com/friendica/friendica/blob/2021.09-rc/src/Util/Logger/StreamLogger.php#L160[/url]',
+                               '[url=https://github.com/friendica/friendica/blob/2021.09-rc/src/Util/Logger/StreamLogger.php#L160]https://github.com/friendica/friendica/blob/2021.09-rc/src/Util/Logger/StreamLogger.php#L160[/url]',
+                       ],
+                       'bug-10692-start-line' => [
+                               '#[url=https://friendica.local/search?tag=L160]L160[/url]',
+                               '#L160',
+                       ]
+               ];
+       }
+
+       /**
+        * @dataProvider dataExpandTags
+        *
+        * @param string $expected Expected BBCode output
+        * @param string $text     Input text
+        */
+       public function testExpandTags(string $expected, string $text)
+       {
+               $actual = BBCode::expandTags($text);
+
+               self::assertEquals($expected, $actual);
+       }
 }