Convert custom profile field URL values to rel="me" links
This commit is contained in:
parent
76e9c4daa2
commit
39607b20e2
3 changed files with 66 additions and 42 deletions
|
@ -736,22 +736,22 @@ class HTML
|
|||
'[youtube]$2[/youtube]',
|
||||
$s
|
||||
);
|
||||
|
||||
|
||||
$s = preg_replace(
|
||||
'#<iframe[^>](.*?)https?://www.youtube.com/embed/([A-Za-z0-9\-_=]+)(.*?)</iframe>#ism',
|
||||
'[youtube]$2[/youtube]',
|
||||
$s
|
||||
);
|
||||
|
||||
|
||||
$s = preg_replace(
|
||||
'#<iframe[^>](.*?)https?://player.vimeo.com/video/([0-9]+)(.*?)</iframe>#ism',
|
||||
'[vimeo]$2[/vimeo]',
|
||||
$s
|
||||
);
|
||||
|
||||
|
||||
return $s;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* transform link href and img src from relative to absolute
|
||||
*
|
||||
|
@ -764,30 +764,30 @@ class HTML
|
|||
if (empty($base)) {
|
||||
return $text;
|
||||
}
|
||||
|
||||
|
||||
$base = rtrim($base, '/');
|
||||
|
||||
|
||||
$base2 = $base . "/";
|
||||
|
||||
|
||||
// Replace links
|
||||
$pattern = "/<a([^>]*) href=\"(?!http|https|\/)([^\"]*)\"/";
|
||||
$replace = "<a\${1} href=\"" . $base2 . "\${2}\"";
|
||||
$text = preg_replace($pattern, $replace, $text);
|
||||
|
||||
|
||||
$pattern = "/<a([^>]*) href=\"(?!http|https)([^\"]*)\"/";
|
||||
$replace = "<a\${1} href=\"" . $base . "\${2}\"";
|
||||
$text = preg_replace($pattern, $replace, $text);
|
||||
|
||||
|
||||
// Replace images
|
||||
$pattern = "/<img([^>]*) src=\"(?!http|https|\/)([^\"]*)\"/";
|
||||
$replace = "<img\${1} src=\"" . $base2 . "\${2}\"";
|
||||
$text = preg_replace($pattern, $replace, $text);
|
||||
|
||||
|
||||
$pattern = "/<img([^>]*) src=\"(?!http|https)([^\"]*)\"/";
|
||||
$replace = "<img\${1} src=\"" . $base . "\${2}\"";
|
||||
$text = preg_replace($pattern, $replace, $text);
|
||||
|
||||
|
||||
|
||||
|
||||
// Done
|
||||
return $text;
|
||||
}
|
||||
|
@ -907,19 +907,6 @@ class HTML
|
|||
return Renderer::replaceMacros(Renderer::getMarkupTemplate('searchbox.tpl'), $values);
|
||||
}
|
||||
|
||||
/**
|
||||
* Replace naked text hyperlink with HTML formatted hyperlink
|
||||
*
|
||||
* @param string $s
|
||||
* @return string
|
||||
*/
|
||||
public static function toLink(string $s): string
|
||||
{
|
||||
$s = preg_replace("/(https?\:\/\/[a-zA-Z0-9\:\/\-\?\&\;\.\=\_\~\#\'\%\$\!\+]*)/", ' <a href="$1" target="_blank" rel="noopener noreferrer">$1</a>', $s);
|
||||
$s = preg_replace("/\<(.*?)(src|href)=(.*?)\&\;(.*?)\>/ism", '<$1$2=$3&$4>', $s);
|
||||
return $s;
|
||||
}
|
||||
|
||||
/**
|
||||
* Given a HTML text and a set of filtering reasons, adds a content hiding header with the provided reasons
|
||||
*
|
||||
|
|
|
@ -26,7 +26,6 @@ use Friendica\Content\Feature;
|
|||
use Friendica\Content\ForumManager;
|
||||
use Friendica\Content\Nav;
|
||||
use Friendica\Content\Text\BBCode;
|
||||
use Friendica\Content\Text\HTML;
|
||||
use Friendica\Core\Config\Capability\IManageConfigValues;
|
||||
use Friendica\Core\Hook;
|
||||
use Friendica\Core\L10n;
|
||||
|
@ -48,6 +47,7 @@ use Friendica\Profile\ProfileField\Repository\ProfileField;
|
|||
use Friendica\Protocol\ActivityPub;
|
||||
use Friendica\Util\DateTimeFormat;
|
||||
use Friendica\Util\Profiler;
|
||||
use Friendica\Util\Strings;
|
||||
use Friendica\Util\Temporal;
|
||||
use Psr\Log\LoggerInterface;
|
||||
|
||||
|
@ -204,7 +204,11 @@ class Profile extends BaseProfile
|
|||
}
|
||||
|
||||
if ($profile['homepage']) {
|
||||
$basic_fields += self::buildField('homepage', $this->t('Homepage:'), HTML::toLink($profile['homepage']));
|
||||
$basic_fields += self::buildField(
|
||||
'homepage',
|
||||
$this->t('Homepage:'),
|
||||
$this->tryRelMe($profile['homepage']) ?: $profile['homepage']
|
||||
);
|
||||
}
|
||||
|
||||
if (
|
||||
|
@ -245,7 +249,7 @@ class Profile extends BaseProfile
|
|||
$custom_fields += self::buildField(
|
||||
'custom_' . $profile_field->order,
|
||||
$profile_field->label,
|
||||
BBCode::convertForUriId($profile['uri-id'], $profile_field->value),
|
||||
$this->tryRelMe($profile_field->value) ?: BBCode::convertForUriId($profile['uri-id'], $profile_field->value),
|
||||
'aprofile custom'
|
||||
);
|
||||
}
|
||||
|
@ -359,4 +363,19 @@ class Profile extends BaseProfile
|
|||
|
||||
return $htmlhead;
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if the input is an HTTP(S) link and returns a rel="me" link if yes, empty string if not
|
||||
*
|
||||
* @param string $input
|
||||
* @return string
|
||||
*/
|
||||
private function tryRelMe(string $input): string
|
||||
{
|
||||
if (preg_match(Strings::onlyLinkRegEx(), trim($input))) {
|
||||
return '<a href="' . trim($input) . '" target="_blank" rel="noopener noreferrer me">' . trim($input) . '</a>';
|
||||
}
|
||||
|
||||
return '';
|
||||
}
|
||||
}
|
||||
|
|
|
@ -380,29 +380,47 @@ class Strings
|
|||
* Returns the regular expression string to match URLs in a given text
|
||||
*
|
||||
* @return string
|
||||
* @see https://daringfireball.net/2010/07/improved_regex_for_matching_urls
|
||||
*/
|
||||
public static function autoLinkRegEx(): string
|
||||
{
|
||||
return '@
|
||||
(?<![=\'\]"/]) # Not preceded by [, =, \', ], ", /
|
||||
(?<![=\'\]"/]) # Not preceded by [, =, \', ], ", /
|
||||
\b
|
||||
( # Capture 1: entire matched URL
|
||||
https?:// # http or https protocol
|
||||
( # Capture 1: entire matched URL
|
||||
' . self::linkRegEx() . '
|
||||
)@xiu';
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the regular expression string to match only an HTTP URL
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public static function onlyLinkRegEx(): string
|
||||
{
|
||||
return '@^' . self::linkRegEx() . '$@xiu';
|
||||
}
|
||||
|
||||
/**
|
||||
* @return string
|
||||
* @see https://daringfireball.net/2010/07/improved_regex_for_matching_urls
|
||||
*/
|
||||
private static function linkRegEx(): string
|
||||
{
|
||||
return 'https?:// # http or https protocol
|
||||
(?:
|
||||
[^/\s\xA0`!()\[\]{};:\'",<>?«»“”‘’.] # Domain can\'t start with a .
|
||||
[^/\s\xA0`!()\[\]{};:\'",<>?«»“”‘’]+ # Domain can\'t end with a .
|
||||
[^/\s\xA0`!()\[\]{};:\'",<>?«»“”‘’.] # Domain can\'t start with a .
|
||||
[^/\s\xA0`!()\[\]{};:\'",<>?«»“”‘’]+ # Domain can\'t end with a .
|
||||
\.
|
||||
[^/\s\xA0`!()\[\]{};:\'".,<>?«»“”‘’]+/? # Followed by a slash
|
||||
)
|
||||
(?: # One or more:
|
||||
[^\s\xA0()<>]+ # Run of non-space, non-()<>
|
||||
| # or
|
||||
\(([^\s\xA0()<>]+|(\([^\s()<>]+\)))*\) # balanced parens, up to 2 levels
|
||||
| # or
|
||||
[^\s\xA0`!()\[\]{};:\'".,<>?«»“”‘’] # not a space or one of these punct chars
|
||||
)*
|
||||
)@xiu';
|
||||
(?: # One or more:
|
||||
[^\s\xA0()<>]+ # Run of non-space, non-()<>
|
||||
| # or
|
||||
\(([^\s\xA0()<>]+|(\([^\s()<>]+\)))*\) # balanced parens, up to 2 levels
|
||||
| # or
|
||||
[^\s\xA0`!()\[\]{};:\'".,<>?«»“”‘’] # not a space or one of these punct chars
|
||||
)*';
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
Loading…
Reference in a new issue