انتقل إلى المحتوى

مستخدم:ASammour/newCatMaker.js

من ويكيبيديا، الموسوعة الحرة

ملاحظة: بعد الحفظ، قد يلزمك إفراغ الكاش لرؤية التغييرات.

$(function () {

      $.when(mw.loader.using('mediawiki.util'), $.ready).then(function () {
            mw.util.addPortletLink('p-tb', '/wiki/وب:منتص', 'منشئ  التصانيف الجديد', 'ca-catmaker', 'الانتقال إلى منشئ التصانيف الجديد');
      });


      if (mw.config.get('wgArticleId') == 9558529 && mw.config.get('wgAction') == "view") {

            async function pageIsExist(title, language) {
                  try {
                        const selectedLanguage = language;

                        const api = new mw.ForeignApi(`https://${selectedLanguage}.wikipedia.org/w/api.php`);

                        const params = {
                              action: 'query',
                              titles: title.replace(/ /g, '_'), // Replace spaces with underscores
                              format: 'json',
                              prop: 'pageprops'
                        };

                        const data = await api.post(params);

                        return ((typeof data.query.pages["-1"] != "undefined") ? false : true);

                  } catch (error) {
                        console.error("Error:", error);
                        return false;
                  }
            }

            async function createCat(secondCat, content) {

                  try {

                        new mw.Api().create(secondCat,
                              {
                                    summary: 'إنشاء تصنيف باستخدام [[وب:منتص|منشئ التصانيف الجديد]]'
                              },
                              content
                        ).done(function () {
                              addToLogs("تم إنشاء التصنيف بنجاح!");
                        }).fail(function () {
                              addToLogs("حدث خطأ أثناء عملية إنشاء التصنيف. حاول مرة أخرى.");
                        });

                  } catch (error) {
                        console.error("Error:", error);
                        return false;
                  }
            }


            async function addCat(secondCat, title) {

                  try {
                        new mw.Api().edit(
                              title,
                              function () {
                                    return {
                                          appendtext: "\n[[" + secondCat.replace(/_/g, " ") + "]]",
                                          summary: "إضافة " + "[[" + secondCat.replace(/_/g, " ") + "]] بواسطة [[وب:منتص]]",
                                          minor: true,
                                    };
                              }
                        );
                        addToLogs("تم إضافة التصنيف إلى صفحة " + title);

                  } catch (error) {
                        console.error("Error:", error);
                        return false;
                  }
            }

            async function getSubCats(firstCat, secondCat, language, namespace) {

                  addToLogs("محاولة إضافة وصلة للتصنيف الجديد لـ 3 مقالات/تصانيف على الأكثر");

                  var counter = 0;

                  try {
                        const selectedLanguage = language;

                        const api = new mw.ForeignApi(`https://${selectedLanguage}.wikipedia.org/w/api.php`);

                        const params = {
                              cmtitle: firstCat.replace(/ /g, '_'), // Replace spaces with underscores
                              action: "query",
                              list: "categorymembers",
                              cmnamespace: namespace,
                              cmlimit: "500",

                        };

                        const data = await api.post(params);

                        if (typeof data.query.categorymembers.length != 0) {

                              for (var i = 0; ((i < data.query.categorymembers.length) && counter <= 3); i++) {
                                    var isExist = await getSiteLink(await getWikidataItem(data.query.categorymembers[i].title, selectedLanguage));
                                    if (isExist != "") {
                                          addToLogs("إضافة وصلة للتصنيف في صفحة " + isExist);

                                          addCat(secondCat, isExist);
                                          counter++;
                                    }
                              }


                        }

                  } catch (error) {
                        console.error("Error:", error);
                        return false;
                  }
            }


            async function setArSitelink(secondCat, wikidataItem) {

                  try {
                        const api = new mw.ForeignApi(`https://www.wikidata.org/w/api.php`);

                        await api.get({
                              action: 'query',
                              meta: 'tokens'
                        }).done(function (data) {
                              api.post({
                                    action: "wbsetsitelink",
                                    id: wikidataItem,
                                    linksite: "arwiki",
                                    token: data.query.tokens.csrftoken,
                                    linktitle: secondCat.replace(/_/g, ' '),
                              });
                              addToLogs("تم إضافة وصلة التصنيف العربي إلى عنصر ويكي بيانات");
                        });
                  } catch (error) {
                        console.error("Error:", error);
                        return false;
                  }
            }


            async function setArLabel(secondCat, wikidataItem) {

                  try {
                        const api = new mw.ForeignApi(`https://www.wikidata.org/w/api.php`);


                        await api.get({
                              action: 'query',
                              meta: 'tokens'
                        }).done(function (data) {
                              api.post({
                                    action: "wbsetlabel",
                                    id: wikidataItem,
                                    language: "ar",
                                    token: data.query.tokens.csrftoken,
                                    value: secondCat.replace(/_/g, ' '),
                              });
                              addToLogs("تم إضافة تسمية إلى عنصر ويكي بيانات الجديد");
                        });



                  } catch (error) {
                        console.error("Error:", error);
                        return false;
                  }
            }

            async function setArDescription(secondCat, wikidataItem) {

                  try {
                        const api = new mw.ForeignApi(`https://www.wikidata.org/w/api.php`);

                        await api.get({
                              action: 'query',
                              meta: 'tokens'
                        }).done(function (data) {
                              api.post({
                                    action: "wbsetdescription",
                                    id: wikidataItem,
                                    language: "ar",
                                    token: data.query.tokens.csrftoken,
                                    value: 'تصنيف ويكيميديا',
                              });
                              addToLogs("تم إضافة وصف إلى عنصر ويكي بيانات الجديد");
                        });

                  } catch (error) {
                        console.error("Error:", error);
                        return false;
                  }
            }

            async function getSiteLink(wikidataItem) {
                  var siteLink = "";

                  try {
                        const api = new mw.ForeignApi(`https://www.wikidata.org/w/api.php`);

                        const params = {
                              action: 'wbgetentities',
                              ids: wikidataItem,
                              sites: 'arwiki', // Specify "arwiki" for Arabic Wikipedia
                              format: 'json'
                        };

                        const data = await api.post(params);


                        if (typeof data.entities[wikidataItem].sitelinks.arwiki == "undefined") {
                              siteLink = "";
                        }
                        else {
                              siteLink = data.entities[wikidataItem].sitelinks.arwiki.title;
                        }

                        return siteLink;

                  } catch (error) {
                        console.error("Error:", error);
                        return false;
                  }
            }

            async function getWikidataItem(title, language) {

                  var wikidataItem = "";

                  try {

                        const api = new mw.ForeignApi(`https://${language}.wikipedia.org/w/api.php`);

                        const params = {
                              action: 'query',
                              titles: title, // Replace spaces with underscores
                              format: 'json',
                              prop: 'pageprops',
                              formatversion: "2"
                        };

                        const data = await api.post(params);


                        if (data.query.pages[0].pageprops.wikibase_item == "undefined") {
                              wikidataItem = "";
                        }
                        else {
                              wikidataItem = (data.query.pages[0].pageprops.wikibase_item);
                        }

                        return wikidataItem;

                  } catch (error) {
                        console.error("Error:", error);
                        return false;
                  }
            }


            //فحص إذا كان صندوق النص الأجنبي فارغا
            async function step1A(firstCat, secondCat, language) {

                addToLogs("يجري الآن فحص المدخلات...");
                
                  if (firstCat == "") {
                        addToLogs("هل تم تحديد قيمة للتصنيف الأجنبي؟. ❌");
                        addToLogs("⏸ انتهاء ⏸");
                  }

                  else if (firstCat != "") {
                        addToLogs("هل تم تحديد قيمة للتصنيف الأجنبي؟. ✅");
                        step1B(firstCat, secondCat, language);
                  }
            }

            //فحص إذا كان صندوق النص العربي فارغا
            async function step1B(firstCat, secondCat, language) {

                  if (secondCat == "") {
                        addToLogs("هل تم تحديد قيمة للتصنيف العربي. ❌");
                        addToLogs("⏸ انتهاء ⏸");
                  }

                  else if (secondCat != "") {
                        addToLogs("هل تم تحديد قيمة للتصنيف العربي. ✅");
                        step2A(firstCat, secondCat, language);
                  }
            }

            //فحص إذا كان كان التصنيف الأجنبي هو عنوان لتصنيف
            async function step2A(firstCat, secondCat, language) {

                  addToLogs("يجري الآن فحص المدخلات...");

                  if (!firstCat.toLowerCase().startsWith("category:") && !firstCat.toLowerCase().startsWith("catégorie:")) {
                        addToLogs("هل عنوان التصنيف الأجنبي صحيح؟. ❌");
                        addToLogs("⏸ انتهاء ⏸");
                  }

                  else {
                        addToLogs("هل عنوان التصنيف الأجنبي صحيح؟. ✅");
                        step2B(firstCat, secondCat, language);
                  }
            }

            //فحص إذا كان التصنيف العربي هو عنوان لتصنيف
            async function step2B(firstCat, secondCat, language) {

                  if (!secondCat.startsWith("تصنيف:")) {
                        addToLogs("هل عنوان التصنيف العربي صحيح؟. ❌");
                        addToLogs("⏸ انتهاء ⏸");
                  }

                  else {
                        addToLogs("هل عنوان التصنيف العربي صحيح؟.  ✅");
                        step3A(firstCat, secondCat, language);
                  }
            }

            //فحص إذا كان التصنيف الأجنبي موجود
            async function step3A(firstCat, secondCat, language) {


                  const pageExists = await pageIsExist(firstCat, language);

                  if (pageExists) {
                        step3B(firstCat, secondCat, language);
                  }
                  else {
                        addToLogs("لا يمكن إكمال العملية؛ لأن التصنيف الأجنبي غير موجود بنفس العنوان في ويكيبيديا " + $("#languageList>select").find(":selected").text());
                        addToLogs("⏸ انتهاء ⏸");
                  }
            }

            //فحص إذا كان التصنيف العربي غير موجود
            async function step3B(firstCat, secondCat, language) {


                  const pageExists1 = await pageIsExist(secondCat, "ar");

                  if (pageExists1) {
                        addToLogs("لا يمكن إكمال العملية؛ لأن التصنيف العربي موجود فعلًا في ويكيبيديا العريبة بنفس الاسم");
                        addToLogs("⏸ انتهاء ⏸");
                  }
                  else {
                        addToLogs("عنوان التصنيف العربي غير موجود في ويكيبيديا العربية✅.");
                        step4(firstCat.replace(/ /g, '_'), secondCat, language);
                  }
            }


            //جلب قيمة عنصر ويكي بيانات للتصنيف الأجنبي
            async function step4(firstCat, secondCat, language) {

                  addToLogs("يتم جلب قيمة عنصر ويكي بيانات للتصنيف: " + firstCat);

                  var wikidataItem = await getWikidataItem(firstCat, language);

                  if (wikidataItem == "") {
                        addToLogs("لا يمكن الاستمرار في العملية؛ لأن التصنيف الأجنبي ليس له عنصر ويكي بيانات.");
                        addToLogs("⏸ انتهاء ⏸");
                  }
                  else {
                        addToLogs(wikidataItem);
                        step5(firstCat, secondCat, language, wikidataItem);
                  }

            }

            //تحقق من أن عنصر ويكي بيانات غير موصول بتصنيف في ويكيبيديا العربية
            async function step5(firstCat, secondCat, language, wikidataItem) {

                  try {

                        var siteLink = await getSiteLink(wikidataItem);

                        addToLogs("التحقق إذا كان التصنيف الإنجليزي موصول بتصنيف في ويكيبيديا العربية");

                        if (siteLink == "") {
                              addToLogs("التصنيف غير موصول");
                              step6(firstCat, secondCat, language, wikidataItem);
                        }
                        else {
                              addToLogs("عذرًا. لا يمكن الاستمرار؛ لأن التصنيف الإنجليزي مرتبط بتصنيف في ويكيبيديا العربية");
                              addToLogs("⏸ انتهاء ⏸");
                        }

                  } catch (error) {
                        console.error("Error:", error);
                        return false;
                  }
            }

            //التحقق من أن التصنيف له أي وصلة في المشاريع الشقيقة
            async function step6(firstCat, secondCat, language, wikidataItem) {
                  var hasSisterLink = "";

                  try {
                        const api = new mw.ForeignApi(`https://www.wikidata.org/w/api.php`);

                        const params = {
                              action: 'wbgetentities',
                              ids: wikidataItem,
                              sites: 'arwiki', // Specify "arwiki" for Arabic Wikipedia
                              format: 'json'
                        };

                        const data = await api.post(params);

                        addToLogs("التحقق إذا كان التصنيف الإنجليزي موصول بمشاريع شقيقة");

                        if (typeof data.entities[wikidataItem].sitelinks.commonswiki != "undefined") {
                              addToLogs("موجود في كومنز: " + data.entities[wikidataItem].sitelinks.commonswiki.title);
                              hasSisterLink = hasSisterLink + "|commons = " + data.entities[wikidataItem].sitelinks.commonswiki.title;
                        }

                        if (typeof data.entities[wikidataItem].sitelinks.arwikisource != "undefined") {
                              addToLogs("موجود في ويكي مصدر: " + data.entities[wikidataItem].sitelinks.arwikisource.title);
                              hasSisterLink = hasSisterLink + "|source  = " + data.entities[wikidataItem].sitelinks.arwikisource.title;
                        }

                        if (typeof data.entities[wikidataItem].sitelinks.arwikibooks != "undefined") {
                              addToLogs("موجود في ويكي الكتب: " + data.entities[wikidataItem].sitelinks.arwikibooks.title);
                              hasSisterLink = hasSisterLink + "|books = " + data.entities[wikidataItem].sitelinks.arwikibooks.title;
                        }

                        if (typeof data.entities[wikidataItem].sitelinks.arwikinews != "undefined") {
                              addToLogs("موجود في ويكي الأخبار: " + data.entities[wikidataItem].sitelinks.arwikinews.title);
                              hasSisterLink = hasSisterLink + "|news = " + data.entities[wikidataItem].sitelinks.arwikinews.title;
                        }


                        if (typeof data.entities[wikidataItem].sitelinks.arwikivoyage != "undefined") {
                              addToLogs("موجود في ويكي الرحلات: " + data.entities[wikidataItem].sitelinks.arwikivoyage.title);
                              hasSisterLink = hasSisterLink + "|voyage = " + data.entities[wikidataItem].sitelinks.arwikivoyage.title;
                        }


                        if (typeof data.entities[wikidataItem].sitelinks.arwikiversity != "undefined") {
                              addToLogs("موجود في ويكي الجامعة: " + data.entities[wikidataItem].sitelinks.arwikiversity.title);
                              hasSisterLink = hasSisterLink + "|versity = " + data.entities[wikidataItem].sitelinks.arwikiversity.title;
                        }


                        if (typeof data.entities[wikidataItem].sitelinks.arwikitionary != "undefined") {
                              addToLogs("موجود في ويكياموس: " + data.entities[wikidataItem].sitelinks.arwikitionary.title);
                              hasSisterLink = hasSisterLink + "|tionary = " + data.entities[wikidataItem].sitelinks.arwikitionary.title;
                        }

                        if (typeof data.entities[wikidataItem].sitelinks.arwikiquote != "undefined") {
                              addToLogs("موجود في ويكي اقتباس: " + data.entities[wikidataItem].sitelinks.arwikiquote.title);
                              hasSisterLink = hasSisterLink + "|quote = " + data.entities[wikidataItem].sitelinks.arwikiquote.title;
                        }

                        step7(firstCat, secondCat, language, wikidataItem, hasSisterLink);

                  } catch (error) {
                        console.error("Error:", error);
                        return false;
                  }
            }


            //التحقق من أن التصنيف له مقالة رئيسية
            async function step7(firstCat, secondCat, language, wikidataItem, hasSisterLink) {

                  try {
                        const api = new mw.ForeignApi(`https://www.wikidata.org/w/api.php`);

                        const params = {
                              action: 'wbgetentities',
                              ids: wikidataItem,
                              props: 'claims', // Request claims for the item
                              claim: 'P301',   // Specifically request claim for property "P301"
                              format: 'json'
                        };

                        const data = await api.post(params);

                        addToLogs("التحقق إذا كان التصنيف الأجنبي له مقالة رئيسية");

                        if (typeof data.entities[wikidataItem].claims["P301"] == "undefined") {
                              addToLogs("لا توجد مقالة رئيسية");
                              step8(firstCat, secondCat, language, wikidataItem, hasSisterLink, "");
                        }
                        else {
                              addToLogs("يوجد مقالة رئيسية");
                              
                              addToLogs("التحقق من أن المقالة الرئيسية موجودة في ويكيبيديا العربية");
                              
                              var isExist = await getSiteLink(data.entities[wikidataItem].claims["P301"][0].mainsnak.datavalue.value.id, "ar");
                              
                              if (isExist == ""){
                              	addToLogs("لا توجد مقالة مقابلة في ويكيبيديا العربية");
                            	step8(firstCat, secondCat, language, wikidataItem, hasSisterLink, isExist);
                              }
                              else{
                              	addToLogs("يوجد مقالة مقابلة في ويكيبيديا العربية: "+isExist);
                              	step8(firstCat, secondCat, language, wikidataItem, hasSisterLink, isExist);
                              }
                        }

                  } catch (error) {
                        console.error("Error:", error);
                        return false;
                  }
            }



            //التحقق من أن التصنيف يحتوي على أي بوابة
            async function step8(firstCat, secondCat, language, wikidataItem, hasSisterLink, mainTopic) {
                  addToLogs("فحص إذا كان التصنيف الأجنبي يحتوي على أي بوابات");

                  var portals = "{{شريط بوابات";
                  try {
                        const selectedLanguage = language;

                        const api = new mw.ForeignApi(`https://${selectedLanguage}.wikipedia.org/w/api.php`);

                        const params = {
                              "action": "query",
                              "prop": "links",
                              "titles": firstCat.replace(/ /g, '_'),
                              "plnamespace": "100",
                              "formatversion": "2"
                        };

                        const data = await api.post(params);

                        if (typeof data.query.pages[0].links != "undefined") {
                              for (var i = 0; i < data.query.pages[0].links.length; i++) {
                                    var isExist = await getSiteLink(await getWikidataItem(data.query.pages[0].links[i].title, selectedLanguage));
                                    if (isExist != "") {
                                          addToLogs("إضافة " + isExist);
                                          portals = portals + "|" + isExist.replace("بوابة:", "");
                                    }
                              }
                        }

                        if (portals == "{{شريط بوابات") {
                              portals = "";
                        }
                        else {
                              portals = portals + "}}";
                        }

                        step9(firstCat, secondCat, language, wikidataItem, hasSisterLink, mainTopic, portals);


                  } catch (error) {
                        console.error("Error:", error);
                        return false;
                  }
            }

            //جلب التصانيف الموجودة في ويكيبيديا العربية
            async function step9(firstCat, secondCat, language, wikidataItem, hasSisterLink, mainTopic, portals) {
                  var content = "";

                  if (hasSisterLink != "") {
                        content = content + "{{روابط شقيقة"+hasSisterLink+"}}\n";
                  }

                  if (mainTopic != "") {
                        content = content + "{{مقالة تصنيف|"+mainTopic+"}}\n";
                  }

                  content = content + portals + "\n";

                  addToLogs("تجهيز النص النهائي");

                  try {
                        const selectedLanguage = language;

                        const api = new mw.ForeignApi(`https://${selectedLanguage}.wikipedia.org/w/api.php`);

                        const params = {
                              "action": "query",
                              "prop": "categories",
                              "titles": firstCat.replace(/_/g, ' '),
                              "clshow": "!hidden",
                              cllimit: "500",
                              "formatversion": "2"
                        };

                        const data = await api.post(params);

                        addToLogs("إضافة تصانيف داخل التصنيف العربي");

                        if (typeof data.query.pages[0].categories != "undefined") {
                              for (var i = 0; i < data.query.pages[0].categories.length; i++) {
                                    var isExist = await getSiteLink(await getWikidataItem(data.query.pages[0].categories[i].title, selectedLanguage));
                                    if (isExist != "") {
                                          addToLogs(isExist);
                                          content = content + "[[" + isExist + "]]\n";
                                    }
                              }
                        }

                        addToLogs("النص النهائي هو: \n\n");

                        addToLogs(content);

                        step10(firstCat, secondCat, language, content, wikidataItem);

                  } catch (error) {
                        console.error("Error:", error);
                        return false;
                  }
            }


            async function step10(firstCat, secondCat, language, content, wikidataItem) {
                  await createCat(secondCat, content);
                  
                  await new Promise(r => setTimeout(r, 2000)); //sleep
                  
                  await setArSitelink(secondCat, wikidataItem);
                  await setArDescription(secondCat, wikidataItem);
                  await setArLabel(secondCat, wikidataItem);

                  await getSubCats(firstCat, secondCat, language, 0);
                  await getSubCats(firstCat, secondCat, language, 14);
                  addToLogs("⏸ انتهاء ⏸");
            }


            function addToLogs(newLog) {
                  $('#logsInput>textarea').val(function (i, text) {
                        return text + newLog + "\n";
                  });

                  $('#logsInput>textarea').scrollTop($('#logsInput>textarea')[0].scrollHeight - $('#logsInput>textarea').height());
            }

            mw.loader.using('oojs-ui-core').done(function () {
                  $(function () {
                        logsInputLabel = new OO.ui.FieldsetLayout({
                              label: 'سجل العمليات'
                        });

                        var logsInput = new OO.ui.MultilineTextInputWidget({
                              value: 'هنا ستظهر جميع المعلومات عن تسلسل العمليات التي تحدث خلال عملية إنشاء التصنيف',
                              disabled: true,
                              id: "logsInput"
                        });

                        firstCatInputLabel = new OO.ui.FieldsetLayout({
                              label: 'اسم التصنيف الأجنبي'

                        });


                        var firstCatInput = new OO.ui.TextInputWidget({
                              placeholder: 'مثال (Category:Payment networks)',
                              id: "firstCatInput"
                        });

                        secondCatInputLabel = new OO.ui.FieldsetLayout({
                              label: 'اسم التصنيف العربي'
                        });

                        var secondCatInput = new OO.ui.TextInputWidget({
                              placeholder: 'مثال (تصنيف:شبكات دفع)',
                              id: "secondCatInput"
                        });



                        languageListLabel = new OO.ui.FieldsetLayout({
                              label: 'اختر اللغة التي تريد استيراد التصنيف منها'
                        });


                        var languageList = new OO.ui.DropdownInputWidget({
                              options: [
                                    { data: 'en', label: 'الإنجليزية' },
                                    { data: 'fr', label: 'الفرنسية' },
                              ],
                              id: "languageList"
                        });


                        var saveButton = new OO.ui.ButtonWidget({
                              //disabled:true
                        });

                        saveButton.setIcon('checkAll')
                              .setLabel('إنشاء!')
                              .setFlags('progressive');

                        saveButton.on('click', async function () {
                              $("#logsInput>textarea").val("");

                              step1A($("#firstCatInput>input").val(), $("#secondCatInput>input").val(), $("#languageList>select").find(":selected").attr("value"));

                        });

                        $('#mw-content-text').append(

                              languageListLabel.$element,
                              languageList.$element,
                              "<div style = 'max-width: 50em;border-top: 3px dashed #bbb;margin:20px 0px;'></div>",

                              firstCatInputLabel.$element,
                              firstCatInput.$element,
                              "<div style = 'max-width: 50em;border-top: 3px dashed #bbb;margin:20px 0px;'></div>",

                              secondCatInputLabel.$element,
                              secondCatInput.$element,
                              "<div style = 'max-width: 50em;border-top: 3px dashed #bbb;margin:20px 0px;'></div>",

                              logsInputLabel.$element,
                              logsInput.$element,

                              "<div style = 'max-width: 50em;border-top: 3px dashed #bbb;margin:20px 0px;'></div>",

                              saveButton.$element

                        );
                        $("#logsInput>textarea").css("min-height", "150px");
			            $("#logsInput>textarea").css("overflow", "scroll");
			            $("#logsInput>textarea").css("max-height", "150px");

                  });
            });

      }
});