jsdiff 比较文本内容差异

翻译自 jsdiff 

JavaScript文本内容差异实现。

基于"An O(ND) Difference Algorithm and its Variations" (Myers, 1986) 中提出的算法 。

安装

npm install diff --save

API

  • Diff.diffChars(oldStr, newStr[, options]) -区分两个文本块,逐字符比较。

    返回更改对象列表(请参见下文)。

    选件

    • ignoreCasetrue忽略大小写差异。默认为false
  • Diff.diffWords(oldStr, newStr[, options]) -区分两个文本块,逐字比较,忽略空格。

    返回更改对象列表(请参见下文)。

    选件

    • ignoreCase:与中的相同diffChars
  • Diff.diffWordsWithSpace(oldStr, newStr[, options]) -区分两个文本块,逐字比较,将空白视为有效。

    返回更改对象列表(请参见下文)。

  • Diff.diffLines(oldStr, newStr[, options]) -比较两个文本块,逐行比较。

    选件

    • ignoreWhitespacetrue忽略开头和结尾的空格。这和diffTrimmedLines
    • newlineIsTokentrue将换行符视为单独的标记。这允许换行结构的更改独立于行内容而发生,并照此处理。一般来说,这是更加人性化友好的形式diffLinesdiffLines更适合贴片机等计算机友好的输出。

    返回更改对象列表(请参见下文)。

  • Diff.diffTrimmedLines(oldStr, newStr[, options]) -区分两个文本块,逐行比较,忽略前导和尾随空格。

    返回更改对象列表(请参见下文)。

  • Diff.diffSentences(oldStr, newStr[, options]) -区分两个文本块,逐句比较。

    返回更改对象列表(请参见下文)。

  • Diff.diffCss(oldStr, newStr[, options]) -比较两个文本块,比较CSS标记。

    返回更改对象列表(请参见下文)。

  • Diff.diffJson(oldObj, newObj[, options])-比较两个JSON对象,比较每个对象上定义的字段。在此比较中,字段的顺序等并不重要。

    返回更改对象列表(请参见下文)。

  • Diff.diffArrays(oldArr, newArr[, options]) -比较两个数组,比较每个项目是否严格相等(===)。

    选件

    • comparatorfunction(left, right)用于自定义相等性检查

    返回更改对象列表(请参见下文)。

  • Diff.createTwoFilesPatch(oldFileName, newFileName, oldStr, newStr, oldHeader, newHeader) -创建一个统一的差异补丁。

    参数:

    • oldFileName :将在修补程序的文件名部分中输出的字符串,以供删除
    • newFileName :要在增补程序的文件名部分中输出的字符串
    • oldStr :原始字符串值
    • newStr :新的字符串值
    • oldHeader :旧文件标题中包含的其他信息
    • newHeader :新文件头中包含的其他信息
    • options:带有选项的对象。当前,仅context支持,并且描述应包括多少行上下文。
  • Diff.createPatch(fileName, oldStr, newStr, oldHeader, newHeader) -创建一个统一的差异补丁。

    就像Diff.createTwoFilesPatch一样,但是oldFileName等于newFileName。

  • Diff.structuredPatch(oldFileName, newFileName, oldStr, newStr, oldHeader, newHeader, options) -返回带有大块对象数组的对象。

    此方法类似于createTwoFilesPatch,但是返回适合进一步处理的数据结构。参数与createTwoFilesPatch相同。返回的数据结构可能如下所示:

    {oldFileName: 'oldfile', newFileName: 'newfile',oldHeader: 'header1', newHeader: 'header2',hunks: [{oldStart: 1, oldLines: 3, newStart: 1, newLines: 3,lines: [' line2', ' line3', '-line4', '+line5', '\\ No newline at end of file'],}]
    }

     

  • Diff.applyPatch(source, patch[, options]) -应用统一的差异补丁。

    返回一个字符串,其中包含提供的数据的新版本。patch可以是字符串diff或parsePatchor structuredPatch方法的输出。

    可选options对象可能具有以下键:

    • fuzzFactor:拒绝补丁之前允许变化的行数。默认为0。
    • compareLine(lineNumber, line, operation, patchContent):回调用于与给定的行进行比较,以确定修补时是否应将它们视为相等。默认为严格相等,但可以被覆盖以提供更模糊的比较。如果应拒绝行,则应返回false。
  • Diff.applyPatches(patch, options) -应用一个或多个补丁。

    此方法将迭代补丁程序的内容,并应用于通过回调提供的数据。每个补丁程序索引的一般流程为:

    • options.loadFile(index, callback)叫做。然后,调用方应加载文件的内容,然后将其传递给callback(err, data)回调。传递err将会终止进一步的补丁程序执行。
    • options.patched(index, content, callback)一旦应用了补丁,就会调用。content将是的返回值applyPatch。准备就绪后,调用方应调用callback(err)回调。传递err将会终止进一步的补丁程序执行。

    一旦应用了所有补丁或发生错误,便进行options.complete(err)回调。

  • Diff.parsePatch(diffStr) -将补丁解析为结构化数据

    返回补丁的JSON对象表示形式,适合与applyPatch方法一起使用。这将解析为返回的相同结构Diff.structuredPatch

  • convertChangesToXML(changes) -将更改列表转换为序列化的XML格式

