Move autolinker execution earlier in BBCode::convert
authorHypolite Petovan <hypolite@mrpetovan.com>
Thu, 26 Sep 2019 00:25:42 +0000 (20:25 -0400)
committerHypolite Petovan <hypolite@mrpetovan.com>
Thu, 26 Sep 2019 00:39:04 +0000 (20:39 -0400)
- Prevents already replaced HTML links (like in [audio] tag) to be doubled
- Add test for it

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

index 02c9551..c5f9986 100644 (file)
@@ -1466,6 +1466,11 @@ class BBCode extends BaseObject
 
                $text = str_replace('[hr]', '<hr />', $text);
 
+               if (!$for_plaintext) {
+                       // Autolinker for isolated URLs
+                       $text = preg_replace(Strings::autoLinkRegEx(), '[url]$1[/url]', $text);
+               }
+
                // This is actually executed in Item::prepareBody()
 
                $nosmile = strpos($text, '[nosmile]') !== false;
@@ -1648,9 +1653,7 @@ class BBCode extends BaseObject
                        $text = Smilies::replace($text);
                }
 
-               // if the HTML is used to generate plain text, then don't do this search, but replace all URL of that kind to text
                if (!$for_plaintext) {
-                       $text = preg_replace(Strings::autoLinkRegEx(), '[url]$1[/url]', $text);
                        if (in_array($simple_html, [7, 9])) {
                                $text = preg_replace_callback("/\[url\](.*?)\[\/url\]/ism", 'self::convertUrlForOStatusCallback', $text);
                                $text = preg_replace_callback("/\[url\=(.*?)\](.*?)\[\/url\]/ism", 'self::convertUrlForOStatusCallback', $text);
index 3d8beb3..1ff653d 100644 (file)
@@ -179,41 +179,48 @@ class BBCodeTest extends MockedTest
                        'bug-2199-named-size' => [
                                'expectedHtml' => '<span style="font-size: xx-large; line-height: initial;">Test text</span>',
                                'text' => '[size=xx-large]Test text[/size]',
-                               'simpleHtml' => 0,
                        ],
                        'bug-2199-numeric-size' => [
                                'expectedHtml' => '<span style="font-size: 24px; line-height: initial;">Test text</span>',
                                'text' => '[size=24]Test text[/size]',
-                               'simpleHtml' => 0,
                        ],
                        'bug-2199-diaspora-no-named-size' => [
                                'expectedHtml' => 'Test text',
                                'text' => '[size=xx-large]Test text[/size]',
+                               'try_oembed' => false,
                                // Triggers the diaspora compatible output
                                'simpleHtml' => 3,
                        ],
                        'bug-2199-diaspora-no-numeric-size' => [
                                'expectedHtml' => 'Test text',
                                'text' => '[size=24]Test text[/size]',
+                               'try_oembed' => false,
                                // Triggers the diaspora compatible output
                                'simpleHtml' => 3,
                        ],
+                       'bug-7665-audio-tag' => [
+                               'expectedHtml' => '<audio src="http://www.cendrones.fr/colloque2017/jonathanbocquet.mp3" controls="controls"><a href="http://www.cendrones.fr/colloque2017/jonathanbocquet.mp3">http://www.cendrones.fr/colloque2017/jonathanbocquet.mp3</a></audio>',
+                               'text' => '[audio]http://www.cendrones.fr/colloque2017/jonathanbocquet.mp3[/audio]',
+                               'try_oembed' => true,
+                       ],
                ];
        }
 
        /**
         * Test convert bbcodes to HTML
+        *
         * @dataProvider dataBBCodes
         *
         * @param string $expectedHtml Expected HTML output
         * @param string $text         BBCode text
+        * @param bool   $try_oembed   Whether to convert multimedia BBCode tag
         * @param int    $simpleHtml   BBCode::convert method $simple_html parameter value, optional.
         * @param bool   $forPlaintext BBCode::convert method $for_plaintext parameter value, optional.
         * @throws \Friendica\Network\HTTPException\InternalServerErrorException
         */
-       public function testConvert($expectedHtml, $text, $simpleHtml = 0, $forPlaintext = false)
+       public function testConvert($expectedHtml, $text, $try_oembed = false, $simpleHtml = 0, $forPlaintext = false)
        {
-               $actual = BBCode::convert($text, false, $simpleHtml, $forPlaintext);
+               $actual = BBCode::convert($text, $try_oembed, $simpleHtml, $forPlaintext);
 
                $this->assertEquals($expectedHtml, $actual);
        }