User:Ricordisamoa/Levenshtein.js

From Meta, a Wikimedia project coordination wiki

Note: After publishing, you may have to bypass your browser's cache to see the changes.

  • Firefox / Safari: Hold Shift while clicking Reload, or press either Ctrl-F5 or Ctrl-R (⌘-R on a Mac)
  • Google Chrome: Press Ctrl-Shift-R (⌘-Shift-R on a Mac)
  • Internet Explorer / Edge: Hold Ctrl while clicking Refresh, or press Ctrl-F5
  • Opera: Press Ctrl-F5.
/* <nowiki>
 * Levenshtein.js by [[User:Ricordisamoa]]
 *
 * computes the Levenshtein distance for an edit in MediaWiki diff view
*/
$(document).ready(function(){
	var revid;
	if(mw.util.getParamValue('diff')!=null&&mw.util.getParamValue('oldid')==null) revid=mw.util.getParamValue('diff');
	else if(mw.util.getParamValue('diff')=='prev'&&mw.util.getParamValue('oldid')!=null) revid=mw.util.getParamValue('oldid');
	else return;
	$(mw.util.addPortletLink('p-cactions','#','Levenshtein distance','Levenshtein','Compute the Levenshtein distance for this edit'))
	.click(function(event){
		event.preventDefault();
		var api=new mw.Api(),
		levenshtein=function(str1, str2) {
 		   var m = str1.length,
	    	    n = str2.length,
	    	    d = [],
	    	    i, j;
	 	
	    	if (!m) return n;
	    	if (!n) return m;
	 	
	    	for (i = 0; i <= m; i++) d[i] = [i];
	    	for (j = 0; j <= n; j++) d[0][j] = j;
	 	
	    	for (j = 1; j <= n; j++) {
	    	    for (i = 1; i <= m; i++) {
	    	        if (str1[i-1] == str2[j-1]) d[i][j] = d[i - 1][j - 1];
	    	        else d[i][j] = Math.min(d[i-1][j], d[i][j-1], d[i-1][j-1]) + 1;
	    	    }
	    	}
	    	return d[m][n];
		};
		api.get({
			prop:'revisions',
			titles:mw.config.get('wgPageName'),
			rvstartid:revid,
			rvlimit:2,
			rvprop:'content|user|ids'
		})
		.done(function(d){
			var revs=d.query.pages[Object.keys(d.query.pages)[0]].revisions;
			mw.util.jsMessage('The Levenshtein distance is:<br/><big><strong>'+levenshtein(revs[1]['*'],revs[0]['*'])+'</strong></big>');
		});
	});
});