callback当省略该参数时,上面所有接受可选方法的方法将在同步模式下运行,而在提供该参数时将在异步模式下运行。这允许更大的差异而不阻塞事件循环。这可以直接作为最终参数或作为对象中的callback字段传递options

变更物件

上面的许多方法都返回更改对象。这些对象包含以下字段:

  • value:文字内容
  • added:如果将值插入到新字符串中,则为True
  • removed:如果从旧字符串中删除了值,则为true

请注意,某些情况下可能会省略特定的标志字段。对标记字段的比较应始终以真实或错误的方式进行。

例子

Node中的基本示例

require('colors');
var Diff = require('diff');var one = 'beep boop';
var other = 'beep boob blah';var diff = Diff.diffChars(one, other);diff.forEach(function(part){// green for additions, red for deletions// grey for common partsvar color = part.added ? 'green' :part.removed ? 'red' : 'grey';process.stderr.write(part.value[color]);
});console.log();

运行上面的程序应该会产生

 

网页中的基本示例

<pre id="display"></pre>
<script src="diff.js"></script>
<script>
var one = 'beep boop',other = 'beep boob blah',color = '',span = null;var diff = Diff.diffChars(one, other),display = document.getElementById('display'),fragment = document.createDocumentFragment();diff.forEach(function(part){// green for additions, red for deletions// grey for common partscolor = part.added ? 'green' :part.removed ? 'red' : 'grey';span = document.createElement('span');span.style.color = color;span.appendChild(document.createTextNode(part.value));fragment.appendChild(span);
});display.appendChild(fragment);
</script>

在浏览器中打开上述.html文件,您应该看到

 

完整的在线演示

jsdiff支持IE8及以下版本中存在某些已知问题的所有ES3环境。在这些浏览器下,某些差异算法(例如单词diff)和其他差异算法可能会由于缺乏对捕获split操作中组的支持而失败。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/322724.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Net Core下多种ORM框架特性及性能对比

在.NET Framework下有许多ORM框架&#xff0c;最著名的无外乎是Entity Framework&#xff0c;它拥有悠久的历史以及便捷的语法&#xff0c;在占有率上一路领先。但随着Dapper的出现&#xff0c;它的地位受到了威胁&#xff0c;本文对比了在.NET Core下 两种框架的表现以及与原生…

从ThoughtWorks 2017技术雷达看微软技术

ThoughtWorks在每年都会出品两期技术雷达&#xff0c;这是一份关于技术趋势的报告&#xff0c;它比起一些我们能在市面上见到的其他各种技术行情和预测报告&#xff0c;更加具体&#xff0c;更具可操作性&#xff0c;因为它不仅涉及到新技术大趋势&#xff0c;比如云平台和大数…

Spark入门(一)单主standalone安装

一、集群安装条件前置 实验spark安装在【Hadoop入门&#xff08;二&#xff09;集群安装】机器上&#xff0c; 已完成安装jdk,hadoop和ssh、网络等配置环境等。 spark所依赖的虚拟机和操作系统配置 环境&#xff1a;ubuntu14 spark-2.4.4-bin-hadoop2.6jdk1.8ssh 虚拟机&a…

AutoMapper在asp.netcore中的使用

automapper 是.net 项目中针对模型之间转换映射的一个很好用的工具&#xff0c;不仅提高了开发的效率还使代码更加简洁&#xff0c;当然也是开源的&#xff0c;https://github.com/AutoMapper&#xff0c;这不多做介绍&#xff0c;详细看&#xff0c;官网下面是介绍它在 .net c…

Hadoop生态Zookeeper安装

一、安装条件前置 实验zookeeper安装在【Hadoop入门&#xff08;二&#xff09;集群安装】机器上&#xff0c;已完成安装jdk,hadoop和ssh配置环境等。 zookeeper所依赖的虚拟机和操作系统配置 环境&#xff1a;ubuntu14 apache-zookeeper-3.5.6-bin.tar jdk1.8ssh 虚拟机…

Hangfire在ASP.NET CORE中的简单实现

hangfire是执行后台任务的利器&#xff0c;具体请看官网介绍&#xff1a;https://www.hangfire.io/ 新建一个asp.net core mvc 项目 引入nuget包 Hangfire.AspNetCore hangfire的任务需要数据库持久化&#xff0c;我们在Startup类中修改ConfigureServices 然后在Configure方法中…

Spark入门(二)多主standalone安装

一、集群安装条件前置 实验spark安装在【Hadoop生态Zookeeper安装】机器上&#xff0c; 已完成安装zookeeper、jdk、hadoop和ssh、网络等配置环境等。 spark所依赖的虚拟机和操作系统配置 环境&#xff1a;ubuntu14 spark-2.4.4-bin-hadoop2.6 apache-zookeeper-3.5.6 jd…

