首页 > 其他分享 >前端实现文本对比,并高亮显示差异!

前端实现文本对比,并高亮显示差异!

时间:2024-08-30 11:54:24浏览次数:5  
标签:高亮 前端 补丁 对比 jsdiff diff 文本 差异

你有没有想过,常见的代码差异对比是如何都实现的呢?其实这里面涉及到非常复杂的文本对比算法,本文就来看看如何通过现有工具库 jsdiff + diff2html 实现文本对比,并高亮显示差异!

图片

 

文本对比

文本对比可以借助 jsdiff 来实现,jsdiff 是一个 JavaScript 库,用于实现文本差异比较。这个库提供了多种方法来计算和展示两个文本之间的差异,可以用于多种文本差异比较的场景,比如版本控制、文档比较、代码编辑器中的变更高亮等。

jsdiff 基于 Myers 在 1986 年提出的 "An O(ND) Difference Algorithm and its Variations" 算法实现。

jsdiff 是一个非常热门的工具库,其 npm 周下载量高达 4000 万,很多知名前端工具库都依赖它:

图片

Github:https://github.com/kpdecker/jsdiff

以下是 jsdiff 提供的 API:

  • diffChars - 对两个文本进行字符级别的差异比较。

  • diffWords - 对两个文本进行单词级别的差异比较,忽略空白字符。

  • diffWordsWithSpace - 对两个文本进行单词级别的差异比较,考虑空白字符作为分隔符。

  • diffLines - 对两个文本按行进行差异比较。

  • diffSentences - 对两个文本按句子进行差异比较。

  • diffCss - 专门用于比较 CSS 代码的差异。

  • diffJson - 比较两个 JSON 对象的差异,首先将它们序列化为格式化的 JSON 文本,然后逐行比较。

  • diffArrays - 比较两个数组,检查数组元素的严格等同性。

  • createTwoFilesPatch - 创建一个包含两个文件差异的补丁。

  • createPatch - 创建一个补丁,通常用于一个文件的前后变化。

  • applyPatch - 应用一个给定的补丁到源文本上。

  • applyPatches - 应用一个或多个补丁到相应的文件内容上。

  • parsePatch - 解析一个补丁字符串为结构化的数据。

  • reversePatch - 反转一个补丁,使得应用此补丁会撤销原始的更改。

  • convertChangesToXML - 将差异对象转换为 XML 格式。

  • convertChangesToDMP - 将差异对象转换为 Google 的 diff-match-patch 库的格式。

在使用 jsdiff 时,首先需要通过以下命令来安装:


npm install diff --save

安装完成之后就可以选择合适的 API 直接使用了。对于文章最开始的例子,就可以借助 createTwoFilesPatch API 来对比两个文件的差异,它的参数如下:


createTwoFilesPatch(oldFileName, newFileName, oldStr, newStr, oldHeader, newHeader, options)
  • oldFileName: 旧文件的文件名。

  • newFileName: 新文件的文件名。

  • oldStr: 原始字符串值

  • newStr: 新的字符串值

  • oldHeader: 可选,允许在旧文件的头部添加额外的信息。

  • newHeader: 可选,用于在新文件的头部添加额外的信息。

  • options: 一个包含选项的对象,可以用来自定义补丁的生成方式:

    • context: 描述应该包含多少行上下文。设置为 Number.MAX_SAFE_INTEGERInfinity 可以包含整个文件内容在一个块(hunk)中。

    • ignoreWhitespace: 与 diffLines 中的用法相同,用于忽略空白字符差异。默认为 false

    • stripTrailingCr: 与 diffLines 中的用法相同,用于在执行差异比较之前去除所有尾随的回车符(\r)。这有助于在比较 UNIX 和 Windows 文本文件时得到有用的差异结果。默认为 false

代码如下:


import * as Diff from 'diff';

const oldFile = `{
  "projectName": "ExampleProject",
  "version": "1.0.0",
  "author": "John Doe",
  "dependencies": {
    "libraryA": "^1.2.3",
    "libraryB": "^3.4.5"
  },
  "devDependencies": {
    "toolX": "^0.9.8"
  },
  "scripts": {
    "start": "node index.js"
  }
}`; 

const newFile = `{
  "projectName": "ExampleProject",
  "version": "1.0.1",
  "author": "Jane Doe",
  "dependencies": {
    "libraryA": "^1.2.3",
    "libraryC": "^7.8.9"
  },
  "devDependencies": {
    "toolX": "^0.9.8",
    "toolY": "^2.3.4"
  },
  "scripts": {
    "start": "node app.js",
    "test": "npm test"
  }
}`;

const diff = Diff.createTwoFilesPatch("旧文件", "新文件", oldFile, newFile);

这里的对比结果 diff 结果如下:

图片

对比结果有点丑,下面会进行优化。

除了 jsdiff,还有一个基于 jsdiff 开发的 React 库:react-diff-viewer。它提供了一种简单易用的方式来展示两个文本或对象之间的差异,不仅可以对文本进行对比,还可以输出漂亮的差异对比结果。

图片

Github:https://github.com/praneshr/react-diff-viewer

高亮显示差异

