PHP 实现细粒度差异引擎

1.1.1 2024-07-09 14:25 UTC

This package is auto-updated.

Last update: 2024-09-12 12:31:25 UTC


README

Tests

FineDiff

FineDiff 是一个简单的库,用于创建两个字符串的 HTML 差异视图

echo (new Diff())->render('hello world', 'hello2 worlds');
hello<ins>2</ins> world<ins>s</ins>

安装

$ composer req lolli42/finediff

标签

  • 1.1 删除 PHP <8.2
  • 1.0 删除 PHP <7.2,支持 PHP >=7.2,添加多字节支持,强制严格类型,无 E_ALL 错误
  • <1.x 与来自 (https://github.com/cogpowered/FineDiff) 的 cogpowered/finediff 相同

使用方法

以字符为单位将两个字符串之间的差异渲染为 HTML

echo (new Diff())->render('string one', 'string two');
string <ins>tw</ins>o<del>ne</del>

以单词为单位将两个字符串之间的差异渲染为 HTML

echo (new Diff(new Word()))->render('string one', 'string two');
string <del>one</del><ins>two</ins>

特殊字符和实体由 HTML 渲染器引用,并且处理多字节字符串

echo (new Diff())->render('foo<bär>baz', 'foo<qüx>baz');
foo&lt;<del>b&auml;r</del><ins>q&uuml;x</ins>&gt;baz

算法

要创建两个字符串之间的差异视图,创建一个中间的 "操作码" 表示形式,该表示形式指定了从字符串一到字符串二的变化。然后渲染器根据这个操作码创建 HTML。请注意,操作码字符串被认为是内部的,并且可能在较新的库版本中以向后不兼容的方式更改。

$diff = new Diff();
echo $diff->getOpcodes('hello world', 'hello2 worlds');
// c5i:2c6i:s
// Means: copy 5 chars "hello", then insert "2", then copy 6 chars " world", then insert "s"
echo $diff->process('hello wordl', 'c5i:2c6i:s');
// hello<ins>2</ins> world<ins>s</ins>

运行测试

完整测试运行

$ composer update
$ vendor/bin/phpunit

限制为单个文件

$ composer update
$ vendor/bin/phpunit tests/DiffTest.php

使用 xdebug (3.x) 启用时的随意设置来运行测试,然后 IDE(如 phpstorm)应设置断点

$ composer update
$ XDEBUG_MODE="debug,develop" XDEBUG_TRIGGER="foo" vendor/bin/phpunit

历史

许可证

MIT 许可证。请参阅 LICENSE 文件。