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

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

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

var peshkarToWikidata = (function() {

    // انگریزی کا بین الویکی ربط اخذ کیا جا رہا ہے
    async function getEnIWLink(pageContent) {
        const regex = /\[\[en:([^\]]+)\]\]/;
        const match = pageContent.match(regex);
        return match ? match[1] : null;
    }

    async function getEnArticle(pageContent) {
        const englishInterwiki = pageContent ? await getEnIWLink(pageContent) : null;
        return englishInterwiki ? englishInterwiki.replace(/ /g, '_') : null;
    }

    // ویکی ڈیٹا آئٹم کی تخلیق
    async function createWikidataItem(urduTitle, englishTitle) {
        try {
            const api = new mw.ForeignApi(`https://www.wikidata.org/w/api.php`);

            const tokenData = await api.get({
                action: 'query',
                meta: 'tokens'
            });

            const token = tokenData.query.tokens.csrftoken;

            const createData = {
                action: 'wbeditentity',
                new: 'item',
                token: token,
                data: JSON.stringify({
                    labels: {
                        ur: {
                            language: 'ur',
                            value: urduTitle
                        },
                        en: {
                            language: 'en',
                            value: englishTitle.replace(/_/g, ' ')
                        }
                    },
                    sitelinks: {
                        urwiki: {
                            site: 'urwiki',
                            title: urduTitle
                        },
                        enwiki: {
                            site: 'enwiki',
                            title: englishTitle
                        }
                    }
                })
            };

            const response = await api.post(createData);
            console.log('Wikidata item created successfully.');
            return response.entity.id;

        } catch (error) {
            console.error('Error creating Wikidata item:', error);
            return null;
        }
    }

    async function getWikidataItem(title) {
        const endpoint = 'https://en.wikipedia.org/w/api.php';
        const params = new URLSearchParams({
            action: 'query',
            titles: title,
            prop: 'pageprops',
            format: 'json',
            formatversion: 2
        });

        try {
            const response = await fetch(`${endpoint}?origin=*&${params.toString()}`, {
                method: 'GET',
                headers: {
                    'Content-Type': 'application/json'
                }
            });
            const data = await response.json();
            if (data.query && data.query.pages[0].pageprops.wikibase_item) {
                return data.query.pages[0].pageprops.wikibase_item;
            }
        } catch (error) {
            console.error('Error fetching Wikidata item:', error);
            return null;
        }
    }

    async function updateWikidataItem(urduTitle, wikidataItem) {
        try {
            const api = new mw.ForeignApi(`https://www.wikidata.org/w/api.php`);

            const tokenData = await api.get({
                action: 'query',
                meta: 'tokens'
            });

            const token = tokenData.query.tokens.csrftoken;

            // Set sitelink
            await api.post({
                action: "wbsetsitelink",
                id: wikidataItem,
                linksite: "urwiki",
                token: token,
                linktitle: urduTitle
            });

            // Set label
            await api.post({
                action: "wbsetlabel",
                id: wikidataItem,
                language: "ur",
                token: token,
                value: urduTitle
            });

            console.log('Wikidata item updated successfully.');
            return true;

        } catch (error) {
            console.error('Error updating Wikidata item:', error);
            return false;
        }
    }

    async function processPageContent(pageContent) {
        const urduTitle = mw.config.get('wgPageName').replace(/_/g, ' ');
        const englishTitle = await getEnArticle(pageContent);

        if (englishTitle) {
            let wikidataItem = await getWikidataItem(englishTitle);

            if (!wikidataItem) {
                wikidataItem = await createWikidataItem(urduTitle, englishTitle);
            }

            if (wikidataItem) {
                const updated = await updateWikidataItem(urduTitle, wikidataItem);
                if (updated) {
                    const regex = /\[\[en:([^\]]+)\]\]/;
                    return pageContent.replace(regex, ''); // حذف بین الویکی ربط
                }
            } else {
                console.log('Failed to create or update Wikidata item.');
            }
        } else {
            console.log('No English interwiki link found.');
        }

        return pageContent;
    }

    async function addLabelToWikidata(pageContent) {
        try {
            const pageTitle = mw.config.get('wgPageName').replace(/_/g, ' ');
            const wikidataItem = await getWikidataItemForLabel(pageTitle);

            if (wikidataItem) {
                const labelAdded = await addUrduLabel(wikidataItem, pageTitle);
                if (labelAdded) {
                    console.log('Urdu label added successfully to the Wikidata item.');
                } else {
                    console.log('Urdu label already exists or no changes were needed.');
                }
            } else {
                console.log('No Wikidata item found for the current article.');
            }

            return pageContent;
        } catch (error) {
            console.error('Error in addLabelToWikidata:', error);
            return pageContent;
        }
    }

    async function getWikidataItemForLabel(pageTitle) {
        const endpoint = 'https://ur.wikipedia.org/w/api.php';
        const params = new URLSearchParams({
            action: 'query',
            titles: pageTitle,
            prop: 'pageprops',
            format: 'json',
            formatversion: 2
        });

        try {
            const response = await fetch(`${endpoint}?origin=*&${params.toString()}`, {
                method: 'GET',
                headers: {
                    'Content-Type': 'application/json'
                }
            });
            const data = await response.json();
            if (data.query && data.query.pages[0].pageprops.wikibase_item) {
                return data.query.pages[0].pageprops.wikibase_item;
            }
        } catch (error) {
            console.error('Error fetching Wikidata item:', error);
            return null;
        }
    }

    async function addUrduLabel(wikidataItem, urduTitle) {
        try {
            const endpoint = 'https://www.wikidata.org/w/api.php';
            const api = new mw.ForeignApi(endpoint);

            const itemData = await api.get({
                action: 'wbgetentities',
                ids: wikidataItem,
                props: 'labels',
                languages: 'ur',
                format: 'json'
            });

            if (itemData.entities[wikidataItem].labels.ur) {
                return false;
            } else {
                const tokenData = await api.get({
                    action: 'query',
                    meta: 'tokens'
                });
                const token = tokenData.query.tokens.csrftoken;

                await api.postWithEditToken({
                    action: 'wbsetlabel',
                    id: wikidataItem,
                    language: 'ur',
                    value: urduTitle,
                    token: token
                });

                return true;
            }
        } catch (error) {
            console.error('Error checking or adding Urdu label:', error);
            return false;
        }
    }

    return {
        processPageContent: processPageContent,
        addLabelToWikidata: addLabelToWikidata
    };
}());

if (typeof window !== "undefined") {
    window.peshkarToWikidata = peshkarToWikidata;
}