如果使用 jsdiff 进行对比,对比结果可能没那么美观,可以借助 diff2html 来美化。

diff2html 是一个用于将差异(diff)结果转换成 HTML 格式的工具,它通常用于在网页上展示文件或文本内容之间的差异。这个库提供了一种方便的方式来生成美观的差异比较视图,使得用户可以轻松地查看和理解两个版本之间的变化。

Github:https://github.com/rtfpessoa/diff2html

首先需要进行安装:


npm install diff2html --save

然后导入使用即可:


import * as Diff2Html from "diff2html";

const outputHtml = Diff2Html.html(diff, {
  inputFormat: "diff",
  showFiles: true,
  matching: "lines",
  highlight: true,
  outputFormat: "side-by-side",
});

这里的 diff 就是上一步中生成的 diff 结果。

美化后对比如下,更美观了:

图片

更多配置可以在其文档中进行探索。

标签:高亮,前端,补丁,对比,jsdiff,diff,文本,差异
From: https://blog.csdn.net/lsq191690/article/details/141676632

相关文章

  • DrawGrid1自画图标和文本
    通过网盘分享的文件:DrawGrid.rar链接:https://pan.baidu.com/s/1ihZ1wFkPEVxr4v02dgMFVA提取码:81etprocedureTForm8.FormCreate(Sender:TObject);beginDrawGrid1.FixedRows:=0;DrawGrid1.FixedCols:=0;//去掉固定列DrawGrid1.RowCount:=3;......
  • vim系列-文本操作篇
    基数行与偶数行分组使用Vim的替换命令,可以轻松地将基数行和偶数行分组:%s/\(^.*$\)\n\(^.*$\)/\1\2/g然后,删除所有的基数行:%s/^.*$\n\(^.*$\)/\1/g删除重复行在Vim中删除重复行是一个常见的操作,以下是几种方法:删除相邻重复行:g/\(.\+\)$\n\1/d删除不相邻重复行使用排......
  • 粤港澳大湾区-工业软件中心-诚聘测试开发产品前端等(广州 不限制年龄)
    简介粤港澳大湾区国家技术创新中心工业软件产业发展中心,是粤港澳大湾区国家技术创新中心直属创新平台之一。该中心致力于聚焦工业软件基础创新,构建工业软件全过程创新生态链,为推动我国工业软件产业发展做出重要贡献。主要目标攻克核心技术:突破工业软件核心关键技术,提升我国......
  • 【C/C++进阶】——文件操作之文本文件与二进制文件指针读写
    【文件】——操作文件目录一:文件的定义二:文件名三:文件类型3.1:二进制文件3.2:文本文件四:文件的打开与关闭4.1:文件指针4.2:文件的打开与关闭五:文件的顺序读写5.1:读写字符5.2:读写字符串5.3:读写格式化数据六:文件的随机读写6.1:fseek6.2:ftell6.3:rewind七:文件读取结......
  • 前端自己分页 shadcn, Next
    import{usePathname,useSearchParams}from'next/navigation'import{PaginationContent,PaginationEllipsis,PaginationItem,PaginationLink,PaginationNext,PaginationPrevious,PaginationasPaginationShadui}from'@/compo......
  • 2024全新快递平台系统独立版小程序源码|带cps推广营销流量主+前端
    2024全新快递平台系统独立版小程序源码|带cps推广营销流量主+前端2024全新快递平台系统**版小程序源码:开启CPS推广营销新时代在这个快节奏的时代,快递服务已经成为我们生活中不可或缺的一部分。随着科技的不断进步,2024年迎来了一个全新的快递平台系统**版小程序源码,它不仅......
  • 前端资源提示符
    由于js是单线程,DOM解析是自上而下的,遇到link或script标签,去暂停主线程去下载资源,然后再继续解析,主线程在等待网络线程下载的这个时间段就会造成浪费,而HTML资源提示符就能很好解决这个问题。async异步下载js资源,不会阻止DOM解析,会在下载完成后立即执行js脚本defe......
  • Linux 文本处理
    1.正则表达式        Linux正则表达式在文本处理和搜索过程中起着非常重要的作用。它可以用于匹配和查找符合特定模式的字符串,从而实现强大的文本处理功能。以下是一些常见的正则表达式作用:        1.匹配字符串:正则表达式可以根据指定的模式匹配字符串。......
  • AI 大模型在文本生成任务中的创新应用
    目录前言一、文本生成技术的最新进展1.1从规则到深度学习:文本生成技术的演变1.2大型语言模型的崛起:从GPT-3到GPT-41.3创新技术推动文本生成质量提升二、文本生成的创新应用案例分析2.1自动内容创作2.2智能对话系统2.3个性化内容推荐三、高质量文本生成的代......
  • 浏览器读出文本window.speechSynthesis.speak(msg)
      window.speechSynthesis.speak(msg)是用于在浏览器中调用WebSpeechAPI的语音合成功能。这段代码会让浏览器读出msg对象中的文本。//创建一个新的SpeechSynthesisUtterance对象varmsg=newSpeechSynthesisUtterance();//设置要朗读的文本msg.text="Hell......