diff options
| author | horus | 2026-03-25 14:40:13 +0100 |
|---|---|---|
| committer | horus | 2026-03-25 14:40:13 +0100 |
| commit | 742526761dea5fe0df74d04c038fb9feb45bce94 (patch) | |
| tree | 4e907ce59587bca74bac425c0e4c0a427d0c82d6 | |
| parent | 2bb1fb114ad47e5063aa72b7d31065531f4db3d4 (diff) | |
| download | curious-742526761dea5fe0df74d04c038fb9feb45bce94.tar.gz | |
Feeds for Mastodon
| -rw-r--r-- | app/Http/Controllers/FeedController.php | 5 | ||||
| -rw-r--r-- | app/Libraries/Helper.php | 112 | ||||
| -rw-r--r-- | 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 "<pre>"; + 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 "<pre>"; + 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'); |
