მომხმარებელი:ԱշոտՏՆՂ/catSuggest.js
იერსახე
შენიშვნა: შენახვის შემდეგ შესაძლოა დაგჭირდეთ ბრაუზერის ქეშის გაწმენდა ცვლილებების სანახავად. Google Chrome, Firefox, Microsoft Edge და Safari: დააჭირეთ ⇧ Shift ღილაკს და შემდეგ - ღილაკს Reload.
//<nowiki>
$.when($.ready).then(function() {
var myApi = new mw.Api();
var wbApi = new mw.ForeignApi('https://www.wikidata.org/w/api.php');
var myCats = mw.config.get('wgCategories');
var possibleCats = {
'exists': {},
'missing': {}
};
var data = {};
var wdAdminQs = [
'Q15647814', // Wikimedia administration category
'Q30432511', // metacategory in Wikimedia projects
'Q24046192', // Wikimedia category of stubs
'Q20769287', // Wikimedia user category
'Q23894233', // Wikimedia templates category
'Q24514938', // Wikidata property usage tracking category
'Q30330522', // unknown parameters category
'Q38084761', // category for no label in Wikidata
'Q58118449' // Wikimedia modules category
];
function getOtherWikis() {
var otherWikis = {};
var interLanguageLinks = document.getElementsByClassName('interlanguage-link-target');
for (var i = interLanguageLinks.length - 1; i >= 0; i--) {
var code = interLanguageLinks[i].getAttribute('href').replace(/^https:\/\/(.+)\.wikipedia\.org.+$/, '$1');
if (code === 'be-x-old') {
code = 'be-tarask';
}
otherWikis[code] = {
'title': decodeURIComponent(interLanguageLinks[i].getAttribute('href').replace(/^.+\/wiki\//, '')),
'api': new mw.ForeignApi('https://' + code + '.wikipedia.org/w/api.php')
};
}
return otherWikis;
}
function getWbData(wiki, title) {
return wbApi.get({
"action": "wbgetentities",
"format": "json",
"sites": wiki,
"titles": title,
"props": "sitelinks/urls"
});
}
function isAdmin(item, isMissing) {
return wbApi.get({
"action": "wbgetclaims",
"format": "json",
"entity": item,
"property": "P31"
}).then(function(q) {
var base = possibleCats.exists;
if (isMissing) {
base = possibleCats.missing;
}
base[item].hidden = false;
for (var i = 0; i < q.claims.P31.length; i++) {
if (wdAdminQs.includes(q.claims.P31[i].mainsnak.datavalue.value.id)) {
base[item].hidden = true;
break;
}
}
});
}
function getOtherCategories(lang, data) {
function WbHelper(x) {
data[lang]['#doneCats']++;
if (!x.entities['-1']) {
var item = Object.keys(x.entities)[0];
if (x.entities[item].sitelinks.kawiki) {
if (!myCats.includes(x.entities[item].sitelinks.kawiki.title.replace('კატეგორია:', ''))) {
isAdmin(item, false);
if (possibleCats.exists[item]) {
possibleCats.exists[item].count++;
possibleCats.exists[item].wikis.push(lang);
} else {
possibleCats.exists[item] = {
'count': 1,
'title': x.entities[item].sitelinks.kawiki.title,
'wikis': [lang]
};
}
}
} else {
isAdmin(item, true);
if (possibleCats.missing[item]) {
possibleCats.missing[item].count++;
possibleCats.missing[item].wikis.push(lang);
} else {
possibleCats.missing[item] = {
'count': 1,
'sitelinks': x.entities[item].sitelinks,
'wikis': [lang]
};
}
}
}
}
function catHelper(cat) {
if (mw.config.get('wgNamespaceNumber') === 0 && cat.hidden === "") {
data[lang]['#doneCats']++;
return;
}
var titile = cat.title;
getWbData((lang === 'be-tarask' ? 'be_x_oldwiki' : lang.replace(/\-/g, '_') + "wiki"), titile).then(function(x) {
WbHelper(x);
});
}
data[lang].api.get({
"action": "query",
"format": "json",
"prop": "categories",
"titles": data[lang].title,
"clprop": "hidden",
"indexpageids": true,
"cllimit": 500
}).then(function(query) {
var id = query.query.pageids[0];
var categories = query.query.pages[id].categories;
data[lang]['#cats'] = categories.length;
data[lang]['#doneCats'] = 0;
for (var i in categories) {
catHelper(categories[i]);
}
});
}
function findPossibleCats(possibleCats, data) {
for (var lang in data) {
getOtherCategories(lang, data);
}
}
function getSorted(possibleCats) {
function comp(a, b) {
if (a.count > b.count) {
return 1;
}
if (a.count < b.count) {
return -1;
}
return 0;
}
var exists = [];
var missing = [];
for (var objExists in possibleCats.exists) {
exists.push(possibleCats.exists[objExists]);
}
for (var objMissing in possibleCats.missing) {
missing.push(possibleCats.missing[objMissing]);
}
return [exists.sort(comp).reverse(), missing.sort(comp).reverse()];
}
function processData(sortedCats) {
function removeUncat(text) {
return text.replace(/\{\{\s*([Uu]ncategorized|[Կկ]ատեգորիա չկա|[Կկ]չ)\s*[^}]*\}\}\s*(<!--.*?-->\s*)?/, '');
}
var div = '<input id="catSuggest-save" type="button" value="Ավելացնել ընդգծված կատեգորիաները"><div class="mw-ui-vform-field warningbox">Խնդրում ենք հաշվի առնել, որ այլ Վիքիպեդիայում կատեգորիայի առկայությունը չի նշանակում, որ այն պարտադիր պետք է լինի Հայերեն Վիքիպեդիայում։</div><div>';
var table1 = '<table style="float: left;" class="wikitable">' +
'<caption>Գոյություն ունեցող կատեգորիաներ</caption>' +
'<thead><tr>' +
'<th class="headerSort" tabindex="0" role="columnheader button">Կատեգորիա</th>' +
'<th class="headerSort" tabindex="0" role="columnheader button">Վիքիներ</th></tr></thead><tbody>';
for (var catExists in sortedCats[0]) {
if (mw.config.get('wgNamespaceNumber') === 0 && !sortedCats[0][catExists].hidden) {
table1 += '<tr><td class="catSuggest-potential">' + sortedCats[0][catExists].title.replace('კატეგორია:', '') + '</td><td>' + sortedCats[0][catExists].wikis.sort().join(', ') + '</td></tr>';
}
}
table1 += '</tbody><tfoot></tfoot></table>';
var table2 = '<table style="float: right;" class="wikitable">' +
'<caption>Գոյություն չունեցող կատեգորիաներ</caption>' +
'<thead><tr>' +
'<th class="headerSort" tabindex="0" role="columnheader button">Կատեգորիա</th>';
for (var catMissing in sortedCats[1]) {
if (mw.config.get('wgNamespaceNumber') === 0 && !sortedCats[1][catMissing].hidden) {
table2 += '<tr><td><ul>';
var rest = '<div class="toccolours mw-collapsible mw-collapsed" style="width:400px; overflow:auto;">';
rest += '<div style="font-weight:bold;line-height:1.6;">Նույն կատեգորիան այլ լեզուներով</div>';
rest += '<div class="mw-collapsible-content">';
var isRest = false;
table2 += '<div>Հետևյալ կատեգորիան կա հոդվածի համապատասխան լեզվով տարբերակում՝</div>';
for (var sitelink in sortedCats[1][catMissing].sitelinks) {
var lc = sortedCats[1][catMissing].sitelinks[sitelink].site.replace(/^(.+)wiki$/g, "$1");
var cattitle = sortedCats[1][catMissing].sitelinks[sitelink].title;
var li = '<li>' + '<a href="' + sortedCats[1][catMissing].sitelinks[sitelink].url + '" class="extiw">' + sitelink + ':' + cattitle.substring(cattitle.indexOf(":") + 1) + '</a></li>';
if (sortedCats[1][catMissing].wikis.includes(lc)) {
table2 += li;
} else {
isRest = true;
rest += li;
}
}
if (isRest) {
table2 += rest + '</div>' + '</div>';
}
table2 += '</ul></td></tr>';
}
}
table2 += '</tbody><tfoot></tfoot></table>';
div += table1 + table2 + '</div>';
$('#catSuggest-loading').remove();
$('#catlinks').after(div);
mw.loader.using('jquery.makeCollapsible').then(function() {
$('.mw-collapsible').makeCollapsible();
});
$('.catSuggest-potential').on('click', function(e) {
if (!$(e.target).attr('catSuggest-checked')) {
$(e.target).attr('catSuggest-checked', 1);
$(e.target).css("background-color", "yellow");
} else {
$(e.target).removeAttr('catSuggest-checked', undefined);
$(e.target).css("background-color", "");
}
});
var saveClicked = false;
$('#catSuggest-save').on('click', function() {
if (!saveClicked) {
saveClicked = true;
var selectedCats = '';
$('td[catSuggest-checked]').each(function() {
selectedCats += '[[კატეგორია:' + $(this).text() + ']]\n';
});
selectedCats = selectedCats.trim();
if (selectedCats === '') {
return;
}
// get wikitext of this article
myApi.get({
action: "query",
prop: "revisions",
rvprop: "content",
formatversion: "2",
titles: mw.config.get('wgTitle')
}).then(function(data) {
var content = data.query.pages[0].revisions[0].content;
if (content) {
var newContent = content.replace(/((?:(?:\[\[(?:კატეგორია|Category):[^\[\]]+?\]\]\n?)+)?\[\[(?:კატეგორია|Category):[^\[\]]+?\]\])/i, '$1\n' + selectedCats.trim());
if (content === newContent) {
myApi.postWithToken('csrf', {
action: 'edit',
title: mw.config.get('wgPageName'),
text: removeUncat(newContent) + '\n' + selectedCats,
summary: 'With catSuggest, +' + selectedCats.replace(/\n/g, ', ')
}).then(function() {
location.reload();
}, function() {
$('#catlinks').after('<div>Պահպանել չհաջողվեց, խնդրում ենք փորձել ձեռքով<textarea>' + selectedCats + '</textarea></div>');
});
} else {
myApi.postWithToken('csrf', {
action: 'edit',
title: mw.config.get('wgTitle'),
text: removeUncat(newContent),
summary: 'catSuggest-ով +' + selectedCats.replace(/\n/g, ', ')
}).then(function() {
location.reload();
}, function() {
$('#catlinks').after('<div>Պահպանել չհաջողվեց, խնդրում ենք փորձել ձեռքով<textarea>' + selectedCats + '</textarea></div>');
});
}
}
});
}
});
}
var clicked = false;
$(mw.util.addPortletLink('p-tb', '#catlinks', 'Գտնել կատեգորիա', 't-page-catSuggest', 'Առաջարկել կատեգորիա ըստ այլ լեզվի')).click(function() {
if (!clicked) {
clicked = true;
$('#catlinks').after('<div style="text-align: center;" id="catSuggest-loading"><a style=" display:block; margin:auto;" title="Ahm masum [CC BY-SA 4.0 (https://creativecommons.org/licenses/by-sa/4.0)], via Wikimedia Commons" href="#catlinks"><img width="256" alt="Loading icon" src="https://upload.wikimedia.org/wikipedia/commons/b/b1/Loading_icon.gif"></a></div>');
data = getOtherWikis();
findPossibleCats(possibleCats, data);
var attempts = 0;
var isDone = setInterval(function() {
attempts++;
var doneSearch = true;
var doneCheck = true
for (var lang in data) {
if (typeof data[lang]['#cats'] === 'undefined' || data[lang]['#cats'] != data[lang]['#doneCats']) {
doneSearch = false;
}
}
for (var item in possibleCats.missing) {
if (typeof possibleCats.missing[item].hidden != "boolean") {
doneCheck = false;
}
}
for (var item in possibleCats.exists) {
if (typeof possibleCats.exists[item].hidden != "boolean") {
doneCheck = false;
}
}
if ((doneCheck && doneSearch) || attempts > 20) { // 20 վայրկյան սպասելուց հետո ցույց տալ ինչ հնարավոր է
clearInterval(isDone);
var sortedCats = getSorted(possibleCats);
processData(sortedCats);
}
}, 1000);
}
});
});
//</nowiki>