Ocelot——初识基于.Net Core的API网关

前言 前不久看到一篇《.NET Core 在腾讯财付通的企业级应用开发实践》&#xff0c;给现在研究.Net Core及想往微服务方向发展的人来了一剂强心针。于是我也就立刻去下Ocelot的源码及去阅读官方文档。 Ocelot的Github地址&#xff1a;https://github.com/TomPallister/Ocelot 官…

forEach和for in

如果是对数组本身进行操作&#xff0c;则必然要用到for循环&#xff0c;如果是依赖数组做其他东西的操作&#xff0c;则可以用 forEach 最经典的两种操作 1、批量获取数组中的单个元素 let _selectSns [];this.multipleSelection.forEach(item > {_selectSns.push(item.sn…

Spark入门(三)Idea构建spark项目

一、依赖包配置 scala与spark的相关依赖包&#xff0c;spark包后尾下划线的版本数字要跟scala的版本第一二位要一致&#xff0c;即2.11 pom.xml <?xml version"1.0" encoding"UTF-8"?><project xmlns"http://maven.apache.org/POM/4.0.…

VS Tools for AI全攻略

大家都知道微软在Connect();17大会上发布了VS Tools for AI&#xff0c;旨在提升Visual Studio和VSCode对日益增长的深度学习需求的体验。看了一圈&#xff0c;网上似乎没有一个完整的中文教程来教你怎么完整配置深度学习方案。 与此同时我也接了一个活&#xff0c;是俱乐部与M…

Spark入门(四)Idea远程提交项目到spark集群

一、依赖包配置 scala与spark的相关依赖包&#xff0c;spark包后尾下划线的版本数字要跟scala的版本第一二位要一致&#xff0c;即2.11 pom.xml <?xml version"1.0" encoding"UTF-8"?><project xmlns"http://maven.apache.org/POM/4.0.…

关于负载均衡的一切:总结与思考

正文 古人云&#xff0c;不患寡而患不均。 在计算机的世界&#xff0c;这就是大家耳熟能详的负载均衡&#xff08;load balancing&#xff09;&#xff0c;所谓负载均衡&#xff0c;就是说如果一组计算机节点&#xff08;或者一组进程&#xff09;提供相同的&#xff08;同质的…

Spark入门(五)Spark SQL shell启动方式(元数据存储在derby)

一、spark-sql shell介绍 Spark sql是以hive SQL提交spark任务到spark集群执行。 由于spark是计算框架没有存储功能&#xff0c;所有spark sql数据表映射关系存储在运行shell的当前目录下metastore_db目录里面&#xff08;spark默认使用derby数据库创建的本地存储&#xff0c…

Spark入门(六)Spark SQL shell启动方式(元数据存储在mysql)

一、hive配置文件 在spak/conf目录添加hive-site.xml配置&#xff0c;设置mysql作为元数据存储的数据库 <?xml version"1.0" encoding"UTF-8" standalone"no"?> <?xml-stylesheet type"text/xsl" href"configurat…

Asp.NET Core2.0 项目实战入门视频课程_完整版

END OR START? 看到这个标题&#xff0c;你开不开心&#xff0c;激不激动呢&#xff1f; 没错&#xff0c;.net core的入门课程已经完毕了。52ABP.School项目从11月19日&#xff0c;第一章视频的试录制&#xff0c;到今天完整版出炉&#xff0c;离不开各位的帮助和加油。 课程…

VS Tools for AI全攻略(2)低配置虚拟机也能玩转深度学习,无需NC/NV系列

接着上文VS Tools for AI全攻略&#xff0c;我们来讨论如何使用Azure资源来训练我们的tensorflow项目。Azure云我个人用得很多&#xff0c;主要是因为微软爸爸批了150刀每月的额度&#xff0c;我可以愉快地玩耍。 那么针对Azure&#xff0c;有成套的两个方案解决问题。 方案一&…

Spark入门(七)Spark SQL thriftserver/beeline启动方式

一、启动thrift服务 启动thriftServer&#xff0c;默认端口为10000,。 --jars 添加worker类库 --driver-class-path 驱动类库 --master spark集群地址 --total-executor-cores 启动的核数&#xff0c;默认是所有核数 --executor-memory 每个work分配的内存&#xff0c;…

【青岛】12月16日.NETCore与AI技术交流会-等你来哦!!

主题是拥抱开源 拥抱开源&#xff1a;开放是互联终端不断增长的主旨和核心——使技术世界变得越来越复杂&#xff0c;联系越来越紧密。在微软&#xff0c;我们专注于向客户提供任何信息支持&#xff0c;即使在任何设备或者在多个平台上。 未来是开放的&#xff0c;未来的云是开…

对于自绝对父相的理解

1、如果对子元素施加绝对定位&#xff0c;然后设置一个bottom为20 则&#xff1a; html <div class"k1"><div class"k2">1111</div></div>.k1 {margin: 0 auto;height: 500px;width: 500px;background: green;}.k2 {height: 100…