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/Http/Controllers/FeedController.php | 5 ++ app/Libraries/Helper.php | 112 ++++++++++++++++++++++++++++++-- routes/web.php | 1 + 3 files changed, 114 insertions(+), 4 deletions(-) diff --git a/app/Http/Controllers/FeedController.php b/app/Http/Controllers/FeedController.php index 5b9c36a..43b31ef 100644 --- a/app/Http/Controllers/FeedController.php +++ b/app/Http/Controllers/FeedController.php @@ -24,6 +24,11 @@ class FeedController extends Controller $articles = Article::orderBy('created_at', 'desc')->take(20)->get(); return Helper::makeFeed($articles, "mastodon"); } + public function mastodon_test() + { + $articles = Article::orderBy('created_at', 'desc')->take(20)->get(); + return Helper::makeFeed($articles, "mastodon_test"); + } public function popular() { 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;
+	}
+}
diff --git a/routes/web.php b/routes/web.php
index ff3046b..8deddbb 100644
--- a/routes/web.php
+++ b/routes/web.php
@@ -26,6 +26,7 @@ Route::get('/article/{id}', 'IndexController@show')->name('show')->where('id', '
 
 Route::get('/feed/new', 'FeedController@new')->name('feed_new');
 Route::get('/feed/mastodon', 'FeedController@mastodon')->name('feed_mastodon');
+Route::get('/feed/mastodon_test', 'FeedController@mastodon_test')->name('feed_mastodon_test');
 Route::get('/feed/popular', 'FeedController@popular')->name('feed_popular');
 Route::get('/feed/search', 'FeedController@search')->name('feed_search');
 
-- 
cgit v1.2.3