LNK_forumSearch

поиск по теме форума

You will need to install an extension such as Tampermonkey, Greasemonkey or Violentmonkey to install this script.

You will need to install an extension such as Tampermonkey to install this script.

You will need to install an extension such as Tampermonkey or Violentmonkey to install this script.

You will need to install an extension such as Tampermonkey or Userscripts to install this script.

You will need to install an extension such as Tampermonkey to install this script.

You will need to install a user script manager extension to install this script.

(I already have a user script manager, let me install it!)

You will need to install an extension such as Stylus to install this style.

You will need to install an extension such as Stylus to install this style.

You will need to install an extension such as Stylus to install this style.

You will need to install a user style manager extension to install this style.

You will need to install a user style manager extension to install this style.

You will need to install a user style manager extension to install this style.

(I already have a user style manager, let me install it!)

// ==UserScript==
// @name         LNK_forumSearch
// @namespace    http://tampermonkey.net/
// @version      1.3
// @description  поиск по теме форума
// @author       LNK
// @include      *heroeswm.ru/forum_messages.php*
// @include      *lordswm.com/forum_messages.php*
// @grant        none
// @license      GNU GPLv3
// ==/UserScript==

(function() {
    'use strict';

async function getPageFetch(aURL) {
    let response = await fetch(aURL);
    let buf = await response.arrayBuffer()
    let s = new TextDecoder('windows-1251').decode(buf);
    return s;
} // getPageFetch

function el(id) { return document.getElementById(id); }

async function searchGo() { //alert(sCount);
    var sCount = 0; 
    var sWhat = el('sWhat').value.trim();
    var pFrom = el('pFrom').value-1;
    var pTo = el('pTo').value-1;
    var dirForw = (pFrom > pTo) ? -1 : 1;
    var i, n1=0, n2, n3, n01, n02, sMes, sText = '', found=false;
    var addr = location.href;
    //var reponse = '';
    if (sWhat == '') { alert('не задана строка дляя поиска!'); return false; }
    if ( btnText == 'Искать') { 
        localStorage.setItem('HWM_forumSearchFromInit', pFrom+1); 
        localStorage.setItem('HWM_forumSearchDirForw', dirForw); 
    }
    localStorage.setItem('HWM_forumSearchStr', sWhat);
    while (((dirForw == -1) && (pFrom >= pTo)) || ((dirForw == 1) && (pFrom <= pTo))) {
        n2 = ((n2 = addr.indexOf('&')) < 0) ? 1000 : n2;
        addr = addr.slice(0,n2) + '&page='+pFrom;
        sText = await getPageFetch(addr);
        if (sText.indexOf(`<td style='color: #000000; padding: 5px;font-size: 0.8125em;'>`) < 0) {
            alert('forum not found'); return false; }
        if (n1 == 0) {
            n1 = sText.indexOf('</a></h1><BR>'); 
            n1 = sText.indexOf('<b><font color=red>',n1);
            if (n1 < 0) { alert('forum page list not found'); return 0; }
            n2 = sText.indexOf('>',n1+5);
            n3 = sText.indexOf('<',n1+5);
            n1 = +sText.slice(n2+1,n3); 
            pFrom = n1-1;
        }
        n1 = 0;
        while ((n1 = sText.indexOf(`<td style='color: #000000; padding: 5px;font-size: 0.8125em;'>`,n1)) > 0) {
            n1 = sText.indexOf('>',n1)+1;
            n2 = sText.indexOf('</td>',n1);
            sMes = sText.slice(n1,n2); //alert(sMes);
            n01 = sMes.toLowerCase().indexOf(sWhat.toLowerCase());
            if (n01 >= 0) {
                n02 = n01 + sWhat.length;
                sCount++;
            }
        }
        if (sCount > 0) { break; }
        pFrom += dirForw; 
        el('pFrom').value = pFrom+1; 
    }
    if (sCount == 0) {
        alert('Все страницы диапазона просмотрены. Поиск завершен.');
        el('pFrom').value = localStorage.getItem('HWM_forumSearchFromInit');
        el('sGo').innerHTML = 'Искать';
        return false;
    } else {
        //alert('Найдено '+sCount);
        localStorage.setItem('HWM_forumSearchFrom', pFrom+1);
        localStorage.setItem('HWM_forumSearchTo', pTo+1);
        location.href = addr;
        return true;
    }
}//searchGo

function showResult() {
    var sCount = 0;
    var sWhat = el('sWhat').value;
    var i, n1=0, n2, n01, n02, sMes, sMes0, sText = '', found=false;
    sText = document.body.innerHTML;
    if (sText.indexOf(`<td style="color: #000000; padding: 5px;font-size: 0.8125em;">`) < 0) {
        alert('forum not found'); return false; }
    while ((n1 = sText.indexOf(`<td style="color: #000000; padding: 5px;font-size: 0.8125em;">`,n1)) > 0) {
        n1 = sText.indexOf('>',n1)+1;
        n2 = sText.indexOf('</td>',n1);
        sMes0 = sText.slice(n1,n2);
        sMes = sMes0.toLowerCase();
        n01 = sMes.indexOf('<a ');
        if (n01 >= 0) {
            n02 = sMes.indexOf('>', n01);
            if (n02 >= 0) {
                sMes = sMes.slice(0,n01) + sMes.slice(n01,n02).toUpperCase() + sMes.slice(n02);
            }
        }
        n01 = sMes.indexOf(sWhat.toLowerCase());
        if (n01 >= 0) {
            n02 = n01 + sWhat.length;
            sCount++;
            sMes0 = sMes0.slice(0,n01) + `<span id='found${sCount}' style='background:magenta;'>` + sMes0.slice(n01,n02) + `</span>` + sMes0.slice(n02);
            //sMes = `<span id='found${sCount}' style='background:magenta;'>` + sMes + `</span>`;
            sText = sText.slice(0,n1) + sMes0 + sText.slice(n2-1);
        }
    }
    if (sCount == 0) {
        alert('Ничего не найдено');
        return false;
    } else {
        document.body.innerHTML = sText;
        el('sGo').onclick = searchGo;
        if (el(`found1`)) { el(`found1`).scrollIntoView({block: "center"}); };
        return true;
    }
}//showResult

    var pText = document.body.innerHTML;
    if (pText.indexOf('</a></h1><br><center><') < 0) { 
        pText = pText.replace('</a></h1><br><br>','</a></h1>&nbsp&nbsp&nbsp&nbsp В теме 1 страница - поиск средствами браузера<BR><BR>');
        document.body.innerHTML = pText;
        return 0;
    }
    var n1 = pText.indexOf('</a></h1><br>');
    //alert(pText.slice(n1,n1+200));
    n1 = pText.indexOf('<b><font color="red">',n1);
    if (n1 < 0) { alert('forum page list not found'); return 0; }
    var n2 = pText.indexOf('>',n1+5); 
    var n3 = pText.indexOf('<',n1+5);
    n1 = +pText.slice(n2+1,n3); //alert(pText.slice(n2+1,n3));
    n2 = n1 - 20; 
    if (n2 < 1) { 
        n2 = 1; 
        if (n1 == 1) { n2 = 20; }
    }
    var strFound = localStorage.getItem('HWM_forumSearchStr');
    var btnText = 'Искать';
    if (!strFound) { strFound = ''; }
    var pFrom = localStorage.getItem('HWM_forumSearchFrom');
    if (pFrom) { 
        var dirForw = parseInt(localStorage.getItem('HWM_forumSearchDirForw'));
        pFrom = parseInt(localStorage.getItem('HWM_forumSearchFrom')) + dirForw;
        localStorage.removeItem('HWM_forumSearchFrom'); 
        btnText = 'Следуюшая страница';
    } else { pFrom = n1; }
    var pTo = localStorage.getItem('HWM_forumSearchTo');
    if (pTo) { localStorage.removeItem('HWM_forumSearchTo'); }
    else { pTo = n2; }
    var sText = `
       &nbsp&nbsp&nbsp&nbsp Поиск по теме:
       <input type='text' id='sWhat' size='30' value='${strFound}'>
       <span id='pCur'> страницы с </span>
       <input type='text' id='pFrom' size='7' value='${pFrom}'> по
       <input type='text' id='pTo' size='7' value='${pTo}'>
       <button id='sGo'>${btnText}</button>
    `;
    pText = pText.replace('</a></h1><br><center><','</a></h1>'+sText+'<br><center><');
    document.body.innerHTML = pText;
    el('sGo').onclick = searchGo;
    if ( btnText == 'Следуюшая страница') { showResult(); }

})();