משתמש:רובין בוט/הפניות כפולות.js

הערה: לאחר הפרסום, ייתכן שיהיה צורך לנקות את זיכרון המטמון (cache) של הדפדפן כדי להבחין בשינויים.

  • פיירפוקס / ספארי: להחזיק את המקש Shift בעת לחיצה על טעינה מחדש (Reload) או ללחוץ על צירוף המקשים Ctrl-F5 או Ctrl-R (במחשב מק: ⌘-R).
  • גוגל כרום: ללחוץ על צירוף המקשים Ctrl-Shift-R (במחשב מק: ⌘-Shift-R).
  • אינטרנט אקספלורר / אדג': להחזיק את המקש Ctrl בעת לחיצה על רענן (Refresh) או ללחוץ על צירוף המקשים Ctrl-F5.
  • אופרה: ללחוץ על Ctrl-F5.
const BOT_USERS = [31];
const userId = mw.config.get("wgUserId");
if (!BOT_USERS.includes(userId)) {
    console.log("Not authorized bot user:", userId);
    return;
}

const api = new mw.Api();

const getRedirectContent = async (title) => {
    const { query } = await api.get({
        prop: "revisions",
        titles: title,
        rvprop: "content",
        rvslots: "*",
        formatversion: "2",
    });
    return query;
};

const getRedirectTarget = async (title) => {
    const { query } = await api.get({
        titles: title,
        redirects: true,
    });
    if (query?.pages) {
        const page = Object.values(query.pages).find(p => !p.missing);
        return page?.title ?? null;
    }
    return null;
};

const extractAnchorFromContent = (content) => {
    const match = content.match(/\[\[.*?(?:#(.+?))?\]\]/);
    return match?.[1] ? `#${match[1]}` : "";
};

const getNamespacePrefix = async (title) => {
    const { query } = await api.get({ titles: title, prop: "info" });
    if (query?.pages) {
        const page = Object.values(query.pages)[0];
        const nsPrefixes = {4:"חב\"דפדיה:",6:"קובץ:",10:"תבנית:",12:"עזרה:"};
        return nsPrefixes[page.ns] ?? "";
    }
    return "";
};

const createRedirect = async (title, target) => {
    try {
        await api.postWithEditToken({
            action: "edit",
            title,
            text: `#הפניה [[${target}]]`,
            tags: "doubleredirect-bot",
            bot: true,
        });
        mw.notify(`Redirect created: ${title}`);
    } catch(e) {
        console.error(e);
    }
};

const processRedirect = async (title) => {
    try {
        const contentData = await getRedirectContent(title);
        const content = contentData.pages[0].revisions[0].slots.main.content;
        const anchor = extractAnchorFromContent(content);

        const finalTarget = await getRedirectTarget(title);
        if (!finalTarget) return;

        const namespace = await getNamespacePrefix(finalTarget);
        const fullTarget = namespace + finalTarget + anchor;

        if (title === finalTarget) { console.log("Circular redirect:", title); return; }

        console.log("Creating redirect to:", fullTarget);
        await createRedirect(title, fullTarget);
    } catch(e) {
        console.error(e);
    }
};

const init = async () => {
    const pageName = mw.config.get("wgPageName");
    if (pageName !== "מיוחד:הפניות_כפולות") return;

    const num = prompt("כמה הפניות כפולות להציג?", 0);
    if (!num) return;

    try {
        const { query } = await api.get({ list:"querypage", qppage:"DoubleRedirects", qplimit:num });
        const redirects = query.querypage.results;
        for (const r of redirects) {
            await processRedirect(r.title.replace(/_/g," "));
        }
    } catch(e) { console.error(e); }
};

$(init);