Qeyd: Dəyişiklikləri yayımladıqdan sonra etdiyiniz dəyişikliklərin görünməsi üçün brauzerinizin keşinin təmizlənməsi lazım ola bilər.
- Firefox / Safari: Reload düyməsinə basılı tutarkən Shift düyməsinə basın, və ya Ctrl+F5 və ya Ctrl+R (Mac üçün ⌘-R )
- Google Chrome: Ctrl-Shift-R (Mac üçün ⌘-Shift-R)
- Edge: Ctrl düyməsini basılı tutarkən Refresh düyməsinə basın, və ya sadəcə Ctrl+F5.
"use strict";
mw.loader.using(['mediawiki.util', 'mediawiki.api', '@wikimedia/codex', 'vue'], function(require) {
const { createMwApp, ref } = require('vue');
const { CdxDialog, CdxRadio, CdxField, CdxTextInput, CdxButton } = require('@wikimedia/codex');
const page = mw.config.get('wgPageName');
const userGroups = mw.config.get('wgUserGroups') || [];
if (!userGroups.includes('sysop')) return;
if (!page.startsWith("Vikipediya:Silinməyə_namizəd_səhifələr")) return;
if (mw.config.get('skin') === 'minerva') return;
const api = new mw.Api();
const headings = document.querySelectorAll('.mw-heading');
headings.forEach((heading, index) => {
const editSection = heading.querySelector('.mw-editsection');
if (!editSection) return;
const aTag = editSection.querySelector('a');
const editLinkHref = aTag ? aTag.getAttribute('href') : null;
if (!editLinkHref) return;
const match = editLinkHref && editLinkHref.match(/title=([^&]+)/);
const matchedTitle = match && match[1] ? decodeURIComponent(match[1]).replace(/_/g, ' ') : null;
if (!matchedTitle || !matchedTitle.startsWith('Vikipediya:Silinməyə namizəd səhifələr/')) return;
const sectionPage = matchedTitle;
const headingEl = heading.querySelector('h2, h3, h4, h5, h6');
const sectionTitle = headingEl ? headingEl.textContent.trim() : null;
if (!sectionTitle) return;
const container = document.createElement('span');
container.className = 'mw-editsection';
editSection.after(container);
const app = createMwApp({
components: {
CdxDialog,
CdxRadio,
CdxField,
CdxTextInput,
CdxButton
},
setup() {
const dialogShown = ref(false);
const comment = ref('');
const decision = ref('');
const submitting = ref(false);
const decisionOptions = [
{ label: 'Silindi', value: 'silindi' },
{ label: 'Saxlanıldı', value: 'saxlanildi' },
{ label: 'Digər', value: 'diger' }
];
const canSubmit = () => comment.value.trim() && decision.value && !submitting.value;
async function finalizeDecision() {
if (!decision.value) {
mw.notify('Qərar seçilməyib.', { type: 'error' });
return;
}
submitting.value = true;
try {
const res = await api.get({
action: 'parse',
prop: 'wikitext',
page: sectionPage,
formatversion: 2
});
let wikitext = res.parse.wikitext;
if (wikitext.includes('{{qapalı') || wikitext.includes('{{ qapalı')) {
mw.notify('Müzakirə artıq yekunlaşdırılıb.', { type: 'error' });
submitting.value = false;
dialogShown.value = false;
return;
}
const lines = wikitext.split('\n');
let targetPage = null;
for (const line of lines) {
const match = line.match(/\[\[:([^\]|]+)(?:\|[^\]]*)?\]\]/);
if (match) {
targetPage = match[1].trim();
break;
}
}
const displayPage = sectionPage.replaceAll('_', ' ');
if (decision.value === 'silindi' && targetPage) {
try {
const exists = await api.get({
action: 'query',
titles: targetPage,
format: 'json'
});
const pageData = Object.values(exists.query.pages)[0];
if (pageData.missing !== undefined) {
mw.notify('Səhifə artıq silinmişdir.', { type: 'info' });
} else {
const deleteReason = `[[Vikipediya:Silinməyə namizəd səhifələr|Silinməyə namizəd səhifələr]]dəki ümumi müzakirəyə əsasən. Bax: [[${displayPage}|${displayPage}]]`;
await api.postWithEditToken({
action: 'delete',
title: targetPage,
reason: deleteReason,
format: 'json'
});
mw.notify('Səhifə silindi.', { type: 'success' });
}
} catch (delErr) {
console.error(delErr);
mw.notify('Səhifə silinərkən xəta baş verdi.', { type: 'error' });
}
}
if ((decision.value === 'saxlanildi' || decision.value === 'diger') && targetPage) {
if (decision.value === 'saxlanildi') {
try {
const talkPage = `Müzakirə:${targetPage}`;
const talkRes = await api.get({
action: 'query',
prop: 'revisions',
rvprop: 'content',
titles: talkPage,
formatversion: 2
});
let talkContent = '';
let pageId = -1;
for (const pageObj of talkRes.query.pages) {
if (!pageObj.missing) {
talkContent =
pageObj.revisions && pageObj.revisions[0] && pageObj.revisions[0].content
? pageObj.revisions[0].content
: '';
pageId = pageObj.pageid;
}
}
const displayPage = sectionPage.replaceAll('_', ' ');
const saxlanildiTemplate = `{{Saxlanıldı|sns=${displayPage}}}`;
const lines = talkContent.split('\n');
let insertIndex = 0;
while (insertIndex < lines.length && lines[insertIndex].match(/^\{\{[^\}]+\}\}$/)) {
insertIndex++;
}
lines.splice(insertIndex, 0, saxlanildiTemplate);
const newContent = lines.join('\n');
await api.postWithEditToken({
action: 'edit',
title: talkPage,
text: newContent,
summary: `Silinməyə namizəd müzakirəsinə əsasən saxlanıldı: [[${displayPage}]]`,
format: 'json'
});
mw.notify('Müzakirə səhifəsinə {{Saxlanıldı}} əlavə olundu.', { type: 'success' });
try {
const articleRes = await api.get({
action: 'query',
prop: 'revisions',
rvprop: 'content',
titles: targetPage,
formatversion: 2
});
const articlePageObj = articleRes.query.pages.find(p => !p.missing);
if (articlePageObj) {
let content = articlePageObj.revisions[0].content;
const nomRegexFull = /<noinclude>\s*\{\{\s*[Ss]ilinməyə\s+namizəd(?:\|[^{}]*)?\s*\}\}\s*<\/noinclude>\s*|\{\{\s*[Ss]ilinməyə\s+namizəd(?:\|[^{}]*)?\s*\}\}\s*/g;
const cleanedContent = content.replace(nomRegexFull, '').trim();
if (cleanedContent !== content) {
await api.postWithEditToken({
action: 'edit',
title: targetPage,
text: cleanedContent,
summary: 'Müzakirəyə əsasən {{Silinməyə namizəd}} şablonu çıxarılır.',
format: 'json'
});
mw.notify('{{Silinməyə namizəd}} şablonu məqalədən çıxarıldı.', { type: 'success' });
}
}
} catch (err) {
console.error(err);
mw.notify('Şablon silinərkən xəta baş verdi.', { type: 'error' });
}
} catch (err) {
console.error(err);
mw.notify('Müzakirə səhifəsi edilərkən xəta baş verdi.', { type: 'error' });
}
}
}
if (lines[0].startsWith('==') || lines[0].startsWith('===')) {
lines.splice(1, 0, '{{qapalı}}');
} else {
lines.unshift('{{qapalı}}');
}
lines.push('----');
lines.push(`'''Yekunlaşdırma:''' ${comment.value.trim()} — ${'~~' + '~~'}`);
lines.push('{{qapalı-son}}');
await api.postWithEditToken({
action: 'edit',
title: sectionPage,
text: lines.join('\n'),
summary:
decision.value === 'silindi'
? 'Müzakirə yekunlaşdırıldı: Silindi'
: decision.value === 'saxlanildi'
? 'Müzakirə yekunlaşdırıldı: Saxlanıldı'
: 'Müzakirə yekunlaşdırıldı',
format: 'json'
});
mw.notify('Müzakirə uğurla yekunlaşdırıldı!', { type: 'success' });
dialogShown.value = false;
} catch (err) {
console.error(err);
mw.notify('Xəta baş verdi. Zəhmət olmasa yenidən cəhd edin.', { type: 'error' });
} finally {
submitting.value = false;
}
}
const openDialog = async () => {
submitting.value = true;
try {
const res = await api.get({
action: 'parse',
prop: 'wikitext',
page: sectionPage,
formatversion: 2
});
const wikitext = res.parse.wikitext;
if (wikitext.includes('{{qapalı') || wikitext.includes('{{ qapalı')) {
mw.notify('Müzakirə artıq yekunlaşdırılıb.', { type: 'error' });
return;
}
dialogShown.value = true;
} catch (err) {
console.error(err);
mw.notify('Xəta baş verdi. Zəhmət olmasa yenidən cəhd edin.', { type: 'error' });
} finally {
submitting.value = false;
}
};
return {
dialogShown,
comment,
decision,
decisionOptions,
canSubmit,
openDialog,
finalizeDecision,
submitting
};
},
template: `
<span class="mw-editsection-bracket">[</span>
<a href="#" @click.prevent="openDialog">yekunlaşdır</a>
<span class="mw-editsection-bracket">]</span>
<cdx-dialog
v-model:open="dialogShown"
title="Müzakirəni yekunlaşdır"
close-button-label="Bağla"
use-close-button
>
<template #default>
<cdx-field :is-fieldset="true" label="Qərar:">
<cdx-radio
v-for="opt in decisionOptions"
:key="'radio-' + opt.value"
v-model="decision"
name="qerar"
:input-value="opt.value"
inline
>
{{ opt.label }}
</cdx-radio>
</cdx-field>
<cdx-field
v-if="decision === 'silindi'"
status="warning"
:messages="{ warning: 'Diqqət: Yekunlaşdırdığınız zaman səhifə avtomatik olaraq silinəcək.' }"
/>
<cdx-field
v-if="decision === 'diger'"
status="warning"
:messages="{ warning: 'Diqqət: Yekunlaşdırdığınız zaman səhifədən {{Silinməyə namizəd}} şablonunu çıxarmağı unutmayın.' }"
/>
<cdx-field label="Şərh əlavə edin:" style="margin-top: 1em;">
<cdx-text-input
v-model="comment"
placeholder="Şərhinizi daxil edin…"
type="text"
/>
</cdx-field>
<div style="margin-top: 1.5em;">
<cdx-button
:disabled="!canSubmit()"
action="progressive"
@click="finalizeDecision"
>
Yekunlaşdır
</cdx-button>
</div>
</template>
</cdx-dialog>
`
});
app.mount(container);
});
});