我有一个遗留的 HTML 网站,我需要添加一些功能。看看它,我注意到每个 HTML 文件中有许多“通用”部分 - 页脚、一些脚本块、标题等。我想将所有这些部分移动到单独的文件中(现在使用 SSI 包含它们) -这将使项目的理解更加容易。但是,有些块看起来相似但有些不同(例如不同的类名)。如此简单的剪切/粘贴是行不通的——我必须仔细检查我移除的每一块。我不想那样做——文件太多了。我想知道是否有一个应用程序可以比较一堆文件并找到相同的块(不一定存在于所有文件中)。
谢谢。
我有一个遗留的 HTML 网站,我需要添加一些功能。看看它,我注意到每个 HTML 文件中有许多“通用”部分 - 页脚、一些脚本块、标题等。我想将所有这些部分移动到单独的文件中(现在使用 SSI 包含它们) -这将使项目的理解更加容易。但是,有些块看起来相似但有些不同(例如不同的类名)。如此简单的剪切/粘贴是行不通的——我必须仔细检查我移除的每一块。我不想那样做——文件太多了。我想知道是否有一个应用程序可以比较一堆文件并找到相同的块(不一定存在于所有文件中)。
谢谢。
你想要一个克隆检测器。
许多克隆检测器只会发现相同的代码行或相同的标记序列。那些对你不起作用。您需要一个了解如何检测参数化克隆的克隆检测器。
一些基于令牌的检测器会发现只有很小变化的克隆作为参数;例如,如果它只是一个不同的类名,这些可能对你有用。这种检测器通常会产生非结构化的克隆序列;以下是从基于令牌的检测器的角度进行的克隆:
} void foo(
和
}
void bar(
为避免此类克隆,令牌检测器通常坚持使用非常长的令牌序列,这意味着它们可能会错过大小适中但有趣的克隆。
我们的 CloneDR 将找到参数可能是复杂结构的参数化克隆。它通过解析感兴趣的代码并比较抽象语法树来做到这一点,抽象语法树代表基本代码减去所有布局和空白。在树或树序列不同的情况下,它可以建议代表整个子树的参数(例如,表达式、htmt 标记组、属性的存在/不存在等)。因为它在树上操作,所以它不能提出上面那种克隆。这反过来意味着它可以找到有意义的适度大小的克隆以及大型克隆。
CloneDR 从精确的语言描述进行操作,以生成与语言结构精确匹配的克隆。有一个专门用于 HTML 的版本。
(我是架构师;您可以在 Wikipedia 页面上查看我关于 CloneDR 的技术论文。)