مستخدم:ASammour/newCatMaker.js
المظهر
يمكن توفير توثيق لسكربت المستخدم هذا في الصفحة : مستخدم:ASammour/newCatMaker. |
ملاحظة: بعد الحفظ، قد يلزمك إفراغ الكاش لرؤية التغييرات.
$(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");
});
});
}
});