primo commit
This commit is contained in:
182
libraries/vendor/jfcherng/php-diff/src/DiffHelper.php
vendored
Normal file
182
libraries/vendor/jfcherng/php-diff/src/DiffHelper.php
vendored
Normal file
@ -0,0 +1,182 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace Jfcherng\Diff;
|
||||
|
||||
use Jfcherng\Diff\Factory\RendererFactory;
|
||||
use Jfcherng\Diff\Renderer\RendererConstant;
|
||||
|
||||
final class DiffHelper
|
||||
{
|
||||
/**
|
||||
* The constructor.
|
||||
*/
|
||||
private function __construct()
|
||||
{
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the absolute path of the project root directory.
|
||||
*/
|
||||
public static function getProjectDirectory(): string
|
||||
{
|
||||
static $path;
|
||||
|
||||
return $path ??= realpath(__DIR__ . '/..');
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the information about available renderers.
|
||||
*/
|
||||
public static function getRenderersInfo(): array
|
||||
{
|
||||
static $info;
|
||||
|
||||
if (isset($info)) {
|
||||
return $info;
|
||||
}
|
||||
|
||||
$glob = implode(\DIRECTORY_SEPARATOR, [
|
||||
self::getProjectDirectory(),
|
||||
'src',
|
||||
'Renderer',
|
||||
'{' . implode(',', RendererConstant::RENDERER_TYPES) . '}',
|
||||
'*.php',
|
||||
]);
|
||||
|
||||
$fileNames = array_map(
|
||||
// get basename without file extension
|
||||
static fn (string $file): string => pathinfo($file, \PATHINFO_FILENAME),
|
||||
// paths of all Renderer files
|
||||
glob($glob, \GLOB_BRACE),
|
||||
);
|
||||
|
||||
$renderers = array_filter(
|
||||
$fileNames,
|
||||
// only normal class files are wanted
|
||||
static fn (string $fileName): bool => (
|
||||
substr($fileName, 0, 8) !== 'Abstract'
|
||||
&& substr($fileName, -9) !== 'Interface'
|
||||
&& substr($fileName, -5) !== 'Trait'
|
||||
),
|
||||
);
|
||||
|
||||
$info = [];
|
||||
foreach ($renderers as $renderer) {
|
||||
$info[$renderer] = RendererFactory::resolveRenderer($renderer)::INFO;
|
||||
}
|
||||
|
||||
return $info;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the available renderers.
|
||||
*
|
||||
* @return string[] the available renderers
|
||||
*/
|
||||
public static function getAvailableRenderers(): array
|
||||
{
|
||||
return array_keys(self::getRenderersInfo());
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the content of the CSS style sheet for HTML renderers.
|
||||
*
|
||||
* @throws \LogicException path is a directory
|
||||
* @throws \RuntimeException path cannot be opened
|
||||
*/
|
||||
public static function getStyleSheet(): string
|
||||
{
|
||||
static $fileContent;
|
||||
|
||||
if (isset($fileContent)) {
|
||||
return $fileContent;
|
||||
}
|
||||
|
||||
$filePath = self::getProjectDirectory() . '/example/diff-table.css';
|
||||
|
||||
$file = new \SplFileObject($filePath, 'r');
|
||||
|
||||
return $fileContent = $file->fread($file->getSize());
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the diff statistics such as inserted and deleted etc...
|
||||
*
|
||||
* @return array<string,float> the statistics
|
||||
*/
|
||||
public static function getStatistics(): array
|
||||
{
|
||||
return Differ::getInstance()->getStatistics();
|
||||
}
|
||||
|
||||
/**
|
||||
* All-in-one static method to calculate the diff between two strings (or arrays of strings).
|
||||
*
|
||||
* @param string|string[] $old the old string (or array of lines)
|
||||
* @param string|string[] $new the new string (or array of lines)
|
||||
* @param string $renderer the renderer name
|
||||
* @param array $differOptions the options for Differ object
|
||||
* @param array $rendererOptions the options for renderer object
|
||||
*
|
||||
* @return string the rendered differences
|
||||
*/
|
||||
public static function calculate(
|
||||
$old,
|
||||
$new,
|
||||
string $renderer = 'Unified',
|
||||
array $differOptions = [],
|
||||
array $rendererOptions = []
|
||||
): string {
|
||||
// always convert into array form
|
||||
\is_string($old) && ($old = explode("\n", $old));
|
||||
\is_string($new) && ($new = explode("\n", $new));
|
||||
|
||||
return RendererFactory::getInstance($renderer)
|
||||
->setOptions($rendererOptions)
|
||||
->render(
|
||||
Differ::getInstance()
|
||||
->setOldNew($old, $new)
|
||||
->setOptions($differOptions),
|
||||
)
|
||||
;
|
||||
}
|
||||
|
||||
/**
|
||||
* All-in-one static method to calculate the diff between two files.
|
||||
*
|
||||
* @param string $old the path of the old file
|
||||
* @param string $new the path of the new file
|
||||
* @param string $renderer the renderer name
|
||||
* @param array $differOptions the options for Differ object
|
||||
* @param array $rendererOptions the options for renderer object
|
||||
*
|
||||
* @throws \LogicException path is a directory
|
||||
* @throws \RuntimeException path cannot be opened
|
||||
*
|
||||
* @return string the rendered differences
|
||||
*/
|
||||
public static function calculateFiles(
|
||||
string $old,
|
||||
string $new,
|
||||
string $renderer = 'Unified',
|
||||
array $differOptions = [],
|
||||
array $rendererOptions = []
|
||||
): string {
|
||||
// we want to leave the line-ending problem to static::calculate()
|
||||
// so do not set SplFileObject::DROP_NEW_LINE flag
|
||||
// otherwise, we will lose \r if the line-ending is \r\n
|
||||
$oldFile = new \SplFileObject($old, 'r');
|
||||
$newFile = new \SplFileObject($new, 'r');
|
||||
|
||||
return self::calculate(
|
||||
// fread() requires the length > 0 hence we plus 1 for empty files
|
||||
$oldFile->fread($oldFile->getSize() + 1),
|
||||
$newFile->fread($newFile->getSize() + 1),
|
||||
$renderer,
|
||||
$differOptions,
|
||||
$rendererOptions,
|
||||
);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user