Substack : recherche rapide dans l'article
Ctrl+Shift+F ouvre une recherche qui surligne chaque occurrence dans l'article.
Code à copier
// Quick in-post search: press Ctrl+Shift+F to highlight matches in the article
(function () {
function findRoot() {
return document.querySelector('.body.markup, .available-content, [class*="postBody"]') || document.body;
}
function clearMarks(root) {
root.querySelectorAll('mark[data-jz-search]').forEach(function (m) {
var p = m.parentNode; p.replaceChild(document.createTextNode(m.textContent), m); p.normalize();
});
}
function mark(root, q) {
if (!q) { return 0; }
var rx = new RegExp(q.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'), 'gi');
var walker = document.createTreeWalker(root, NodeFilter.SHOW_TEXT, null);
var nodes = [], n; while ((n = walker.nextNode())) { if (rx.test(n.nodeValue)) { nodes.push(n); } }
var count = 0;
nodes.forEach(function (node) {
var span = document.createElement('span');
span.innerHTML = node.nodeValue.replace(rx, function (m) { count++; return '<mark data-jz-search style="background:#fde68a;color:#111;">' + m + '</mark>'; });
node.parentNode.replaceChild(span, node);
});
return count;
}
document.addEventListener('keydown', function (e) {
if (!(e.ctrlKey && e.shiftKey && (e.key === 'F' || e.key === 'f'))) { return; }
e.preventDefault();
var root = findRoot(); clearMarks(root);
var q = prompt('Search inside post:'); if (q == null || q === '') { return; }
var n = mark(root, q);
alert(n + ' match(es) for "' + q + '"');
var first = root.querySelector('mark[data-jz-search]');
if (first) { first.scrollIntoView({ behavior: 'smooth', block: 'center' }); }
});
})();
Comment utiliser cet exemple
- Copiez le code avec le bouton ci-dessus.
- Installez JustZix (2 minutes) et ouvrez l'extension sur la page cible.
- Ajoutez une nouvelle règle correspondant à cette page.
- Collez le code dans le panneau JavaScript de la règle et enregistrez — il s'exécute à chaque visite de page.
Notez cet exemple
Aucune note — soyez le premier.