Add related help titles and fix umlauts
Some checks failed
linter / quality (push) Has been cancelled
tests / ci (push) Has been cancelled
tests / ui (push) Has been cancelled

This commit is contained in:
Codex Agent
2026-01-23 10:05:29 +01:00
parent df5e8204fa
commit 0db0ddf3c4
5 changed files with 72 additions and 7 deletions

View File

@@ -4,6 +4,7 @@ namespace App\Services\Help;
use Illuminate\Filesystem\Filesystem;
use Illuminate\Support\Arr;
use Illuminate\Support\Collection;
use Illuminate\Support\Facades\Cache;
use Illuminate\Support\Facades\Storage;
use Illuminate\Support\Str;
@@ -70,6 +71,8 @@ class HelpSyncService
}
}
$articles = $this->hydrateRelatedTitles($articles);
$disk = config('help.disk');
$compiledPath = trim(config('help.compiled_path'), '/');
$written = [];
@@ -87,6 +90,58 @@ class HelpSyncService
return $written;
}
private function hydrateRelatedTitles(Collection $articles): Collection
{
$titleIndex = $articles->mapWithKeys(function (array $article) {
$audience = Arr::get($article, 'audience');
$locale = Arr::get($article, 'locale');
$slug = Arr::get($article, 'slug');
if (! $audience || ! $locale || ! $slug) {
return [];
}
return [$this->articleKey((string) $audience, (string) $locale, (string) $slug) => Arr::get($article, 'title')];
});
return $articles->map(function (array $article) use ($titleIndex) {
$related = Arr::get($article, 'related', []);
if (empty($related)) {
return $article;
}
$audience = (string) Arr::get($article, 'audience');
$locale = (string) Arr::get($article, 'locale');
$article['related'] = collect($related)
->map(function ($item) use ($titleIndex, $audience, $locale) {
$slug = is_array($item) ? Arr::get($item, 'slug') : (is_string($item) ? $item : null);
if (! $slug) {
return null;
}
$title = $titleIndex->get($this->articleKey($audience, $locale, $slug));
return array_filter([
'slug' => $slug,
'title' => $title,
], static fn ($value) => $value !== null && $value !== '');
})
->filter()
->values()
->all();
return $article;
});
}
private function articleKey(string $audience, string $locale, string $slug): string
{
return sprintf('%s::%s::%s', $audience, $locale, $slug);
}
private function parseFile(SplFileInfo $file): array
{
$contents = $this->files->get($file->getPathname());