From 247a9cd638af19efdb98c34ffd4f83eeb6183755 Mon Sep 17 00:00:00 2001 From: Pete Bishop Date: Mon, 24 Mar 2025 14:56:56 +0000 Subject: [PATCH 1/7] Add GitHub Retrieved Release Notes Page --- app/Support/GitHub.php | 25 +++++++++++++++++++ .../1/getting-started/release-notes.md | 15 +++++++++++ 2 files changed, 40 insertions(+) create mode 100644 resources/views/docs/desktop/1/getting-started/release-notes.md diff --git a/app/Support/GitHub.php b/app/Support/GitHub.php index d0aa6763..19521e6b 100644 --- a/app/Support/GitHub.php +++ b/app/Support/GitHub.php @@ -2,6 +2,7 @@ namespace App\Support; +use Illuminate\Support\Collection; use Illuminate\Support\Facades\Cache; use Illuminate\Support\Facades\Http; @@ -38,6 +39,17 @@ function () { return $version['name'] ?? 'Unknown'; } + public function releases(): Collection + { + return Cache::remember( + $this->getCacheKey('releases'), + now()->addHour(), + function () { + return $this->fetchReleases(); + } + ); + } + private function fetchLatestVersion() { // Make a request to GitHub @@ -55,4 +67,17 @@ private function getCacheKey(string $string): string { return sprintf('%s-%s', $this->package, $string); } + + private function fetchReleases(): ?Collection + { + // Make a request to GitHub + $response = Http::get('https://api.github.com/repos/'.$this->package.'/releases'); + + // Check if the request was successful + if ($response->failed()) { + return null; + } + + return collect($response->json()); + } } diff --git a/resources/views/docs/desktop/1/getting-started/release-notes.md b/resources/views/docs/desktop/1/getting-started/release-notes.md new file mode 100644 index 00000000..c415274b --- /dev/null +++ b/resources/views/docs/desktop/1/getting-started/release-notes.md @@ -0,0 +1,15 @@ +--- +title: Release Notes +order: 1100 +--- + +@forelse (\App\Support\GitHub::electron()->releases() as $release) +## {{ $release['name'] }} +Released: {{ \Carbon\Carbon::parse($release['published_at'])->format('F j, Y') }}** + +{{ str_replace('#', '##', $release['body']) }} +--- +@empty +## We couldn't show you the latest release notes at this time. +Not to worry, you can head over to GitHub to see the [latest release notes](https://github.com/NativePHP/electron/releases). +@endforelse From 8c3cebe5f7fc84b9162b08e04694c4621c30e5bd Mon Sep 17 00:00:00 2001 From: Pete Bishop Date: Mon, 24 Mar 2025 15:15:19 +0000 Subject: [PATCH 2/7] Add GitHub Release Object with formatting for release notes --- app/Support/GitHub.php | 13 ++- app/Support/GitHub/Release.php | 85 +++++++++++++++++++ .../1/getting-started/release-notes.md | 6 +- 3 files changed, 93 insertions(+), 11 deletions(-) create mode 100644 app/Support/GitHub/Release.php diff --git a/app/Support/GitHub.php b/app/Support/GitHub.php index 19521e6b..537b708c 100644 --- a/app/Support/GitHub.php +++ b/app/Support/GitHub.php @@ -2,6 +2,7 @@ namespace App\Support; +use App\Support\GitHub\Release; use Illuminate\Support\Collection; use Illuminate\Support\Facades\Cache; use Illuminate\Support\Facades\Http; @@ -31,9 +32,7 @@ public function latestVersion() $version = Cache::remember( $this->getCacheKey('latest-version'), now()->addHour(), - function () { - return $this->fetchLatestVersion(); - } + fn () => $this->fetchLatestVersion() ); return $version['name'] ?? 'Unknown'; @@ -44,9 +43,7 @@ public function releases(): Collection return Cache::remember( $this->getCacheKey('releases'), now()->addHour(), - function () { - return $this->fetchReleases(); - } + fn () => $this->fetchReleases() ); } @@ -75,9 +72,9 @@ private function fetchReleases(): ?Collection // Check if the request was successful if ($response->failed()) { - return null; + return collect(); } - return collect($response->json()); + return collect($response->json())->map(fn (array $release) => new Release($release)); } } diff --git a/app/Support/GitHub/Release.php b/app/Support/GitHub/Release.php new file mode 100644 index 00000000..73b654e9 --- /dev/null +++ b/app/Support/GitHub/Release.php @@ -0,0 +1,85 @@ +data[$name] ?? null; + } + + public function __isset(string $name): bool + { + return isset($this->data[$name]); + } + + public function getBodyForMarkdown(): string + { + $body = $this->body; + + // Convert any URLs to Markdown links + if ($this->convertLinks) { + $body = preg_replace( + '/(https?:\/\/[^\s]+)/', + '[$1]($1)', + $body + ); + } + + // Change any @ tags to markdown links to GitHub + if ($this->withUserLinks) { + $body = preg_replace( + '/@([a-zA-Z0-9_]+)/', + '[@$1](https://github.com/$1)', + $body + ); + } + + return str_replace('#', '##', $body); + } + + public function withoutUserLinks(bool $withoutUserLinks = true): static + { + $this->withUserLinks = ! $withoutUserLinks; + + return $this; + } + + public function withoutLinkConversion(bool $convertLinks = true): static + { + $this->convertLinks = ! $convertLinks; + + return $this; + } +} diff --git a/resources/views/docs/desktop/1/getting-started/release-notes.md b/resources/views/docs/desktop/1/getting-started/release-notes.md index c415274b..a32390ff 100644 --- a/resources/views/docs/desktop/1/getting-started/release-notes.md +++ b/resources/views/docs/desktop/1/getting-started/release-notes.md @@ -4,10 +4,10 @@ order: 1100 --- @forelse (\App\Support\GitHub::electron()->releases() as $release) -## {{ $release['name'] }} -Released: {{ \Carbon\Carbon::parse($release['published_at'])->format('F j, Y') }}** +## {{ $release->name }} +**Released: {{ \Carbon\Carbon::parse($release->published_at)->format('F j, Y') }}** -{{ str_replace('#', '##', $release['body']) }} +{{ $release->getBodyForMarkdown() }} --- @empty ## We couldn't show you the latest release notes at this time. From d07ec25ebd8a4f4d3c3d7149217c027cd9042188 Mon Sep 17 00:00:00 2001 From: Pete Bishop Date: Tue, 25 Mar 2025 12:14:21 +0000 Subject: [PATCH 3/7] Take 10 latest --- app/Support/GitHub.php | 10 +++++----- .../docs/desktop/1/getting-started/release-notes.md | 2 +- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/app/Support/GitHub.php b/app/Support/GitHub.php index 537b708c..0006f3e9 100644 --- a/app/Support/GitHub.php +++ b/app/Support/GitHub.php @@ -29,13 +29,13 @@ public static function laravel(): static public function latestVersion() { - $version = Cache::remember( + $release = Cache::remember( $this->getCacheKey('latest-version'), now()->addHour(), fn () => $this->fetchLatestVersion() ); - return $version['name'] ?? 'Unknown'; + return $release?->name ?? 'Unknown'; } public function releases(): Collection @@ -44,10 +44,10 @@ public function releases(): Collection $this->getCacheKey('releases'), now()->addHour(), fn () => $this->fetchReleases() - ); + ) ?? collect(); } - private function fetchLatestVersion() + private function fetchLatestVersion(): ?Release { // Make a request to GitHub $response = Http::get('https://api.github.com/repos/'.$this->package.'/releases/latest'); @@ -57,7 +57,7 @@ private function fetchLatestVersion() return null; } - return $response->json(); + return new Release($response->json()); } private function getCacheKey(string $string): string diff --git a/resources/views/docs/desktop/1/getting-started/release-notes.md b/resources/views/docs/desktop/1/getting-started/release-notes.md index a32390ff..831a6c6a 100644 --- a/resources/views/docs/desktop/1/getting-started/release-notes.md +++ b/resources/views/docs/desktop/1/getting-started/release-notes.md @@ -3,7 +3,7 @@ title: Release Notes order: 1100 --- -@forelse (\App\Support\GitHub::electron()->releases() as $release) +@forelse (\App\Support\GitHub::electron()->releases()->take(10) as $release) ## {{ $release->name }} **Released: {{ \Carbon\Carbon::parse($release->published_at)->format('F j, Y') }}** From 51f500784ebf40568260a2185a5b5194d06a0eb2 Mon Sep 17 00:00:00 2001 From: Pete Bishop Date: Tue, 25 Mar 2025 12:17:57 +0000 Subject: [PATCH 4/7] Appease pint --- app/Support/GitHub/Release.php | 1 + 1 file changed, 1 insertion(+) diff --git a/app/Support/GitHub/Release.php b/app/Support/GitHub/Release.php index 73b654e9..8b445507 100644 --- a/app/Support/GitHub/Release.php +++ b/app/Support/GitHub/Release.php @@ -26,6 +26,7 @@ class Release { private bool $withUserLinks = true; + private bool $convertLinks = true; public function __construct( From d159a9f4bfae58f4c1c6af0daad29cbe63fc69ef Mon Sep 17 00:00:00 2001 From: Pete Bishop <9081809+PeteBishwhip@users.noreply.github.com> Date: Wed, 26 Mar 2025 18:35:28 +0000 Subject: [PATCH 5/7] Update Release Note Markdown processing to reduce PR link sizes. --- app/Support/GitHub/Release.php | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/app/Support/GitHub/Release.php b/app/Support/GitHub/Release.php index 8b445507..978571b4 100644 --- a/app/Support/GitHub/Release.php +++ b/app/Support/GitHub/Release.php @@ -52,7 +52,13 @@ public function getBodyForMarkdown(): string // Convert any URLs to Markdown links if ($this->convertLinks) { $body = preg_replace( - '/(https?:\/\/[^\s]+)/', + '/https?:\/\/[^\s]+\/pull\/(\d+)/', + '[#$1]($0)', + $body + ); + + $body = preg_replace( + '/(https?:\/\/(?![^\s]+\/pull\/\d+)[^\s]+)/', '[$1]($1)', $body ); @@ -67,7 +73,7 @@ public function getBodyForMarkdown(): string ); } - return str_replace('#', '##', $body); + return preg_replace('/^#/m', '##', $body); } public function withoutUserLinks(bool $withoutUserLinks = true): static From 13fb1ec7d3b29f3d25ef440a8518e5c9a88b8fb3 Mon Sep 17 00:00:00 2001 From: Pete Bishop <9081809+PeteBishwhip@users.noreply.github.com> Date: Thu, 27 Mar 2025 10:33:29 +0000 Subject: [PATCH 6/7] BugFix: HTML Special Chars in Table of Contents --- app/Http/Controllers/ShowDocumentationController.php | 2 +- .../1/getting-started/{release-notes.md => releasenotes.md} | 0 2 files changed, 1 insertion(+), 1 deletion(-) rename resources/views/docs/desktop/1/getting-started/{release-notes.md => releasenotes.md} (100%) diff --git a/app/Http/Controllers/ShowDocumentationController.php b/app/Http/Controllers/ShowDocumentationController.php index 9e6b852f..bae2ce42 100644 --- a/app/Http/Controllers/ShowDocumentationController.php +++ b/app/Http/Controllers/ShowDocumentationController.php @@ -238,7 +238,7 @@ protected function extractTableOfContents(string $document): array ->map(function (string $line) { return [ 'level' => strlen(trim(Str::before($line, '# '))) + 1, - 'title' => $title = trim(Str::after($line, '# ')), + 'title' => $title = htmlspecialchars_decode(trim(Str::after($line, '# '))), 'anchor' => Str::slug(Str::replace('`', 'code', $title)), ]; }) diff --git a/resources/views/docs/desktop/1/getting-started/release-notes.md b/resources/views/docs/desktop/1/getting-started/releasenotes.md similarity index 100% rename from resources/views/docs/desktop/1/getting-started/release-notes.md rename to resources/views/docs/desktop/1/getting-started/releasenotes.md From 66d819ada15e1706897e1342d598a93282a71c0c Mon Sep 17 00:00:00 2001 From: Pete Bishop <9081809+PeteBishwhip@users.noreply.github.com> Date: Fri, 28 Mar 2025 08:52:24 +0000 Subject: [PATCH 7/7] Demote subheadings --- app/Support/GitHub/Release.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/Support/GitHub/Release.php b/app/Support/GitHub/Release.php index 978571b4..30130478 100644 --- a/app/Support/GitHub/Release.php +++ b/app/Support/GitHub/Release.php @@ -73,7 +73,7 @@ public function getBodyForMarkdown(): string ); } - return preg_replace('/^#/m', '##', $body); + return preg_replace('/^#/m', '###', $body); } public function withoutUserLinks(bool $withoutUserLinks = true): static