mirror of
				https://github.com/dgtlmoon/changedetection.io.git
				synced 2025-10-31 14:47:21 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			111 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			111 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| var a = document.getElementById("a");
 | |
| var b = document.getElementById("b");
 | |
| var result = document.getElementById("result");
 | |
| 
 | |
| function changed() {
 | |
|   // https://github.com/kpdecker/jsdiff/issues/389
 | |
|   // I would love to use `{ignoreWhitespace: true}` here but it breaks the formatting
 | |
|   options = {
 | |
|     ignoreWhitespace: document.getElementById("ignoreWhitespace").checked,
 | |
|   };
 | |
| 
 | |
|   var diff = Diff[window.diffType](a.textContent, b.textContent, options);
 | |
|   var fragment = document.createDocumentFragment();
 | |
|   for (var i = 0; i < diff.length; i++) {
 | |
|     if (diff[i].added && diff[i + 1] && diff[i + 1].removed) {
 | |
|       var swap = diff[i];
 | |
|       diff[i] = diff[i + 1];
 | |
|       diff[i + 1] = swap;
 | |
|     }
 | |
| 
 | |
|     var node;
 | |
|     if (diff[i].removed) {
 | |
|       node = document.createElement("del");
 | |
|       node.classList.add("change");
 | |
|       const wrapper = node.appendChild(document.createElement("span"));
 | |
|       wrapper.appendChild(document.createTextNode(diff[i].value));
 | |
|     } else if (diff[i].added) {
 | |
|       node = document.createElement("ins");
 | |
|       node.classList.add("change");
 | |
|       const wrapper = node.appendChild(document.createElement("span"));
 | |
|       wrapper.appendChild(document.createTextNode(diff[i].value));
 | |
|     } else {
 | |
|       node = document.createTextNode(diff[i].value);
 | |
|     }
 | |
|     fragment.appendChild(node);
 | |
|   }
 | |
| 
 | |
|   result.textContent = "";
 | |
|   result.appendChild(fragment);
 | |
| 
 | |
|   // Jump at start
 | |
|   inputs.current = 0;
 | |
|   next_diff();
 | |
| }
 | |
| 
 | |
| window.onload = function () {
 | |
|   /* Convert what is options from UTC time.time() to local browser time */
 | |
|   var diffList = document.getElementById("diff-version");
 | |
|   if (typeof diffList != "undefined" && diffList != null) {
 | |
|     for (var option of diffList.options) {
 | |
|       var dateObject = new Date(option.value * 1000);
 | |
|       option.label = dateObject.toLocaleString();
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   /* Set current version date as local time in the browser also */
 | |
|   var current_v = document.getElementById("current-v-date");
 | |
|   var dateObject = new Date(newest_version_timestamp * 1000);
 | |
|   current_v.innerHTML = dateObject.toLocaleString();
 | |
|   onDiffTypeChange(
 | |
|     document.querySelector('#settings [name="diff_type"]:checked'),
 | |
|   );
 | |
|   changed();
 | |
| };
 | |
| 
 | |
| a.onpaste = a.onchange = b.onpaste = b.onchange = changed;
 | |
| 
 | |
| if ("oninput" in a) {
 | |
|   a.oninput = b.oninput = changed;
 | |
| } else {
 | |
|   a.onkeyup = b.onkeyup = changed;
 | |
| }
 | |
| 
 | |
| function onDiffTypeChange(radio) {
 | |
|   window.diffType = radio.value;
 | |
|   // Not necessary
 | |
|   //	document.title = "Diff " + radio.value.slice(4);
 | |
| }
 | |
| 
 | |
| var radio = document.getElementsByName("diff_type");
 | |
| for (var i = 0; i < radio.length; i++) {
 | |
|   radio[i].onchange = function (e) {
 | |
|     onDiffTypeChange(e.target);
 | |
|     changed();
 | |
|   };
 | |
| }
 | |
| 
 | |
| document.getElementById("ignoreWhitespace").onchange = function (e) {
 | |
|   changed();
 | |
| };
 | |
| 
 | |
| var inputs = document.getElementsByClassName("change");
 | |
| inputs.current = 0;
 | |
| 
 | |
| function next_diff() {
 | |
|   var element = inputs[inputs.current];
 | |
|   var headerOffset = 80;
 | |
|   var elementPosition = element.getBoundingClientRect().top;
 | |
|   var offsetPosition = elementPosition - headerOffset + window.scrollY;
 | |
| 
 | |
|   window.scrollTo({
 | |
|     top: offsetPosition,
 | |
|     behavior: "smooth",
 | |
|   });
 | |
| 
 | |
|   inputs.current++;
 | |
|   if (inputs.current >= inputs.length) {
 | |
|     inputs.current = 0;
 | |
|   }
 | |
| }
 | 
