mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
fix
This commit is contained in:
parent
0d10610d75
commit
f1493f847b
@ -1,96 +1,92 @@
|
||||
/* ht_searcher.js ───────────────────────────────────────────────── */
|
||||
/* Everything – UI + worker – lives in this one file. */
|
||||
|
||||
/* ht_searcher.js ─────────────────────────────────────────────── */
|
||||
(() => {
|
||||
/* ──────────────────────────────
|
||||
0. Build an inline Web Worker
|
||||
────────────────────────────── */
|
||||
/* ───────────── 0. Inline Web-Worker code ────────────────────── */
|
||||
const workerCode = `
|
||||
/* inside the worker thread ################################## */
|
||||
self.window = self; /* let searchindex.js use window */
|
||||
|
||||
/* 1. elasticlunr.min.js (CDN → local) */
|
||||
/* Make scripts written for browsers happy inside the worker */
|
||||
self.window = self;
|
||||
self.search = self.search || {}; /* ensure object */
|
||||
|
||||
const abs = p => location.origin + p; /* helper */
|
||||
|
||||
/* 1 ─ elasticlunr.min.js (CDN → local) */
|
||||
try {
|
||||
importScripts('https://cdn.jsdelivr.net/npm/elasticlunr@0.9.5/elasticlunr.min.js');
|
||||
} catch (_) {
|
||||
importScripts('/elasticlunr.min.js');
|
||||
} catch (e) {
|
||||
console.error('elasticlunr CDN failed →', e);
|
||||
importScripts(abs('/elasticlunr.min.js'));
|
||||
}
|
||||
|
||||
/* 2. searchindex.js (GitHub Raw → local) */
|
||||
|
||||
/* 2 ─ searchindex.js (GitHub Raw → local) */
|
||||
(async () => {
|
||||
try {
|
||||
const r = await fetch(
|
||||
'https://raw.githubusercontent.com/HackTricks-wiki/hacktricks/refs/heads/master/searchindex.js',
|
||||
{ mode: 'cors' }
|
||||
{ mode:'cors' }
|
||||
);
|
||||
if (!r.ok) throw new Error(r.status);
|
||||
if (!r.ok) throw new Error('HTTP ' + r.status);
|
||||
const blobURL = URL.createObjectURL(
|
||||
new Blob([await r.text()], { type: 'application/javascript' })
|
||||
); /* force correct MIME */
|
||||
importScripts(blobURL);
|
||||
} catch (_) {
|
||||
importScripts('/searchindex.js');
|
||||
new Blob([await r.text()], { type:'application/javascript' })
|
||||
);
|
||||
importScripts(blobURL); /* MIME coercion */
|
||||
} catch (e) {
|
||||
console.error('GitHub index fetch failed →', e);
|
||||
try {
|
||||
importScripts(abs('/searchindex.js'));
|
||||
} catch (e2) {
|
||||
console.error('Local index load failed →', e2);
|
||||
throw e2; /* abort loudly */
|
||||
}
|
||||
}
|
||||
|
||||
/* 3. Build index & reply to queries */
|
||||
|
||||
/* 3 ─ build index & answer queries */
|
||||
const idx = elasticlunr.Index.load(self.search.index);
|
||||
|
||||
self.onmessage = ({ data: q }) => {
|
||||
const hits = idx.search(q, { bool: 'AND', expand: true });
|
||||
postMessage(hits);
|
||||
|
||||
self.onmessage = ({ data:q }) => {
|
||||
if (!q) { postMessage([]); return; } /* empty search */
|
||||
const raw = idx.search(q, { bool:'AND', expand:true });
|
||||
const docs = raw.map(r => idx.documentStore.getDoc(r.ref));
|
||||
postMessage(docs); /* only docs cross thread */
|
||||
};
|
||||
})();
|
||||
`;
|
||||
|
||||
/* Turn the string into a real worker file */
|
||||
|
||||
const workerURL = URL.createObjectURL(
|
||||
new Blob([workerCode], { type: 'application/javascript' })
|
||||
new Blob([workerCode], { type:'application/javascript' })
|
||||
);
|
||||
const worker = new Worker(workerURL); /* classic worker, supports importScripts */
|
||||
URL.revokeObjectURL(workerURL); /* clean up */
|
||||
|
||||
/* ──────────────────────────────
|
||||
1. Minimal search-UI glue
|
||||
────────────────────────────── */
|
||||
const WRAP = document.getElementById('search-wrapper');
|
||||
const TOG = document.getElementById('search-toggle');
|
||||
const INP = document.getElementById('searchbar');
|
||||
const LIST = document.getElementById('searchresults');
|
||||
const worker = new Worker(workerURL);
|
||||
URL.revokeObjectURL(workerURL); /* tidy blob */
|
||||
|
||||
/* ───────────── 1. Tiny UI glue ─────────────────────────────── */
|
||||
const WRAP = document.getElementById('search-wrapper');
|
||||
const TOG = document.getElementById('search-toggle');
|
||||
const INP = document.getElementById('searchbar');
|
||||
const LIST = document.getElementById('searchresults');
|
||||
const HOTKEY = 83; /* “s” */
|
||||
let debounce;
|
||||
|
||||
/* Paint results that come back from the worker */
|
||||
const paint = hits => {
|
||||
LIST.innerHTML = hits.slice(0, 30).map(h =>
|
||||
'<li><a href="' + h.doc.url + '">' + h.doc.title + '</a></li>'
|
||||
|
||||
/* paint results */
|
||||
worker.onmessage = ({ data:docs }) => {
|
||||
LIST.innerHTML = docs.slice(0,30).map(d =>
|
||||
'<li><a href="' + d.url + '">' + d.title + '</a></li>'
|
||||
).join('');
|
||||
};
|
||||
|
||||
worker.onmessage = ({ data }) => paint(data);
|
||||
|
||||
/* Open the search UI */
|
||||
const open = () => {
|
||||
WRAP.classList.remove('hidden');
|
||||
INP.focus();
|
||||
};
|
||||
|
||||
/* Toggle button */
|
||||
|
||||
/* open UI */
|
||||
const open = () => { WRAP.classList.remove('hidden'); INP.focus(); };
|
||||
|
||||
TOG.addEventListener('click', open);
|
||||
|
||||
/* Keyboard shortcut: “s” (no modifiers) */
|
||||
document.addEventListener('keydown', e => {
|
||||
if (!e.metaKey && !e.ctrlKey && !e.altKey && e.keyCode === HOTKEY) {
|
||||
e.preventDefault();
|
||||
open();
|
||||
e.preventDefault(); open();
|
||||
}
|
||||
});
|
||||
|
||||
/* Debounced input → worker */
|
||||
|
||||
/* debounced keystrokes → worker */
|
||||
INP.addEventListener('input', e => {
|
||||
clearTimeout(debounce);
|
||||
debounce = setTimeout(() => {
|
||||
worker.postMessage(e.target.value.trim());
|
||||
}, 120);
|
||||
});
|
||||
})();
|
||||
|
||||
})();
|
||||
|
Loading…
x
Reference in New Issue
Block a user