` — descriptor optional (1x, 2x, 800w). $split = preg_split( '#\s+#', $candidate, 2 ); $url = $split[0]; $descr = isset( $split[1] ) ? ' ' . $split[1] : ''; $rewritten = self::rewrite_url( $url, $opts ); $out[] = $rewritten . $descr; } return implode( ', ', $out ); } /** * Convert relative/scheme-relative URLs to absolute against the site * origin. Returns null if we can't make sense of it. */ private static function absolutize( string $url ): ?string { if ( preg_match( '#^https?://#i', $url ) ) { return $url; } if ( 0 === strpos( $url, '//' ) ) { return self::$home_scheme . ':' . $url; } if ( 0 === strpos( $url, '/' ) ) { return self::$home_scheme . '://' . self::$home_host . $url; } // Bare relative paths like `images/x.png` — these would need a // base URL to resolve. The DOM rendering picked one already; we // can't reliably guess. Leave alone. return null; } /** * Strip scheme + trailing slash from a user-entered CDN URL so the * stored value is just a host (cdn.example.com). Tolerant of * `https://cdn.example.com/`, `//cdn.example.com`, or bare host. */ public static function normalize_host( string $value ): string { $value = trim( $value ); if ( '' === $value ) { return ''; } $value = preg_replace( '#^https?://#i', '', $value ); $value = preg_replace( '#^//#', '', $value ); $value = rtrim( $value, '/' ); return strtolower( $value ); } private static function prime_origin(): void { $home = function_exists( 'home_url' ) ? home_url() : ''; $p = wp_parse_url( $home ); if ( is_array( $p ) && ! empty( $p['host'] ) ) { self::$home_host = strtolower( $p['host'] ); self::$home_scheme = isset( $p['scheme'] ) ? strtolower( $p['scheme'] ) : 'https'; } } private static function opts(): array { if ( null === self::$opts ) { self::$opts = function_exists( 'get_option' ) ? (array) get_option( 'xspeed_module_cdn', array() ) : array(); } return self::$opts; } }