Skip to content

Commit 4fbc913

Browse files
committed
Fix #419: Add meta links to the RSS feed
1 parent d3ac8e4 commit 4fbc913

File tree

2 files changed

+137
-1
lines changed

2 files changed

+137
-1
lines changed

src/Concerns/HasPageMetadata.php

+30-1
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
use Hyde\Framework\Helpers\Meta;
66
use Hyde\Framework\Hyde;
77
use Hyde\Framework\Models\MarkdownPost;
8+
use Hyde\Framework\Services\RssFeedService;
89

910
/**
1011
* @see \Tests\Feature\Concerns\HasPageMetadataTest
@@ -24,8 +25,16 @@ public function getDynamicMetadata(): array
2425
$array[] = '<link rel="canonical" href="'.$this->getCanonicalUrl().'" />';
2526
}
2627

28+
if ($this->canUseRssFeedlink()) {
29+
$array[] = '<link rel="alternate" type="application/rss+xml" title="'
30+
.RssFeedService::getTitle()
31+
.' RSS Feed" href="'
32+
.Hyde::uriPath(RssFeedService::getDefaultOutputFilename())
33+
.'" />';
34+
}
35+
2736
if ($this instanceof MarkdownPost) {
28-
// Temporarly merge data with GeneratesPageMetadata trait for compatibility
37+
// Temporarily merge data with GeneratesPageMetadata trait for compatibility
2938
$array[] = "\n<!-- Blog Post Meta Tags -->";
3039
foreach ($this->getMetadata() as $name => $content) {
3140
$array[] = Meta::name($name, $content);
@@ -51,4 +60,24 @@ public function canUseCanonicalUrl(): bool
5160
{
5261
return Hyde::uriPath() && isset($this->slug);
5362
}
63+
64+
public function canUseRssFeedLink(): bool
65+
{
66+
if (RssFeedService::canGenerateFeed() && isset($this->slug)) {
67+
68+
if ($this instanceof MarkdownPost) {
69+
return true;
70+
}
71+
72+
if (str_starts_with($this->getCurrentPagePath(), 'post')) {
73+
return true;
74+
}
75+
76+
if ($this->getCurrentPagePath() === 'index') {
77+
return true;
78+
}
79+
}
80+
81+
return false;
82+
}
5483
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,107 @@
1+
<?php
2+
3+
namespace Tests\Unit;
4+
5+
use Hyde\Framework\Models\BladePage;
6+
use Hyde\Framework\Models\DocumentationPage;
7+
use Hyde\Framework\Models\MarkdownPage;
8+
use Hyde\Framework\Models\MarkdownPost;
9+
use Tests\TestCase;
10+
11+
/**
12+
* @covers \Hyde\Framework\Concerns\HasPageMetadata::canUseRssFeedLink
13+
*/
14+
class HasPageMetadataRssFeedLinkTest extends TestCase
15+
{
16+
protected function setUp(): void
17+
{
18+
parent::setUp();
19+
20+
config(['hyde.site_url' => 'foo']);
21+
}
22+
23+
24+
public function test_can_use_rss_feed_link_adds_meta_link_for_markdown_posts()
25+
{
26+
$page = new MarkdownPost([], '');
27+
28+
$this->assertStringContainsString(
29+
'<link rel="alternate" type="application/rss+xml" title="HydePHP RSS Feed" href="foo/feed.xml" />',
30+
$page->renderPageMetadata()
31+
);
32+
}
33+
34+
public function test_can_use_rss_feed_link_adds_meta_link_for_post_related_pages()
35+
{
36+
$page = new MarkdownPage([], '', slug: 'posts');
37+
38+
$this->assertStringContainsString(
39+
'<link rel="alternate" type="application/rss+xml" title="HydePHP RSS Feed" href="foo/feed.xml" />',
40+
$page->renderPageMetadata()
41+
);
42+
}
43+
44+
public function test_can_use_rss_feed_link_adds_meta_link_for_markdown_index_page()
45+
{
46+
$page = new MarkdownPage([], '', slug: 'index');
47+
48+
$this->assertStringContainsString(
49+
'<link rel="alternate" type="application/rss+xml" title="HydePHP RSS Feed" href="foo/feed.xml" />',
50+
$page->renderPageMetadata()
51+
);
52+
}
53+
54+
public function test_can_use_rss_feed_link_adds_meta_link_for_blade_index_page()
55+
{
56+
$page = new BladePage('index');
57+
58+
$this->assertStringContainsString(
59+
'<link rel="alternate" type="application/rss+xml" title="HydePHP RSS Feed" href="foo/feed.xml" />',
60+
$page->renderPageMetadata()
61+
);
62+
}
63+
64+
public function test_can_use_rss_feed_link_does_not_add_meta_link_for_documentation_index_page()
65+
{
66+
$page = new DocumentationPage([], '', slug: 'index');
67+
68+
$this->assertStringNotContainsString(
69+
'<link rel="alternate" type="application/rss+xml" title="HydePHP RSS Feed" href="foo/feed.xml" />',
70+
$page->renderPageMetadata()
71+
);
72+
}
73+
74+
public function test_can_use_rss_feed_uses_configured_site_url()
75+
{
76+
config(['hyde.site_url' => 'https://example.org']);
77+
$page = new MarkdownPost([], '');
78+
79+
$this->assertStringContainsString(
80+
'<link rel="alternate" type="application/rss+xml" title="HydePHP RSS Feed" href="https://example.org/feed.xml" />',
81+
$page->renderPageMetadata()
82+
);
83+
}
84+
85+
public function test_can_use_rss_feed_uses_configured_rss_file_name()
86+
{
87+
config(['hyde.rssFilename' => 'posts.rss']);
88+
$page = new MarkdownPost([], '');
89+
90+
$this->assertStringContainsString(
91+
'<link rel="alternate" type="application/rss+xml" title="HydePHP RSS Feed" href="foo/posts.rss" />',
92+
$page->renderPageMetadata()
93+
);
94+
}
95+
96+
// Test link is not added if site url is not set
97+
public function test_link_is_not_added_if_site_url_is_not_set()
98+
{
99+
config(['hyde.site_url' => '']);
100+
$page = new MarkdownPost([], '');
101+
102+
$this->assertStringNotContainsString(
103+
'<link rel="alternate" type="application/rss+xml"',
104+
$page->renderPageMetadata()
105+
);
106+
}
107+
}

0 commit comments

Comments
 (0)