<?php 
 
/* 
 * This file is part of Chevere. 
 * 
 * (c) Rodolfo Berrios <rodolfo@chevere.org> 
 * 
 * For the full copyright and license information, please view the LICENSE 
 * file that was distributed with this source code. 
 */ 
 
declare(strict_types=1); 
 
namespace Chevere\Xr; 
 
use Chevere\Filesystem\File; 
use Chevere\Filesystem\Interfaces\DirInterface; 
 
final class XrBuild 
{ 
    private string $html; 
 
    public function __construct( 
        private DirInterface $dir, 
        private string $version, 
        private string $codename, 
    ) { 
        $dir->assertExists(); 
        $file = new File($dir->path()->getChild('index.html')); 
        $this->html = $file->getContents(); 
        $this->replace('%version%', $this->version); 
        $this->replace('%codename%', $this->codename); 
        $this->replaceIcons('svg', 'image/svg+xml'); 
        $this->replaceIcons('png', 'image/png'); 
        $this->replaceStyles(); 
        $this->replaceFont('fonts/firacode/firacode-regular.woff', 'font/woff'); 
        $this->replaceScripts(); 
    } 
 
    public function html(): string 
    { 
        return $this->html; 
    } 
 
    public function replaceStyles(): void 
    { 
        preg_match_all( 
            '#<link rel="stylesheet".*(href=\"(.*)\")>#', 
            $this->html, 
            $files 
        ); 
        foreach ($files[0] as $pos => $match) { 
            $fileMatch = new File($this->dir->path()->getChild($files[2][$pos])); 
            $replace = '<style media="all">' . $fileMatch->getContents() . '</style>'; 
            $this->replace($match, $replace); 
        } 
    } 
 
    public function replaceScripts(): void 
    { 
        preg_match_all("#<script .*(src=\"(.*)\")><\/script>#", $this->html, $files); 
        foreach ($files[0] as $pos => $match) { 
            $fileMatch = new File($this->dir->path()->getChild($files[2][$pos])); 
            $replace = str_replace(' ' . $files[1][$pos], '', $match); 
            $replace = str_replace( 
                "></script>", 
                '>' 
                    . $fileMatch->getContents() 
                    . "</script>", 
                $replace 
            ); 
            $this->replace($match, $replace); 
        } 
    } 
 
    public function replaceIcons(string $extension, string $mime): void 
    { 
        preg_match_all( 
            '#="(icon\.' . $extension . ')"#', 
            $this->html, 
            $files 
        ); 
        foreach ($files[0] as $pos => $match) { 
            $fileMatch = new File($this->dir->path()->getChild($files[1][$pos])); 
            $replace = '="data:' . $mime . ';base64,' 
                . base64_encode($fileMatch->getContents()) 
                . '"'; 
            $this->replace($match, $replace); 
        } 
    } 
 
    public function replaceFont(string $font, string $mime): void 
    { 
        $fileMatch = new File($this->dir->path()->getChild($font)); 
        $replace = 'url(data:' . $mime . ';base64,' 
                . base64_encode($fileMatch->getContents()) 
                . ')'; 
        $this->replace( 
            "url('$font')", 
            $replace 
        ); 
    } 
 
    private function replace(string $search, string $replace): void 
    { 
        $this->html = str_replace($search, $replace, $this->html); 
    } 
} 
 
 |