let elementosDestacados = []; // Lista de elementos destacados let indiceAtual = -1; // Índice do elemento atual destacado // Função para remover os destaques anteriores function removerDestaques(elemento) { const highlightedElements = elemento.querySelectorAll('.highlight'); highlightedElements.forEach(el => { // Substitui o span pelo texto original el.replaceWith(el.textContent); }); elementosDestacados = []; indiceAtual = -1; } // Função para buscar, destacar e navegar até o texto encontrado na página inteira function buscarTexto() { const input = document.getElementById('pesquisar').value; const body = document.body; // Remove os destaques anteriores removerDestaques(body); if (input.trim() !== '') { // Criar expressão regular para busca com espaços em branco, case-insensitive const regex = new RegExp(`(${input})`, 'gi'); // Função recursiva para percorrer e destacar o texto function destacarTextoNoElemento(elemento) { if (elemento.nodeType === 3) { // Tipo 3 é um nó de texto const originalText = elemento.textContent; // Verifica se o texto corresponde à expressão regular if (regex.test(originalText)) { const fragment = document.createDocumentFragment(); let lastIndex = 0; // Realiza a substituição, respeitando os espaços originalText.replace(regex, (match, p1, offset) => { // Adiciona o texto antes da correspondência fragment.appendChild(document.createTextNode(originalText.slice(lastIndex, offset))); // Cria o elemento de destaque const span = document.createElement('span'); span.className = 'highlight'; span.textContent = match; fragment.appendChild(span); // Adiciona o elemento destacado à lista elementosDestacados.push(span); // Atualiza o índice para continuar a partir da última correspondência lastIndex = offset + match.length; }); // Adiciona o restante do texto após a última correspondência fragment.appendChild(document.createTextNode(originalText.slice(lastIndex))); // Substitui o nó original pelo fragmento atualizado elemento.replaceWith(fragment); } } else if (elemento.nodeType === 1 && elemento.childNodes && !['SCRIPT', 'STYLE'].includes(elemento.tagName)) { // Percorre os filhos se for um elemento elemento.childNodes.forEach(child => destacarTextoNoElemento(child)); } } destacarTextoNoElemento(body); // Se encontrou elementos destacados, navegue até o primeiro if (elementosDestacados.length > 0) { indiceAtual = 0; scrollToHighlight(indiceAtual); } } } // Função para rolar até o item destacado atual function scrollToHighlight(index) { if (index >= 0 && index < elementosDestacados.length) { elementosDestacados.forEach((el, idx) => { el.classList.remove('active-highlight'); // Remove o destaque ativo }); elementosDestacados[index].classList.add('active-highlight'); // Adiciona o destaque ao ativo elementosDestacados[index].scrollIntoView({ behavior: 'smooth', block: 'center' }); } } // Função para navegar até o próximo item destacado function navegarProximo() { if (elementosDestacados.length > 0) { indiceAtual = (indiceAtual + 1) % elementosDestacados.length; scrollToHighlight(indiceAtual); } } // Função para navegar até o item anterior destacado function navegarAnterior() { if (elementosDestacados.length > 0) { indiceAtual = (indiceAtual - 1 + elementosDestacados.length) % elementosDestacados.length; scrollToHighlight(indiceAtual); } }