facebook / difflib
此包已被放弃,不再维护。未建议替代包。
v1.3.0
2021-09-27 22:08 UTC
Requires
- hhvm: ^4.56
- hhvm/hsl: ^4.0
Requires (Dev)
- facebook/fbexpect: ^2.1.2
- hhvm/hacktest: ^2.0
- hhvm/hhast: ^4.0
- hhvm/hhvm-autoload: ^2.0|^3.0
README
DiffLib 是一个用于创建和解析差异的 Hack 库。可以创建任何两个项目序列之间的差异。对于字符串差异,还提供了额外的辅助功能(例如,支持统一差异和彩色差异)。
差异表示为一系列 DiffOp
操作;这些可以 '保留' 一个元素(即在两个序列中都未更改),插入一个元素或删除一个元素。例如,在统一差异中,这些将是
DiffKeepOp -DiffDeleteOp +DiffInsertOp
字符串差异通常表示为一系列行,但也可以表示为一系列字符,允许行内差异。
差异输出格式
difflib 可以创建标准统一差异
difflib 还可以创建带有行内编辑高亮的彩色差异
提供了一个针对标准 CLI 终端的实现,以及针对其他实现(如 HTML 或 XHP)的抽象基类。
示例
use namespace Facebook\DiffLib; function create_unified_diff(string $from, string $to): string { return DiffLib\StringDiff::lines($from, $to)->getUnifiedDiff(); } function create_colored_diff(string $from, string $to): string { return DiffLib\CLIColoredUnifiedDiff::create($from, $to); } final class IntDiff extends DiffLib\Diff { const type TContent = int; } function dump_int_diff(vec<int> $from, vec<int> $to): void { $diff = (new IntDiff($from, $to))->getDiff(); foreach ($diff as $op) { if ($op is DiffLib\DiffKeepOp<_>) { \printf(" %d\n", $op->getContent()); } else if ($op is DiffLib\DiffDeleteOp<_>) { \printf("- %d\n", $op->getContent()); } else { $op = $op as DiffLib\DiffInsertOp<_>; printf("+ %d\n", $op->getContent()); } } }
dump_int_diff(vec[1, 3, 9], vec[1, 4, 9])
将产生以下输出
1
- 3
+ 4
9
要求
- HHVM 当前发布版本
安装 DiffLib
composer require facebook/difflib
DiffLib 的工作原理
差异是通过 Myers 差异算法创建的:Myers, E.W. Algorithmica (1986) 1: 251. https://doi.org/10.1007/BF01840446
有关更多详细信息,请参阅注释实现。
完整文档
DiffLib\Diff
: 抽象基类。需要子类化以操作任何特定类型。DiffLib\StringDiff
: 用于字符串差异的最终类,并添加了对创建统一差异的支持DiffLib\ColoredUnifiedDiff
: 统一差异渲染的抽象基类。输出可以是任何类型 - 例如,字符串或 XHP。DiffLib\CLIColoredUnifiedDiff
: 用于将统一差异渲染到支持彩色转义序列的终端的抽象最终类。提供行内高亮。DiffLib\DiffOp
: 差异操作的抽象基类。密封到DiffInsertOp
、DiffKeepOp
和DiffDeleteOp
。DiffLib\cluster()
: 将相同类型的连续操作组合在一起的实用函数。将vec<DiffOp<T>>
转换为更短的vec<DiffOp<vec<T>>>
数量。
许可
DiffLib 采用 MIT 许可证,如 LICENSE 文件所示。