Laravel Topic Normalizer
#Laravel Topic Normalizer
Merge raw topic / keyword lists from several sources — GitHub topics, composer.json + package.json keywords, Packagist keywords — into one clean list: slugged, deduplicated, length-filtered and capped.
#Installation
composer require jeffersongoncalves/laravel-topic-normalizer
#Usage
use JeffersonGoncalves\TopicNormalizer\TopicNormalizer; $topics = TopicNormalizer::normalize( $repo['topics'] ?? [], // GitHub topics $composer['keywords'] ?? [], // composer.json $packageJson['keywords'] ?? [], // package.json ); // => ['laravel', 'filament', 'php-package', …] (slugged, unique, max 20)
Pass any number of lists. Non-strings are skipped; values are Str::slug()-ed, empties and out-of-range slugs dropped, duplicates removed (first occurrence wins, order preserved), and the result capped.
#Per-call overrides
The config defaults can be overridden per call with named arguments (each falls back to its config value):
$topics = TopicNormalizer::normalize( $repo['topics'] ?? [], $composer['keywords'] ?? [], max: 10, // cap this call at 10 maxLength: 30, // drop slugs longer than 30 chars minLength: 2, // drop single-character noise );
max_length / min_length are accepted as snake_case aliases. A max of 0 (or less) returns an empty list.
#Configuration
php artisan vendor:publish --tag="topic-normalizer-config"
| Key | Default | Description |
|---|---|---|
max |
20 |
Maximum number of topics returned (0 or less returns nothing). |
max_length |
50 |
Slugs longer than this are dropped as junk. |
min_length |
0 |
Slugs shorter than this are dropped as junk (0 disables the check). |
#Testing
composer test
#Changelog
Please see CHANGELOG for more information on what has changed recently.
#Contributing
Please see CONTRIBUTING for details.
#Security Vulnerabilities
Please review our security policy on how to report security vulnerabilities.
#Credits
#License
The MIT License (MIT). Please see License File for more information.