Wikipedysta:Zamkorus/archiwizerdyskusji.js
Wygląd
(Przekierowano z Wikipedysta:Krzysiek 123456789/archiwizerdyskusji.js)
Uwaga: aby zobaczyć zmiany po opublikowaniu, może zajść potrzeba wyczyszczenia pamięci podręcznej przeglądarki.
- Firefox / Safari: Przytrzymaj Shift podczas klikania Odśwież bieżącą stronę, lub naciśnij klawisze Ctrl+F5, lub Ctrl+R (⌘-R na komputerze Mac)
- Google Chrome: Naciśnij Ctrl-Shift-R (⌘-Shift-R na komputerze Mac)
- Edge: Przytrzymaj Ctrl, jednocześnie klikając Odśwież, lub naciśnij klawisze Ctrl+F5.
- Opera: Naciśnij klawisze Ctrl+F5.
// Ustawienia
const stronaDyskusji = "Dyskusja wikipedysty:Krzysiek 123456789";
const stronaArchiwum = "Dyskusja wikipedysty:Krzysiek 123456789/Archiwum";
const stronaNewslettera = "Dyskusja wikipedysty:Krzysiek 123456789/Stare_newslettery";
const watkiDoPozostawienia = 5;
const czyWatkiBezwzglednie = true;
const newsletterPatterns = [/(?:Tech.News|Wiadomości.techniczne|Wikipedia.translation.of.the.week):.\d{4}-\d{2}/, /Zaproszenie.do.udziału.w.Tygodniu/, />The.Signpost</, /Editing.news.\d{4}.#\d/, /Biuletyn.Wikimedia.Polska/, /Movement.Strategy.and.Governance.News/, /Wikidata.weekly.summary.#\d*/, /Biuletyn.Powszechnych.Zasad.Postępowania/, /Universal.Code.of.Conduct.News/, /Growth.*(?:updates|Newsletter).#\d*/i, /Editing.News.#\d/ig];
// Funkcje
async function sekcje(pageToGet) {
let zwrot;
const params = {
action: "parse",
page: pageToGet,
prop: "sections",
};
const api = new mw.Api();
await api.get(params).done((data) => {
zwrot = data.parse["sections"];
});
return zwrot;
}
function tyldy(ile) {
let tyld = "";
for (let step = 0; step < ile; step++) {
tyld = tyld + "~";
}
return tyld;
}
async function wikitekstZsekcji(pageName, index_sekcji = 0) {
let zwrot;
const params = {
action: "parse",
page: pageName,
prop: "wikitext"
};
if (index_sekcji != 0) {
params.section = index_sekcji;
};
const api = new mw.Api();
await api.get(params).done((data) => {
zwrot = data.parse.wikitext["*"];
});
return zwrot;
}
function indexAnalyzer(wszystkieSekcje, searchedTocLevel) {
let idArray = new Array();
let dlug = wszystkieSekcje.length;
for (let i = 0; i < dlug; i++) {
if (wszystkieSekcje[i]["toclevel"] == searchedTocLevel) {
idArray = idArray.concat([parseInt(wszystkieSekcje[i]["index"])]);
}
}
return idArray;
}
function sekcjeArchiwizowane(indexy, toLeave, threadsAbsolutely) {
let doArchiwum = 0;
let pomocnicze = indexy.length - toLeave;
if (threadsAbsolutely === false) {
if (indexy.length % 2 == 0) {
doArchiwum = indexy.length / 2;
} else {
doArchiwum = indexy.length / 2;
doArchiwum -= 0.5;
}
} else {
doArchiwum = pomocnicze;
}
if (indexy.length - doArchiwum >= toLeave) {
indexy = indexy.slice(0, doArchiwum);
} else {
if (pomocnicze > 0) {
indexy = indexy.slice(0, pomocnicze);
} else {
indexy = indexy.slice(0, 0);
}
}
return indexy;
}
async function wstawiaczNaStrone(isAppended, nazwaStrony, trescDoWsatienia, edycjiOpis, isMinor = true) {
let params = {
action: "edit",
title: nazwaStrony,
minor: isMinor,
summary: edycjiOpis,
format: "json",
};
if (isAppended) {
params.appendtext = trescDoWsatienia;
} else {
params.text = trescDoWsatienia;
}
let returned;
const api = new mw.Api();
await api.postWithToken("csrf", params).done((data) => {
returned = data;
console.log(data);
});
return returned;
}
function getWatekForm(amout) {
if (amout == 1) {
return "wątek";
} else if (amout % 10 >= 2 && amout % 10 <= 4 && (amout % 100 < 10 || amout % 100 >= 20)) {
return "wątki";
} else {
return "wątków";
}
}
async function aktualnaData() {
let dataCzas;
const formula = "@@" + "{{LOCALTIME}} {{LOCALDAY2}}-{{LOCALMONTH}}-{{LOCALYEAR}}" + "@@";
const params = {
action: "parse",
text: formula,
prop: "text",
contentmodel: "wikitext",
};
const api = new mw.Api();
await api.get(params).done((data) => {
dataCzas = data.parse.text["*"];
});
dataCzas = dataCzas.match(/(?:\@+)([1234567890 :-]*)(?:\@+)/g);
dataCzas = dataCzas[0];
dataCzas = dataCzas.replace(/(?:\@+)([1234567890 :-]*)(?:\@+)/g, "$1");
dataCzas = dataCzas + "r.";
return dataCzas;
}
const filter_newsletters = (indexes, sections_container, patterns) => {
let all_newsletters = sections_container.filter((section) => {
const line = section.line;
let is_newsletter = false;
for (const element of patterns) {
if (element.test(line)) {
is_newsletter = true;
break;
}
}
return is_newsletter;
}).map(obj => parseInt(obj.index));
const indexes_newsletters = indexes.filter(x => all_newsletters.includes(x));
const indexes_important_threads = indexes.filter(x => !all_newsletters.includes(x));
return { 'newsletters': indexes_newsletters, 'important_threads': indexes_important_threads };
}
// Główna funkcja archiwizacji
async function wykonaj() {
buttonAnima();
const wszystkieSekcje = await sekcje(stronaDyskusji);
let indexy = indexAnalyzer(wszystkieSekcje, 1);
indexy = sekcjeArchiwizowane(indexy, watkiDoPozostawienia, czyWatkiBezwzglednie);
const filtered_indexes = filter_newsletters(indexy, wszystkieSekcje, newsletterPatterns);
async function threadAnalysis(contentToProcess, discusionPageContent) {
for (const n of filtered_indexes.newsletters) {
if (Number.isInteger(n)) {
let thread = await wikitekstZsekcji(stronaDyskusji, n);
thread += "\n\n";
contentToProcess += thread;
discusionPageContent = discusionPageContent.replace(thread, "");
}
else {
console.log(n);
}
}
}
if (indexy.length > 0) {
buttonAnima(1);
let discusionPageContent = await wikitekstZsekcji(stronaDyskusji);
let archivedThreads = '';
let archivedNewsletters = '';
await threadAnalysis(archivedNewsletters, discusionPageContent);
await threadAnalysis(archivedThreads, discusionPageContent);
let edycjiOpis = `Zarchiwizowano ${indexy.length} ${getWatekForm(indexy.length)} przenosząc [[${stronaDyskusji}]] ⇨ [[${stronaArchiwum}]](${filtered_indexes.important_threads.length}) + [[${stronaNewslettera}]](${filtered_indexes.newsletters.length}) za pomocą [[Wikipedysta:Krzysiek_123456789/archiwizerdyskusji.js|archiwizera dyskusji]], sygnatura czasowa: ${await aktualnaData()}`;
archivedThreads = "\n\n" + archivedThreads;
archivedNewsletters = "\n\n" + archivedNewsletters;
await wstawiaczNaStrone(false, stronaDyskusji, discusionPageContent, edycjiOpis);
await wstawiaczNaStrone(true, stronaArchiwum, archivedThreads, edycjiOpis);
await wstawiaczNaStrone(true, stronaNewslettera, archivedNewsletters, edycjiOpis);
buttonAnima(2);
setTimeout(window.location.reload(true), 350);
}
else {
alert("Brak wątków do archiwizacji! Możesz zmienić liczbę pozostawianych wątków w opcjach skryptu.");
archivumskoButton.removeEventListener("click", wykonaj);
buttonAnima(3);
}
}
function buttonAnima(postep) {
switch (postep) {
case 1:
$("#achivumskoButton").css({ color: "#72777d", "background-color": "#c8ccd1" });
break;
case 2:
$("#achivumskoButton").css({ color: "#24e5bb" });
break;
case 3:
archivumskoButton.style.background = "#dd3333";
archivumskoButton.style.color = "white";
archivumskoButton.style.cursor = "no-drop";
break;
default:
$("#achivumskoButton").css({ color: "#f6ff68" });
}
}
const archivumskoButton = document.getElementById("achivumskoButton");
archivumskoButton.setAttribute(
"style",
"color:#fff;display:inline-block;box-sizing:border-box;margin:0;padding:6px 12px;border-radius:2px;cursor:pointer;font-weight:900;line-height:1.29em;text-align:center;background-color:#36c;border:10px;font-family:Verdana;font-size:15px"
);
archivumskoButton.innerHTML = "<span>Archiwizuj</span>";
archivumskoButton.addEventListener("click", wykonaj);