PHP Classes

File: src/XrBuild.php

Recommend this page to a friend!
  Classes of Rodolfo Berrios Arce   XR PHP Debugger Online   src/XrBuild.php   Download  
File: src/XrBuild.php
Role: Class source
Content type: text/plain
Description: Class source
Class: XR PHP Debugger Online
Debug PHP code using a Web interface
Author: By
Last change:
Date: 1 year ago
Size: 3,242 bytes
 

Contents

Class file image Download
<?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);
    }
}