User:Polygnotus/DuplicateReferences.js

This is an old revision of this page, as edited by Polygnotus (talk | contribs) at 01:12, 16 July 2024. 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.using(['mediawiki.util'], function () {
    $(document).ready(function () {
        console.log("Script started");
        
        if ((mw.config.get('wgNamespaceNumber') !== 0 && mw.config.get('wgPageName') !== 'User:Polygnotus/dupreftest') || mw.config.get('wgAction') !== 'view') {
            console.log("Not the correct page or action, script terminated");
            return;
        }
        
        console.log("Page title:", document.title);
        console.log("URL:", window.___location.href);

        let referencesHeading = document.getElementById("References");
        if (!referencesHeading) {
            console.log("References heading not found, script terminated");
            return;
        }
        
        const style = document.createElement('style');
        style.textContent = `
            li:target { border: 1px dotted red; padding: 2px; background-color: #ffcccc !important;}
            .duplicate-citation-highlight { background-color: #ffe6e6; }
            .duplicate-citation-hover { background-color: #ffcccc; }
            .duplicate-citation-clicked { border: 1px dotted red; padding: 2px; background-color: #ffe6e6; }
        `;
        document.head.appendChild(style);
        
        let parentDiv = referencesHeading.closest("div");
        let newParagraph = document.createElement("p");
        newParagraph.style.color = "red";
        
        function addDuplicateCitationsTemplate() {
            // ... (unchanged)
        }

        function getDuplicateInfo() {
            // ... (use the updated function provided above)
        }

        function calculateSimilarity(str1, str2) {
            // ... (unchanged)
        }

        function editDistance(s1, s2) {
            // ... (unchanged)
        }

        function getAllVisibleText(element) {
            // ... (unchanged)
        }

        function extractVisibleText(htmlString) {
            // ... (unchanged)
        }

        function checkDuplicateReferenceLinks() {
            console.log("Checking for duplicate reference links");
            const duplicateInfo = getDuplicateInfo();
            
            if (duplicateInfo.length > 0) {
                console.log("Duplicates found, creating list");
                
                if (document.querySelector('table.box-Duplicated_citations') === null) {
                    const editSections = parentDiv.querySelectorAll('span.mw-editsection');
                    
                    editSections.forEach(editSection => {
                        let spanBefore = document.createElement('span');
                        spanBefore.className = 'mw-editsection-bracket';
                        spanBefore.textContent = '[';
                
                        let addTemplateLink = document.createElement('a');
                        addTemplateLink.textContent = ' add {{duplicated citations}} ';
                        addTemplateLink.href = '#';
                        addTemplateLink.addEventListener('click', function(e) {
                            e.preventDefault();
                            addDuplicateCitationsTemplate();
                        });
                
                        let spanAfter = document.createElement('span');
                        spanAfter.className = 'mw-editsection-bracket';
                        spanAfter.textContent = ']';
                
                        editSection.appendChild(spanBefore);
                        editSection.appendChild(addTemplateLink);
                        editSection.appendChild(spanAfter);
                    });
                }
                
                duplicateInfo.forEach(({ url, refs }) => {
                    let paragraphInfo = document.createElement('span');
                    
                    let urlLink = document.createElement('a');
                    urlLink.href = url;
                    urlLink.textContent = url;
                    urlLink.target = "_blank";
                    urlLink.rel = "noopener noreferrer";
                    
                    paragraphInfo.appendChild(document.createTextNode('Duplicate URL: '));
                    paragraphInfo.appendChild(urlLink);
                    paragraphInfo.appendChild(document.createTextNode(' in refs: '));
                    
                    refs.forEach((refNumber, index) => {
                        let link = document.createElement('a');
                        link.href = `#cite_note-${refNumber}`;
                        link.textContent = refNumber;
                        paragraphInfo.appendChild(link);

                        // Highlight only the specific duplicates on hover
                        link.addEventListener('mouseover', () => {
                            refs.forEach(ref => {
                                const citationElement = document.getElementById(`cite_note-${ref}`);
                                if (citationElement) {
                                    if (ref === refNumber) {
                                        citationElement.classList.add('duplicate-citation-hover');
                                    } else {
                                        citationElement.classList.add('duplicate-citation-highlight');
                                    }
                                }
                            });
                        });
                        link.addEventListener('mouseout', () => {
                            refs.forEach(ref => {
                                const citationElement = document.getElementById(`cite_note-${ref}`);
                                if (citationElement) {
                                    citationElement.classList.remove('duplicate-citation-hover');
                                    citationElement.classList.remove('duplicate-citation-highlight');
                                }
                            });
                        });

                        // Highlight duplicates on click and allow navigation
                        link.addEventListener('click', () => {
                            // Remove previous click highlights
                            document.querySelectorAll('.duplicate-citation-clicked').forEach(el => {
                                el.classList.remove('duplicate-citation-clicked');
                            });
                            // Add new click highlights
                            refs.forEach(ref => {
                                const citationElement = document.getElementById(`cite_note-${ref}`);
                                if (citationElement) {
                                    citationElement.classList.add('duplicate-citation-clicked');
                                }
                            });
                            // The default behavior (navigation) will now occur
                        });
                        
                        if (index < refs.length - 1) {
                            paragraphInfo.appendChild(document.createTextNode(', '));
                        }
                    });
                    
                    paragraphInfo.appendChild(document.createElement('br'));
                    newParagraph.appendChild(paragraphInfo);
                });
                
                console.log("Appending duplicate list to page");
                parentDiv.after(newParagraph);
            } else {
                console.log("No duplicates found");
            }
        }
        
        checkDuplicateReferenceLinks();
        console.log("Script execution completed");
    });
});