MediaWiki:Gadget-noteTA.js
注意:在保存之后,您可能需要清除浏览器缓存才能看到所作出的变更的影响。
- Firefox或Safari:按住Shift的同时单击刷新,或按Ctrl-F5或Ctrl-R(Mac为⌘-R)
- Google Chrome:按Ctrl-Shift-R(Mac为⌘-Shift-R)
- Internet Explorer:按住Ctrl的同时单击刷新,或按Ctrl-F5
- Opera:前往菜单 → 设置(Mac为Opera → Preferences),然后隐私和安全 → 清除浏览数据 → 缓存的图片和文件。
"use strict";
// <pre>
/*
* 引自 https://zh.wikipedia.org/wiki/MediaWiki:Gadget-noteTA.js https://zh.wikipedia.org/wiki/MediaWiki:Gadget-noteTAvector.js
* User:AnnAngela做了整合与现代化
*/
mw.hook("wikipage.content").add(() => {
const map = {
zh: "(不转换)",
"zh-hans": "(简体)",
"zh-hant": "(繁体)",
};
const replaceReg = RegExp(`^\\/(?:${Object.keys(map).join("|")})`);
const name = Object.keys(map);
const api = new mw.Api();
$(() => {
if ($("#noteTA-vector-menu-tabs")[0]) {
return;
}
$("#p-variants").nextAll('.noteTA-menu, [class*="mw-indicator"], [id*="mw-indicator"]').remove();
const noteTAIndicator = $("[id^=mw-indicator-noteTA-], [id^=mobile-noteTA-]").hide();
if (noteTAIndicator.length === 0) {
return;
}
const $noteTAIndicatorImg = noteTAIndicator.find("img");
let $dialog = null;
const $this = $("#p-variants").length === 0
? $("[id^=mobile-noteTA-].mobileonly").show()
: $("<div/>", {
"class": "vector-menu vector-menu-tabs vectorTabs",
id: "noteTA-vector-menu-tabs",
style: "float: left",
}).append(
$("<ul>").append(
$("<li>", { "class": "selected" }).append(
$("<span>").append(
$("<a>", { href: "javascript:;" }).append($noteTAIndicatorImg[0]),
),
),
),
).insertAfter("#p-variants");
$this.on("click", () => {
if ($dialog === null) {
$dialog = $('<div class="noteTA-dialog" />');
$dialog.html('<div class="mw-ajax-loader" style="margin-top: 48px;" />');
$dialog.dialog({
title: wgULS("字词转换", "字詞轉換"),
});
let wikitext_1 = "";
const $dom = $("#mw-content-text .mw-parser-output");
let collapse_1 = true;
const actualTitle_1 = mw.config.get("wgPageName").replace(/_/g, " ");
const parse = async () => {
try {
const results = await api.post({
action: "parse",
title: "Template:CGroup/____SAND_BOX____",
text: wikitext_1,
prop: "text",
variant: mw.config.get("wgUserVariant"),
});
$dialog.html(results.parse.text["*"]);
if (collapse_1) {
$dialog.find(".mw-collapsible").makeCollapsible();
$dialog.find(".mw-collapsible-toggle").on("click.mw-collapse", async (_, ele) => {
const $collapsibleContent = $(ele).parent(".mw-collapsible").find(".mw-collapsible-content");
await $collapsibleContent.promise();
$dialog.dialog("option", "position", "center");
});
}
$dialog.dialog("option", "width", Math.round($(window).width() * 0.8));
$dialog.css("max-height", `${Math.round($(window).height() * 0.8)}px`);
$dialog.dialog("option", "position", "center");
} catch {
return parse();
}
};
let maybeTitle_1 = parse;
const $noteTAtitle = $dom.find(".noteTA-title");
if ($noteTAtitle.length) {
const titleConv = $noteTAtitle.last().data("noteta-code");
let titleDesc = $noteTAtitle.last().data("noteta-desc");
if (titleDesc) {
titleDesc = `(${titleDesc})`;
} else {
titleDesc = "";
}
wikitext_1 += `<span style="float: right;">{{edit|${actualTitle_1}|section=0}}</span>\n`;
wikitext_1 += "; 本文使用[[Help:繁简转换|标题手工转换]]\n";
wikitext_1 += `* 转换标题为:-{D|${titleConv}}-${titleDesc}\n`;
wikitext_1 += `* 实际标题为:-{R|${actualTitle_1}}-;当前显示为:-{|${titleConv}}-\n`;
} else {
maybeTitle_1 = async () => {
try {
const results = await api.post({
action: "parse",
title: actualTitle_1,
text: `{{noteTA/multititle|${actualTitle_1}}}`,
prop: "text",
variant: "zh",
});
const $multititle = $(results.parse.text["*"]).find(".noteTA-multititle");
if ($multititle.length) {
const textVariant_1 = {};
const variantText_1 = {};
let multititleText = "";
$multititle.children().each((_, ele) => {
const $li = $(ele);
const variant = $li.data("noteta-multititle-variant");
const text = $li.text();
variantText_1[variant] = text;
if (textVariant_1[text]) {
textVariant_1[text].push(variant);
} else {
textVariant_1[text] = [variant];
}
});
multititleText += "; 本文[[Help:繁简转换|标题可能经过转换]]\n";
multititleText += "* 转换标题为:";
const multititle = [],
titleConverted = variantText_1[mw.config.get("wgUserVariant")];
for (const variant in variantText_1) {
const text = variantText_1[variant];
if (text === null) {
continue;
}
const variants = textVariant_1[text];
for (let i = 0, l = variants.length; i < l; i++) {
variantText_1[variants[i]] = null;
}
const variantsName = variants.map((variant) => `-{R|{{MediaWiki:Variantname-${variant}}}}-`).join("、");
multititle.push(`${variantsName}:-{R|${text}}-`);
}
multititleText += multititle.join(";");
multititleText += `\n* 实际标题为:-{R|${actualTitle_1}}-;当前显示为:-{R|${titleConverted}}-\n`;
wikitext_1 = multititleText + wikitext_1;
}
parse();
} catch {
return maybeTitle_1();
}
};
}
const $noteTAgroups = $dom.find(".noteTA-group > *[data-noteta-group]");
if ($noteTAgroups.length > 1) {
collapse_1 = true;
}
for (const json of new Set($noteTAgroups.map((_, ele) => JSON.stringify([$(ele).data("noteta-group-source"), $(ele).data("noteta-group")])))) {
const [source, group] = JSON.parse(json);
switch (source) {
case "template":
wikitext_1 += `{{CGroup/${group}}}\n`;
break;
case "module":
wikitext_1 += `{{#invoke:CGroupViewer|dialog|${group}}}\n`;
break;
case "none":
wikitext_1 += `; 本文使用的公共转换组“${group}”尚未创建\n`;
wikitext_1 += `* {{edit|Module:CGroup/${group}|创建公共转换组“${group}”}}\n`;
break;
default:
wikitext_1 += `; 未知公共转换组“${group}”来源“${source}”\n`;
}
}
const $noteTAlocal = $dom.find(".noteTA-local");
if ($noteTAlocal.length) {
collapse_1 = true;
wikitext_1 += `<span style="float: right;">{{edit|${actualTitle_1}|section=0}}</span>\n`;
wikitext_1 += "; 本文使用[[Help:繁简转换|全文手工转换]]\n";
const $noteTAlocals = $noteTAlocal.children("*[data-noteta-code]");
for (const json of new Set($noteTAlocals.map((_, ele) => JSON.stringify([$(ele).data("noteta-code"), $(ele).data("noteta-desc")])))) {
const [localConv, desc] = JSON.parse(json),
localDesc = desc ? `<br>说明:${desc}` : "";
wikitext_1 += `* -{D|${localConv}}-当前显示为:-{${localConv}}-${localDesc}\n`;
}
}
wikitext_1 += "{{noteTA/footer}}\n";
maybeTitle_1();
} else {
$dialog.dialog("open");
}
});
});
$(() => {
$("#ca-varlang-1, #ca-varlang-2").remove();
const wgUserId = mw.config.get("wgUserId");
if (typeof wgUserId === "number" && wgUserId > 0 && mw.config.get("wgAction") === "view" && localStorage.getItem("AnnTools-noteTA-alert") !== "true" && !document.querySelector("#noteTA-lang") && !/^\/zh-[a-z]+\//.test(location.pathname)) {
const url = new mw.Uri();
const wgUserVariant = mw.config.get("wgUserVariant");
if (!(Reflect.has(url.query, "variant") || Reflect.has(url.query, "uselang")) && !url.path.startsWith("/index.php") && name.includes(wgUserVariant)) {
$("body").append(`<div id="noteTA-lang" style="background: #3366CC; color: white; text-align: center; padding: .5rem; position: fixed; top: 0; left: 0; right: 0; z-index: 9999;"><p>检测到您当前使用的<b>内容</b>语言变体 ${wgUserVariant}${map[wgUserVariant]}会导致繁简转换无法正常工作,我们建议您切换到以下三种<b>内容</b>语言变体之一:</p><p><span class="noteTA-lang-changer mw-ui-button" data-lang="zh-cn">zh-cn(中国大陆)</span> <span class="noteTA-lang-changer mw-ui-button" data-lang="zh-hk">zh-hk(中国香港)</span> <span class="noteTA-lang-changer mw-ui-button" data-lang="zh-tw">zh-tw(台湾地区)</span> | <span id="noteTA-lang-explainer" class="mw-ui-button">了解更多</span> <span id="noteTA-lang-disable" class="mw-ui-button mw-ui-destructive">不再提示</span></div>`);
const container = $("#noteTA-lang");
$(".noteTA-lang-changer").on("click", async (e) => {
const target = e.target;
const text = target.innerText;
const lang = target.dataset.lang;
container.html(`<p>正在切换至 ${text} ……</p>`);
try {
const result = await api.postWithToken("csrf", {
action: "options",
optionname: "variant",
optionvalue: lang,
});
if (result.options === "success") {
container.html("<p>切换成功,正在刷新页面!</p>");
location.pathname = location.pathname.replace(replaceReg, "");
} else {
throw result;
}
} catch (reason) {
console.info("noteTA-lang-changer:", reason);
container.html(`<p class="mw-parser-output">发生错误,无法切换,请手动访问<b>【<a href="/Special:Preferences#mw-prefsection-personal-i18n" target="_blank" class="external text">设置页面 - 语言</a> - 内容语言变种】处</b>修改您的内容语言变种为 ${text}</p>`);
}
}).filter(`[data-lang="${wgUserVariant}"]`).addClass("mw-ui-progressive");
$("#noteTA-lang-explainer").on("click", () => {
//open(mw.config.get("wgServer") + mw.config.get("wgScriptPath") +,"_blank");
}).hide();
$("#noteTA-lang-disable").on("click", () => {
$("#noteTA-lang").remove();
localStorage.setItem("AnnTools-noteTA-alert", "true");
});
}
}
}, 0);
});
// </pre>