میڈیاویکی:Gadget-Peshkar.js

آزاد دائرۃ المعارف، ویکیپیڈیا سے

تفصیل کے لیے کھولیں کے بٹن پر کلک کریں یاددہانی: محفوظ کرنے کے بعد تازہ ترین تبدیلیوں کو دیکھنے کے لیے آپ کو اپنے براؤزر کا کیش صاف کرنا ہوگا۔

  • فائرفاکس/ سفاری: جب Reload پر کلک کریں تو Shift دبا کر رکھیں، یا Ctrl-F5 یا Ctrl-R دبائیں (Mac پر R- )
  • گوگل کروم: Ctrl-Shift-R دبائیں (Mac پر Shift-R-⌘)
  • انٹرنیٹ ایکسپلورر: جب Refresh پر کلک کریں تو Ctrl یا Ctrl-F5 دبائیں
  • اوپیرا: Tools → Preferences میں جائیں اور کیش صاف کریں

/*
 * خودکار درستی املا 
 * کاوشِ Yethrosh (2024ء)
 *
 * اردو ویکیپیڈیا کے مضامین میں املا و تحریر کی غلطیوں کی خودکار اصلاح کے لیے خصوصی طور پر تیار کردہ آلہ
 * جس کی مدد سے ویکی صارفین ایک کلک پر مضامین کی اصلاح کر سکتے ہیں۔
 *
 * وپ:املا پڑتالگر کے تحت تیار شدہ
 */

