From fd08b50a80c3aed25f9e2a19cbfe9fb3ad35cf1f Mon Sep 17 00:00:00 2001 From: ArthurHoaro Date: Tue, 7 Nov 2017 20:23:58 +0100 Subject: [PATCH] Don't URL encode description links if parameter 'redirector.encode_url' is set to false --- application/FeedBuilder.php | 2 +- application/LinkUtils.php | 15 +++++++++------ index.php | 18 +++++++++++++++--- tests/LinkUtilsTest.php | 15 +++++++++++++++ 4 files changed, 40 insertions(+), 10 deletions(-) diff --git a/application/FeedBuilder.php b/application/FeedBuilder.php index 3cfaafb4..ebae18b4 100644 --- a/application/FeedBuilder.php +++ b/application/FeedBuilder.php @@ -152,7 +152,7 @@ protected function buildItem($link, $pageaddr) } else { $permalink = ''. t('Permalink') .''; } - $link['description'] = format_description($link['description'], '', $pageaddr); + $link['description'] = format_description($link['description'], '', false, $pageaddr); $link['description'] .= PHP_EOL .'
— '. $permalink; $pubDate = $link['created']; diff --git a/application/LinkUtils.php b/application/LinkUtils.php index 267e62cd..e3d95d08 100644 --- a/application/LinkUtils.php +++ b/application/LinkUtils.php @@ -102,12 +102,13 @@ function count_private($links) * * @param string $text input string. * @param string $redirector if a redirector is set, use it to gerenate links. + * @param bool $urlEncode Use `urlencode()` on the URL after the redirector or not. * * @return string returns $text with all links converted to HTML links. * * @see Function inspired from http://www.php.net/manual/en/function.preg-replace.php#85722 */ -function text2clickable($text, $redirector = '') +function text2clickable($text, $redirector = '', $urlEncode = true) { $regex = '!(((?:https?|ftp|file)://|apt:|magnet:)\S+[a-z0-9\(\)]/?)!si'; @@ -117,8 +118,9 @@ function text2clickable($text, $redirector = '') // Redirector is set, urlencode the final URL. return preg_replace_callback( $regex, - function ($matches) use ($redirector) { - return ''. $matches[1] .''; + function ($matches) use ($redirector, $urlEncode) { + $url = $urlEncode ? urlencode($matches[1]) : $matches[1]; + return ''. $matches[1] .''; }, $text ); @@ -164,12 +166,13 @@ function space2nbsp($text) * * @param string $description shaare's description. * @param string $redirector if a redirector is set, use it to gerenate links. + * @param bool $urlEncode Use `urlencode()` on the URL after the redirector or not. * @param string $indexUrl URL to Shaarli's index. - * + * @return string formatted description. */ -function format_description($description, $redirector = '', $indexUrl = '') { - return nl2br(space2nbsp(hashtag_autolink(text2clickable($description, $redirector), $indexUrl))); +function format_description($description, $redirector = '', $urlEncode = true, $indexUrl = '') { + return nl2br(space2nbsp(hashtag_autolink(text2clickable($description, $redirector, $urlEncode), $indexUrl))); } /** diff --git a/index.php b/index.php index e1516d37..9d5f25ea 100644 --- a/index.php +++ b/index.php @@ -526,7 +526,11 @@ function showDailyRSS($conf) { // We pre-format some fields for proper output. foreach ($links as &$link) { - $link['formatedDescription'] = format_description($link['description'], $conf->get('redirector.url')); + $link['formatedDescription'] = format_description( + $link['description'], + $conf->get('redirector.url'), + $conf->get('redirector.encode_url') + ); $link['thumbnail'] = thumbnail($conf, $link['url']); $link['timestamp'] = $link['created']->getTimestamp(); if (startsWith($link['url'], '?')) { @@ -598,7 +602,11 @@ function showDaily($pageBuilder, $LINKSDB, $conf, $pluginManager) $taglist = explode(' ',$link['tags']); uasort($taglist, 'strcasecmp'); $linksToDisplay[$key]['taglist']=$taglist; - $linksToDisplay[$key]['formatedDescription'] = format_description($link['description'], $conf->get('redirector.url')); + $linksToDisplay[$key]['formatedDescription'] = format_description( + $link['description'], + $conf->get('redirector.url'), + $conf->get('redirector.encode_url') + ); $linksToDisplay[$key]['thumbnail'] = thumbnail($conf, $link['url']); $linksToDisplay[$key]['timestamp'] = $link['created']->getTimestamp(); } @@ -1688,7 +1696,11 @@ function buildLinkList($PAGE,$LINKSDB, $conf, $pluginManager) while ($i<$end && $iget('redirector.url')); + $link['description'] = format_description( + $link['description'], + $conf->get('redirector.url'), + $conf->get('redirector.encode_url') + ); $classLi = ($i % 2) != 0 ? '' : 'publicLinkHightLight'; $link['class'] = $link['private'] == 0 ? $classLi : 'private'; $link['timestamp'] = $link['created']->getTimestamp(); diff --git a/tests/LinkUtilsTest.php b/tests/LinkUtilsTest.php index c77922ec..99679320 100644 --- a/tests/LinkUtilsTest.php +++ b/tests/LinkUtilsTest.php @@ -130,6 +130,21 @@ public function testText2clickableWithRedirector() $this->assertEquals($expectedText, $processedText); } + /** + * Test text2clickable a redirector set and without URL encode. + */ + public function testText2clickableWithRedirectorDontEncode() + { + $text = 'stuff http://hello.there/?is=someone&or=something#here otherstuff'; + $redirector = 'http://redirector.to'; + $expectedText = 'stuff http://hello.there/?is=someone&or=something#here otherstuff'; + $processedText = text2clickable($text, $redirector, false); + $this->assertEquals($expectedText, $processedText); + } + /** * Test testSpace2nbsp. */