Jump to content

User:Ahecht/Scripts/discussionrows.js

From Wikipedia, the free encyclopedia
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.
$(document).ready( function() {
	function highlightDiscussionRows() {
		const colorA = '#f0f7ff'; 
		const colorB = '#fffbf0'; 
	
		const startMarkers = Array.from(document.querySelectorAll('span[data-mw-comment-start][id^="c-"]'));
		let colorIndex = 0;
	
		if (startMarkers.length === 0) {
			console.warn("No 'data-mw-comment-start' markers found on this page.");
			return;
		}
	
		startMarkers.forEach(startMarker => {
			const commentId = startMarker.id;
			const endMarker = document.querySelector(`[data-mw-comment-sig="${commentId.replace(/"/g, '\\"')}"]`);
			if (!endMarker) return;
	
			const chosenColor = (colorIndex % 2 === 0) ? colorA : colorB;
	
			const walker = document.createTreeWalker(
				document.querySelector('.mw-parser-output') || document.body,
				NodeFilter.SHOW_TEXT
			);
	
			const blocksToColor = [];
			let insideComment = false;
			let node = walker.nextNode();
	
			while (node) {
				if (startMarker.compareDocumentPosition(node) & Node.DOCUMENT_POSITION_CONTAINED_BY || 
					startMarker.compareDocumentPosition(node) & Node.DOCUMENT_POSITION_FOLLOWING) {
					insideComment = true;
				}
				
				if (endMarker.compareDocumentPosition(node) & Node.DOCUMENT_POSITION_CONTAINED_BY || 
					!(endMarker.compareDocumentPosition(node) & Node.DOCUMENT_POSITION_PRECEDING)) {
					insideComment = false;
					break;
				}
	
				if (insideComment) {
					if (node.textContent.trim().length > 0) {
						let block = node.parentElement.closest('p, dd, li, div.mw-parser-output > div, td');
						if (block && !blocksToColor.includes(block)) {
							blocksToColor.push(block);
						}
					}
				}
	
				node = walker.nextNode();
			}
	
			blocksToColor.forEach((block, bIndex) => {
				block.style.backgroundColor = chosenColor;
				
				
				if (blocksToColor.length > 1) { // If there are multiple paragraphs, close the margin gap and use padding instead
					block.style.marginTop = '0px';
					block.style.marginBottom = '0px';
					block.style.paddingTop = '4px';
					block.style.paddingBottom = '4px';
					
					if (bIndex === 0) {
						block.style.paddingTop = '8px';
					}
	
					if (bIndex === blocksToColor.length - 1) {
						block.style.paddingBottom = '8px';
					}
				}
			});
	
			if (blocksToColor.length > 0) {
				colorIndex++;
			}
		});
	}
		
	var nsNum = mw.config.get("wgNamespaceNumber");
	if ((nsNum % 2 !== 0) || (nsNum == 4)) {highlightDiscussionRows();} // Talk: and Wikipedia: namespaces only
} );