mw.loader.using(['mediawiki.api', 'mediawiki.util', 'jquery'], function() {
    $(function() {

        // جن صفحات پر درستی املا کا آپشن نظر آئے گا
        if (mw.config.get('wgAction') !== 'view' || [0, 4, 10, 12, 14, 100, 102, 118].indexOf(mw.config.get('wgNamespaceNumber')) === -1) {
            return;
        }

        const TAG = 'Peshkar';
        const VERSION = 2.0;

        // صفحہ کھولنے کے لیے
        async function loadPage(title) {
            try {
                const data = await new mw.Api().get({
                    action: 'query',
                    prop: 'revisions',
                    titles: title,
                    rvprop: 'content',
                    format: 'json'
                });
                const pageId = Object.keys(data.query.pages)[0];
                return data.query.pages[pageId].revisions[0]['*'];
            } catch (error) {
                throw new Error('صفحہ کے مندرجات اخذ نہیں کیے جا سکے: ' + error);
            }
        }

        // صفحہ محفوظ کرنے کے لیے
        async function savePage(title, newText) {
            try {
                const data = await new mw.Api().post({
                    action: 'edit',
                    title: title,
                    text: newText,
                    summary: 'خودکار: ویکائی بذریعہ [[وپ:پیش کار|پیش کار]]',
                    tags: TAG,
                    token: mw.user.tokens.get('csrfToken')
                });
                if (data.error && data.error.info) {
                    throw new Error(data.error.info);
                } else {
                    return 'ترمیم مکمل ہوئی!';
                }
            } catch (error) {
                throw new Error('ترمیم نہیں کی جا سکی: ' + error);
            }
        }

        // مندرجات صفحہ کے ہر جز پر کام کرنے کے لیے
        const processPart = (part, replacements) => {
            replacements.forEach(([incorrect, correct]) => {
                const regex = new RegExp(incorrect, 'g');
                part = part.replace(regex, correct);
            });
            part = peshkarFunctions.formatText(part);

            return part;
        };

        // سانچوں اور روابط کو اصلاح سے مستثنیٰ رکھنے کے لیے
        const replaceOutside = function(text, replacements) {
            const parts = text.split(/(\[\[[\s\S]*?\]\]|\{\{[\s\S]*?\}\})/); // ریجیکس براے سانچہ و روابط
            for (let i = 0; i < parts.length; i++) {
                // محض ان الفاظ کی اصلاح کی جائے جو ویکی ربط یا سانچوں سے خارج ہوں
                if (!parts[i].startsWith('[[') && !parts[i].startsWith('{{')) {
                    parts[i] = processPart(parts[i], replacements);
                }
            }
            return parts.join('');
        };

        // اصل فنکشن
        async function imla(words, correctInfobox) {
            try {
                const pageTitle = mw.config.get('wgPageName');
                let pageContent = await loadPage(pageTitle);
                const originalContent = pageContent;

                // اگر خانۂ معلومات کی ترتیب مقصود ہو
                if (correctInfobox) {
                    pageContent = peshkarFunctions.extractTemplates(pageContent, infoboxKeywords);
                }

                // اگر خانۂ معلومات نہ ہو تو اسے شامل کیا جائے
                pageContent = await peshkarAddInfobox.addInfobox(pageContent);

                // پہلے انگریزی کے سرخ روابط تبدیل کیے جائیں
                pageContent = await peshkarTranslateLinks.translateEnlinks(pageContent);

                // پھر حسب موقع دو زبر لگائیں جائیں 
                pageContent = peshkarFunctions.addDoZabar(doZabarWords, pageContent);

                // بعد ازاں صفحہ کے بقیہ مندرجات پر اصلاح کا عمل ہو
                pageContent = replaceOutside(pageContent, words);
                pageContent = peshkarFunctions.decodeHTMLSymbolEntitiesCodes(pageContent);
                pageContent = peshkarFunctions.wikiSubsection(pageContent);
                pageContent = peshkarFunctions.SubSectionLeveling(pageContent);
                pageContent = peshkarFunctions.wikiUrlMinifier(pageContent);
                pageContent = peshkarFunctions.wikitranslateEnMonth(pageContent);
                pageContent = peshkarFunctions.autoFormatCleanReferences(pageContent);
                pageContent = peshkarFunctions.autoFormatCleanTags(pageContent);
                pageContent = peshkarFunctions.autoFormatCleanDuplicateLinks(pageContent);
                pageContent = peshkarFunctions.addColumnToRefTemplate(pageContent);
                pageContent = peshkarFunctions.fixBadLinks(pageContent);
                pageContent = peshkarFunctions.robustToEnglishDigits(pageContent);
                pageContent = peshkarFunctions.toEnglishDigits(pageContent);
                pageContent = peshkarFunctions.cleanTemplateBracesFromArticle(pageContent, true);
                pageContent = peshkarFunctions.removeCheckDict(pageContent);
                pageContent = peshkarFunctions.sortCategories(pageContent);
                pageContent = peshkarFunctions.autoEdISBN(pageContent);
                pageContent = peshkarFunctions.autoEdWhitespace(pageContent);
                pageContent = peshkarFunctions.autoEdHTMLtoWikitext(pageContent);
                pageContent = peshkarFunctions.autoEdHeadlines(pageContent);
                pageContent = peshkarFunctions.autoEdTablestoWikitext(pageContent);
                pageContent = peshkarFunctions.replaceBey(pageContent);
                pageContent = peshkarFunctions.replaceMand(pageContent);
                pageContent = peshkarFunctions.autoEdExtraBreaks(pageContent);

                const imlaCorrected = originalContent !== pageContent;
                if (imlaCorrected) {
                    await savePage(pageTitle, pageContent); // اصلاحات کو صفحہ میں محفوظ کیا جا رہا ہے
                    peshkarFunctions.openDiffPage(pageTitle); // اصلاحات کے بعد فرق صفحہ کھولنے کے لیے
                } else { // اگر اصلاح کی ضرورت نہ ہو تو
                    peshkarFunctions.removeStatusAnimation();
                    mw.notify('اِس صفحہ میں اصلاح کی ضرورت محسوس نہیں ہوئی۔', {
                        autoHide: true,
                        tag: 'peshkar-notification',
                        className: 'peshkar-notice'
                    });
                }
            } catch (error) {
                peshkarFunctions.removeStatusAnimation();
                mw.notify(error.message);
            }
        }

        // ڈائیلاگ باکس کا فنکشن
        function showPeshkarDialog() {
            let peshkar = document.createElement('div');
            peshkar.id = 'peshkarModal';

            let peshkarContent = document.createElement('div');
            peshkarContent.id = 'peshkarContent';
            peshkarContent.className = 'clearfix'; // Clearfix class to clear the floats

            let peshkarName = document.createElement('div');
            peshkarName.id = 'peshkarTitle';
            let peshkarText = document.createTextNode('ویکی پیش کار (نسخۂ دوم)');
            peshkarName.appendChild(peshkarText);
            peshkarContent.appendChild(peshkarName);

            let peshkarHeader = document.createElement('div');
            peshkarHeader.id = 'peshkarHeader';
            let titleText = document.createTextNode('کیا آپ واقعی املا کی غلطیوں کو خودکار طور پر درست کرنا چاہتے ہیں؟');
            peshkarHeader.appendChild(titleText);
            peshkarContent.appendChild(peshkarHeader);

            let checkbox = document.createElement('input');
            checkbox.type = 'checkbox';
            checkbox.id = 'infoboxCheckbox';
            let label = document.createElement('label');
            label.htmlFor = 'infoboxCheckbox';
            label.appendChild(document.createTextNode('اور ساتھ ہی خانۂ معلومات کی تنظیم و ترتیب بھی مقصود ہے؟'));
            label.id = 'infoboxCheckboxText';
            peshkarContent.appendChild(checkbox);
            peshkarContent.appendChild(label);
            let br = document.createElement('br');
            br.id = 'lineBreakSpace';
            peshkarContent.appendChild(br);

            let listHeader = document.createElement('div');
            listHeader.id = 'listHeader';
            let headerText = document.createTextNode('اگر آپ خانۂ معلومات کو مرتب کرنے کی غرض سے اس آپشن کو استعمال کر رہے ہیں تو درج ذیل ہدایات کو بغور ملاحظہ فرمائیں:');
            listHeader.appendChild(headerText);
            peshkarContent.appendChild(listHeader);

            let ul = document.createElement('ul');
            ul.id = 'durustiList';

            let li1 = document.createElement('li');
            li1.textContent = 'اس آپشن کو اسی وقت استعمال کریں جب خانۂ معلومات کے تمام پیرامیٹر علاحدہ سطروں کی بجائے ایک ہی سطر میں درج ہوں اور خانۂ معلومات کی حالت ابتر ہو۔';
            ul.appendChild(li1);

            let li2 = document.createElement('li');
            li2.textContent = 'اسے استعمال کرتے وقت یہ ملحوظ رکھیں کہ خانۂ معلومات میں موجود دوسرے سانچوں کی فارمیٹنگ میں بھی تبدیلی ہو جاتی ہے جس کی بنا پر بعض سانچے درست نظر نہیں آتے۔';
            ul.appendChild(li2);

            let li3 = document.createElement('li');
            li3.textContent = 'اگر ایسا ہو تو اس آلہ سے ترمیم کے بعد آپ دوبارہ خانۂ ترمیم میں جا کر ان تبدیل شدہ سانچوں کے پیرامیٹر کو بدست خود درست کر دیں۔';
            ul.appendChild(li3);

            peshkarContent.appendChild(ul);

            let closeButton = document.createElement('button');
            closeButton.textContent = 'منسوخ کریں';
            closeButton.className = 'closeButton';
            closeButton.onclick = function() {
                peshkar.style.display = 'none';
                document.body.removeChild(peshkar);
            };
            peshkarContent.appendChild(closeButton);

            let acceptButton = document.createElement('button');
            acceptButton.textContent = 'جی ہاں';
            acceptButton.className = 'acceptButton';
            acceptButton.onclick = function() {
                let checkboxValue = document.getElementById('infoboxCheckbox').checked;
                imla(imlaWords, checkboxValue); // Call the imla function with the checkbox value
                peshkar.style.display = 'none';
                document.body.removeChild(peshkar);
                peshkarFunctions.showStatusAnimation();
            };
            peshkarContent.appendChild(acceptButton);
            peshkar.appendChild(peshkarContent);
            document.body.appendChild(peshkar);

            $("#peshkarModal").draggable().resizable();
        }

        function addPortletLink() {
            const peshkarPosition = document.querySelector('#ca-watch, #ca-unwatch');
            if (peshkarPosition) {
                const portlet = mw.util.addPortletLink(
                    'right-navigation',
                    '#',
                    'پیش‌کار',
                    'p-peshkar',
                    'پیش نظر صفحہ میں موجود املا اور فارمیٹنگ کی غلطیوں کو خودکار طور پر درست کریں [alt + shift + p]',
                    null,
                    peshkarPosition
                );
                portlet.addEventListener('click', function(event) {
                    event.preventDefault();
                    showPeshkarDialog();
                });

                document.addEventListener('keydown', function(event) {
                    if (event.altKey && event.shiftKey && event.key === 'p') {
                        showPeshkarDialog();
                    }
                });
            }
        }
        addPortletLink();
    });
});