Recherche
-------------------------------------------------
[30/06/2020] - ~1min - # #
-------------------------------------------------
<section class="ideas">
Vous êtes tout tristouille en train de chercher une page en particulier dans mon ptit bordel ?
Allez on va tenter de la trouver ensemble !
</ul>
</div>
let wasmModule = null;
let memory = null;
let searchFunction = null;
let freeFunction = null;
async function initializeSearch() {
try {
const response = await fetch('https://lord.re/js/tinysearch_engine.wasm');
if (!response.ok) {
throw new Error(`Failed to fetch WASM: ${response.status} ${response.statusText}`);
}
const wasmBytes = await response.arrayBuffer();
const module = await WebAssembly.instantiate(wasmBytes);
wasmModule = module.instance;
memory = wasmModule.exports.memory;
searchFunction = wasmModule.exports.search;
freeFunction = wasmModule.exports.free_search_result;
if (!searchFunction || !freeFunction || !memory) {
throw new Error('Required WASM exports not found');
}
document.getElementById('recherche').disabled = false;
document.getElementById('recherche').focus();
} catch (error) {
console.error('Failed to initialize search:', error);
document.getElementById('status').innerHTML = `<div class="error">Failed to initialize search: ${error.message}</div>`;
}
}
function stringToWasmPtr(str) {
const bytes = new TextEncoder().encode(str + '\0');
const ptr = wasmModule.exports.__wbindgen_malloc(bytes.length);
if (!ptr) {
// Fallback: write to a known memory location
const memoryArray = new Uint8Array(memory.buffer);
const startOffset = 1024; // Use a safe offset
memoryArray.set(bytes, startOffset);
return startOffset;
}
new Uint8Array(memory.buffer, ptr, bytes.length).set(bytes);
return ptr;
}
function wasmPtrToString(ptr) {
if (ptr === 0) return null;
const memoryArray = new Uint8Array(memory.buffer);
let length = 0;
// Find the null terminator
while (memoryArray[ptr + length] !== 0) {
length++;
if (length > 1000000) break; // Safety limit
}
const bytes = memoryArray.slice(ptr, ptr + length);
return new TextDecoder().decode(bytes);
}
function performSearch() {
const query = document.getElementById('recherche').value.trim();
const resultsDiv = document.getElementById('results');
const statusDiv = document.getElementById('status');
if (!wasmModule) {
statusDiv.innerHTML = 'Search engine not initialized';
return;
}
if (!query) {
resultsDiv.innerHTML = '';
statusDiv.textContent = 'Enter a search query to see results.';
return;
}
try {
const startTime = performance.now();
// Allocate memory for query string
let queryPtr;
try {
queryPtr = stringToWasmPtr(query);
} catch (e) {
// Fallback: use a fixed memory location
const queryBytes = new TextEncoder().encode(query + '\0');
const memoryArray = new Uint8Array(memory.buffer);
queryPtr = 1024; // Fixed offset
memoryArray.set(queryBytes, queryPtr);
}
// Call search function
const resultPtr = searchFunction(queryPtr, 10);
// Free query memory if we allocated it
if (wasmModule.exports.__wbindgen_free && queryPtr > 1024) {
wasmModule.exports.__wbindgen_free(queryPtr, query.length + 1);
}
const endTime = performance.now();
const searchTime = (endTime - startTime).toFixed(3);
if (resultPtr === 0) {
resultsDiv.innerHTML = 'No results found';
statusDiv.textContent = `No results found for "${query}" (${searchTime}ms)`;
return;
}
// Read result string
const resultString = wasmPtrToString(resultPtr);
// Free result memory
freeFunction(resultPtr);
if (!resultString) {
resultsDiv.innerHTML = 'No results found';
statusDiv.textContent = `No results found for "${query}" (${searchTime}ms)`;
return;
}
const results = JSON.parse(resultString);
if (results.length === 0) {
resultsDiv.innerHTML = 'No results found';
statusDiv.textContent = `No results found for "${query}" (${searchTime}ms)`;
} else {
const resultHTML = results.map(result => `
${result.title} [1]
`).join('');
resultsDiv.innerHTML = resultHTML;
statusDiv.textContent = `Found ${results.length} result${results.length !== 1 ? 's' : ''} for "${query}" (${searchTime}ms)`;
}
} catch (error) {
console.error('Search error:', error);
resultsDiv.innerHTML = 'Search failed. Check console for details.';
statusDiv.innerHTML = `<div class="error">Search failed: ${error.message}</div>`;
}
}
// Enter key support
document.getElementById('recherche').addEventListener('keypress', function(event) {
if (event.key === 'Enter') {
performSearch();
}
});
// Initialize search engine
document.getElementById('recherche').disabled = true;
initializeSearch();
-------
Des fois des résultats sont un peu étranges mais ça marche en gros.
Ça nécessite Javascript pour fonctionner et tout se fait sur votre ordi, rien sur le serveur.
</section>
Liens
------------------------------------
------------------------------------
[30/06/2020] - # #
------------------------------------