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

[1] ${result.title} (${result.url})

------------------------------------

🏠 Retour à la home

------------------------------------

[30/06/2020] - # #

------------------------------------

[>> Suivant >>] ⏭ Récap 11 : Juin 2020
[<< Précédent <<] ⏮ Event Horizon