106 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			106 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
<?php
 | 
						|
 | 
						|
namespace Sphere\Debloat\OptimizeCss;
 | 
						|
 | 
						|
use Sphere\Debloat\Plugin;
 | 
						|
 | 
						|
/**
 | 
						|
 * Add a few Google Font optimizations.
 | 
						|
 * 
 | 
						|
 * @author  asadkn
 | 
						|
 * @since   1.0.0
 | 
						|
 */
 | 
						|
class GoogleFonts
 | 
						|
{
 | 
						|
	public $active = false;
 | 
						|
	protected $renders = [];
 | 
						|
 | 
						|
	public function enable()
 | 
						|
	{
 | 
						|
		$this->active = true;
 | 
						|
	}
 | 
						|
 | 
						|
	/**
 | 
						|
	 * Add resource hints for preconnect and so on.
 | 
						|
	 * 
 | 
						|
	 * @param string $html Full DOM HTML.
 | 
						|
	 * @return void
 | 
						|
	 */
 | 
						|
	public function add_hints($html)
 | 
						|
	{
 | 
						|
		if (!$this->active || !Plugin::options()->optimize_gfonts) {
 | 
						|
			return $html;
 | 
						|
		}
 | 
						|
 | 
						|
		// preconnect with dns-prefetch fallback for Firefox. Due to safari bug, can't be in same rel.
 | 
						|
		$hint = '<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />';
 | 
						|
		$hint .= '<link rel="dns-prefetch" href="https://fonts.gstatic.com" />';
 | 
						|
 | 
						|
		// Only needed if not inlined.
 | 
						|
		if (!Plugin::options()->optimize_css || !Plugin::options()->optimize_gfonts_inline) {
 | 
						|
			$hint .= '<link rel="preconnect" href="https://fonts.googleapis.com" crossorigin />';
 | 
						|
			$hint .= '<link rel="dns-prefetch" href="https://fonts.googleapis.com" />';
 | 
						|
		}
 | 
						|
 | 
						|
		// Add in to head.
 | 
						|
		$html = str_replace('<head>', '<head>' . $hint, $html);
 | 
						|
 | 
						|
		// No longer needed as preconnect's better and we always want to use https.
 | 
						|
		$html = str_replace("<link rel='dns-prefetch' href='//fonts.googleapis.com' />", '', $html);
 | 
						|
 | 
						|
		return $html;
 | 
						|
	}
 | 
						|
 | 
						|
	/**
 | 
						|
	 * Late processing and injecting data in HTML DOM.
 | 
						|
	 *
 | 
						|
	 * @param string $html
 | 
						|
	 * @return string
 | 
						|
	 */
 | 
						|
	public function render_in_dom($html)
 | 
						|
	{
 | 
						|
		if ($this->renders) {
 | 
						|
			$html = str_replace('<head>', '<head>' . implode('', $this->renders), $html);
 | 
						|
		}
 | 
						|
 | 
						|
		$html = $this->add_hints($html);
 | 
						|
		return $html;
 | 
						|
	}
 | 
						|
 | 
						|
	public function optimize(Stylesheet $sheet)
 | 
						|
	{
 | 
						|
        if (!$sheet->is_google_fonts()) {
 | 
						|
            return;
 | 
						|
        }
 | 
						|
 | 
						|
		// Set normal render if optimizations are disabled.
 | 
						|
		if (!Plugin::options()->optimize_gfonts) {
 | 
						|
			$sheet->render_type = 'normal';
 | 
						|
			return;
 | 
						|
		}
 | 
						|
 | 
						|
		$sheet->delay_type = 'preload';
 | 
						|
		if (strpos($sheet->url, 'display=') === false) {
 | 
						|
			$sheet->url .= '&display=swap';
 | 
						|
		}
 | 
						|
	}
 | 
						|
 | 
						|
	public function do_render(Stylesheet $sheet)
 | 
						|
	{
 | 
						|
		return $sheet->render();
 | 
						|
 | 
						|
		// $orig_media = $sheet->media;
 | 
						|
 | 
						|
		// // If no display= or if display=auto.
 | 
						|
		// if (!preg_match('/display=(?!auto)/', $sheet->url)) {
 | 
						|
		// 	$sheet->media = 'x';
 | 
						|
		// }
 | 
						|
		
 | 
						|
		// // Add the JS to render with display: swap on mobile.
 | 
						|
		// $extra = "<script>const e = document.currentScript.previousElementSibling; window.innerWidth > 1024 || (e.href+='&display=swap'); e.media='" . esc_js($orig_media) ."'</script>";
 | 
						|
		// $this->renders[] = $sheet->render() . $extra;
 | 
						|
 | 
						|
		// // Return empty space to strip out the tag.
 | 
						|
		// return ' ';
 | 
						|
	}
 | 
						|
} |