Skip to content

Commit

Permalink
wip
Browse files Browse the repository at this point in the history
  • Loading branch information
tjodalv committed Mar 20, 2024
1 parent b70d996 commit e994e78
Show file tree
Hide file tree
Showing 6 changed files with 150 additions and 0 deletions.
29 changes: 29 additions & 0 deletions src/Blade/ExtendBlade.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
<?php

namespace Kanuni\LaravelBladeAnchor\Blade;

use Illuminate\Support\Facades\Blade;
use Illuminate\Support\Facades\View;

class ExtendBlade
{
public function boot()
{
View::creator('*', function (\Illuminate\View\View $view) {
$view->with('__current_view_name', $view->getName());
});

Blade::directive('anchor', function (string $anchorName) {
return <<<DIRECTIVE
<?php
foreach (
\Kanuni\LaravelBladeAnchor\Facades\LaravelBladeAnchor::getExtenders(\$__current_view_name, $anchorName)
as \$extender
) {
\$extender(get_defined_vars());
}
?>
DIRECTIVE;
});
}
}
44 changes: 44 additions & 0 deletions src/BladeAnchor.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
<?php

namespace Kanuni\LaravelBladeAnchor;

use Illuminate\Support\Facades\View;
use Kanuni\LaravelBladeAnchor\Contracts\Extender;

class BladeAnchor
{
private static array $extenders = [];

public function registerExtender(string $view, string $anchor, string $extender): bool
{
if (! View::exists($view)) return false;
if (! class_exists($extender)) return false;

$anchorPath = "$view#$anchor";
$resolvedExtender = app($extender);

$this->addAnchorExtender($anchorPath, $resolvedExtender);

return true;
}

protected function addAnchorExtender(string $anchorPath, Extender $extender)
{
if (array_key_exists($anchorPath, static::$extenders)) {
// Push extender to extenders array
static::$extenders[$anchorPath][] = $extender;
} else {
// Create new array for the path and add extender to it
static::$extenders[$anchorPath] = [$extender];
}
}

public function getExtenders(string $view, string $anchor): array
{
$path = "$view#$anchor";

return array_key_exists($path, static::$extenders)
? static::$extenders[$path]
: [];
}
}
32 changes: 32 additions & 0 deletions src/BladeAnchorServiceProvider.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
<?php

namespace Kanuni\LaravelBladeAnchor;

use Kanuni\LaravelBladeAnchor\Blade\ExtendBlade;
use Spatie\LaravelPackageTools\Package;
use Spatie\LaravelPackageTools\PackageServiceProvider;
use Kanuni\LaravelBladeAnchor\Commands\MakeBladeExtenderCommand;

class BladeAnchorServiceProvider extends PackageServiceProvider
{
public function configurePackage(Package $package): void
{
/*
* This class is a Package Service Provider
*
* More info: https://github.com/spatie/laravel-package-tools
*/
$package
->name('laravel-blade-anchor')
->hasConfigFile()
->hasViews()
->hasMigration('create_laravel-blade-anchor_table')
->hasCommand(MakeBladeExtenderCommand::class);
}

public function bootingPackage()
{
// Register blade directive
app(ExtendBlade::class)->boot();
}
}
19 changes: 19 additions & 0 deletions src/Commands/MakeBladeExtenderCommand.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
<?php

namespace Kanuni\LaravelBladeAnchor\Commands;

use Illuminate\Console\Command;

class MakeBladeExtenderCommand extends Command
{
public $signature = 'make:blade-extender';

public $description = 'Create new blade extender class that can be attached to anchor defined in blade template.';

public function handle(): int
{
$this->comment('All done');

return self::SUCCESS;
}
}
10 changes: 10 additions & 0 deletions src/Contracts/Extender.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
<?php

namespace Kanuni\LaravelBladeAnchor\Contracts;

use Illuminate\Contracts\Support\Htmlable;

interface Extender
{
public function __invoke(?array $variables): string|Htmlable;
}
16 changes: 16 additions & 0 deletions src/Facades/LaravelBladeAnchor.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
<?php

namespace Kanuni\LaravelBladeAnchor\Facades;

use Illuminate\Support\Facades\Facade;

/**
* @see \Kanuni\LaravelBladeAnchor\LaravelBladeAnchor
*/
class LaravelBladeAnchor extends Facade
{
protected static function getFacadeAccessor()
{
return \Kanuni\LaravelBladeAnchor\BladeAnchor::class;
}
}

0 comments on commit e994e78

Please sign in to comment.