facebook/difflib

此包已被放弃,不再维护。未建议替代包。

维护者

详细信息

github.com/hhvm/difflib

源代码

问题

安装: 569 163

依赖者: 11

建议者: 0

安全性: 0

星标: 9

关注者: 22

分支: 7

开放问题: 3

语言:Hack

v1.3.0 2021-09-27 22:08 UTC

This package is auto-updated.

Last update: 2023-07-31 00:22:27 UTC


README

Continuous Integration

DiffLib 是一个用于创建和解析差异的 Hack 库。可以创建任何两个项目序列之间的差异。对于字符串差异,还提供了额外的辅助功能(例如,支持统一差异和彩色差异)。

差异表示为一系列 DiffOp 操作;这些可以 '保留' 一个元素(即在两个序列中都未更改),插入一个元素或删除一个元素。例如,在统一差异中,这些将是

 DiffKeepOp
-DiffDeleteOp
+DiffInsertOp

字符串差异通常表示为一系列行,但也可以表示为一系列字符,允许行内差异。

差异输出格式

difflib 可以创建标准统一差异

@@ -1 +1@@ -Foo Bat Baz +Foo Bar Baz

difflib 还可以创建带有行内编辑高亮的彩色差异

same diff as above, but with 'Bat' highlighted red, 'Bar' highlighted green

提供了一个针对标准 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: 差异操作的抽象基类。密封到 DiffInsertOpDiffKeepOpDiffDeleteOp
  • DiffLib\cluster(): 将相同类型的连续操作组合在一起的实用函数。将 vec<DiffOp<T>> 转换为更短的 vec<DiffOp<vec<T>>> 数量。

许可

DiffLib 采用 MIT 许可证,如 LICENSE 文件所示。