Участник:AttemptToCallNil/license.js

// <nowiki> /* eslint strict: ["error", "global"] */ /* globals $, RLQ, mw */ "use strict"; const mod_registry = []; const mod_aliases = { "BC-IC2 Crossover": "BuildCraft-IndustrialCraft 2 Crossover Mod", "GraviSuite": "Gravitation Suite", "IC2": "IndustrialCraft 2", "Mo’Creatures": "Mo'Creatures", "RedPower2": "RedPower 2", "The CaMping": "The Camping Mod", "The Electrical Age": "Electrical Age" }; const mod_name_repls = [ [/ThaumCraft/g, "Thaumcraft"] ]; function register_mod(mod_name) { let mod_name_norm = mod_name.replace(/_/g, " ").trim(); mod_name_norm = mod_name_norm.replace(/\/$/, ""); if (mod_name_norm.startsWith("(") && mod_name_norm.endsWith(")")) { mod_name_norm = mod_name_norm.substring(1, mod_name_norm.length - 1).trim(); } for (const replace of mod_name_repls) { mod_name_norm = mod_name_norm.replace(replace[0], replace[1]); } if (mod_aliases[mod_name_norm] !== undefined) { mod_name_norm = mod_aliases[mod_name_norm]; } if (mod_name_norm.match(/^\d+$/)) { return; } if (!mod_registry.includes(mod_name_norm)) { mod_registry.push(mod_name_norm); } } // ----------------------------------------------------------------------------- function next_unlicensed_file(api, file_name) { return api.get({ "action": "query", "list": "categorymembers", "cmtitle": "Категория:Нелицензированные файлы", "cmprop": "title", "cmlimit": 2, "cmsort": "sortkey", "cmstartsortkeyprefix": file_name, "utf8": true, "formatversion": 2 }); } function get_next_file_name(data) { if (data.continue === undefined) { mw.notification.notify("No unlicensed files remaining."); } else { return data.query.categorymembers[1].title; } } function jump_to_file(file_title) { window.location = `https://minecraft-ru.gamepedia.com/${file_title}`; } function get_page_code(templates) { let code = ""; for (const template of templates) { code += `{{${template}}}`; } return code; } function get_summary(templates) { const base_summary = "license.js: полуавтоматическая простановка "; if (templates.length === 1) { return `${base_summary}шаблона ${templates[0]}`; } let summary = `${base_summary}шаблонов `; for (let index = 0; index < templates.length; index++) { if (index === templates.length - 1) { summary += " и "; } else if (index > 0) { summary += ", "; } summary += templates[index]; } return summary; } function relicense_on_activation(license_text, license_summary) { return function (event) { $(".licensejs-button").unbind("click.licensejs"); const $this = $(this); $this.append("⌛️"); const api = new mw.Api(); next_unlicensed_file(api, mw.config.get("wgTitle")) .done((data) => { const next_file = get_next_file_name(data); api.edit(mw.config.get("wgPageName"), (revision) => { let {content} = revision; if (content.match(/{{\s*[Лл]ицензия/g)) { content = content.replace(/{{\s*[Лл]ицензия\s*}}/, license_text); } else { content = `${content}\n\n== Лицензирование ==\n${license_text}`; content = content.replace(/\n{3,}/g, "\n\n"); } return { "text": content, "summary": license_summary, "assert": "user", "minor": true, "bot": true }; }).done(() => { $this.text($this.text().replace("⌛", "✅")); if (event.shiftKey) { jump_to_file(next_file); } else { window.location.reload(); return false; } }) .fail((data) => { $this.text($this.text().replace("⌛", "❌")); mw.notification.notify(`Edit error: ${data}`); }); }); }; } function get_link(text, templates) { const handler = relicense_on_activation(get_page_code(templates), get_summary(templates)); return $("<li>").append($("<a>").text(text) .click(handler)); } function get_linked_titles() { const linked_on = $(".mw-imagepage-linkstoimage a"); const linked_on_titles = []; for (const title_name of linked_on) { let title = $(title_name).attr("title"); if (title.match(new RegExp("частни(к|ца|ка|цы):"))) { if (title.includes("/")) { title = title.substring(title.indexOf("/") + 1); } else { continue; } } const ns_match = title.match(/^[^:]+:(\S.+)$/); if (ns_match) { title = ns_match[1]; } linked_on_titles.push(title); } return linked_on_titles; } function fill_page_title_names() { const page_title = mw.config.get("wgTitle"); const title_matches = [...page_title.matchAll(/\(([^а-яА-Я\(\)]+)\)/g)]; for (const title_match of title_matches) { for (const title_match_entry of title_match) { register_mod(title_match_entry); } } } function produce_mod_links() { const links = []; for (const mod of mod_registry) { const mod_title = `L/Mod:${mod}`; const mod_code = `{{Лицензия/Модификация|${mod}}}`; const mod_template = ["Лицензия/Модификация"]; const moj_mod_title = "(+Mojang)"; const moj_mod_code = `{{Лицензия/Mojang}}\n{{Лицензия/Модификация|${mod}}}`; const moj_mod_templates = ["Лицензия/Mojang", "Лицензия/Модификация"]; const handler_mod = relicense_on_activation(mod_code, get_summary(mod_template)); const handler_moj_mod = relicense_on_activation(moj_mod_code, get_summary(moj_mod_templates)); links.push($("<li>") .append($("<a>") .addClass("licensejs-button") .text(mod_title) .on("click.licensejs", handler_mod))); links.push($("<li>") .append($("<a>") .addClass("licensejs-button") .text(moj_mod_title) .on("click.licensejs", handler_moj_mod))); } return links; } function get_other_links() { const linked_on_titles = get_linked_titles(); fill_page_title_names(); for (const title of linked_on_titles) { if (title.match(/^[^а-яА-Я\/]+$/)) { register_mod(title); } const new_mod_names = [...title.matchAll(/([^а-яА-Я\n/]+?)\//g)]; for (const new_mod_name_match of new_mod_names) { for (const new_mod_name of new_mod_name_match) { register_mod(new_mod_name); } } const final_mod_name = title.match(/\/([^а-яА-Я\n/]+?)$/); if (final_mod_name) { register_mod(final_mod_name[1]); } } return produce_mod_links(); } RLQ.push(() => { mw.loader.using(["mediawiki.api", "mediawiki.notification"], () => { if (mw.config.get("wgCanonicalNamespace") === "File") { $("#filetoc").append(get_link("L/Mojang", ["Лицензия/Mojang"])); $("#filetoc").append(get_link("L/C418", ["Лицензия/C418"])); $("#filetoc").append(get_link("L/©", ["Лицензия/Авторское право"])); $("#filetoc").append(get_link("L/SG", ["Лицензия/Простая геометрия"])); for (const other_link of get_other_links()) { $("#filetoc").append(other_link); } $("#filetoc").append($("<li>") .append($("<a>") .text("След. >>") .on("click.licensejs", () => { next_unlicensed_file(new mw.Api(), mw.config.get("wgTitle")) .done((data) => { jump_to_file(get_next_file_name(data)); }); }))); } }); }); // </nowiki> 
В данной статье используются материалы из статьи «Участник:AttemptToCallNil/license.js» с вики-сайта Minecraft Wiki, расположенного на Фэндоме, и они распространяются согласно лицензии Creative Commons Attribution-NonCommercial-ShareAlike 3.0. Авторы статьи.