tempest/highlight
Fast, extensible server-side syntax highlighting for PHP and other languages. Install via Composer and use the Highlighter to parse code into highlighted output for rendering in docs, blogs, or apps, with a focus on performance and customization.
Installation:
composer require tempest/highlight
Add to composer.json if using Laravel’s autoloader.
First Use Case: Highlight PHP, GraphQL, or Svelte code in a Blade template:
use Tempest\Highlight\Highlighter;
$highlighter = new Highlighter();
$highlighted = $highlighter->parse($svelteCode, 'svelte'); // New in 2.25.0
Render in Blade:
<pre>{{ $highlighted }}</pre>
Key Entry Points:
Highlighter::parse($code, $language): Core method (now supports svelte alongside graphql).Highlighter::getLanguages(): List all supported languages (includes svelte).Pattern: Use a Blade directive for reusable highlighting (now with Svelte support):
// app/Providers/AppServiceProvider.php
Blade::directive('highlight', function ($expression) {
$highlighter = app(Highlighter::class);
return "<?php echo {$highlighter}->parse({$expression}, 'svelte'); ?>"; // Updated for Svelte
});
Usage:
@highlight($svelteComponent)
Pattern: Return highlighted Svelte components in JSON APIs:
return response()->json([
'component' => $highlighter->parse($svelteCode, 'svelte'),
]);
Pattern: Infer language from file extension (now includes .svelte):
$language = match (pathinfo($filePath, PATHINFO_EXTENSION)) {
'svelte' => 'svelte',
'graphql' => 'graphql',
default => $defaultLanguage,
};
$highlighted = $highlighter->parse(file_get_contents($filePath), $language);
Pattern: Apply themes to Svelte components:
$highlighter = new Highlighter(['theme' => 'catppuccin']);
$highlighted = $highlighter->parse($svelteCode, 'svelte');
Pattern: Highlight Svelte syntax (components, directives, stores):
$component = <<<SVELTE
<script>
let count = 0;
$: doubled = count * 2;
</script>
<button on:click={() => count++}>
Clicked {count} {doubled > 10 ? 'times' : 'time'}
</button>
SVELTE;
$highlighted = $highlighter->parse($component, 'svelte');
Pattern: Bind Highlighter as a singleton (unchanged):
// config/services.php
'highlight' => Tempest\Highlight\Highlighter::class,
// app/Providers/AppServiceProvider.php
public function register()
{
$this->app->singleton(Tempest\Highlight\Highlighter::class);
}
Pattern: Highlight Svelte code in validation errors:
public function withValidator($validator)
{
$validator->after(function ($validator) {
if ($validator->errors()->has('svelte_code')) {
$highlighted = app(Highlighter::class)->parse(
$validator->errors()->first('svelte_code'),
'svelte'
);
// Log or display $highlighted
}
});
}
Pattern: Highlight Svelte in Nova tooltips:
use Tempest\Highlight\Highlighter;
public function fields(Request $request)
{
return [
Text::make('Svelte Component')
->asHtml()
->content(fn () => app(Highlighter::class)->parse($this->component, 'svelte')),
];
}
Pattern: Highlight Svelte in event payloads:
public function handle(SvelteComponentRendered $event)
{
$highlightedCode = app(Highlighter::class)->parse(
$event->code,
'svelte'
);
// Log or notify with $highlightedCode
}
parse() may return unhighlighted code if the language isn’t registered (e.g., svelte must be explicit).$highlighted = $highlighter->parse($code, 'svelte'); // Not 'text/svelte'
svelte is in supported languages:
dd($highlighter->getLanguages()); // Should include 'svelte'
{{ !! }} or wrap in a component:
<x-highlight :code="$svelteComponent" language="svelte" />
$highlighter->parse(file($largeSvelteFile), 'svelte'); // Processes line-by-line
$highlighter->addLanguage(new CustomSvelteLanguage());
style: 'html' for web output:
$highlighter->parse($svelteCode, 'svelte', ['style' => 'html']);
Use debug() to inspect Svelte parsing:
$tokens = $highlighter->tokenize($svelteCode, 'svelte');
dd($tokens); // Analyze token structure (e.g., components, directives, stores)
Compare performance with PHPBench:
$highlighter->parse($benchmarkComponent, 'svelte'); // Measure execution time
Override theme variables for Svelte:
$highlighter->setThemeVariables([
'svelte_tag' => '#FF0000', // Force red for Svelte tags
'svelte_directive' => '#00FF00',
]);
Add a test to verify Svelte highlighting:
public function testSvelteHighlighting()
{
$highlighted = $this->app->make(Highlighter::class)->parse(
'<script>let count = 0;</script><button>{count}</button>',
'svelte'
);
$this->assertStringContainsString('<span class="svelte_tag"><script></span>', $highlighted);
}
Extend \Tempest\Highlight\Renderer\Renderer for Svelte-specific output (e.g., Markdown):
class SvelteMarkdownRenderer extends Renderer
{
protected function renderToken(Token $token): string
{
return match ($token->type) {
'svelte_tag' => '```svelte\n' . $token->value . '\n```',
'svelte_directive' => '!' . $token->value,
default => $token->value,
};
}
}
Register with:
$highlighter->addRenderer('svelte-mark
How can I help you explore Laravel packages today?