משתמש:נריה בוט/חסימת-דף-קובץ.js
מראה
לתשומת ליבך: לאחר הפרסום, ייתכן שיהיה צורך לנקות את זיכרון המטמון (cache) של הדפדפן כדי להבחין בשינויים.
- פיירפוקס / ספארי: להחזיק את המקש Shift בעת לחיצה על טעינה מחדש (Reload) או ללחוץ על צירוף המקשים Ctrl-F5 או Ctrl-R (במחשב מק: ⌘-R).
- גוגל כרום: ללחוץ על צירוף המקשים Ctrl-Shift-R (במחשב מק: ⌘-Shift-R).
- אדג': להחזיק את המקש Ctrl בעת לחיצה על רענן (Refresh) או ללחוץ על צירוף המקשים Ctrl-F5.
/*
// לחצן לחסימת קובץ והסרת התמונות מהערכים ישירות דרך דף הקובץ
$(document).ready(function() {
if (mw.config.get('wgNamespaceNumber') === 6) {
const fileName = mw.config.get('wgTitle');
$('#firstHeading').append(
$('<button>', {
class: 'mw-ui-button',
style: 'margin-left: 10px;'
})
.text('חסימת תמונה')
.click(() => handleImageBlock(fileName))
);
}
});
async function handleImageBlock(fileName) {
if (!isUserAllowed()) {
mw.notify('הסקריפט מוגבל לבדוקי עריכות, העריכה לא בוצעה', { type: 'error' });
return;
}
try {
await removeImageFromArticles(fileName);
await createRedirectPage(fileName);
mw.notify('התמונה הוסרה ונחסמה', { type: 'success' });
} catch (error) {
console.error('Error:', error);
mw.notify('אירעה שגיאה בעת ביצוע הפעולה', { type: 'error' });
}
}
function isUserAllowed() {
return mw.config.get('wgUserGroups').includes('autopatroller');
}
async function removeImageFromArticles(fileName) {
const normalizedFileName = fileName.replace(/^(File:|קובץ:|תמונה:)/i, '');
const pages = await getFileUsage(normalizedFileName);
for (const page of pages) {
if (page.ns !== 4) {
await removeImageFromPage(page.pageid, normalizedFileName);
}
}
}
async function getFileUsage(fileName) {
const response = await $.ajax({
url: mw.util.wikiScript('api'),
data: {
action: 'query',
format: 'json',
prop: 'fileusage',
titles: `File:${fileName}`,
fuprop: 'pageid|title|namespace',
fulimit: 'max'
}
});
const pages = Object.values(response.query.pages)[0];
return pages.fileusage || [];
}
async function removeImageFromPage(pageId, fileName) {
const pageContent = await getPageContent(pageId);
let newContent = pageContent.replace(
new RegExp(`\\[\\[(?:File|קובץ|תמונה):${escapeRegExp(fileName)}\\s*(?:\\|[^\\]]*)?\\]\\]`, 'gi'),
''
);
newContent = newContent.replace(
/<gallery[^>]*>([\s\S]*?)<\/gallery>/gi,
(match, content) => {
if (!content) return '';
const filteredLines = content
.split('\n')
.filter(line => {
const normalizedLine = line.trim().toLowerCase();
const normalizedFileName = fileName.toLowerCase();
return !normalizedLine.includes(normalizedFileName);
})
.join('\n');
return filteredLines.trim() ? `<gallery>${filteredLines}</gallery>` : '';
}
);
if (newContent !== pageContent) {
await savePage(pageId, newContent, 'הסרת תמונה');
}
}
async function createRedirectPage(fileName) {
const fullFileName = fileName.replace(/^(File:|קובץ:|תמונה:)?/i, 'קובץ:');
const redirectText = '#הפניה [[קובץ:תמונה חילופית.jpg]]';
await savePage(null, redirectText, 'חסימת תמונה', fullFileName);
}
async function getPageContent(pageId) {
const response = await $.ajax({
url: mw.util.wikiScript('api'),
data: {
action: 'parse',
format: 'json',
pageid: pageId,
prop: 'wikitext'
}
});
return response.parse.wikitext['*'];
}
async function savePage(pageId, text, summary, title = null) {
const params = {
action: 'edit',
format: 'json',
text: text,
summary: summary,
bot: 1,
token: mw.user.tokens.get('csrfToken')
};
if (pageId) {
params.pageid = pageId;
params.nocreate = 1;
} else if (title) {
params.title = title;
params.createonly = 1;
}
return $.ajax({
url: mw.util.wikiScript('api'),
method: 'POST',
data: params
});
}
function escapeRegExp(string) {
return string.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
}
*/