UNPKG

vue-diff-text

Version:

A simple Vue 3 component to display the difference between two blocks of text.

3 lines (2 loc) 8.76 kB
(function(m,o){typeof exports=="object"&&typeof module<"u"?o(exports,require("vue")):typeof define=="function"&&define.amd?define(["exports","vue"],o):(m=typeof globalThis<"u"?globalThis:m||self,o(m.VueDiffText={},m.Vue))})(this,function(m,o){"use strict";function x(){}x.prototype={diff:function(e,n){var i,f=arguments.length>2&&arguments[2]!==void 0?arguments[2]:{},r=f.callback;typeof f=="function"&&(r=f,f={}),this.options=f;var s=this;function l(c){return r?(setTimeout(function(){r(void 0,c)},0),!0):c}e=this.castInput(e),n=this.castInput(n),e=this.removeEmpty(this.tokenize(e)),n=this.removeEmpty(this.tokenize(n));var d=n.length,p=e.length,h=1,u=d+p;f.maxEditLength&&(u=Math.min(u,f.maxEditLength));var g=(i=f.timeout)!==null&&i!==void 0?i:1/0,E=Date.now()+g,a=[{oldPos:-1,lastComponent:void 0}],y=this.extractCommon(a[0],n,e,0);if(a[0].oldPos+1>=p&&y+1>=d)return l([{value:this.join(n),count:n.length}]);var v=-1/0,_=1/0;function S(){for(var c=Math.max(v,-h);c<=Math.min(_,h);c+=2){var C=void 0,D=a[c-1],k=a[c+1];D&&(a[c-1]=void 0);var q=!1;if(k){var V=k.oldPos-c;q=k&&0<=V&&V<d}var A=D&&D.oldPos+1<p;if(!q&&!A){a[c]=void 0;continue}if(!A||q&&D.oldPos+1<k.oldPos?C=s.addToPath(k,!0,void 0,0):C=s.addToPath(D,void 0,!0,1),y=s.extractCommon(C,n,e,c),C.oldPos+1>=p&&y+1>=d)return l(J(s,C.lastComponent,n,e,s.useLongestToken));a[c]=C,C.oldPos+1>=p&&(_=Math.min(_,c-1)),y+1>=d&&(v=Math.max(v,c+1))}h++}if(r)(function c(){setTimeout(function(){if(h>u||Date.now()>E)return r();S()||c()},0)})();else for(;h<=u&&Date.now()<=E;){var M=S();if(M)return M}},addToPath:function(e,n,i,f){var r=e.lastComponent;return r&&r.added===n&&r.removed===i?{oldPos:e.oldPos+f,lastComponent:{count:r.count+1,added:n,removed:i,previousComponent:r.previousComponent}}:{oldPos:e.oldPos+f,lastComponent:{count:1,added:n,removed:i,previousComponent:r}}},extractCommon:function(e,n,i,f){for(var r=n.length,s=i.length,l=e.oldPos,d=l-f,p=0;d+1<r&&l+1<s&&this.equals(n[d+1],i[l+1]);)d++,l++,p++;return p&&(e.lastComponent={count:p,previousComponent:e.lastComponent}),e.oldPos=l,d},equals:function(e,n){return this.options.comparator?this.options.comparator(e,n):e===n||this.options.ignoreCase&&e.toLowerCase()===n.toLowerCase()},removeEmpty:function(e){for(var n=[],i=0;i<e.length;i++)e[i]&&n.push(e[i]);return n},castInput:function(e){return e},tokenize:function(e){return e.split("")},join:function(e){return e.join("")}};function J(t,e,n,i,f){for(var r=[],s;e;)r.push(e),s=e.previousComponent,delete e.previousComponent,e=s;r.reverse();for(var l=0,d=r.length,p=0,h=0;l<d;l++){var u=r[l];if(u.removed){if(u.value=t.join(i.slice(h,h+u.count)),h+=u.count,l&&r[l-1].added){var E=r[l-1];r[l-1]=r[l],r[l]=E}}else{if(!u.added&&f){var g=n.slice(p,p+u.count);g=g.map(function(y,v){var _=i[h+v];return _.length>y.length?_:y}),u.value=t.join(g)}else u.value=t.join(n.slice(p,p+u.count));p+=u.count,u.added||(h+=u.count)}}var a=r[d-1];return d>1&&typeof a.value=="string"&&(a.added||a.removed)&&t.equals("",a.value)&&(r[d-2].value+=a.value,r.pop()),r}var N=new x;function R(t,e,n){return N.diff(t,e,n)}function Z(t,e){if(typeof t=="function")e.callback=t;else if(t)for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n]);return e}var O=/^[A-Za-z\xC0-\u02C6\u02C8-\u02D7\u02DE-\u02FF\u1E00-\u1EFF]+$/,W=/\S/,B=new x;B.equals=function(t,e){return this.options.ignoreCase&&(t=t.toLowerCase(),e=e.toLowerCase()),t===e||this.options.ignoreWhitespace&&!W.test(t)&&!W.test(e)},B.tokenize=function(t){for(var e=t.split(/([^\S\r\n]+|[()[\]{}'"\r\n]|\b)/),n=0;n<e.length-1;n++)!e[n+1]&&e[n+2]&&O.test(e[n])&&O.test(e[n+2])&&(e[n]+=e[n+2],e.splice(n+1,2),n--);return e};function j(t,e,n){return n=Z(n,{ignoreWhitespace:!0}),B.diff(t,e,n)}function G(t,e,n){return B.diff(t,e,n)}var L=new x;L.tokenize=function(t){this.options.stripTrailingCr&&(t=t.replace(/\r\n/g,` `));var e=[],n=t.split(/(\n|\r\n)/);n[n.length-1]||n.pop();for(var i=0;i<n.length;i++){var f=n[i];i%2&&!this.options.newlineIsToken?e[e.length-1]+=f:(this.options.ignoreWhitespace&&(f=f.trim()),e.push(f))}return e};function H(t,e,n){return L.diff(t,e,n)}var F=new x;F.tokenize=function(t){return t.split(/(\S.+?[.!?])(?=\s+|$)/)};function Q(t,e,n){return F.diff(t,e,n)}var U=new x;U.tokenize=function(t){return t.split(/([{}:;,]|\s+)/)};function w(t){"@babel/helpers - typeof";return typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?w=function(e){return typeof e}:w=function(e){return e&&typeof Symbol=="function"&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},w(t)}var X=Object.prototype.toString,T=new x;T.useLongestToken=!0,T.tokenize=L.tokenize,T.castInput=function(t){var e=this.options,n=e.undefinedReplacement,i=e.stringifyReplacer,f=i===void 0?function(r,s){return typeof s>"u"?n:s}:i;return typeof t=="string"?t:JSON.stringify($(t,null,null,f),f," ")},T.equals=function(t,e){return x.prototype.equals.call(T,t.replace(/,([\r\n])/g,"$1"),e.replace(/,([\r\n])/g,"$1"))};function $(t,e,n,i,f){e=e||[],n=n||[],i&&(t=i(f,t));var r;for(r=0;r<e.length;r+=1)if(e[r]===t)return n[r];var s;if(X.call(t)==="[object Array]"){for(e.push(t),s=new Array(t.length),n.push(s),r=0;r<t.length;r+=1)s[r]=$(t[r],e,n,i,f);return e.pop(),n.pop(),s}if(t&&t.toJSON&&(t=t.toJSON()),w(t)==="object"&&t!==null){e.push(t),s={},n.push(s);var l=[],d;for(d in t)t.hasOwnProperty(d)&&l.push(d);for(l.sort(),r=0;r<l.length;r+=1)d=l[r],s[d]=$(t[d],e,n,i,d);e.pop(),n.pop()}else s=t;return s}var z=new x;z.tokenize=function(t){return t.slice()},z.join=z.removeEmpty=function(t){return t};const Y={class:"text-diff text-diff-chars"},P=["textContent"],b=o.defineComponent({__name:"DiffChars",props:{oldText:{type:String,required:!0},newText:{type:String,required:!0},options:{type:Object,default:()=>({})}},setup(t){const e=t,n=o.computed(()=>R(e.oldText,e.newText,e.options));return(i,f)=>(o.openBlock(),o.createElementBlock("div",Y,[(o.openBlock(!0),o.createElementBlock(o.Fragment,null,o.renderList(n.value,(r,s)=>(o.openBlock(),o.createElementBlock("span",{key:s,class:o.normalizeClass({"diff-added":r.added,"diff-removed":r.removed}),textContent:o.toDisplayString(r.value)},null,10,P))),128))]))}}),K={class:"text-diff text-diff-words"},ee=["textContent"],te=o.defineComponent({__name:"DiffWords",props:{oldText:{type:String,required:!0},newText:{type:String,required:!0},options:{type:Object,default:()=>({})}},setup(t){const e=t,n=o.computed(()=>j(e.oldText,e.newText,e.options));return(i,f)=>(o.openBlock(),o.createElementBlock("div",K,[(o.openBlock(!0),o.createElementBlock(o.Fragment,null,o.renderList(n.value,(r,s)=>(o.openBlock(),o.createElementBlock("span",{key:s,class:o.normalizeClass({"diff-added":r.added,"diff-removed":r.removed}),textContent:o.toDisplayString(r.value)},null,10,ee))),128))]))}}),ne={class:"text-diff text-diff-words-with-space"},oe=["textContent"],I=o.defineComponent({__name:"DiffWordsWithSpace",props:{oldText:{type:String,required:!0},newText:{type:String,required:!0},options:{type:Object,default:()=>({})}},setup(t){const e=t,n=o.computed(()=>G(e.oldText,e.newText,e.options));return(i,f)=>(o.openBlock(),o.createElementBlock("div",ne,[(o.openBlock(!0),o.createElementBlock(o.Fragment,null,o.renderList(n.value,(r,s)=>(o.openBlock(),o.createElementBlock("span",{key:s,class:o.normalizeClass({"diff-added":r.added,"diff-removed":r.removed}),textContent:o.toDisplayString(r.value)},null,10,oe))),128))]))}}),re={class:"text-diff text-diff-lines"},ie=["textContent"],se=o.defineComponent({__name:"DiffLines",props:{oldText:{type:String,required:!0},newText:{type:String,required:!0},options:{type:Object,default:()=>({})}},setup(t){const e=t,n=o.computed(()=>H(e.oldText,e.newText,e.options));return(i,f)=>(o.openBlock(),o.createElementBlock("div",re,[(o.openBlock(!0),o.createElementBlock(o.Fragment,null,o.renderList(n.value,(r,s)=>(o.openBlock(),o.createElementBlock("span",{key:s,class:o.normalizeClass({"diff-added":r.added,"diff-removed":r.removed}),textContent:o.toDisplayString(r.value)},null,10,ie))),128))]))}}),fe={class:"text-diff text-diff-sentences"},le=["textContent"],de=o.defineComponent({__name:"DiffSentences",props:{oldText:{type:String,required:!0},newText:{type:String,required:!0},options:{type:Object,default:()=>({})}},setup(t){const e=t,n=o.computed(()=>Q(e.oldText,e.newText,e.options));return(i,f)=>(o.openBlock(),o.createElementBlock("div",fe,[(o.openBlock(!0),o.createElementBlock(o.Fragment,null,o.renderList(n.value,(r,s)=>(o.openBlock(),o.createElementBlock("span",{key:s,class:o.normalizeClass({"diff-added":r.added,"diff-removed":r.removed}),textContent:o.toDisplayString(r.value)},null,10,le))),128))]))}});m.DiffChars=b,m.DiffLines=se,m.DiffSentences=de,m.DiffWords=te,m.DiffWordsWithSpace=I,m.TextDiff=I,Object.defineProperty(m,Symbol.toStringTag,{value:"Module"})});