לדלג לתוכן

משתמש:נריה בוט/חסימת-דף-קובץ.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, '\\$&');
}
*/