LNK_forumSearch

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

您需要先安裝使用者腳本管理器擴展,如 TampermonkeyGreasemonkeyViolentmonkey 之後才能安裝該腳本。

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

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyViolentmonkey 後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyUserscripts 後才能安裝該腳本。

你需要先安裝一款使用者腳本管理器擴展,比如 Tampermonkey,才能安裝此腳本

您需要先安裝使用者腳本管理器擴充功能後才能安裝該腳本。

(我已經安裝了使用者腳本管理器,讓我安裝!)

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

(我已經安裝了使用者樣式管理器,讓我安裝!)

// ==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(); }

})();