LNK_forumSearch

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

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Greasemonkey 油猴子Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Userscripts ,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 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(); }

})();