From 742526761dea5fe0df74d04c038fb9feb45bce94 Mon Sep 17 00:00:00 2001 From: horus Date: Wed, 25 Mar 2026 14:40:13 +0100 Subject: Feeds for Mastodon --- app/Libraries/Helper.php | 112 +++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 108 insertions(+), 4 deletions(-) (limited to 'app/Libraries') diff --git a/app/Libraries/Helper.php b/app/Libraries/Helper.php index 41d26e5..8164887 100644 --- a/app/Libraries/Helper.php +++ b/app/Libraries/Helper.php @@ -59,7 +59,7 @@ class Helper { $feed->lang = 'en'; $feed->setShortening(false); // true or false - if ( "mastodon" == $title ) { + if ( "mastodon" == $title || "mastodon_test" == $title ) { $feed->setTextLimit(500); // maximum length of description text } else { $feed->setTextLimit(100); // maximum length of description text @@ -71,7 +71,7 @@ class Helper { $desc = ($post->excerpt_html); $categories = null; - if ( "mastodon" == $title ) { + if ( "mastodon" == $title || "mastodon_test" == $title ) { $cat_len= 0; @@ -115,7 +115,12 @@ class Helper { // max desc length is 500 - 23 (Link) - $cat_len - 2 (white spaces) $max_len = 500 - 23 - $cat_len - 2; - $desc = Helper::first_sentence($desc, $max_len); + if ( "mastodon_test" == $title ) { + $desc = Helper::mastodon_summary($desc, $max_len); + }else { + $desc = Helper::first_sentence($desc, $max_len); + #$desc = Helper::mastodon_summary($desc, $max_len); + } $desc .= " " . $categories;# . $discussions; @@ -188,5 +193,104 @@ class Helper { } } -} + private static function next_sentence($content, $max_len = NULL) { + + $content = ltrim($content); + $pos = strpos($content, '.'); + + if($pos === false) { + if ( is_null($max_len) ) { + return $content; + } else { + return substr($content, 0, $max_len); + } + } else { + return substr($content, 0, $pos+1); + } + + } + + /** + * Make sure to toot as much text as possible while still staying below the limit of 500 chars -link (23 chars) - 2 (white spaces) - possible hashtags + */ + public static function mastodon_summary($excerpt, $max_len = 475){ + + /** + * Strip HTML from Wikipedia excerpt + */ + $excerpt = ltrim(html_entity_decode(strip_tags($excerpt))); + + /** + * The toot to be returned + */ + $content = ""; + + /** + * https://stackoverflow.com/questions/16377437/split-a-text-into-sentences + */ + $sentences = preg_split('/(?<=[.?!])\s+(?=[a-z])/i', $excerpt); + echo "
";
+ echo "-----------------------";
+ var_dump($excerpt);
+ var_dump($sentences);
+
+ for ( $i = 0; $i < count($sentences); $i++ ) {
+ #if ( mb_strlen($content) < $max_len && (mb_strlen($content) + mb_strlen($sentences) ) {
+ if ( mb_strlen($content) < $max_len && (mb_strlen($content) + mb_strlen($sentences) ) < $max_len ){
+
+ //var_dump(rtrim(ltrim($sentences[$i])));
+ $content .= rtrim(ltrim($sentences[$i]));
+ var_dump("ok", $max_len);
+
+ $max_len = $max_len - mb_strlen($sentences[$i]);
+ var_dump("ok", $max_len);
+
+ } else {
+ var_dump("fail", mb_strlen($content), $max_len);
+ break;
+ }
+ }
+ return $content;
+
+ echo "";
+ while ( mb_strlen($content) < $max_len ) {
+
+ /**
+ * Get next sentence
+ */
+ $next_sentence = Helper::next_sentence($excerpt, $max_len);
+ var_dump($next_sentence);
+
+ if ( "" == $next_sentence ) {
+ break;
+ }
+
+ /**
+ * Check if $content + $next_sentence is still under $max_len
+ */
+ if ( (mb_strlen($content) + mb_strlen($next_sentence)) < $max_len ) {
+
+ /**
+ * add text
+ */
+ $content .= $next_sentence;
+
+ /**
+ * Recalc $max_len
+ */
+ $max_len = $max_len - mb_strlen($next_sentence);
+
+ /**
+ * Remove sentence from excerpt
+ */
+ $excerpt = substr($excerpt, mb_strlen($next_sentence));
+
+ } else {
+ break;
+ }
+ }
+
+ return $content;
+ }
+}
--
cgit v1.2.3