| 12 |
- /* Licence MIT, https://github.com/idesis-gmbh/htmldiff.js/blob/develop/js/htmldiff.js */
- (function(){'use strict';function a(a){return">"===a}function b(a){return"<"===a}function c(a){return /^\s+$/.test(a)}function d(a){var b=a.match(/^\s*<([^!>][^>]*)>\s*$/);return!!b&&b[1].trim().split(" ")[0]}function e(a){return!d(a)}function f(a){return /^<!--/.test(a)}function g(a){return /--\>$/.test(a)}function h(a){var b=C.exec(a);return b&&b[1]}function j(a,b){return a.substring(a.length-b.length-2)==="</"+b}function k(a){return /^\s*<[^>]+\/>\s*$/.test(a)}function l(a){var b=/^<img[\s>]/.test(a);return b||e(a)||h(a)||k(a)}function m(a){return{string:a,key:p(a)}}function n(a,b,c,d){this.segment=d,this.length=c,this.startInBefore=a+d.beforeIndex,this.startInAfter=b+d.afterIndex,this.endInBefore=this.startInBefore+this.length-1,this.endInAfter=this.startInAfter+this.length-1,this.segmentStartInBefore=a,this.segmentStartInAfter=b,this.segmentEndInBefore=this.segmentStartInBefore+this.length-1,this.segmentEndInAfter=this.segmentStartInAfter+this.length-1}function o(d){for(var e,k="char",l="",n="",o=[],p=0;p<d.length;p++)switch(e=d[p],k){case"tag":var q=h(l);q?(k="atomic_tag",n=q,l+=e):f(l)?(k="html_comment",l+=e):a(e)?(l+=">",o.push(m(l)),l="",k=c(e)?"whitespace":"char"):l+=e;break;case"atomic_tag":a(e)&&j(l,n)?(l+=">",o.push(m(l)),l="",n="",k="char"):l+=e;break;case"html_comment":l+=e,g(l)&&(l="",k="char");break;case"char":b(e)?(l&&o.push(m(l)),l="<",k="tag"):/\s/.test(e)?(l&&o.push(m(l)),l=e,k="whitespace"):/[\w\d\#@]/.test(e)?l+=e:/&/.test(e)?(l&&o.push(m(l)),l=e):(l+=e,o.push(m(l)),l="");break;case"whitespace":b(e)?(l&&o.push(m(l)),l="<",k="tag"):c(e)?l+=e:(l&&o.push(m(l)),l=e,k="char");break;default:throw new Error("Unknown mode "+k);}return l&&o.push(m(l)),o}function p(b){var c=/^<img.*src=['"]([^"']*)['"].*>$/.exec(b);if(c)return"<img src=\""+c[1]+"\">";var d=/^<a.*href=['"]([^"']*)['"]/.exec(b);if(d)return"<a href=\""+d[1]+"\"></a>";var a=/^<object.*data=['"]([^"']*)['"]/.exec(b);if(a)return"<object src=\""+a[1]+"\"></object>";if(/^<(svg|math|video)[\s>]/.test(b)){var e=b.indexOf("data-uuid=\"");if(-1!==e){var f=b.slice(0,e),g=b.slice(e+44);return f+g}return b}var h=/^<iframe.*src=['"]([^"']*)['"].*>/.exec(b);if(h)return"<iframe src=\""+h[1]+"\"></iframe>";var i=/<([^\s>]+)[\s>]/.exec(b);return i?"<"+i[1].toLowerCase()+">":b?b.replace(/(\s+| | )/g," "):b}function q(a){return a.reduce(function(a,b,c){return a[b.key]?a[b.key].push(c):a[b.key]=[c],a},Object.create(null))}function r(a,b){return b.endInBefore<a.startInBefore&&b.endInAfter<a.startInAfter?-1:b.startInBefore>a.endInBefore&&b.startInAfter>a.endInAfter?1:0}function s(){this._root=null}function t(a){for(var b=a.beforeTokens,c=a.afterMap,d=null,e=null,f=0;f<b.length;f++){var g=!1,h=b.length-f;if(e&&h<e.length)break;var i=b[f];if(" "===i.key){d=f;continue}d===f-1&&(g=!0);var j=c[i.key];j&&j.forEach(function(b){var c=e?e.length:0,d=u(a,f,b,c,g);d&&d.length>c&&(e=d)})}return e}function u(a,b,c,d,e){var f=a.beforeTokens,g=a.afterTokens,h=b+d,i=c+d;if(!(h>=f.length||i>=g.length)){if(d){var j=f[h].key,k=g[i].key;if(j!==k)return}for(var l=!0,m=1,o=b+m,p=c+m;l&&o<f.length&&p<g.length;){var q=f[o].key,r=g[p].key;q===r?(m++,o=b+m,p=c+m):l=!1}if(e&&0<b&&0<c){var s=f[b-1].key,t=g[c-1].key;" "===s&&" "===t&&(b--,c--,m++)}return new n(b,c,m,a)}}function v(a,b,c,d){return{beforeTokens:a,afterTokens:b,beforeMap:q(a),afterMap:q(b),beforeIndex:c,afterIndex:d}}function w(a){for(var b,c=new s,d=[a];d.length;)if(a=d.pop(),b=t(a),b&&b.length){if(0<b.segmentStartInBefore&&0<b.segmentStartInAfter){var e=a.beforeTokens.slice(0,b.segmentStartInBefore),f=a.afterTokens.slice(0,b.segmentStartInAfter);d.push(v(e,f,a.beforeIndex,a.afterIndex))}var g=a.beforeTokens.slice(b.segmentEndInBefore+1),h=a.afterTokens.slice(b.segmentEndInAfter+1),i=a.beforeIndex+b.segmentEndInBefore+1,j=a.afterIndex+b.segmentEndInAfter+1;g.length&&h.length&&d.push(v(g,h,i,j)),c.add(b)}return c.toArray()}function x(a,b){function c(b){return!("equal"!==b.action)&&!(0!=b.endInBefore-b.startInBefore)&&/^\s$/.test(a.slice(b.startInBefore,b.endInBefore+1))}if(!a)throw new Error("Missing beforeTokens");if(!b)throw new Error("Missing afterTokens");var d=0,e=0,f=[],g=v(a,b,0,0),h=w(g);h.push(new n(a.length,b.length,0,g));for(var j=0;j<h.length;j++){var k=h[j],l="none";d===k.startInBefore?e!==k.startInAfter&&(l="insert"):(l="delete",e!==k.startInAfter&&(l="replace")),"none"!==l&&f.push({action:l,startInBefore:d,endInBefore:"insert"===l?null:k.startInBefore-1,startInAfter:e,endInAfter:"delete"===l?null:k.startInAfter-1}),0!==k.length&&f.push({action:"equal",startInBefore:k.startInBefore,endInBefore:k.endInBefore,startInAfter:k.startInAfter,endInAfter:k.endInAfter}),d=k.endInBefore+1,e=k.endInAfter+1}for(var m,o=[],p={action:"none"},q=0;q<f.length;q++)m=f[q],c(m)&&"replace"===p.action||"replace"===m.action&&"replace"===p.action?(p.endInBefore=m.endInBefore,p.endInAfter=m.endInAfter):(o.push(m),p=m);return o}function y(a){this.tokens=a,this.notes=a.reduce(function(a,b,c){a.notes.push({isWrappable:l(b),insertedTag:!1});var e=!k(b)&&d(b),f=a.tagStack[a.tagStack.length-1];return e&&(f&&"/"+f.tag===e?(a.notes[f.position].insertedTag=!0,a.tagStack.pop()):a.tagStack.push({tag:e,position:c})),a},{notes:[],tagStack:[]}).notes}function z(a,b,c,d,e){var f=new y(b);d=d?d+"-":"";var g=" data-"+d+"operation-index=\""+c+"\"";return e&&(g+=" class=\""+e+"\""),f.combine(function(b){if(b.isWrappable){var c=b.tokens.join("");if(c.trim())return"<"+a+g+">"+c+"</"+a+">"}else return b.tokens.join("");return""},function(b){var e=" data-diff-node=\""+a+"\"";return e+=" data-"+d+"operation-index=\""+c+"\"",b.replace(/>\s*$/,e+"$&")})}function A(a,b,c,d,e){return c.reduce(function(c,f,g){return c+E[f.action](f,a,b,g,d,e)},"")}function B(a,b,c,d,e){if(a===b)return a;C=e?new RegExp("^<("+e.replace(/\s*/g,"").replace(/,/g,"|")+")\b"):D,a=o(a),b=o(b);var f=x(a,b);return A(a,b,f,d,c)}var C,D=/^<(iframe|object|math|svg|script|video|head|style|a)[\b]/;s.prototype={add:function(a){var b={value:a,left:null,right:null},c=this._root;if(c)for(;;){var d=r(c.value,a);if(-1===d){if(c.left)c=c.left;else{c.left=b;break}}else if(1!==d)break;else if(c.right)c=c.right;else{c.right=b;break}}else this._root=b},toArray:function(){function a(b,c){return b&&(a(b.left,c),c.push(b.value),a(b.right,c)),c}return a(this._root,[])}},y.prototype.combine=function(a,b){var c=this.notes,d=this.tokens.slice(),e=d.reduce(function(a,e,f){c[f].insertedTag&&(d[f]=b(d[f])),null===a.status&&(a.status=c[f].isWrappable);var g=c[f].isWrappable;return g!==a.status&&(a.list.push({isWrappable:a.status,tokens:d.slice(a.lastIndex,f)}),a.lastIndex=f,a.status=g),f===d.length-1&&a.list.push({isWrappable:a.status,tokens:d.slice(a.lastIndex,f+1)}),a},{list:[],status:null,lastIndex:0}).list;return e.map(a).join("")};var E={equal:function(a,b,c){var d=c.slice(a.startInAfter,a.endInAfter+1);return d.reduce(function(a,b){return a+b.string},"")},insert:function(a,b,c,d,e,f){var g=c.slice(a.startInAfter,a.endInAfter+1),h=g.map(function(a){return a.string});return z("ins",h,d,e,f)},delete:function(a,b,c,d,e,f){var g=b.slice(a.startInBefore,a.endInBefore+1),h=g.map(function(a){return a.string});return z("del",h,d,e,f)},replace:function(){return E["delete"].apply(null,arguments)+E.insert.apply(null,arguments)}};B.htmlToTokens=o,B.findMatchingBlocks=w,w.findBestMatch=t,w.createMap=q,w.createToken=m,w.createSegment=v,w.getKeyForToken=p,B.calculateOperations=x,B.renderOperations=A,"function"==typeof define?define([],function(){return B}):"undefined"!=typeof module&&null!==module?module.exports=B:this.htmldiff=B}).call(this);
|