我有两个文本文件file1.txt和file2.txt。我想找到将突出显示相等,插入和删除文本的文件的差异。最终目标是创建一个具有不同颜色和样式的文本(相等,插入和删除文本(的HTML文件。
file1.txt
I am testing this ruby code for printing the file diff.
file2.txt
I am testing this code for printing the file diff.
我正在使用此代码
doc1 = File.open('file1.txt').read
doc2 = open('file2.txt').read
final_doc = Diffy::Diff.new(doc1, doc2).each_chunk.to_a
输出为:
-I am testing this ruby code for printing the file diff.
+I am testing this code for printing the file diff.
但是,我需要以类似于以下格式的输出。
equal:
I am testing this
insertion:
ruby
equal:
code for printing the file diff.
在python中有一个可以通过它来实现的,但我在红宝石中没有发现这种功能。
我发现Ruby中有几个不同的库来进行" diffs",但它们更专注于按线进行检查。我创建了一些代码,这些代码用于比较几个相对较短的字符串并显示差异,这是一种快速黑客,如果突出显示它们已将其从 - 从 - 要这样做,就需要更多地考虑算法。但是该代码一次一次构成奇怪的奇迹。
关键是,就像在任何语言处理中一样,使您的令牌化正确。您不能仅通过Word处理字符串。真正最好的方法是首先循环,递归并将每个令牌与文本中的位置相关联并使用它来进行分析,但是下面的方法是快速简便的。
def self.change_differences(text1,text2) #oldtext, newtext
result = ""
tokens = text2.split(/(?<=[?.!,])/) #Positive look behind regexp.
for token in tokens
if text1.sub!(token,"") #Yes it contained it.
result += "<span class='diffsame'>" + token + "</span>"
else
result += "<span class='diffadd'>" + token + "</span>"
end
end
tokens = text1.split(/(?<=[?.!,])/) #Positive look behind regexp.
for token in tokens
result += "<span class='diffremove'>"+token+"</span>"
end
return result
end
来源:我!