]> git.mxchange.org Git - friendica.git/commitdiff
Message split at commas, exclamation mark or question mark
authorMichael <heluecht@pirati.ca>
Tue, 12 Nov 2024 09:53:20 +0000 (09:53 +0000)
committerMichael <heluecht@pirati.ca>
Thu, 14 Nov 2024 14:37:44 +0000 (14:37 +0000)
src/Content/Text/Plaintext.php
tests/src/Content/PlaintextTest.php [new file with mode: 0644]

index d88e499eab24839834fa53195f8c9dac00fa723c..d2362714f4237c8182712c10f3e7a5ebbcf5cfe9 100644 (file)
@@ -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 (file)
index 0000000..9683025
--- /dev/null
@@ -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']);
+       }
+}