1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
|
<?php
namespace App\Libraries;
use App\Libraries\Helper;
use Carbon\Carbon;
class Helper {
public static function escapeLike($string){
$search = array('%', '_');
$replace = array('\%', '\_');
$string = str_replace($search, $replace, $string);
$string = explode(" ", $string);
return implode("%", $string);
}
public static function formatTimestamp($timestamp) {
return Carbon::createFromTimestamp($timestamp)->format("Y-m-d");
}
public static function makeFeed($model, $title, $cache = 60) {
switch($title) {
case("new"):
$feed_title = 'Newest Articles';
$feed_description = 'Newest interesting articles from Wikipedia. Keep exploring.';
break;
case( "popular"):
$feed_title = 'Popular Articles';
$feed_description = 'The most popular articles. Keep exploring.';
break;
case( "mastodon"):
$feed_title = 'Feed for Mastodon';
$feed_description = 'New articles are published automatically to Mastodon.';
break;
default:
$feed_title = 'Search for: ' . $title;
$feed_description = 'All articles for "' . $title . '".';
break;
}
// create new feed
$feed = \App::make("feed");
// multiple feeds are supported
// if you are using caching you should set different cache keys for your feeds
// cache the feed for $cache minutes (second parameter is optional)
$feed->setCache($cache, 'feed_' . $title);
// check if there is cached feed and build new only if is not
if (!$feed->isCached())
{
// set your feed's title, description, link, pubdate and language
$feed->title = $feed_title;
$feed->description = $feed_description;
#$feed->logo = 'http://yoursite.tld/logo.jpg';
$feed->link = url('feed/' . $title);
$feed->setDateFormat('datetime'); // 'datetime', 'timestamp' or 'carbon'
$feed->pubdate = $model[0]->created_at;
$feed->lang = 'en';
$feed->setShortening(false); // true or false
if ( "mastodon" == $title ) {
$feed->setTextLimit(500); // maximum length of description text
} else {
$feed->setTextLimit(100); // maximum length of description text
}
foreach ($model as $post)
{
$desc = ($post->excerpt_html);
if ( "mastodon" == $title ) {
$cat_len= 0;
if ( ! $post->getCategories()->get()->isEmpty() ) {
$categories = "#MostDiscussed ";
foreach( $post->getCategories()->get() as $cat ) {
$categories .= "#". $cat->name . " ";
}
$cat_counter = $post->getCategories()->get()->count();
$cat_len = mb_strlen($categories, "UTF-8");
}
$discussions = "";
if ( $post->getDiscussions()->orderBy('created_at', 'desc')->get()->count() > 1 ) {
// multiple discussions on HN. show one link where you can find them all
$discussions = env('APP_URL') . "/article/" . $post->id;
} else {
// only on disc link. ### TODO foreach not needed
foreach( $post->getDiscussions()->orderBy('created_at', 'desc')->get() as $dis ) {
$discussions = $dis->source_url;
}
}
// 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);
$desc .= " " . $categories;# . $discussions;
// set item's title, author, url, pubdate, description, content, enclosure (optional)*
$feed->addItem([
'title' => $desc, // mastofeed.org seems to ignore the description field
'author' => env('APP_NAME'),
'url' => \URL::to($post->url),
'link' => \URL::to($post->url),
'pubdate' => $post->created_at,
'description' => $desc,
'content' => $desc
]);
} else {
if ( ! $post->getCategories()->get()->isEmpty() ) {
$categories = "<br>";
foreach( $post->getCategories()->get() as $cat ) {
$categories .= "<a href='". \URL::to('/topic/' . $cat->name) ."'>". $cat->name . "</a> | ";
}
$categories = rtrim($categories, " | ");
$desc .= "<br>Topics:";
$desc .= $categories;
}
$discussions = "<br>";
foreach( $post->getDiscussions()->orderBy('comments', 'desc')->get() as $dis ) {
$discussions .= "<a href='" . $dis->source_url . "'>" . $dis->title . "</a> ";
$discussions .= $dis->upvotes . " Upvotes | " . $dis->comments . " Comments<br>";
}
$desc .= "<br><br>Discussions:";
$desc .= $discussions;
// set item's title, author, url, pubdate, description, content, enclosure (optional)*
$feed->addItem([
'title' => $post->title,
'author' => env('APP_NAME'),
'url' => \URL::to($post->url),
'link' => \URL::to($post->url),
'pubdate' => $post->created_at,
'description' => $desc,
'content' => $desc
]);
}
}
}
// first param is the feed format
// optional: second param is cache duration (value of 0 turns off caching)
// optional: you can set custom cache key with 3rd param as string
return $feed->render('atom', $cache, 'feed_' . $title);
}
public static function first_sentence($content, $max_len = NULL) {
$content = html_entity_decode(strip_tags($content));
$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);
}
}
}
|