summaryrefslogtreecommitdiff
path: root/app
diff options
context:
space:
mode:
authorhorus2026-03-25 14:40:13 +0100
committerhorus2026-03-25 14:40:13 +0100
commit742526761dea5fe0df74d04c038fb9feb45bce94 (patch)
tree4e907ce59587bca74bac425c0e4c0a427d0c82d6 /app
parent2bb1fb114ad47e5063aa72b7d31065531f4db3d4 (diff)
downloadcurious-742526761dea5fe0df74d04c038fb9feb45bce94.tar.gz
Feeds for Mastodon
Diffstat (limited to 'app')
-rw-r--r--app/Http/Controllers/FeedController.php5
-rw-r--r--app/Libraries/Helper.php112
2 files changed, 113 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;
+ }
+}