* * This file is part of a Moko Consulting project. * * SPDX-License-Identifier: GPL-3.0-or-later * * # FILE INFORMATION * DEFGROUP: Joomla.Template.Site * INGROUP: MokoCassiopeia * PATH: scripts/download-google-fonts.php * VERSION: 03.09.03 * BRIEF: Download Google Fonts (woff2) for local self-hosting */ $fontsDir = __DIR__ . '/../src/media/fonts'; if (!is_dir($fontsDir)) { fwrite(STDERR, "Error: Fonts directory not found: {$fontsDir}\n"); exit(1); } $fonts = [ 'Roboto' => 'https://fonts.googleapis.com/css2?family=Roboto:wght@100;300;400;700&display=swap', 'Noto Sans' => 'https://fonts.googleapis.com/css2?family=Noto+Sans:wght@100;300;400;700&display=swap', 'Fira Sans' => 'https://fonts.googleapis.com/css2?family=Fira+Sans:wght@100;300;400;700&display=swap', ]; $userAgent = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36'; echo "Google Fonts Downloader for MokoCassiopeia\n"; echo str_repeat('=', 48) . "\n"; echo "Target: {$fontsDir}\n\n"; foreach ($fonts as $name => $url) { echo "Downloading {$name}...\n"; $ctx = stream_context_create(['http' => ['header' => "User-Agent: {$userAgent}\r\n"]]); $css = @file_get_contents($url, false, $ctx); if ($css === false) { fwrite(STDERR, " FAIL: could not fetch CSS for {$name}\n"); continue; } preg_match_all('#https://fonts\.gstatic\.com[^)]*\.woff2#', $css, $matches); if (empty($matches[0])) { fwrite(STDERR, " FAIL: no woff2 URLs found for {$name}\n"); continue; } $count = 0; foreach ($matches[0] as $fontUrl) { $filename = basename($fontUrl); $dest = $fontsDir . '/' . $filename; $data = @file_get_contents($fontUrl, false, $ctx); if ($data === false) { fwrite(STDERR, " FAIL: {$filename}\n"); continue; } file_put_contents($dest, $data); $size = round(strlen($data) / 1024, 1); echo " OK: {$filename} ({$size} KB)\n"; $count++; } echo " {$count} file(s) downloaded\n\n"; } echo "Done.\n";