diff --git a/src/Content/Text/BBCode.php b/src/Content/Text/BBCode.php index 85466b50f..2c324a433 100644 --- a/src/Content/Text/BBCode.php +++ b/src/Content/Text/BBCode.php @@ -1275,20 +1275,15 @@ class BBCode extends BaseObject ( # Capture 1: entire matched URL https?:// # http or https protocol (?: - www\d{0,3}[.] # "www.", "www1.", "www2." … "www999." - | # or - [a-z0-9.\-]+[.][a-z]{2,4}/ # looks like domain name followed by a slash + [^/.][^/]+[.][^/]+/? # looks like domain name followed by a slash ) (?: # One or more: [^\s()<>]+ # Run of non-space, non-()<> | # or \(([^\s()<>]+|(\([^\s()<>]+\)))*\) # balanced parens, up to 2 levels - )+ - (?: # End with: - \(([^\s()<>]+|(\([^\s()<>]+\)))*\) # balanced parens, up to 2 levels | # or [^\s`!()\[\]{};:\'".,<>?«»“”‘’] # not a space or one of these punct chars - ) + )* )@'; $text = preg_replace($autolink_regex, '[url]$1[/url]', $text); if ($simple_html == 7) { diff --git a/tests/src/Content/Text/BBCodeTest.php b/tests/src/Content/Text/BBCodeTest.php new file mode 100644 index 000000000..f155eeee3 --- /dev/null +++ b/tests/src/Content/Text/BBCodeTest.php @@ -0,0 +1,111 @@ +setUpVfsDir(); + $this->mockApp($this->root); + $this->app->videowidth = 425; + $this->app->videoheight = 350; + $this->configMock->shouldReceive('get') + ->with('system', 'remove_multiplicated_lines') + ->andReturn(false); + $this->configMock->shouldReceive('get') + ->with('system', 'no_oembed') + ->andReturn(false); + $this->configMock->shouldReceive('get') + ->with('system', 'allowed_link_protocols') + ->andReturn(null); + $this->configMock->shouldReceive('get') + ->with('system', 'itemcache_duration') + ->andReturn(-1); + $this->mockL10nT(); + } + + public function dataLinks() + { + return [ + /** @see https://github.com/friendica/friendica/issues/2487 */ + 'bug-2487-1' => [ + 'data' => 'https://de.wikipedia.org/wiki/Juha_Sipilä', + 'assertHTML' => true, + ], + 'bug-2487-2' => [ + 'data' => 'https://de.wikipedia.org/wiki/Dnepr_(Motorradmarke)', + 'assertHTML' => true, + ], + 'bug-2487-3' => [ + 'data' => 'https://friendica.wäckerlin.ch/friendica', + 'assertHTML' => true, + ], + 'bug-2487-4' => [ + 'data' => 'https://mastodon.social/@morevnaproject', + 'assertHTML' => true, + ], + /** @see https://github.com/friendica/friendica/issues/5795 */ + 'bug-5795' => [ + 'data' => 'https://social.nasqueron.org/@liw/100798039015010628', + 'assertHTML' => true, + ], + /** @see https://github.com/friendica/friendica/issues/6095 */ + 'bug-6095' => [ + 'data' => 'https://en.wikipedia.org/wiki/Solid_(web_decentralization_project)', + 'assertHTML' => true, + ], + 'no-protocol' => [ + 'data' => 'example.com/path', + 'assertHTML' => false + ], + 'wrong-protocol' => [ + 'data' => 'ftp://example.com', + 'assertHTML' => false + ], + 'wrong-domain-without-path' => [ + 'data' => 'http://example', + 'assertHTML' => false + ], + 'wrong-domain-with-path' => [ + 'data' => 'http://example/path', + 'assertHTML' => false + ], + ]; + } + + /** + * Test convert different links inside a text + * @dataProvider dataLinks + * + * @param string $data The data to text + * @param bool $assertHTML True, if the link is a HTML link (...) + * @throws \Friendica\Network\HTTPException\InternalServerErrorException + */ + public function testAutoLinking($data, $assertHTML) + { + $output = BBCode::convert($data); + if ($assertHTML) { + $assert = '' . $data . ''; + } else { + $assert = $data; + } + + $this->assertEquals($assert, $output); + } +} \ No newline at end of file