lolli42 /
PHP 实现细粒度差异引擎
1.1.1
2024-07-09 14:25 UTC
Requires
- php: >=8.2
- ext-mbstring: *
Requires (Dev)
- friendsofphp/php-cs-fixer: ^3.50.0
- phpstan/phpstan: ^1.10.57
- phpunit/phpunit: ^11.2.6
Replaces
README
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<<del>bär</del><ins>qüx</ins>>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
历史
- 最初由 Raymond Hill 编写 (https://github.com/gorhill/PHP-FineDiff)
- 由 Rob Crowe 修改以使其适应现代世界。这意味着文档化、格式良好、易于扩展的代码 (https://github.com/cogpowered/FineDiff)
- 由 Christian Kuhn 添加 PHP 8 兼容性和多字节字符串支持 (https://github.com/lolli42/FineDiff)
许可证
MIT 许可证。请参阅 LICENSE 文件。