From 2614bacf04f7ce3536ebbb84c52a57df3abffc49 Mon Sep 17 00:00:00 2001 From: raulsf-dev Date: Wed, 3 Jul 2024 12:06:47 +0100 Subject: [PATCH 1/7] wip changes on blogs --- app/BlogPosts/TableOfContents.php | 44 ++++++ .../Controllers/Website/BlogController.php | 28 ++++ app/Models/BlogPost.php | 9 ++ composer.json | 5 +- composer.lock | 126 +++++++++++++++++- config/breadcrumbs.php | 75 +++++++++++ config/codex.php | 2 +- resources/css/app.css | 4 + resources/views/blog/blog-detail.blade.php | 90 +++++++++++-- resources/views/blog/blog-list.blade.php | 2 + .../atlas/blog-navigation.blade.php | 39 ++++++ .../vendor/breadcrumbs/bootstrap4.blade.php | 15 +++ .../vendor/breadcrumbs/bootstrap5.blade.php | 15 +++ .../views/vendor/breadcrumbs/bulma.blade.php | 23 ++++ .../vendor/breadcrumbs/foundation6.blade.php | 17 +++ .../views/vendor/breadcrumbs/json-ld.php | 23 ++++ .../vendor/breadcrumbs/materialize.blade.php | 17 +++ .../vendor/breadcrumbs/tailwind.blade.php | 29 ++++ .../views/vendor/breadcrumbs/uikit.blade.php | 13 ++ routes/breadcrumbs.php | 22 +++ 20 files changed, 585 insertions(+), 13 deletions(-) create mode 100644 app/BlogPosts/TableOfContents.php create mode 100644 config/breadcrumbs.php create mode 100644 resources/views/components/atlas/blog-navigation.blade.php create mode 100644 resources/views/vendor/breadcrumbs/bootstrap4.blade.php create mode 100644 resources/views/vendor/breadcrumbs/bootstrap5.blade.php create mode 100644 resources/views/vendor/breadcrumbs/bulma.blade.php create mode 100644 resources/views/vendor/breadcrumbs/foundation6.blade.php create mode 100644 resources/views/vendor/breadcrumbs/json-ld.php create mode 100644 resources/views/vendor/breadcrumbs/materialize.blade.php create mode 100644 resources/views/vendor/breadcrumbs/tailwind.blade.php create mode 100644 resources/views/vendor/breadcrumbs/uikit.blade.php create mode 100644 routes/breadcrumbs.php diff --git a/app/BlogPosts/TableOfContents.php b/app/BlogPosts/TableOfContents.php new file mode 100644 index 00000000..563917d4 --- /dev/null +++ b/app/BlogPosts/TableOfContents.php @@ -0,0 +1,44 @@ +raw = $html; + $this->_process(); + } + + public function toc () + { + return $this->_toc; + } + + public function html () + { + return $this->_parsedHtml; + } + + private function _process () + { + $this->_toc = []; + + $html = preg_replace_callback("/([^<]+)<\/h/", function($matches) { + $id = Str::random(8); + $this->_toc[] = (object) [ + 'priority' => intval($matches[1]), + 'id' => $id, + 'text' => $matches[3] + ]; + return ''.$matches[3].'raw); + + $this->_parsedHtml = $html; + } +} diff --git a/app/Http/Controllers/Website/BlogController.php b/app/Http/Controllers/Website/BlogController.php index 6db1212f..2f574a1f 100644 --- a/app/Http/Controllers/Website/BlogController.php +++ b/app/Http/Controllers/Website/BlogController.php @@ -25,9 +25,37 @@ public function detail(BlogPost $blog): \Illuminate\Contracts\View\View $otherBlogs = BlogPost::query()->whereIn('id', $blogIds)->get(); + $lines = explode("\n", $blog->markdown_content); + $titles = collect(); + $currentMainTitle = null; + + foreach ($lines as $line) { + // Verify if the line is ## (h2) + if (preg_match('/^\s*##\s(?!#)(.+)/', $line, $matches)) { + $currentMainTitle = ['title' => trim($matches[1]), 'subtitles' => collect()]; + $titles->push($currentMainTitle); + } + // Verify if the line is ### (h3) + elseif (preg_match('/^\s*###\s(.+)/', $line, $matches)) { + if ($currentMainTitle) { + $currentMainTitle['subtitles']->push(trim($matches[1])); + $titles->pop(); + $titles->push($currentMainTitle); + } + } + } + + $sections = $titles->map(function ($title) { + return [ + 'title' => $title['title'], + 'subtitles' => $title['subtitles']->toArray() + ]; + }); + return view('blog.blog-detail', [ 'blog' => $blog, 'otherBlogs' => $otherBlogs, + 'sections' => $sections, ]); } } diff --git a/app/Models/BlogPost.php b/app/Models/BlogPost.php index df46aa2e..ac398f1f 100644 --- a/app/Models/BlogPost.php +++ b/app/Models/BlogPost.php @@ -2,12 +2,14 @@ namespace App\Models; +use App\BlogPosts\TableOfContents; use App\Models\Traits\HasUserFeedback; use Illuminate\Database\Eloquent\Builder; use Illuminate\Database\Eloquent\Casts\Attribute; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; use Illuminate\Support\Facades\Storage; +use Illuminate\Support\Str; use Spatie\Sluggable\HasSlug; use Spatie\Sluggable\SlugOptions; @@ -105,4 +107,11 @@ public function getTailGraphUrl(): string return $image; } + + public function transformedContent(): Attribute + { + return Attribute::make( + get: fn () => new TableOfContents(Str::markdown($this->markdown_content)) + ); + } } diff --git a/composer.json b/composer.json index 058f1f89..8c71bd16 100644 --- a/composer.json +++ b/composer.json @@ -12,6 +12,7 @@ "borah/knowledge-base-laravel": "^0.7", "borahlabs/aws-marketplace-saas-laravel": "^1.0", "convertkit/convertkitapi": "^1.3", + "diglactic/laravel-breadcrumbs": "^9.0", "filament/filament": "^3.2", "filament/forms": "^3.2", "graham-campbell/bitbucket": "^10.4", @@ -30,8 +31,8 @@ "lorisleiva/laravel-actions": "^2.8", "openai-php/laravel": "^0.8", "spatie/laravel-sitemap": "^7.2", - "wire-elements/modal": "^2.0", - "spatie/laravel-sluggable": "^3.6" + "spatie/laravel-sluggable": "^3.6", + "wire-elements/modal": "^2.0" }, "require-dev": { "barryvdh/laravel-debugbar": "^3.13", diff --git a/composer.lock b/composer.lock index 3e5a1a31..7482e7f0 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "e467ec6a5c5b92e8e21e1b80c7cbfcda", + "content-hash": "d9943f087ee8f6b7a47ca158bcc836c6", "packages": [ { "name": "anourvalar/eloquent-serialize", @@ -1168,6 +1168,77 @@ }, "time": "2022-10-27T11:44:00+00:00" }, + { + "name": "diglactic/laravel-breadcrumbs", + "version": "v9.0.0", + "source": { + "type": "git", + "url": "https://github.com/diglactic/laravel-breadcrumbs.git", + "reference": "88e8f01e013e811215770e27b40a74014c28f2c4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/diglactic/laravel-breadcrumbs/zipball/88e8f01e013e811215770e27b40a74014c28f2c4", + "reference": "88e8f01e013e811215770e27b40a74014c28f2c4", + "shasum": "" + }, + "require": { + "facade/ignition-contracts": "^1.0", + "laravel/framework": "^8.0 || ^9.0 || ^10.0 || ^11.0", + "php": "^7.3 || ^8.0" + }, + "conflict": { + "davejamesmiller/laravel-breadcrumbs": "*" + }, + "require-dev": { + "orchestra/testbench": "^6.0 || ^7.0 || ^8.0 || ^9.0", + "php-coveralls/php-coveralls": "^2.7", + "phpunit/phpunit": "^9.5 || ^10.5", + "spatie/phpunit-snapshot-assertions": "^4.2 || ^5.1" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "Diglactic\\Breadcrumbs\\ServiceProvider" + ], + "aliases": { + "Breadcrumbs": "Diglactic\\Breadcrumbs\\Breadcrumbs" + } + } + }, + "autoload": { + "psr-4": { + "Diglactic\\Breadcrumbs\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Sheng Slogar", + "email": "sheng@diglactic.com", + "role": "Maintainer" + }, + { + "name": "Dave James Miller", + "email": "dave@davejamesmiller.com", + "role": "Original Creator" + } + ], + "description": "A simple Laravel-style way to create breadcrumbs.", + "homepage": "https://github.com/diglactic/laravel-breadcrumbs", + "keywords": [ + "laravel" + ], + "support": { + "issues": "https://github.com/diglactic/laravel-breadcrumbs/issues", + "source": "https://github.com/diglactic/laravel-breadcrumbs/tree/v9.0.0" + }, + "time": "2024-03-12T00:42:39+00:00" + }, { "name": "doctrine/cache", "version": "2.2.0", @@ -1870,6 +1941,59 @@ ], "time": "2023-10-06T06:47:41+00:00" }, + { + "name": "facade/ignition-contracts", + "version": "1.0.2", + "source": { + "type": "git", + "url": "https://github.com/facade/ignition-contracts.git", + "reference": "3c921a1cdba35b68a7f0ccffc6dffc1995b18267" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/facade/ignition-contracts/zipball/3c921a1cdba35b68a7f0ccffc6dffc1995b18267", + "reference": "3c921a1cdba35b68a7f0ccffc6dffc1995b18267", + "shasum": "" + }, + "require": { + "php": "^7.3|^8.0" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "^v2.15.8", + "phpunit/phpunit": "^9.3.11", + "vimeo/psalm": "^3.17.1" + }, + "type": "library", + "autoload": { + "psr-4": { + "Facade\\IgnitionContracts\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Freek Van der Herten", + "email": "freek@spatie.be", + "homepage": "https://flareapp.io", + "role": "Developer" + } + ], + "description": "Solution contracts for Ignition", + "homepage": "https://github.com/facade/ignition-contracts", + "keywords": [ + "contracts", + "flare", + "ignition" + ], + "support": { + "issues": "https://github.com/facade/ignition-contracts/issues", + "source": "https://github.com/facade/ignition-contracts/tree/1.0.2" + }, + "time": "2020-10-16T08:27:54+00:00" + }, { "name": "filament/actions", "version": "v3.2.85", diff --git a/config/breadcrumbs.php b/config/breadcrumbs.php new file mode 100644 index 00000000..3f2837c3 --- /dev/null +++ b/config/breadcrumbs.php @@ -0,0 +1,75 @@ + 'breadcrumbs::tailwind', + + /* + |-------------------------------------------------------------------------- + | Breadcrumbs File(s) + |-------------------------------------------------------------------------- + | + | The file(s) where breadcrumbs are defined. e.g. + | + | - base_path('routes/breadcrumbs.php') + | - glob(base_path('breadcrumbs/*.php')) + | + */ + + 'files' => base_path('routes/breadcrumbs.php'), + + /* + |-------------------------------------------------------------------------- + | Exceptions + |-------------------------------------------------------------------------- + | + | Determine when to throw an exception. + | + */ + + // When route-bound breadcrumbs are used but the current route doesn't have a name (UnnamedRouteException) + 'unnamed-route-exception' => true, + + // When route-bound breadcrumbs are used and the matching breadcrumb doesn't exist (InvalidBreadcrumbException) + 'missing-route-bound-breadcrumb-exception' => true, + + // When a named breadcrumb is used but doesn't exist (InvalidBreadcrumbException) + 'invalid-named-breadcrumb-exception' => true, + + /* + |-------------------------------------------------------------------------- + | Classes + |-------------------------------------------------------------------------- + | + | Subclass the default classes for more advanced customisations. + | + */ + + // Manager + 'manager-class' => Diglactic\Breadcrumbs\Manager::class, + + // Generator + 'generator-class' => Diglactic\Breadcrumbs\Generator::class, + +]; diff --git a/config/codex.php b/config/codex.php index 70e79176..db1275c0 100644 --- a/config/codex.php +++ b/config/codex.php @@ -1,4 +1,4 @@ - [ diff --git a/resources/css/app.css b/resources/css/app.css index 669494e2..e7e7032c 100644 --- a/resources/css/app.css +++ b/resources/css/app.css @@ -56,6 +56,10 @@ text-fill-color: transparent; } +.border-secondary-gradient { + border-image: linear-gradient(180deg, #FFFFFF -91.67%, #9A88F5 77.96%) 1; +} + .title-gradient { background: linear-gradient(180deg, #FFF -91.67%, #9A88F5 77.96%); background-clip: text; diff --git a/resources/views/blog/blog-detail.blade.php b/resources/views/blog/blog-detail.blade.php index f3ff02c3..8a7ee3ef 100644 --- a/resources/views/blog/blog-detail.blade.php +++ b/resources/views/blog/blog-detail.blade.php @@ -4,11 +4,21 @@ @section('metadescription', $blog->seo_description) {{-- Hacer la og image de tailgraph en el modelo --}} @section('og_image', $blog->getTailGraphUrl()) -
-
-

{{ $blog->title }}

+
+ {{ Breadcrumbs::render('blogDetail', $blog) }} +
+ + + + +
+

{{ $blog->title }}

-
{{ $blog->image_alt }} @@ -16,17 +26,21 @@ class="absolute left-0 top-0 w-full h-full object-cover" /> class="absolute top-4 right-4 bg-violet-500 text-white text-sm font-medium rounded-md px-2 py-1">{{ $blog->published_at->format('d-m-Y') }}
-
- {!! Str::markdown($blog->markdown_content) !!} +
+ {!! $blog->transformed_content->html() !!}
+ +
-
-
+ +
+ + @if ($otherBlogs->count() > 0) -
+

{{ __('Other blogs') }}

@@ -39,4 +53,62 @@ class="absolute top-4 right-4 bg-violet-500 text-white text-sm font-medium round
@endif + diff --git a/resources/views/blog/blog-list.blade.php b/resources/views/blog/blog-list.blade.php index b5f0f817..644d8bae 100644 --- a/resources/views/blog/blog-list.blade.php +++ b/resources/views/blog/blog-list.blade.php @@ -1,5 +1,7 @@
+ {{ Breadcrumbs::render('blog') }} +

Blog

diff --git a/resources/views/components/atlas/blog-navigation.blade.php b/resources/views/components/atlas/blog-navigation.blade.php new file mode 100644 index 00000000..cd05f4a5 --- /dev/null +++ b/resources/views/components/atlas/blog-navigation.blade.php @@ -0,0 +1,39 @@ +
+
+
+

On this page

+
+ +
+
diff --git a/resources/views/vendor/breadcrumbs/bootstrap4.blade.php b/resources/views/vendor/breadcrumbs/bootstrap4.blade.php new file mode 100644 index 00000000..59a820d2 --- /dev/null +++ b/resources/views/vendor/breadcrumbs/bootstrap4.blade.php @@ -0,0 +1,15 @@ +@unless ($breadcrumbs->isEmpty()) + +@endunless diff --git a/resources/views/vendor/breadcrumbs/bootstrap5.blade.php b/resources/views/vendor/breadcrumbs/bootstrap5.blade.php new file mode 100644 index 00000000..13fb1b1d --- /dev/null +++ b/resources/views/vendor/breadcrumbs/bootstrap5.blade.php @@ -0,0 +1,15 @@ +@unless ($breadcrumbs->isEmpty()) + +@endunless diff --git a/resources/views/vendor/breadcrumbs/bulma.blade.php b/resources/views/vendor/breadcrumbs/bulma.blade.php new file mode 100644 index 00000000..26e478ef --- /dev/null +++ b/resources/views/vendor/breadcrumbs/bulma.blade.php @@ -0,0 +1,23 @@ +@unless ($breadcrumbs->isEmpty()) + +@endunless diff --git a/resources/views/vendor/breadcrumbs/foundation6.blade.php b/resources/views/vendor/breadcrumbs/foundation6.blade.php new file mode 100644 index 00000000..06294668 --- /dev/null +++ b/resources/views/vendor/breadcrumbs/foundation6.blade.php @@ -0,0 +1,17 @@ +@unless ($breadcrumbs->isEmpty()) + +@endunless diff --git a/resources/views/vendor/breadcrumbs/json-ld.php b/resources/views/vendor/breadcrumbs/json-ld.php new file mode 100644 index 00000000..5f75225d --- /dev/null +++ b/resources/views/vendor/breadcrumbs/json-ld.php @@ -0,0 +1,23 @@ + 'https://schema.org', + '@type' => 'BreadcrumbList', + 'itemListElement' => [], +]; + +foreach ($breadcrumbs as $i => $breadcrumb) { + $json['itemListElement'][] = [ + '@type' => 'ListItem', + 'position' => $i + 1, + 'item' => [ + '@id' => $breadcrumb->url ?: Request::fullUrl(), + 'name' => $breadcrumb->title, + 'image' => $breadcrumb->image ?? null, + ], + ]; +} +?> + diff --git a/resources/views/vendor/breadcrumbs/materialize.blade.php b/resources/views/vendor/breadcrumbs/materialize.blade.php new file mode 100644 index 00000000..7d89a9f4 --- /dev/null +++ b/resources/views/vendor/breadcrumbs/materialize.blade.php @@ -0,0 +1,17 @@ +@unless ($breadcrumbs->isEmpty()) + +@endunless diff --git a/resources/views/vendor/breadcrumbs/tailwind.blade.php b/resources/views/vendor/breadcrumbs/tailwind.blade.php new file mode 100644 index 00000000..f845520c --- /dev/null +++ b/resources/views/vendor/breadcrumbs/tailwind.blade.php @@ -0,0 +1,29 @@ +@unless ($breadcrumbs->isEmpty()) + + @endunless diff --git a/resources/views/vendor/breadcrumbs/uikit.blade.php b/resources/views/vendor/breadcrumbs/uikit.blade.php new file mode 100644 index 00000000..920183db --- /dev/null +++ b/resources/views/vendor/breadcrumbs/uikit.blade.php @@ -0,0 +1,13 @@ +@unless ($breadcrumbs->isEmpty()) + +@endunless diff --git a/routes/breadcrumbs.php b/routes/breadcrumbs.php new file mode 100644 index 00000000..97b58f78 --- /dev/null +++ b/routes/breadcrumbs.php @@ -0,0 +1,22 @@ +push('Home', route('homepage')); +}); + +// Home > Blog +Breadcrumbs::for('blog', function (BreadcrumbTrail $trail) { + $trail->parent('home'); + $trail->push('Blog', route('blog.index')); +}); + +// Home > Blog +Breadcrumbs::for('blogDetail', function (BreadcrumbTrail $trail, BlogPost $blog) { + $trail->parent('blog'); + $trail->push($blog->title, route('blog.detail', $blog)); +}); From 50bedc304d38e6f4c2c7e1f4fdfd2e86853a4a89 Mon Sep 17 00:00:00 2001 From: raulsf-dev Date: Wed, 3 Jul 2024 14:26:27 +0100 Subject: [PATCH 2/7] wip changes and mobile version --- resources/views/blog/blog-detail.blade.php | 15 ++++-- .../atlas/blog-navigation.blade.php | 39 -------------- .../atlas/blog/navigation.blade.php | 53 +++++++++++++++++++ .../components/atlas/blog/share.blade.php | 45 ++++++++++++++++ .../icons/facebook-filled.blade.php | 9 ++++ .../icons/facebook-outlined.blade.php | 9 ++++ .../icons/linkedin-filled.blade.php | 12 +++++ .../icons/linkedin-outlined.blade.php | 12 +++++ .../components/icons/twitter-filled.blade.php | 9 ++++ .../icons/twitter-outlined.blade.php | 9 ++++ .../icons/whatsapp-filled.blade.php | 12 +++++ .../icons/whatsapp-outlined.blade.php | 11 ++++ 12 files changed, 193 insertions(+), 42 deletions(-) delete mode 100644 resources/views/components/atlas/blog-navigation.blade.php create mode 100644 resources/views/components/atlas/blog/navigation.blade.php create mode 100644 resources/views/components/atlas/blog/share.blade.php create mode 100644 resources/views/components/icons/facebook-filled.blade.php create mode 100644 resources/views/components/icons/facebook-outlined.blade.php create mode 100644 resources/views/components/icons/linkedin-filled.blade.php create mode 100644 resources/views/components/icons/linkedin-outlined.blade.php create mode 100644 resources/views/components/icons/twitter-filled.blade.php create mode 100644 resources/views/components/icons/twitter-outlined.blade.php create mode 100644 resources/views/components/icons/whatsapp-filled.blade.php create mode 100644 resources/views/components/icons/whatsapp-outlined.blade.php diff --git a/resources/views/blog/blog-detail.blade.php b/resources/views/blog/blog-detail.blade.php index 8a7ee3ef..bd30e2ea 100644 --- a/resources/views/blog/blog-detail.blade.php +++ b/resources/views/blog/blog-detail.blade.php @@ -11,8 +11,10 @@ @@ -26,7 +28,14 @@ class="absolute left-0 top-0 w-full h-full object-cover" /> class="absolute top-4 right-4 bg-violet-500 text-white text-sm font-medium rounded-md px-2 py-1">{{ $blog->published_at->format('d-m-Y') }}
-
+ {{-- TODO: add blog mobile navigation here --}} +
+ + + +
+ +
{!! $blog->transformed_content->html() !!}
diff --git a/resources/views/components/atlas/blog-navigation.blade.php b/resources/views/components/atlas/blog-navigation.blade.php deleted file mode 100644 index cd05f4a5..00000000 --- a/resources/views/components/atlas/blog-navigation.blade.php +++ /dev/null @@ -1,39 +0,0 @@ -
-
-
-

