如果您编写 JSL 一段时间了,您可能保存了脚本的多个副本,并最终想知道脚本之间的差异。 没有一个很好的方法来回答 Windows 中内置的问题,因此这里有一种在 JSL 中执行此操作的方法,使用最短的编辑脚本函数(几乎完成所有工作)。
CompareTextFiles = Function( {pathA, pathB},
{textA, textB, v, gray, red, green, ipart, parts, kind, text, vv, bb},
textA = Load Text File( pathA );
textB = Load Text File( pathB );
parts = Shortest Edit Script( lines( textA, textB, ignorewhitespace() ) );
v = V List Box();
gray = RGB Color( .9, .9, .9 );
red = RGB Color( 1, .7, .7 );
green = RGB Color( .7, 1, .7 );
For( ipart = 1, ipart <= N Items( parts ), ipart += 1,
{kind, text} = parts[ipart];
bb = MouseBox(
Border Box( Left( 10 ), Right( 100 ),
// trim removes a final CR that double spaces the joint
// between text boxes in the vlistbox. the 3 spaces added
// back hides a rendering error that clips the last chars
// in a line...sometimes.
Text Box( Trim( text, right ) || " ", <<SETWRAP></SETWRAP>该函数需要两个文件名并返回一个适合嵌入到窗口中的 vlist 框。 vlist 框包含一堆绘制在灰色、红色或绿色背景上的文本框。 最短编辑脚本函数返回的编辑脚本是一个命令列表:保留数据常见的到两个字符串(灰色),删除第一个字符串的数据(红色),插入来自第二个字符串的数据(绿色)。 仅使用这三个命令,该脚本是“a”(不是“the”)将字符串 A 转换为字符串 B 的最短脚本。
MouseBox 在红色和绿色部分添加了一个工具提示,解释哪个文件丢失了该数据或添加了该数据。
这最短的编辑脚本还有一些其他参数(此处未使用)对于较长的文件非常有用,尤其是限制范围。 通过设置 500 或 1000 个差异的合理限制,您可以直接说“这些文件确实不同”,而无需花费太多时间等待非常缓慢的匹配过程,而该过程不太可能产生有趣的结果。 该函数的调用方式为忽略空白参数,因为我对缩进不同的行不感兴趣。
Two versions of Jabberwocky downloaded from the webTwo versions of Jabberwocky downloaded from the webTwo versions of Jabberwocky downloaded from the webTwo versions of Jabberwocky downloaded from the web从网上下载的 Jabberwocky 的两个版本
这些版本中至少有一个对原始版本进行了修改。
附脚本。