mirror of
https://github.com/friendica/friendica
synced 2024-11-17 17:03:41 +00:00
Message split at commas, exclamation mark or question mark
This commit is contained in:
parent
cf220928c6
commit
8fdd78ef95
2 changed files with 85 additions and 6 deletions
|
@ -241,6 +241,7 @@ class Plaintext
|
|||
$parts = [];
|
||||
$part = '';
|
||||
$break_pos = 0;
|
||||
$comma_pos = 0;
|
||||
|
||||
$limit = $baselimit;
|
||||
|
||||
|
@ -269,24 +270,30 @@ class Plaintext
|
|||
}
|
||||
|
||||
$break = mb_strrpos($word, "\n") !== false;
|
||||
if (!$break && mb_strrpos($word, '. ') !== false) {
|
||||
$next = mb_substr($message, 0, 1);
|
||||
$break = IntlChar::isupper($next);
|
||||
}
|
||||
if ($break) {
|
||||
$break_pos = $pos + mb_strlen($part);
|
||||
if (!$break && (mb_strrpos($word, '. ') !== false || mb_strrpos($word, '? ') !== false || mb_strrpos($word, '! ') !== false)) {
|
||||
$break = IntlChar::isupper(mb_substr($message, 0, 1));
|
||||
}
|
||||
|
||||
$comma = (mb_strrpos($word, ', ') !== false) && IntlChar::isalpha(mb_substr($message, 0, 1));
|
||||
|
||||
if ((mb_strlen($part . $word) > $limit - 8) && ($parts || (mb_strlen($part . $word . $message) > $limit))) {
|
||||
if ($break_pos) {
|
||||
$parts[] = trim(mb_substr($part, 0, $break_pos));
|
||||
$part = mb_substr($part, $break_pos);
|
||||
} elseif ($comma_pos) {
|
||||
$parts[] = trim(mb_substr($part, 0, $comma_pos));
|
||||
$part = mb_substr($part, $comma_pos);
|
||||
} else {
|
||||
$parts[] = trim($part);
|
||||
$part = '';
|
||||
}
|
||||
$limit = $baselimit;
|
||||
$break_pos = 0;
|
||||
$comma_pos = 0;
|
||||
} elseif ($break) {
|
||||
$break_pos = $pos + mb_strlen($part);
|
||||
} elseif ($comma) {
|
||||
$comma_pos = $pos + mb_strlen($part);
|
||||
}
|
||||
$part .= $word;
|
||||
}
|
||||
|
|
72
tests/src/Content/PlaintextTest.php
Normal file
72
tests/src/Content/PlaintextTest.php
Normal file
|
@ -0,0 +1,72 @@
|
|||
<?php
|
||||
|
||||
// Copyright (C) 2010-2024, the Friendica project
|
||||
// SPDX-FileCopyrightText: 2010-2024 the Friendica project
|
||||
//
|
||||
// SPDX-License-Identifier: AGPL-3.0-or-later
|
||||
|
||||
namespace Friendica\Test\src\Content;
|
||||
|
||||
use Friendica\Content\Text\BBCode;
|
||||
use Friendica\Content\Text\Plaintext;
|
||||
use Friendica\Network\HTTPException\InternalServerErrorException;
|
||||
use Friendica\Test\FixtureTest;
|
||||
|
||||
class PlaintextTest extends FixtureTest
|
||||
{
|
||||
protected function setUp(): void
|
||||
{
|
||||
parent::setUp();
|
||||
}
|
||||
|
||||
public function dataMessage()
|
||||
{
|
||||
return [
|
||||
'test-1' => [
|
||||
'data' => "Ich habe mein Profil so eingestellt, dass ich alle Folgeanfragen manuell bestätigen muss, was langsam aber sicher richtig in Arbeit ausartet 😉\n\nIch schaue mir immer die anderen Profile an und schaue, was sie so gepostet haben. Wenn die Person noch nichts gepostet hat, ignoriere ich die Anfragen und schaue ggf. nach einiger Zeit wieder nach, ob jetzt was gepostet wurde! Wenn die Posts in eine Richtung gehen, die ich nicht mag, lehne ich die Anfragen ab.\n\nIch ignoriere auch Anfragen, wenn sie von Accounts kommen, die ggf. tausenden von anderen Accounts folgen, da ich davon ausgehe, dass da niemand ernsthaft so vielen Accounts folgen kann.",
|
||||
'expected' => [
|
||||
'Ich habe mein Profil so eingestellt, dass ich alle Folgeanfragen manuell bestätigen muss, was langsam aber sicher richtig in Arbeit ausartet 😉 (1/6)',
|
||||
'Ich schaue mir immer die anderen Profile an und schaue, was sie so gepostet haben. (2/6)',
|
||||
'Wenn die Person noch nichts gepostet hat, ignoriere ich die Anfragen und schaue ggf. nach einiger Zeit wieder nach, ob jetzt was gepostet wurde! (3/6)',
|
||||
'Wenn die Posts in eine Richtung gehen, die ich nicht mag, lehne ich die Anfragen ab. (4/6)',
|
||||
'Ich ignoriere auch Anfragen, wenn sie von Accounts kommen, die ggf. tausenden von anderen Accounts folgen, da ich davon ausgehe, (5/6)',
|
||||
'dass da niemand ernsthaft so vielen Accounts folgen kann. (6/6)'
|
||||
],
|
||||
'test-2' => [
|
||||
'data' => 'Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.',
|
||||
'expected' => [
|
||||
'Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, (1/6)',
|
||||
'sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. (2/6)',
|
||||
'Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. (3/6)',
|
||||
'Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, (4/6)',
|
||||
'sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. (5/6)',
|
||||
'Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. (6/6)'
|
||||
],
|
||||
]
|
||||
],
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* Test split long texts
|
||||
*
|
||||
* @dataProvider dataMessage
|
||||
*
|
||||
* @param string $text Test string
|
||||
* @param array $expected Expected result
|
||||
*
|
||||
* @throws InternalServerErrorException
|
||||
*/
|
||||
public function testSplitMessage(string $text, array $expected)
|
||||
{
|
||||
$item = [
|
||||
'uri-id' => -1,
|
||||
'uid' => 0,
|
||||
'title' => '',
|
||||
'plink' => '',
|
||||
'body' => $text,
|
||||
];
|
||||
$output = Plaintext::getPost($item, 160, false, BBCode::BLUESKY);
|
||||
self::assertEquals($expected, $output['parts']);
|
||||
}
|
||||
}
|
Loading…
Reference in a new issue