On this page

-
- -
-
diff --git a/resources/views/components/atlas/blog/navigation.blade.php b/resources/views/components/atlas/blog/navigation.blade.php new file mode 100644 index 00000000..c027313c --- /dev/null +++ b/resources/views/components/atlas/blog/navigation.blade.php @@ -0,0 +1,53 @@ +
+ @if (!empty($blog->transformed_content->toc())) +
+ +
+ +
+
+ + + + @endif +
diff --git a/resources/views/components/atlas/blog/share.blade.php b/resources/views/components/atlas/blog/share.blade.php new file mode 100644 index 00000000..2371627d --- /dev/null +++ b/resources/views/components/atlas/blog/share.blade.php @@ -0,0 +1,45 @@ +
+

Share this page

+ +
+ @php + $pageTitle = $blog->title; + $pageUrl = url()->current(); + @endphp + + + + + + + +
+
diff --git a/resources/views/components/icons/facebook-filled.blade.php b/resources/views/components/icons/facebook-filled.blade.php new file mode 100644 index 00000000..e34b2150 --- /dev/null +++ b/resources/views/components/icons/facebook-filled.blade.php @@ -0,0 +1,9 @@ + + + + diff --git a/resources/views/components/icons/facebook-outlined.blade.php b/resources/views/components/icons/facebook-outlined.blade.php new file mode 100644 index 00000000..14dc0d8e --- /dev/null +++ b/resources/views/components/icons/facebook-outlined.blade.php @@ -0,0 +1,9 @@ + + + + diff --git a/resources/views/components/icons/linkedin-filled.blade.php b/resources/views/components/icons/linkedin-filled.blade.php new file mode 100644 index 00000000..c54410d8 --- /dev/null +++ b/resources/views/components/icons/linkedin-filled.blade.php @@ -0,0 +1,12 @@ + + + + + diff --git a/resources/views/components/icons/linkedin-outlined.blade.php b/resources/views/components/icons/linkedin-outlined.blade.php new file mode 100644 index 00000000..a2ec20c7 --- /dev/null +++ b/resources/views/components/icons/linkedin-outlined.blade.php @@ -0,0 +1,12 @@ + + + + + diff --git a/resources/views/components/icons/twitter-filled.blade.php b/resources/views/components/icons/twitter-filled.blade.php new file mode 100644 index 00000000..06ce0732 --- /dev/null +++ b/resources/views/components/icons/twitter-filled.blade.php @@ -0,0 +1,9 @@ + + + + diff --git a/resources/views/components/icons/twitter-outlined.blade.php b/resources/views/components/icons/twitter-outlined.blade.php new file mode 100644 index 00000000..4e196e9e --- /dev/null +++ b/resources/views/components/icons/twitter-outlined.blade.php @@ -0,0 +1,9 @@ + + + + diff --git a/resources/views/components/icons/whatsapp-filled.blade.php b/resources/views/components/icons/whatsapp-filled.blade.php new file mode 100644 index 00000000..772a744f --- /dev/null +++ b/resources/views/components/icons/whatsapp-filled.blade.php @@ -0,0 +1,12 @@ + + + + + diff --git a/resources/views/components/icons/whatsapp-outlined.blade.php b/resources/views/components/icons/whatsapp-outlined.blade.php new file mode 100644 index 00000000..b6890fd9 --- /dev/null +++ b/resources/views/components/icons/whatsapp-outlined.blade.php @@ -0,0 +1,11 @@ + + + + + From d7a421acb06325c147909aa6e9e076f26052c6e6 Mon Sep 17 00:00:00 2001 From: raulsf-dev Date: Thu, 4 Jul 2024 09:37:07 +0100 Subject: [PATCH 3/7] schema org and style changes --- .../Controllers/Website/BlogController.php | 51 ++++++------- composer.json | 1 + composer.lock | 75 ++++++++++++++++++- config/codex.php | 1 + resources/views/blog/blog-detail.blade.php | 21 ++---- resources/views/blog/blog-list.blade.php | 6 +- .../atlas/blog/navigation.blade.php | 6 +- 7 files changed, 110 insertions(+), 51 deletions(-) diff --git a/app/Http/Controllers/Website/BlogController.php b/app/Http/Controllers/Website/BlogController.php index 2f574a1f..6a369e04 100644 --- a/app/Http/Controllers/Website/BlogController.php +++ b/app/Http/Controllers/Website/BlogController.php @@ -5,6 +5,7 @@ use App\Http\Controllers\Controller; use App\Models\BlogPost; use Illuminate\Http\Request; +use Spatie\SchemaOrg\Schema; class BlogController extends Controller { @@ -17,45 +18,37 @@ public function index(): \Illuminate\Contracts\View\View public function detail(BlogPost $blog): \Illuminate\Contracts\View\View { - if (! auth()->user()?->emailIsFromCodex()) { - abort_if(! $blog->is_visible, 404); + if (!auth()->user()?->emailIsFromCodex()) { + abort_if(!$blog->is_visible, 404); } $blogIds = collect($blog->related_blogs); $otherBlogs = BlogPost::query()->whereIn('id', $blogIds)->get(); - $lines = explode("\n", $blog->markdown_content); - $titles = collect(); - $currentMainTitle = null; - - foreach ($lines as $line) { - // Verify if the line is ## (h2) - if (preg_match('/^\s*##\s(?!#)(.+)/', $line, $matches)) { - $currentMainTitle = ['title' => trim($matches[1]), 'subtitles' => collect()]; - $titles->push($currentMainTitle); - } - // Verify if the line is ### (h3) - elseif (preg_match('/^\s*###\s(.+)/', $line, $matches)) { - if ($currentMainTitle) { - $currentMainTitle['subtitles']->push(trim($matches[1])); - $titles->pop(); - $titles->push($currentMainTitle); - } - } - } - - $sections = $titles->map(function ($title) { - return [ - 'title' => $title['title'], - 'subtitles' => $title['subtitles']->toArray() - ]; - }); + $schema = Schema::article() + ->headline('Example Article') + ->author(config('codex.blog_author')) + ->datePublished($blog->published_at) + ->mainEntityOfPage(Schema::webPage() + ->url(url()->current())); + + $schema = Schema::blogPosting() + ->headline($blog->title) + ->articleBody($blog->markdown_content) + ->author(Schema::person()->name(config('codex.blog_author'))) + ->datePublished($blog->published_at->toIso8601String()) + ->dateModified($blog->updated_at->toIso8601String()) + ->mainEntityOfPage(Schema::webPage()->url(url()->current())) + ->publisher(Schema::organization() + ->name('CodexAtlas Blog') + ->logo(Schema::imageObject()->url(asset('images/logo.png')))) + ->image($blog->image_url); return view('blog.blog-detail', [ 'blog' => $blog, 'otherBlogs' => $otherBlogs, - 'sections' => $sections, + 'schema' => $schema, ]); } } diff --git a/composer.json b/composer.json index 8c71bd16..51e3cbe1 100644 --- a/composer.json +++ b/composer.json @@ -32,6 +32,7 @@ "openai-php/laravel": "^0.8", "spatie/laravel-sitemap": "^7.2", "spatie/laravel-sluggable": "^3.6", + "spatie/schema-org": "^3.23", "wire-elements/modal": "^2.0" }, "require-dev": { diff --git a/composer.lock b/composer.lock index 7482e7f0..75de5aad 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "d9943f087ee8f6b7a47ca158bcc836c6", + "content-hash": "41728e10c95b0c305cdf3b82dcbd45ee", "packages": [ { "name": "anourvalar/eloquent-serialize", @@ -9435,6 +9435,79 @@ ], "time": "2024-04-22T14:28:40+00:00" }, + { + "name": "spatie/schema-org", + "version": "3.23.0", + "source": { + "type": "git", + "url": "https://github.com/spatie/schema-org.git", + "reference": "c95abf7da59f16570aec18ca11d861255e645c39" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/spatie/schema-org/zipball/c95abf7da59f16570aec18ca11d861255e645c39", + "reference": "c95abf7da59f16570aec18ca11d861255e645c39", + "shasum": "" + }, + "require": { + "ext-json": "*", + "php": "^8.0" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "^3.6", + "graham-campbell/analyzer": "^3.0.5", + "illuminate/collections": "^8.62.0", + "league/flysystem": "^2.3.0 || ^3.0", + "pestphp/pest": "^1.21", + "symfony/console": "^5.3.7 || 6.0", + "twig/twig": "^3.3.3" + }, + "type": "library", + "autoload": { + "psr-4": { + "Spatie\\SchemaOrg\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Sebastian De Deyne", + "email": "sebastian@spatie.be", + "homepage": "https://spatie.be", + "role": "Developer" + }, + { + "name": "Tom Witkowski", + "email": "dev.gummibeer@gmail.com", + "homepage": "https://gummibeer.de", + "role": "Developer" + } + ], + "description": "A fluent builder Schema.org types and ld+json generator", + "homepage": "https://github.com/spatie/schema-org", + "keywords": [ + "schema-org", + "spatie" + ], + "support": { + "issues": "https://github.com/spatie/schema-org/issues", + "source": "https://github.com/spatie/schema-org/tree/3.23.0" + }, + "funding": [ + { + "url": "https://spatie.be/open-source/support-us", + "type": "custom" + }, + { + "url": "https://github.com/spatie", + "type": "github" + } + ], + "time": "2024-01-11T14:58:44+00:00" + }, { "name": "spatie/temporary-directory", "version": "2.2.1", diff --git a/config/codex.php b/config/codex.php index db1275c0..b1575347 100644 --- a/config/codex.php +++ b/config/codex.php @@ -69,4 +69,5 @@ 'support_email' => env('SUPPORT_EMAIL', 'support@codexatlas.app'), 'llm' => env('CODEX_LLM', 'openai'), 'company_domain' => env('COMPANY_DOMAIN', '@codexatlas.app'), + 'blog_author' => env('BLOG_AUTHOR', 'CodexAtlas'), ]; diff --git a/resources/views/blog/blog-detail.blade.php b/resources/views/blog/blog-detail.blade.php index bd30e2ea..4a3967d7 100644 --- a/resources/views/blog/blog-detail.blade.php +++ b/resources/views/blog/blog-detail.blade.php @@ -4,15 +4,13 @@ @section('metadescription', $blog->seo_description) {{-- Hacer la og image de tailgraph en el modelo --}} @section('og_image', $blog->getTailGraphUrl()) -
+
{{ Breadcrumbs::render('blogDetail', $blog) }}
- - - {{-- TODO: add blog mobile navigation here --}}
- +
@@ -63,16 +60,6 @@ class="absolute top-4 right-4 bg-violet-500 text-white text-sm font-medium round @endif
+ + {!! $schema->toScript() !!} diff --git a/resources/views/blog/blog-list.blade.php b/resources/views/blog/blog-list.blade.php index 644d8bae..2423ebfd 100644 --- a/resources/views/blog/blog-list.blade.php +++ b/resources/views/blog/blog-list.blade.php @@ -1,6 +1,8 @@ -
- {{ Breadcrumbs::render('blog') }} +
+
+ {{ Breadcrumbs::render('blog') }} +

Blog

diff --git a/resources/views/components/atlas/blog/navigation.blade.php b/resources/views/components/atlas/blog/navigation.blade.php index c027313c..71b83f38 100644 --- a/resources/views/components/atlas/blog/navigation.blade.php +++ b/resources/views/components/atlas/blog/navigation.blade.php @@ -1,15 +1,15 @@
@if (!empty($blog->transformed_content->toc())) -
+
-
+