לדלג לתוכן

משתמש:רובין בוט/הפניות כפולות.js – הבדלי גרסאות

מתוך חב"דפדיה, אנציקלופדיה חב"דית חופשית
אין תקציר עריכה
אין תקציר עריכה
שורה 1: שורה 1:
final_script_userpage = """
(() => {
(() => {
     const api = new mw.Api();
     const api = new mw.Api();
     const skipTitles = [
     const skipTitles = [
         "770",
         "770",
         "פורטל:חסידים ואנשי מעשה",
         "פורטל:חסידים ואנשי מעשה",
         "פורטל:משיח וגאולה",
         "פורטל:משיח וגאולה",
         "פורטל:\\"הקהל\\"",
         "פורטל:\"הקהל\"",
         "פורטל:ימי חבד",
         "פורטל:ימי חבד",
         "פורטל:ניגוני חבד",
         "פורטל:ניגוני חבד",
         "פורטל:נשיאי חבד",
         "פורטל:נשיאי חבד",
         "פורטל:חסידות חב\\\"ד",
         "פורטל:חסידות חב\"ד",
         "פורטל:תורת חב\\\"ד",
         "פורטל:תורת חב\"ד",
         "שיחה:פורטל:\\"הקהל\\"",
         "שיחה:פורטל:\"הקהל\"",
         "פורטל:אישי חב\\\"ד",
         "פורטל:אישי חב\"ד",
         "פורטל:בית רבי",
         "פורטל:בית רבי",
         "שיחה:פורטל:אישי חב\\\"ד",
         "שיחה:פורטל:אישי חב\"ד",
         "שיחה:פורטל:בית רבי"
         "שיחה:פורטל:בית רבי"
     ];
     ];
שורה 27: שורה 25:
                 rvprop: "content",
                 rvprop: "content",
                 rvslots: "*",
                 rvslots: "*",
                 formatversion: "2",
                 formatversion: "2"
             });
             });
             const page = response.query?.pages?.[0];
             const page = response.query?.pages?.[0];
שורה 40: שורה 38:
             const { query } = await api.get({
             const { query } = await api.get({
                 titles: title,
                 titles: title,
                 redirects: true,
                 redirects: true
             });
             });
             if (query?.pages) {
             if (query?.pages) {
שורה 53: שורה 51:


     const extractAnchorFromContent = (content) => {
     const extractAnchorFromContent = (content) => {
         const match = content.match(/#הפניה\\s*\\[\\[[^\\]]+?(?:#(.+?))?\\]\\]/);
         const match = content.match(/#הפניה\s*\[\[[^\]]+?(?:#(.+?))?\]\]/);
         return match?.[1] ? "#" + match[1] : "";
         return match?.[1] ? "#" + match[1] : "";
     };
     };
שורה 61: שורה 59:
             const { query } = await api.get({
             const { query } = await api.get({
                 titles: title,
                 titles: title,
                 prop: "info",
                 prop: "info"
             });
             });
             if (query?.pages) {
             if (query?.pages) {
שורה 82: שורה 80:
                 title: title,
                 title: title,
                 text: "#הפניה [[" + target + "]]",
                 text: "#הפניה [[" + target + "]]",
                 summary: "בוט: מתקן הפניה כפולה ל- [[" + target + "]]",
                 summary: "בוט: מתקן הפניה כפולה ל- [[" + target + "]]"
             });
             });
             mw.notify(title + ": ההפניה תוקנה ל- " + target, { type: 'success' });
             mw.notify(title + ": ההפניה תוקנה ל- " + target, { type: 'success' });
         } catch (error) {
         } catch {
             mw.notify(title + ": שגיאה בעת תיקון ההפניה", { type: 'error' });
             mw.notify(title + ": שגיאה בעת תיקון ההפניה", { type: 'error' });
         }
         }
שורה 95: שורה 93:
             const content = await getRedirectContent(title);
             const content = await getRedirectContent(title);
             if (content === null) return;
             if (content === null) return;
             const anchor = extractAnchorFromContent(content);
             const anchor = extractAnchorFromContent(content);
             const finalTarget = await getRedirectTarget(title);
             const finalTarget = await getRedirectTarget(title);
             if (!finalTarget) return;
             if (!finalTarget) return;
             const namespace = await getNamespacePrefix(finalTarget);
             const namespace = await getNamespacePrefix(finalTarget);
             const fullTarget = namespace + finalTarget + anchor;
             const fullTarget = namespace + finalTarget + anchor;
             if (title.replace(/_/g, " ") === fullTarget.replace(/_/g, " ")) return;
             if (title.replace(/_/g, " ") === fullTarget.replace(/_/g, " ")) return;
             await createRedirect(title, fullTarget);
             await createRedirect(title, fullTarget);
         } catch { }
         } catch {}
     };
     };


שורה 112: שורה 106:
         const pageName = mw.config.get("wgPageName");
         const pageName = mw.config.get("wgPageName");
         if (pageName !== "מיוחד:הפניות_כפולות") return;
         if (pageName !== "מיוחד:הפניות_כפולות") return;
         const numInput = prompt("כמה הפניות לתקן?", "10");
         const numInput = prompt("כמה הפניות לתקן?", "10");
         const num = parseInt(numInput, 10);
         const num = parseInt(numInput, 10);
         if (isNaN(num) || num <= 0) return;
         if (isNaN(num) || num <= 0) return;
         try {
         try {
             const { query } = await api.get({
             const { query } = await api.get({
                 list: "querypage",
                 list: "querypage",
                 qppage: "DoubleRedirects",
                 qppage: "DoubleRedirects",
                 qplimit: num,
                 qplimit: num
             });
             });
             const redirects = query.querypage.results;
             const redirects = query.querypage.results;
             if (!redirects.length) return;
             if (!redirects.length) return;
             for (const redirect of redirects) {
             for (const redirect of redirects) {
                 const title = redirect.title.replace(/_/g, " ");
                 const title = redirect.title.replace(/_/g, " ");
                 await processRedirect(title);
                 await processRedirect(title);
             }
             }
         } catch { }
            mw.notify("סיום תיקון ההפניות.", { type: 'success' });
         } catch {}
     };
     };


     $(init);
     $(init);
})();
})();
"""
script_userpage_path = "/mnt/data/הפניות_כפולות_למשתמש_רובין_בוט.js"
with open(script_userpage_path, "w", encoding="utf-8") as f:
    f.write(final_script_userpage)
script_userpage_path

גרסה מ־15:56, 23 ביולי 2025

(() => {
    const api = new mw.Api();
    const skipTitles = [
        "770",
        "פורטל:חסידים ואנשי מעשה",
        "פורטל:משיח וגאולה",
        "פורטל:\"הקהל\"",
        "פורטל:ימי חבד",
        "פורטל:ניגוני חבד",
        "פורטל:נשיאי חבד",
        "פורטל:חסידות חב\"ד",
        "פורטל:תורת חב\"ד",
        "שיחה:פורטל:\"הקהל\"",
        "פורטל:אישי חב\"ד",
        "פורטל:בית רבי",
        "שיחה:פורטל:אישי חב\"ד",
        "שיחה:פורטל:בית רבי"
    ];

    const getRedirectContent = async (title) => {
        try {
            const response = await api.get({
                prop: "revisions",
                titles: title,
                rvprop: "content",
                rvslots: "*",
                formatversion: "2"
            });
            const page = response.query?.pages?.[0];
            return page?.revisions?.[0]?.slots?.main?.content ?? null;
        } catch {
            return null;
        }
    };

    const getRedirectTarget = async (title) => {
        try {
            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;
        } catch {
            return null;
        }
    };

    const extractAnchorFromContent = (content) => {
        const match = content.match(/#הפניה\s*\[\[[^\]]+?(?:#(.+?))?\]\]/);
        return match?.[1] ? "#" + match[1] : "";
    };

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

    const createRedirect = async (title, target) => {
        try {
            await api.postWithEditToken({
                action: "edit",
                format: "json",
                title: title,
                text: "#הפניה [[" + target + "]]",
                summary: "בוט: מתקן הפניה כפולה ל- [[" + target + "]]"
            });
            mw.notify(title + ": ההפניה תוקנה ל- " + target, { type: 'success' });
        } catch {
            mw.notify(title + ": שגיאה בעת תיקון ההפניה", { type: 'error' });
        }
    };

    const processRedirect = async (title) => {
        if (skipTitles.includes(title)) return;
        try {
            const content = await getRedirectContent(title);
            if (content === null) return;
            const anchor = extractAnchorFromContent(content);
            const finalTarget = await getRedirectTarget(title);
            if (!finalTarget) return;
            const namespace = await getNamespacePrefix(finalTarget);
            const fullTarget = namespace + finalTarget + anchor;
            if (title.replace(/_/g, " ") === fullTarget.replace(/_/g, " ")) return;
            await createRedirect(title, fullTarget);
        } catch {}
    };

    const init = async () => {
        const pageName = mw.config.get("wgPageName");
        if (pageName !== "מיוחד:הפניות_כפולות") return;
        const numInput = prompt("כמה הפניות לתקן?", "10");
        const num = parseInt(numInput, 10);
        if (isNaN(num) || num <= 0) return;
        try {
            const { query } = await api.get({
                list: "querypage",
                qppage: "DoubleRedirects",
                qplimit: num
            });
            const redirects = query.querypage.results;
            if (!redirects.length) return;
            for (const redirect of redirects) {
                const title = redirect.title.replace(/_/g, " ");
                await processRedirect(title);
            }
            mw.notify("סיום תיקון ההפניות.", { type: 'success' });
        } catch {}
    };

    $(init);
})();