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下 两种框架的表现以及与原生…

P3275-[SCOI2011]糖果【差分约束,负环】

正题 题目大意:https://www.luogu.org/problemnew/show/P3275 题目大意 对于nnn个值&#xff0c;给出一系列不等式。求每个值的最小正整数。 解题思路 差分约束 codecodecode #include<cstdio> #include<queue> #include<cstring> #define MN 300005 usi…

ssh免密登陆失败原因总结(Linux)

转载自 ssh免密登陆失败原因总结&#xff08;Linux&#xff09; 1. SSH公钥认证&#xff08;免密码&#xff09;配置 登录到本机服务器A&#xff0c;切换到响应的操作系统用户&#xff0c;执行命令&#xff0c;生成秘钥文件【按照提示直接回车】 ssh-keygen -t rsa 将公钥传送…

FormData的使用

声明 创造一个空对象 var formData new FormData();或者在里面放入一个表单 var form document.getElementById("kForm"); var formData new FormData(form);赋值 如果想在里面赋值&#xff0c;可以用append方法 添加&#xff1a; formData.append(k1,kejin)…

从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…

POJ1201-Intervals【差分约束,负环,SPFA】

正题 题目链接:http://poj.org/problem?id1201 题目大意 求一个最少数量的数字集合满足 在li∼ril_i\sim r_ili​∼ri​的范围的数字至少是cic_ici​个 解题思路 设sis_isi​表示0∼i0\sim i0∼i的范围内数字个数。然后其实条件就是sr−si≥cs_r-s_i\geq csr​−si​≥c。…

laravel使用migrate操作数据库迁移

数据库表单预创建 1、生成php文件 php artisan make:migration create_articles_table2、执行php文件操作数据库 php artisan migrate --force回滚上一个 php artisan migrate:rollback回滚初始状态 php artisan migrate:reset$table->increments(id); $table->strin…

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 虚拟机…

jzoj3054-祖孙询问【LCA】

正题 题目大意 求两个点的祖孙关系。 解题思路 直接LCALCALCA&#xff0c;然后暴力判断。 codecodecode #include<cstdio> #include<algorithm> #include<queue> #include<cmath> #define N 41000 using namespace std; struct line{int to,next,w;…

入职、最近两个月以及感悟反省

六月份我入职了 现在是八月份&#xff0c;来讲讲我获得了什么吧。 可能最重要的就是熟练了公司的环境&#xff01;熟悉了那种工作氛围&#xff01;为以后工作铺垫基础。 这个倒是必然的&#xff0c;更多的是我想知道我实际意外所获得的东西&#xff0c;下面就来讲讲吧&#xff…

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…

jzoj3055-比赛【数学,统计】

正题 题目大意 2∗n2*n2∗n个人&#xff0c;AAA队BBB队各nnn各&#xff0c;有不同的战斗力。两个队的人随机PKPKPK&#xff0c;每次PKPKPK的价值为(X−Y)2(X-Y)^2(X−Y)2加入获胜队。求AAA队期望比BBB队多多少分。 解题思路 首先根据全排列我们发现其实每一个人打别的队的任何…

js的三元表达式用来替换表格中的颜色

var k1 3; var k2 0; var a k11?color-success:k10?color-red:k13?color-kejin: console.log(a)简单三元 scope.row.status 1 ?启用:禁用精确三元表达 scope.row.status1?启用:scope.row.status0?禁用:

jzoj3056-数字【数位dp,统计,容斥】

正题 题目大意 求有多少个2∗n2*n2∗n位的数字(允许有前导零)满足 只包含SSS集合内的数字前nnn位的和等于后nnn位之和或者奇数位之和和偶数位之和相等 解题思路 预处理数组fi,jf_{i,j}fi,j​表示iii位数&#xff0c;数字之和为jjj时的方案数。 动态转移方程 fi,j∑k1mfi,j−…

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.…