Created
September 13, 2016 17:08
-
-
Save ramsey/32d2c01a88ef87825e3578df426f17a2 to your computer and use it in GitHub Desktop.
Downloads the .woff2 formats of the specified Google Font for the specified language types. This also creates the appropriate CSS for the downloaded font files
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
/** | |
* Downloads the .woff2 formats of the specified Google Font for the specified | |
* language types. This also creates the appropriate CSS for the downloaded | |
* font files | |
* | |
* Usage: | |
* php google-font-download.php 'Open Sans' ['latin-ext,latin' [/path/to/write/to]] | |
*/ | |
if (empty($argv[1])) { | |
echo "You must specify a font to download.\n"; | |
exit(1); | |
} | |
$fontToDownload = $argv[1]; | |
$langsToDownload = ['latin-ext', 'latin']; | |
$savePath = getcwd(); | |
$fontDirname = strtolower(preg_replace('/[^A-Za-z0-9]/', '-', $fontToDownload)); | |
$cssFilename = $fontDirname . '.css'; | |
if (!empty($argv[2])) { | |
$langsToDownload = explode(',', $argv[2]); | |
} | |
if (!empty($argv[3])) { | |
$savePath = realpath($argv[3]); | |
if (!$savePath) { | |
echo "The path {$savePath} does not exist.\n"; | |
exit(1); | |
} | |
} | |
if (!is_writable($savePath)) { | |
echo "Cannot write to {$savePath}.\n"; | |
exit(1); | |
} | |
if (!chdir($savePath)) { | |
echo "Unable to change to {$savePath}.\n"; | |
exit(1); | |
} | |
$fontPath = $savePath . DIRECTORY_SEPARATOR . $fontDirname; | |
if (!file_exists($fontPath) && !mkdir($fontPath)) { | |
echo "Unable to create {$fontDirname} in {$savePath}.\n"; | |
exit(1); | |
} | |
// Change to the location where we want to download these files | |
if (!chdir($fontPath)) { | |
echo "Unable to change to {$fontPath}.\n"; | |
exit(1); | |
} | |
$qs = [ | |
'family' => $fontToDownload . ':100,100i,200,200i,300,300i,400,400i,500,500i,600,600i,700,700i,800,800i,900,900i', | |
]; | |
$userAgent = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36'; | |
$context = stream_context_create([ | |
'http' => [ | |
'method' => 'GET', | |
'header' => "User-Agent: {$userAgent}\r\n", | |
], | |
]); | |
$googleFontUrl = 'https://fonts.googleapis.com/css?' . http_build_query($qs); | |
$googleFontCss = @file_get_contents($googleFontUrl, false, $context); | |
if (!$googleFontCss) { | |
echo "Unable to download CSS from Google.\n"; | |
exit(1); | |
} | |
$currentWeight = null; | |
$currentLang = null; | |
$lines = explode("\n", $googleFontCss); | |
$linesToInclude = []; | |
foreach ($lines as $line) { | |
$matches = []; | |
// What language is this font? | |
if (preg_match('/^\/\* (.*) \*\/$/', $line, $matches) === 1) { | |
$currentLang = $matches[1]; | |
} | |
if (!in_array($currentLang, $langsToDownload)) { | |
continue; | |
} | |
// What font-weight are we using? | |
if (preg_match('/^ font-weight: (\d{3}).*$/', $line, $matches) === 1) { | |
$currentWeight = $matches[1]; | |
} | |
// What is the URL and file name for this font? | |
if (preg_match("/^ src: local\(.*\), local\('(.*)'\), url\((.*)\) .*$/", $line, $matches) === 1) { | |
$filename = strtolower($matches[1] . '_' . $currentLang . '_' . $currentWeight) . '.woff2'; | |
$fontDownloadUrl = $matches[2]; | |
$line = str_replace($fontDownloadUrl, $filename, $line); | |
// Download the file to the current directory | |
echo "Downloading font file for {$matches[1]}, {$currentWeight}, {$currentLang}.\n"; | |
$fontContents = @file_get_contents($fontDownloadUrl, false, $context); | |
if (!$fontContents) { | |
echo "Skipping {$filename}. Unable to download font from {$fontDownloadUrl}.\n"; | |
continue; | |
} | |
file_put_contents($filename, $fontContents); | |
} | |
$linesToInclude[] = $line; | |
} | |
file_put_contents($cssFilename, implode("\n", $linesToInclude)); | |
echo "Font files downloaded to {$fontPath} and CSS file created.\n"; |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment