Skip to content

Instantly share code, notes, and snippets.

@RosemaryOrchard
Last active April 30, 2024 18:55
Show Gist options
  • Save RosemaryOrchard/f30cbb206cd5a26e743ab5b7c37b98e4 to your computer and use it in GitHub Desktop.
Save RosemaryOrchard/f30cbb206cd5a26e743ab5b7c37b98e4 to your computer and use it in GitHub Desktop.
Reveal anchor links on websites. To add this to your bookmarks (bar), bookmark this page, copy the script below, edit the bookmark and change the address to the script.
javascript: (() => {
var anchorTest = 'bookmarklet-anchor-test';
if (document.getElementById(anchorTest)) {
alert("Anchors already present");
return;
}
function createAnchor(anchorId) {
var anchor = document.createElement('a');
anchor.href = '#' + anchorId;
anchor.innerText = '⚓️';
anchor.style = 'margin-right: 0.3em';
return anchor;
}
var headings = ['h1', 'h2', 'h3', 'h4', 'h5', 'h6'];
var headingsWithId = headings.map(heading => `${heading}[id]`).join(' ');
var anchorLinks = document.querySelectorAll(headingsWithId);
var foundAnchors = anchorLinks.length > 0;
anchorLinks.forEach(heading => {
var anchor = createAnchor(heading.getAttribute('id'));
heading.insertBefore(anchor, heading.firstChild);
});
var isAppleSupportSite = window.location.origin.includes('support.apple.com');
if (isAppleSupportSite || !foundAnchors) {
var documentRoot = document;
['.main', '#article-section'].forEach(nodeSearch => {
if (documentRoot.querySelector(nodeSearch)) {
documentRoot = documentRoot.querySelector(nodeSearch)
}
});
var anchorLinks = Array.from(documentRoot.querySelectorAll('[id]'));
var mappedIds = [];
anchorLinks.filter(anchorLink => {
var anchorLinkId = anchorLink.id;
if (
mappedIds.includes(anchorLinkId) ||
mappedIds.includes(anchorLinkId.replace('aria-', ''))
) {
return false;
}
mappedIds.push(anchorLinkId);
return true;
})
.forEach(anchorLink => {
var anchorLinkId = anchorLink.id;
var anchor = createAnchor(anchorLinkId);
var anchorPoint = null;
var i = 0;
while (anchorPoint === null && i < headings.length) {
anchorPoint = anchorLink.querySelector(headings[i]) ?? null;
i++;
}
if (!anchorPoint) {
anchorPoint = anchorLink.children.item(0);
} else if (anchorPoint.querySelector('button')) {
while ((anchorPoint.children ?? []).length > 0 && anchorPoint.innerText) {
anchorPoint = anchorPoint.firstChild;
}
anchorPoint.parentNode.insertBefore(anchor, anchorPoint);
} else {
anchorPoint.insertBefore(anchor, anchorPoint.firstChild);
}
});
}
var testSpan = document.createElement('span');
testSpan.setAttribute('id', anchorTest);
document.body.appendChild(testSpan);
})();
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment