summaryrefslogtreecommitdiffstats
path: root/vendor/jfcherng/php-diff/src/DiffHelper.php
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/jfcherng/php-diff/src/DiffHelper.php')
-rw-r--r--vendor/jfcherng/php-diff/src/DiffHelper.php184
1 files changed, 184 insertions, 0 deletions
diff --git a/vendor/jfcherng/php-diff/src/DiffHelper.php b/vendor/jfcherng/php-diff/src/DiffHelper.php
new file mode 100644
index 0000000..7c7165f
--- /dev/null
+++ b/vendor/jfcherng/php-diff/src/DiffHelper.php
@@ -0,0 +1,184 @@
+<?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 = $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, [
+ static::getProjectDirectory(),
+ 'src',
+ 'Renderer',
+ '{' . \implode(',', RendererConstant::RENDERER_TYPES) . '}',
+ '*.php',
+ ]);
+
+ $fileNames = \array_map(
+ // get basename without file extension
+ function (string $file): string {
+ return \pathinfo($file, \PATHINFO_FILENAME);
+ },
+ // paths of all Renderer files
+ \glob($glob, \GLOB_BRACE)
+ );
+
+ $renderers = \array_filter(
+ $fileNames,
+ // only normal class files are wanted
+ function (string $fileName): bool {
+ return
+ \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 = static::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 static::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
+ );
+ }
+}