Jump to content

User:Nardog/Consecudiff.js

From Wikipedia, the free encyclopedia
This is an old revision of this page, as edited by Nardog (talk | contribs) at 08:56, 16 August 2021 (make sure diffs are available). The present address (URL) is a permanent link to this revision, which may differ significantly from the current revision.
Note: After saving, you have to bypass your browser's cache to see the changes. Google Chrome, Firefox, Microsoft Edge and Safari: Hold down the ⇧ Shift key and click the Reload toolbar button. For details and instructions about other browsers, see Wikipedia:Bypass your cache.
mw.loader.addStyleTag('.consecudiff::before{content:" ["} .consecudiff::after{content:"]"} .consecudiff-top::before{content:" ⟨"} .consecudiff-top::after{content:"⟩"}');

mw.hook('wikipage.content').add(function consecudiff($content) {
	if (!($content.hasClass('mw-changeslist') || $content.find('.mw-changeslist, .mw-contributions-list, #pagehistory').length)) return;
	
	$content.find('.consecudiff').remove();
	
	let isHist = mw.config.get('wgAction') === 'history';
	let isContribs = !isHist && $content[0].querySelector('.mw-contributions-list') && true;
	let isEnhanced = !(isHist || isContribs) && $content[0].querySelector('.mw-enhanced-rc') && true;
	let threshold = isContribs ? window.consecudiffContribsThreshold || 120 :
		isHist ? window.consecudiffHistThreshold || 720 :
		window.consecudiffThreshold || 720;
	let strict = !(isHist || isContribs) && window.consecudiffDetectInterruptions;
	let o = {};
	
	let diffSelector = isHist ? '.mw-history-histlinks > span:last-child > a' :
		'.mw-changeslist-diff';
	$content[0].querySelectorAll(
		isHist ? '#pagehistory > li' :
		isContribs ? '.mw-contributions-list > li' :
		isEnhanced ? '.mw-changeslist-src-mw-edit.mw-rcfilters-ui-highlights-enhanced-nested, .mw-changeslist-src-mw-new.mw-rcfilters-ui-highlights-enhanced-nested' :
		'.mw-changeslist-src-mw-edit, .mw-changeslist-src-mw-new'
	).forEach(li => {
		let title = isHist || (isEnhanced ? li.parentElement : li)
			.querySelector(isContribs ? '.mw-contributions-title' : '.mw-title');
		if (!title) return;
		title = title.textContent;
		let user = (li.querySelector('.mw-userlink') || {}).textContent;
		let date = Date.parse(
			(isHist || isContribs) ? li.querySelector('.mw-changeslist-date').textContent.replace(',', '') :
			li.dataset.mwTs.replace(/(....)(..)(..)(..)(..)(..)/, '$1-$2-$3T$4:$5:$6Z')
		) / 60000;
		let parent = isContribs && li.parentElement;
		let obj = o[title];
		if (obj) {
			if (obj.lastUser && obj.lastUser !== user ||
				obj.lastDate && obj.lastDate - date > threshold ||
				obj.lastParent && obj.lastParent !== parent ||
				obj.nextRev && obj.nextRev !== li.dataset.mwRevid
			) {
				obj.liss.push([li]);
			} else {
				obj.liss[obj.liss.length - 1].push(li);
			}
		} else {
			obj = { liss: [[li]] };
			o[title] = obj;
		}
		if (user) obj.lastUser = user;
		if (date) obj.lastDate = date;
		if (parent) obj.lastParent = parent;
		if (strict) {
			let diff = li.querySelector(diffSelector);
			obj.nextRev = diff && diff.search.match(/&oldid=(\d+)/)[1];
		}
	});
	
	Object.values(o).forEach(v => {
		v.liss.forEach(lis => {
			let count = lis.length;
			if (count < 2) return;
			let firstLink;
			let start = lis.findIndex((li, i) => {
				firstLink = lis[i].querySelector(diffSelector);
				return firstLink;
			});
			if (start === -1 || count - start < 2) return;
			let lastLink, end;
			for (let i = count - 1; i > start; i--) {
				lastLink = lis[i].querySelector(diffSelector);
				if (lastLink) {
					end = i + 1;
					break;
				}
			}
			if (!end) return;
			count = end - start;
			if (count < 2) return;
			lis = lis.slice(start, end);
			let href = firstLink.pathname + firstLink.search;
			href = isContribs
				? href.replace(/diff=prev&oldid=\d+/, `diff=${lis[0].dataset.mwRevid}&oldid=${lis[count - 1].dataset.mwRevid}&direction=prev`)
				: href.replace(/oldid=\d+/, 'oldid=' + lastLink.search.match(/oldid=(\d+)/)[1]);
			let classes = ['consecudiff'];
			if (!isHist &&
				lis[0].classList.contains(isContribs ? 'mw-contributions-current' : 'mw-changeslist-last')
			) {
				classes.push('consecudiff-top');
			}
			lis.forEach((li, i) => {
				$('<span>').addClass(classes).append($('<a>', {
					href: href,
					text: count - i + '/' + count
				})).appendTo(isEnhanced ? li.lastElementChild : li);
			});
		});
	});
});