Merge pull request #13384 from annando/smilies
Posts without text or only with emojis are now always accepted in the language check
This commit is contained in:
commit
a0da13cf6b
4 changed files with 108 additions and 6 deletions
|
@ -285,4 +285,33 @@ class Smilies
|
||||||
|
|
||||||
return str_replace($matches[0], $t, $matches[0]);
|
return str_replace($matches[0], $t, $matches[0]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Checks if the body doesn't contain any alphanumeric characters
|
||||||
|
*
|
||||||
|
* @param string $body Possibly-HTML post body
|
||||||
|
* @return boolean
|
||||||
|
*/
|
||||||
|
public static function isEmojiPost(string $body): bool
|
||||||
|
{
|
||||||
|
// Strips all whitespace
|
||||||
|
$conv = preg_replace('#\s#u', '', html_entity_decode($body));
|
||||||
|
if (empty($conv)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!class_exists('IntlChar')) {
|
||||||
|
// Most Emojis are 4 byte Unicode characters, so this is a good workaround, when IntlChar does not exist on the system
|
||||||
|
return strlen($conv) / mb_strlen($conv) == 4;
|
||||||
|
}
|
||||||
|
|
||||||
|
for ($i = 0; $i < mb_strlen($conv); $i++) {
|
||||||
|
$character = mb_substr($conv, $i, 1);
|
||||||
|
|
||||||
|
if (\IntlChar::isalnum($character) || \IntlChar::ispunct($character) || \IntlChar::isgraph($character) && (strlen($character) <= 2)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1791,12 +1791,8 @@ class BBCode
|
||||||
$text = preg_replace("/\[event\-id\](.*?)\[\/event\-id\]/ism", '', $text);
|
$text = preg_replace("/\[event\-id\](.*?)\[\/event\-id\]/ism", '', $text);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!$for_plaintext && DI::config()->get('system', 'big_emojis') && ($simple_html != self::DIASPORA)) {
|
if (!$for_plaintext && DI::config()->get('system', 'big_emojis') && ($simple_html != self::DIASPORA) && Smilies::isEmojiPost($text)) {
|
||||||
$conv = html_entity_decode(str_replace([' ', "\n", "\r"], '', $text));
|
$text = '<span style="font-size: xx-large; line-height: normal;">' . $text . '</span>';
|
||||||
// Emojis are always 4 byte Unicode characters
|
|
||||||
if (!empty($conv) && (strlen($conv) / mb_strlen($conv) == 4)) {
|
|
||||||
$text = '<span style="font-size: xx-large; line-height: normal;">' . $text . '</span>';
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Handle mentions and hashtag links
|
// Handle mentions and hashtag links
|
||||||
|
|
|
@ -21,6 +21,7 @@
|
||||||
|
|
||||||
namespace Friendica\Protocol;
|
namespace Friendica\Protocol;
|
||||||
|
|
||||||
|
use Friendica\Content\Smilies;
|
||||||
use Friendica\Content\Text\BBCode;
|
use Friendica\Content\Text\BBCode;
|
||||||
use Friendica\Core\Logger;
|
use Friendica\Core\Logger;
|
||||||
use Friendica\Core\Protocol;
|
use Friendica\Core\Protocol;
|
||||||
|
@ -172,6 +173,11 @@ class Relay
|
||||||
*/
|
*/
|
||||||
public static function isWantedLanguage(string $body, int $uri_id = 0, int $author_id = 0)
|
public static function isWantedLanguage(string $body, int $uri_id = 0, int $author_id = 0)
|
||||||
{
|
{
|
||||||
|
if (empty($body) || Smilies::isEmojiPost($body)) {
|
||||||
|
Logger::debug('Empty body or only emojis', ['body' => $body]);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
$languages = [];
|
$languages = [];
|
||||||
foreach (Item::getLanguageArray($body, 10, $uri_id, $author_id) as $language => $reliability) {
|
foreach (Item::getLanguageArray($body, 10, $uri_id, $author_id) as $language => $reliability) {
|
||||||
if ($reliability > 0) {
|
if ($reliability > 0) {
|
||||||
|
|
|
@ -72,4 +72,75 @@ class SmiliesTest extends FixtureTest
|
||||||
$output = Smilies::replaceFromArray($text, $smilies);
|
$output = Smilies::replaceFromArray($text, $smilies);
|
||||||
self::assertEquals($expected, $output);
|
self::assertEquals($expected, $output);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function dataIsEmojiPost(): array
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
'emoji' => [
|
||||||
|
'expected' => true,
|
||||||
|
'body' => '👀',
|
||||||
|
],
|
||||||
|
'emojis' => [
|
||||||
|
'expected' => true,
|
||||||
|
'body' => '👀🤷',
|
||||||
|
],
|
||||||
|
'emoji+whitespace' => [
|
||||||
|
'expected' => true,
|
||||||
|
'body' => ' 👀 ',
|
||||||
|
],
|
||||||
|
'empty' => [
|
||||||
|
'expected' => false,
|
||||||
|
'body' => '',
|
||||||
|
],
|
||||||
|
'whitespace' => [
|
||||||
|
'expected' => false,
|
||||||
|
'body' => '
|
||||||
|
',
|
||||||
|
],
|
||||||
|
'emoji+ASCII' => [
|
||||||
|
'expected' => false,
|
||||||
|
'body' => '🤷a',
|
||||||
|
],
|
||||||
|
'HTML entity whitespace' => [
|
||||||
|
'expected' => false,
|
||||||
|
'body' => ' ',
|
||||||
|
],
|
||||||
|
'HTML entity else' => [
|
||||||
|
'expected' => false,
|
||||||
|
'body' => '°',
|
||||||
|
],
|
||||||
|
'emojis+HTML whitespace' => [
|
||||||
|
'expected' => true,
|
||||||
|
'body' => '👀 🤷',
|
||||||
|
],
|
||||||
|
'emojis+HTML else' => [
|
||||||
|
'expected' => false,
|
||||||
|
'body' => '👀<🤷',
|
||||||
|
],
|
||||||
|
'zwj' => [
|
||||||
|
'expected' => true,
|
||||||
|
'body' => '👨👨👧',
|
||||||
|
],
|
||||||
|
'zwj+whitespace' => [
|
||||||
|
'expected' => true,
|
||||||
|
'body' => ' 👨👨👧 ',
|
||||||
|
],
|
||||||
|
'zwj+HTML whitespace' => [
|
||||||
|
'expected' => true,
|
||||||
|
'body' => ' 👨👨👧 ',
|
||||||
|
],
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @dataProvider dataIsEmojiPost
|
||||||
|
*
|
||||||
|
* @param bool $expected
|
||||||
|
* @param string $body
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function testIsEmojiPost(bool $expected, string $body)
|
||||||
|
{
|
||||||
|
$this->assertEquals($expected, Smilies::isEmojiPost($body));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue