Skip to content

Instantly share code, notes, and snippets.

@Alsweider
Forked from dpschen/findDuplicatesInOnetab.js
Last active May 20, 2025 20:04
Show Gist options
  • Save Alsweider/075061c7576dc1bc5021f0aab3b5bd5f to your computer and use it in GitHub Desktop.
Save Alsweider/075061c7576dc1bc5021f0aab3b5bd5f to your computer and use it in GitHub Desktop.
Find duplicates links in OneTab - including optimisation by insectman
(function findDuplicatesInOnetab() {
const isOneTab = document
.querySelector("title")
?.innerHTML.includes("OneTab"); // cheap OneTab check
if (!isOneTab) {
alert("Run this script in a OneTab tab");
return;
}
const getOneTabLinks = () => [
...document.querySelectorAll("#contentAreaDiv [href]"),
];
const getDuplicateLinks = (links) => {
const linkMap = new Map();
let linkList = links || getOneTabLinks();
linkList.forEach((linkEl) => {
const link = linkEl.getAttribute("href");
if (!linkMap.has(link)) {
linkMap.set(link, [linkEl]);
} else {
linkMap.get(link).push(linkEl);
}
});
return Array.from(linkMap.values()).filter((linkEls) => linkEls.length > 1).map((le) => ({ link: le[0].getAttribute("href"), linkEls: le }));
};
const scrollToEl = (el) => {
el.scrollIntoView({ behavior: "smooth", block: "center" });
};
const markLink = (el, text) => {
el.style.backgroundColor = "#DE5918";
el.style.color = "#fff";
if (text) {
const duplicateMarker = document.createElement("span");
duplicateMarker.innerHTML = text;
duplicateMarker.classList.add("duplicate-marker");
duplicateMarker.style.marginRight = "20px";
el.insertAdjacentElement("afterbegin", duplicateMarker);
}
};
const unMarkLinks = (linkEls = getOneTabLinks()) => {
linkEls.forEach((el) => {
el.style.backgroundColor = undefined;
el.style.color = undefined;
const duplicateMarker = el.querySelector(".duplicate-marker");
if (duplicateMarker) duplicateMarker.remove();
});
};
const findDuplicates = (links) => {
unMarkLinks(links);
const groupedDuplicates = getDuplicateLinks(links);
if (!groupedDuplicates.length) {
alert("No Duplicates Found");
} else {
groupedDuplicates.forEach((duplicate, groupIndex) =>
duplicate.linkEls.forEach((el, duplicateIndex) =>
markLink(
el,
`${groupIndex + 1}/${groupedDuplicates.length} | ${
duplicateIndex + 1
}/${duplicate.linkEls.length}`
)
)
);
alert(`${groupedDuplicates.length} Duplicates Found`);
scrollToEl(groupedDuplicates[0].linkEls[0]);
}
};
findDuplicates(getOneTabLinks());
})();
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment