User:Bot doubleredirects/Gadget-DoubleRedirectFixer.js: Difference between revisions
Appearance
No edit summary |
No edit summary |
||
| Line 1: | Line 1: | ||
// קרדיט: המכלול (גרסה משופרת - מאפשרת הרצה לכל משתמש מחובר) | |||
(() => { | |||
const api = new mw.Api(); | |||
/** | |||
* מקבל את תוכן דף ההפניה. | |||
* @param {string} title - שם הדף. | |||
* @returns {Promise<string|null>} תוכן הדף או null אם הייתה שגיאה. | |||
*/ | |||
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 (error) { | |||
console.error("שגיאה בקבלת תוכן הפניה עבור " + title + ":", error); | |||
return null; | |||
} | |||
}; | |||
/** | |||
* מקבל את יעד ההפניה הסופי. | |||
* @param {string} title - שם דף ההפניה. | |||
* @returns {Promise<string|null>} יעד ההפניה או 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 (error) { | |||
console.error("שגיאה בקבלת יעד ההפניה עבור " + title + ":", error); | |||
return null; | |||
} | |||
}; | |||
/** | |||
* מחלץ את העוגן (anchor) מתוך תוכן הפניה (לדוגמה: [[דף_יעד#עוגן]]). | |||
* @param {string} content - תוכן דף ההפניה. | |||
* @returns {string} העוגן עם '#' אם קיים, אחרת מחרוזת ריקה. | |||
*/ | |||
const extractAnchorFromContent = (content) => { | |||
const match = content.match(/#הפניה\s*\[\[[^\]]+?(?:#(.+?))?\]\]/); | |||
return match?.[1] ? "#" + match[1] : ""; | |||
}; | |||
/** | |||
* מקבל את קידומת מרחב השם של דף (לדוגמה: "מדיה ויקי:", "קובץ:"). | |||
* @param {string} title - שם הדף. | |||
* @returns {Promise<string>} קידומת מרחב השם או מחרוזת ריקה. | |||
*/ | |||
const getNamespacePrefix = async (title) => { | |||
try { | |||
const { query } = await api.get({ | |||
titles: title, | |||
prop: "info", | |||
}); | |||
if (query?.pages) { | |||
const page = Object.values(query.pages)[0]; | |||
if (page.ns !== undefined) { | |||
// יש להוסיף כאן מרחבי שמות נוספים במידת הצורך | |||
const namespacePrefixes = { | |||
4: "chabadpedia:", // Namespace 4 | |||
6: "File:", // Namespace 6 | |||
10: "Template:", // Namespace 10 | |||
12: "Help:", // Namespace 12 | |||
// ... ניתן להוסיף עוד מרחבי שמות לפי המספרים שלהם בוויקי | |||
}; | |||
return namespacePrefixes[page.ns] ?? ""; | |||
} | |||
} | |||
return ""; | |||
} catch (error) { | |||
console.error("שגיאה בקבלת קידומת מרחב שם עבור " + title + ":", error); | |||
return ""; | |||
} | |||
}; | |||
/** | |||
* יוצר/מתקן הפניה. | |||
* @param {string} title - שם הדף שיהפוך להפניה. | |||
* @param {string} target - יעד ההפניה. | |||
*/ | |||
const createRedirect = async (title, target) => { | |||
try { | |||
await api.postWithEditToken({ | |||
action: "edit", | |||
format: "json", | |||
// **השורות עם "tags" הוסרו לחלוטין כאן.** | |||
title: title, | |||
text: "#הפניה [[" + target + "]]", | |||
summary: "בוט: מתקן הפניה כפולה ל- [[" + target + "]]", | |||
}); | |||
mw.notify(title + ": ההפניה תוקנה בהצלחה ל- " + target, { type: 'success', title: 'הצלחה' }); | |||
} catch (error) { | |||
console.error("שגיאה ביצירת הפניה עבור " + title + " ל- " + target + ":", error); | |||
// בדיקה ספציפית לשגיאת badtags | |||
if (error.code === 'badtags') { | |||
mw.notify(title + ": שגיאה: אין הרשאה להשתמש בתגיות עריכה. אנא פנה למנהל המערכת.", { type: 'error', title: 'שגיאת הרשאה' }); | |||
} else { | |||
mw.notify(title + ": נכשל תיקון ההפניה. פרטים בקונסול.", { type: 'error', title: 'שגיאה' }); | |||
} | |||
} | |||
}; | |||
/** | |||
* מעבד הפניה כפולה יחידה: מוצא את היעד הסופי ומתקן אותה. | |||
* @param {string} title - שם הדף של ההפניה הכפולה. | |||
*/ | |||
const processRedirect = async (title) => { | |||
try { | |||
const content = await getRedirectContent(title); | |||
if (content === null) { | |||
mw.notify(title + ": לא ניתן לאחזר תוכן דף ההפניה.", { type: 'warn' }); | |||
return; | |||
} | |||
const anchor = extractAnchorFromContent(content); | |||
const finalTarget = await getRedirectTarget(title); | |||
if (!finalTarget) { | |||
mw.notify(title + ": לא נמצא יעד הפניה סופי.", { type: 'warn' }); | |||
return; | |||
} | |||
const namespace = await getNamespacePrefix(finalTarget); | |||
const fullTarget = namespace + finalTarget + anchor; | |||
// בדיקה למניעת הפניות מעגליות או תיקונים מיותרים | |||
if (title.replace(/_/g, " ") === finalTarget.replace(/_/g, " ") && !anchor) { | |||
mw.notify(title + ": ההפניה כבר תקינה. אין צורך בתיקון.", { type: 'info' }); | |||
return; | |||
} | |||
if (title.replace(/_/g, " ") === fullTarget.replace(/_/g, " ")) { | |||
mw.notify(title + ": הפניה מעגלית או תקינה. אין צורך בתיקון.", { type: 'info' }); | |||
return; | |||
} | |||
console.log("יוצר הפניה חדשה: " + title + " --> " + fullTarget); | |||
await createRedirect(title, fullTarget); | |||
} catch (error) { | |||
console.error("שגיאה בעיבוד הפניה כפולה עבור " + title + ":", error); | |||
mw.notify(title + ": אירעה שגיאה בעת עיבוד ההפניה. פרטים בקונסול.", { type: 'error', title: 'שגיאה' }); | |||
} | |||
}; | |||
/** | |||
* הפונקציה הראשית שמפעילה את הסקריפט. | |||
*/ | |||
const init = async () => { | |||
const pageName = mw.config.get("wgPageName"); | |||
// ודא שהסקריפט רץ רק בדף ההפניות הכפולות | |||
if (pageName !== "Special:DoubleRedirects") { | |||
console.log("הסקריפט פועל רק בדף מיוחד:הפניות_כפולות."); | |||
return; | |||
} | |||
const numInput = prompt("כמה הפניות כפולות להציג ולתקן? (מומלץ להתחיל עם מספר קטן, לדוגמה: 10)", "0"); | |||
const num = parseInt(numInput, 10); | |||
if (isNaN(num) || num <= 0) { | |||
mw.notify("קלט לא חוקי. אנא הזן מספר שלם חיובי.", { type: 'error' }); | |||
return; | |||
} | |||
try { | |||
mw.notify("מתחיל בדיקת " + num + " הפניות כפולות...", { type: 'info' }); | |||
// קבלת רשימת ההפניות הכפולות באמצעות API | |||
const { query } = await api.get({ | |||
list: "querypage", | |||
qppage: "DoubleRedirects", | |||
qplimit: num, | |||
}); | |||
const redirects = query.querypage.results; | |||
if (redirects.length === 0) { | |||
mw.notify("לא נמצאו הפניות כפולות לתיקון.", { type: 'info' }); | |||
return; | |||
} | |||
// לולאה על כל הפניה ותיקונה | |||
for (const redirect of redirects) { | |||
const title = redirect.title.replace(/_/g, " "); | |||
await processRedirect(title); | |||
} | |||
mw.notify("סיום עיבוד ההפניות הכפולות.", { type: 'success', title: 'סיום' }); | |||
} catch (error) { | |||
console.error("שגיאה באחזור הפניות כפולות:", error); | |||
mw.notify("אירעה שגיאה באחזור רשימת ההפניות הכפולות.", { type: 'error', title: 'שגיאה כללית' }); | |||
} | |||
}; | |||
// הפעל את הסקריפט כאשר הדף נטען | |||
$(init); | |||
})(); | })(); | ||
Revision as of 09:42, 10 July 2025
// קרדיט: המכלול (גרסה משופרת - מאפשרת הרצה לכל משתמש מחובר)
(() => {
const api = new mw.Api();
/**
* מקבל את תוכן דף ההפניה.
* @param {string} title - שם הדף.
* @returns {Promise<string|null>} תוכן הדף או null אם הייתה שגיאה.
*/
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 (error) {
console.error("שגיאה בקבלת תוכן הפניה עבור " + title + ":", error);
return null;
}
};
/**
* מקבל את יעד ההפניה הסופי.
* @param {string} title - שם דף ההפניה.
* @returns {Promise<string|null>} יעד ההפניה או 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 (error) {
console.error("שגיאה בקבלת יעד ההפניה עבור " + title + ":", error);
return null;
}
};
/**
* מחלץ את העוגן (anchor) מתוך תוכן הפניה (לדוגמה: [[דף_יעד#עוגן]]).
* @param {string} content - תוכן דף ההפניה.
* @returns {string} העוגן עם '#' אם קיים, אחרת מחרוזת ריקה.
*/
const extractAnchorFromContent = (content) => {
const match = content.match(/#הפניה\s*\[\[[^\]]+?(?:#(.+?))?\]\]/);
return match?.[1] ? "#" + match[1] : "";
};
/**
* מקבל את קידומת מרחב השם של דף (לדוגמה: "מדיה ויקי:", "קובץ:").
* @param {string} title - שם הדף.
* @returns {Promise<string>} קידומת מרחב השם או מחרוזת ריקה.
*/
const getNamespacePrefix = async (title) => {
try {
const { query } = await api.get({
titles: title,
prop: "info",
});
if (query?.pages) {
const page = Object.values(query.pages)[0];
if (page.ns !== undefined) {
// יש להוסיף כאן מרחבי שמות נוספים במידת הצורך
const namespacePrefixes = {
4: "chabadpedia:", // Namespace 4
6: "File:", // Namespace 6
10: "Template:", // Namespace 10
12: "Help:", // Namespace 12
// ... ניתן להוסיף עוד מרחבי שמות לפי המספרים שלהם בוויקי
};
return namespacePrefixes[page.ns] ?? "";
}
}
return "";
} catch (error) {
console.error("שגיאה בקבלת קידומת מרחב שם עבור " + title + ":", error);
return "";
}
};
/**
* יוצר/מתקן הפניה.
* @param {string} title - שם הדף שיהפוך להפניה.
* @param {string} target - יעד ההפניה.
*/
const createRedirect = async (title, target) => {
try {
await api.postWithEditToken({
action: "edit",
format: "json",
// **השורות עם "tags" הוסרו לחלוטין כאן.**
title: title,
text: "#הפניה [[" + target + "]]",
summary: "בוט: מתקן הפניה כפולה ל- [[" + target + "]]",
});
mw.notify(title + ": ההפניה תוקנה בהצלחה ל- " + target, { type: 'success', title: 'הצלחה' });
} catch (error) {
console.error("שגיאה ביצירת הפניה עבור " + title + " ל- " + target + ":", error);
// בדיקה ספציפית לשגיאת badtags
if (error.code === 'badtags') {
mw.notify(title + ": שגיאה: אין הרשאה להשתמש בתגיות עריכה. אנא פנה למנהל המערכת.", { type: 'error', title: 'שגיאת הרשאה' });
} else {
mw.notify(title + ": נכשל תיקון ההפניה. פרטים בקונסול.", { type: 'error', title: 'שגיאה' });
}
}
};
/**
* מעבד הפניה כפולה יחידה: מוצא את היעד הסופי ומתקן אותה.
* @param {string} title - שם הדף של ההפניה הכפולה.
*/
const processRedirect = async (title) => {
try {
const content = await getRedirectContent(title);
if (content === null) {
mw.notify(title + ": לא ניתן לאחזר תוכן דף ההפניה.", { type: 'warn' });
return;
}
const anchor = extractAnchorFromContent(content);
const finalTarget = await getRedirectTarget(title);
if (!finalTarget) {
mw.notify(title + ": לא נמצא יעד הפניה סופי.", { type: 'warn' });
return;
}
const namespace = await getNamespacePrefix(finalTarget);
const fullTarget = namespace + finalTarget + anchor;
// בדיקה למניעת הפניות מעגליות או תיקונים מיותרים
if (title.replace(/_/g, " ") === finalTarget.replace(/_/g, " ") && !anchor) {
mw.notify(title + ": ההפניה כבר תקינה. אין צורך בתיקון.", { type: 'info' });
return;
}
if (title.replace(/_/g, " ") === fullTarget.replace(/_/g, " ")) {
mw.notify(title + ": הפניה מעגלית או תקינה. אין צורך בתיקון.", { type: 'info' });
return;
}
console.log("יוצר הפניה חדשה: " + title + " --> " + fullTarget);
await createRedirect(title, fullTarget);
} catch (error) {
console.error("שגיאה בעיבוד הפניה כפולה עבור " + title + ":", error);
mw.notify(title + ": אירעה שגיאה בעת עיבוד ההפניה. פרטים בקונסול.", { type: 'error', title: 'שגיאה' });
}
};
/**
* הפונקציה הראשית שמפעילה את הסקריפט.
*/
const init = async () => {
const pageName = mw.config.get("wgPageName");
// ודא שהסקריפט רץ רק בדף ההפניות הכפולות
if (pageName !== "Special:DoubleRedirects") {
console.log("הסקריפט פועל רק בדף מיוחד:הפניות_כפולות.");
return;
}
const numInput = prompt("כמה הפניות כפולות להציג ולתקן? (מומלץ להתחיל עם מספר קטן, לדוגמה: 10)", "0");
const num = parseInt(numInput, 10);
if (isNaN(num) || num <= 0) {
mw.notify("קלט לא חוקי. אנא הזן מספר שלם חיובי.", { type: 'error' });
return;
}
try {
mw.notify("מתחיל בדיקת " + num + " הפניות כפולות...", { type: 'info' });
// קבלת רשימת ההפניות הכפולות באמצעות API
const { query } = await api.get({
list: "querypage",
qppage: "DoubleRedirects",
qplimit: num,
});
const redirects = query.querypage.results;
if (redirects.length === 0) {
mw.notify("לא נמצאו הפניות כפולות לתיקון.", { type: 'info' });
return;
}
// לולאה על כל הפניה ותיקונה
for (const redirect of redirects) {
const title = redirect.title.replace(/_/g, " ");
await processRedirect(title);
}
mw.notify("סיום עיבוד ההפניות הכפולות.", { type: 'success', title: 'סיום' });
} catch (error) {
console.error("שגיאה באחזור הפניות כפולות:", error);
mw.notify("אירעה שגיאה באחזור רשימת ההפניות הכפולות.", { type: 'error', title: 'שגיאה כללית' });
}
};
// הפעל את הסקריפט כאשר הדף נטען
$(init);
})();