diff --git a/src/Content/Text/Plaintext.php b/src/Content/Text/Plaintext.php index d88e499eab..d2362714f4 100644 --- a/src/Content/Text/Plaintext.php +++ b/src/Content/Text/Plaintext.php @@ -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 && (mb_strrpos($word, '. ') !== false || mb_strrpos($word, '? ') !== false || mb_strrpos($word, '! ') !== false)) { + $break = IntlChar::isupper(mb_substr($message, 0, 1)); } - if ($break) { - $break_pos = $pos + mb_strlen($part); - } + + $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; } diff --git a/tests/src/Content/PlaintextTest.php b/tests/src/Content/PlaintextTest.php new file mode 100644 index 0000000000..96830254f9 --- /dev/null +++ b/tests/src/Content/PlaintextTest.php @@ -0,0 +1,72 @@ + [ + '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']); + } +}