Участник:Skmp/rq.js
Перейти к навигации
Перейти к поиску
// Интерфейс для добавления шаблона rq с параметрами.
// Ссылка для открытия находится в меню "Еще" (справа сверху страницы).
function rqjs_show() {
$("#rqjs-dialog").dialog("open");
}
var rqjs = {
params: [],
final_code: "",
edit: function() {
$.getJSON(mw.config.get('wgScriptPath') + '/api.php?action=tokens&format=json', function(tokens_response) {
$.post(mw.config.get('wgScriptPath') + "/api.php?action=edit&format=json", {
title: mw.config.get('wgPageName'),
minor: true,
nocreate: true,
summary: `+rq ([[u:Skmp/rq.js|rqjs]])`,
appendtext: "\n" + rqjs.final_code,
token: tokens_response.tokens.edittoken
}, function() {
location.reload();
});
});
},
setCode: function(code) {
rqjs.params = [];
const checkboxes = document.querySelectorAll("#rqjs-dialog input");
for(const checkbox of checkboxes) {
checkbox.checked = false;
}
rqjs.final_code = `{{${ code }}}`;
document.getElementById("rqjs-code").innerText = rqjs.final_code;
},
generateCode: function(el) {
param = el.name;
if(el.checked) {
rqjs.params.push(param);
} else {
rqjs.params.pop(param);
}
if(rqjs.params.length === 0) {
rqjs.final_code = `{{rq}}`;
} else {
rqjs.final_code = `{{rq|${ rqjs.params.join("|") }}}`;
}
document.getElementById("rqjs-code").innerText = rqjs.final_code;
}
};
mw.loader.using('mediawiki.util', function() {
if(mw.config.get('wgNamespaceNumber') === 0) {
mw.util.addPortletLink(
'p-cactions',
'javascript:rqjs_show()',
'+rq',
't-rqjs',
'Добавить шаблон rq'
);
}
});
mw.loader.using('jquery.ui', function () {
if (mw.config.get('wgNamespaceNumber') !== 0) return;
$('<div id="rqjs-dialog">\
<div style="display: flex; justify-content: space-between">\
<fieldset style="width: 43%" name="crit"><legend>Критические недостатки</legend>\
<div><input name="notability" type="checkbox"><label for="notability">Значимость</label></div>\
<div><input name="sources" type="checkbox"><label for="sources" data-only-code="нет ссылок">Нет ссылок</label></div>\
<div><input name="refless" type="checkbox"><label for="refless">Нет сносок</label></div>\
<div><input name="neutral" type="checkbox"><label for="neutral" data-only-code="проверить нейтральность">Проверить нейтральность</label></div>\
<div><input name="empty" type="checkbox"><label for="empty">Дописать</label></div>\
</fieldset>\
<fieldset style="width: 43%" name="quality"><legend>Качество текста</legend>\
<div><input name="checktranslate" type="checkbox"><label for="checktranslate">Плохой перевод</label></div>\
<div><input name="translate" type="checkbox"><label for="translate">Перевести</label></div>\
<div><input name="cleanup" type="checkbox"><label for="cleanup">Переработать</label></div>\
<div><input name="grammar" type="checkbox"><label for="grammar" data-only-code="опечатки">Опечатки</label></div>\
<div><input name="style" type="checkbox"><label for="style">Стиль статьи</label></div>\
<div><input name="global" type="checkbox"><label for="global">Глобализировать</label></div>\
</fieldset>\
</div>\
<div style="display: flex; justify-content: space-between">\
<fieldset style="width: 43%" name="content"><legend>Наполнение</legend>\
<div><input name="nolead" type="checkbox"><label for="nolead">Нет преамбулы</label></div>\
<div><input name="shortlead" type="checkbox"><label for="shortlead">Короткая преамбула</label></div>\
<div><input name="wikify" type="checkbox"><label for="wikify">Викифицировать</label></div>\
<div><input name="check" type="checkbox"><label for="check">Проверить факты</label></div>\
<div><input name="renew" type="checkbox"><label for="renew" data-only-code="обновить">Обновить</label></div>\
<div><input name="img" type="checkbox"><label for="img">Добавить иллюстрации</label></div>\
<div><input name="part" type="checkbox"><label for="part" data-only-code="нет разделов">Нет разделов</label></div>\
<div><input name="cat" type="checkbox"><label for="cat" data-only-code="нет категорий">Нет категорий</label></div>\
<div><input name="infobox" type="checkbox"><label for="infobox" data-only-code="нет карточки">Нет карточки</label></div>\
<div><input name="taxobox" type="checkbox"><label for="taxobox" data-only-code="нет таксобокса">Нет таксобокса</label></div>\
<div><input name="coord" type="checkbox"><label for="coord" data-only-code="нет координат">Нет координат</label></div>\
</fieldset>\
<fieldset style="width: 43%" name="other"><legend>Прочее</legend>\
<div><input name="linkless" type="checkbox"><label for="linkless">изолированная статья</label></div>\
<div><input name="nocat=1" type="checkbox"><label style="font-family: monospace; font-size: 12px" for="nocat=1">(Отключить категории)</label></div>\
</fieldset>\
</div>\
<pre id="rqjs-code">{{rq}}</pre>\
</div>').dialog({
title: "Добавить шаблон rq",
closeOnEscape: true,
autoOpen: false,
resizable: false,
width: 500,
dialogClass: "rqjs-dialog-root",
buttons: [{
text: "Записать",
click: function() {
rqjs.edit();
const button = document.querySelector(".rqjs-dialog-root button");
button.getElementsByTagName("span")[0].innerText = "Записываем...";
button.style.pointerEvents = "none";
this.style.opacity = "0.5";
}
}]
});
const checkboxes = document.querySelectorAll("#rqjs-dialog input");
for(const checkbox of checkboxes) {
checkbox.onclick = () => rqjs.generateCode(checkbox);
}
const labels = document.querySelectorAll("#rqjs-dialog label");
for(const label of labels) {
const code = label.dataset.onlyCode || label.getAttribute('for');
// Skip img
if (code === "img") continue;
else if (code === "nocat=1") continue;
label.innerHTML += ' <a style="font-family: monospace" href="javascript:rqjs.setCode(\'subst:' + code + '\')">(!)</a>';
}
});