. * */ namespace Vvveb\System\Media; class Font { const KEY_VALUE_REGEX = '/\s*(.+?)\s*:\s*([^;$]+)[;$]?/ms'; const FONT_FACE_REGEX = '/@font-face\s*{([^}]+)}/ms'; static function getParams($comments) { $results = []; if (preg_match_all(static :: KEY_VALUE_REGEX, $comments, $matches)) { $matches[1] = array_map(function ($key) { return trim($key); }, $matches[1]); $results = array_combine($matches[1], $matches[2]); } return $results; } static function arrayToFontFaces($fonts = []) { $css = ''; if ($fonts) { foreach ($fonts as &$font) { //$font = array_filter($font, fn($var) => ($var !== NULL && $var !== FALSE && $var !== '')); //remove empty fields //$font = array_filter($font, 'strlen'); if (isset($font['font-family'])) { $font['font-family'] = '"' . trim($font['font-family'], '\'"') . '"'; } if (isset($font['src'])) { if (strncmp($font['src'], 'url(', 4) === 0) { $font['src']= substr($font['src'], 4); } $src = trim($font['src'], '\'")('); $font['src'] = 'url("' . $src . '")'; } $properties = ''; foreach ($font as $property => $value) { if ($value) { $properties .= "$property: $value;"; } } if ($properties) { $css .= '@font-face {' . $properties . "}\n"; } } } return $css; } static function removeFontFaces($css) { return preg_replace(static :: FONT_FACE_REGEX, '', $css) ?? $css; } static function parseFontFaces($css, $allFonts = true, $variants = true) { $fontFaceRegex = '/@font-face\s*{([^}]+)}/ms'; //$css = file_get_contents($cssFile); $fonts = []; $matches = []; if (preg_match_all(static:: FONT_FACE_REGEX, $css, $matches)) { foreach ($matches[1] as $match) { //var_dump($match); $properties = $match; //var_dump($match); $props = self::getParams($properties); if (isset($props['font-family'])) { $props['font-family'] = trim($props['font-family'], '\'"'); } if (isset($props['src'])) { if (strncmp($props['src'], 'url(', 4) === 0) { $props['src']= substr($props['src'], 4); } $props['src']= trim($props['src'], '\'")('); } $font = []; if ($allFonts) { $font = $props; } else { if ((! isset($props['font-weight']) || $props['font-weight'] == '400' || $props['font-weight'] == 'normal' || strpos($props['font-weight'], ' ') !== false) && (! isset($props['font-style']) || $props['font-style'] == 'normal')) { $font = $props; } } if ($variants) { $family = $props['font-family']; if ($family) { $fonts[$family]['variants'][] = $font; } } else { if ($font) { $fonts[] = $font; } } } } return $fonts; } static function themeFonts($theme, $variants = false) { $fonts = []; if ($theme && is_dir($themeCssDir = DIR_THEMES . $theme . DS . 'css' . DS)) { $styleCss = $themeCssDir . 'style.css'; $fontsCss = $themeCssDir . 'fonts.css'; if (file_exists($styleCss) && ($css = file_get_contents($styleCss))) { $fonts = Font::parseFontFaces($css, false, $variants); } if (file_exists($fontsCss) && ($css = file_get_contents($fontsCss))) { $fonts = array_merge($fonts, Font::parseFontFaces($css, false, $variants)); } } return $fonts; } }