TVTropes Now available in the app store!
Open

Follow TV Tropes

Wickcheckbot

Go To

const puppeteer = require('puppeteer-core');

(async () => {const browser = await puppeteer.launch({headless: false,executablePath: '/nix/store/x205pbkd5xh5g4iv0g58xjla55has3cx-chromium-108.0.5359.94/bin/chromium-browser',args: ['—no-sandbox', '—disable-setuid-sandbox']});

const fs = require('fs');const readline = require('readline');const puppeteer = require('puppeteer');

const rl = readline.createInterface({  input: process.stdin,  output: process.stdout});

function askQuestion(query) {  return new Promise((resolve) => {    rl.question(query, (answer) => {      resolve(answer);      rl.pause();    });  });}

async function main() {  const wikiWord = await askQuestion('Page name (Wiki Word): ');  const wicktotal = await askQuestion('Number of wicks to check: ');  const MAX_LINKS = parseInt(wicktotal) || 50;

  console.log(`Set MAX_LINKS to: ${MAX_LINKS}`);  console.log(`wikiWord: ${wikiWord}`);

  const indexUrl = `https://tvtropes.org/pmwiki/relatedsearch.php?term=Main/${wikiWord}`;

  const browser = await puppeteer.launch();  const page = await browser.newPage();

  await page.goto(indexUrl);

const inwicks = await page.evaluate(() => {    const startIdx = document.body.innerHTML.indexOf('non-search engine links');    const endIdx = document.body.innerHTML.indexOf('excluding discussions');    const html = document.body.innerHTML.substring(startIdx, endIdx);    const linkRegex = /\/pmwiki\/pmwiki\.php\/([a-zA-Z0-9]+\/[a-zA-Z0-9]+)/g;    return Array.from(html.matchAll(linkRegex)).map(x => x[1]);});

inwicks.sort(() => Math.random() - 0.5);

let localresult = '';let result = '';

for (let i = 0; i < Math.min(inwicks.length, MAX_LINKS); i++) {    const wickpage = `https://tvtropes.org${inwicks[i]}?action=source`;    await page.goto(wickpage);

    const patternBase = `[a-zA-Z0-9,\\.'{]*${wikiWord}`;    const pattern1 = new Reg Exp(`^\\* ${patternBase}`);    const pattern2 = new Reg Exp(`^\\*\\* ${patternBase}`);    const pattern3 = new Reg Exp(`${patternBase}`);    const pattern4 = new Reg Exp(`\\{\\{${wikiWord.substring(0, 2)}`);

    const sourceText = await page.evaluate(() => {        const spanElement = document.querySelector('span[style*="font-family:Courier"]');        return spanElement ? spanElement.innerText : '';    });

    const lines = sourceText.split('<br>');

    function processLine(line, idx) {        if (pattern1.test(line)) {            result += `\n* ${inwicks[idx]}: ${line}`;            while (idx + 1 < lines.length && (lines[idx + 1].startsWith('**') || lines[idx + 1].startsWith('—>'))) {                idx++;                result += ` ${lines[idx]}`;            }            return true;

        } else if (pattern2.test(line)) {            result += `\n* ${inwicks[idx]}: ${line}`;            while (idx + 1 < lines.length && (lines[idx + 1].startsWith('***') || lines[idx + 1].startsWith('—>'))) {                idx++;                result += ` ${lines[idx]}`;            }            return true;        } else if (pattern3.test(line)) {            result += `\n* ${inwicks[idx]}: ${line}`;            return true;        } else if (pattern4.test(line)) {            result += `\n* ${inwicks[idx]}: ${line}`;            return true;        }        return false;    }

    lines.some((line, idx) => processLine(line, idx));}

fs.writeFileSync('output.txt', result);

main();

await browser.close();})();

Top