imported>Irukaza |
imported>Irukaza |
| 第9行: |
第9行: |
| return; | | return; |
| } | | } |
| await mw.loader.using("mediawiki.api"); | | await mw.loader.using("mw.Api"); |
| const upperFirstCase = (s) => /^[a-z]/.test(s) ? s.substring(0, 1).toUpperCase() + s.substring(1) : s; | | const upperFirstCase = (s) => /^[a-z]/.test(s) ? s.substring(0, 1).toUpperCase() + s.substring(1) : s; |
| const api = new mw.Api(); | | const api = new mw.Api(); |
| | const p = $('<fieldset><legend>链入情况</legend><p id="queryWhatlinkshere">……</p></fieldset>').insertAfter("#mw-content-text > form").find("#queryWhatlinkshere"); |
| | const list = await (async () => { |
| | const result = []; |
| | const eol = Symbol(); |
| | let lhcontinue = undefined; |
| | while (lhcontinue !== eol) { |
| | const _result = await api.post({ |
| | action: "query", |
| | format: "json", |
| | prop: "linkshere", |
| | titles: target, |
| | lhprop: "redirect|title|pageid", |
| | lhcontinue, |
| | lhlimit: "max", |
| | }); |
| | if (_result.continue) { |
| | lhcontinue = _result.continue.lhcontinue; |
| | } else { |
| | lhcontinue = eol; |
| | } |
| | result.push(...(Object.values(_result.query.pages)[0].linkshere || [])); |
| | } |
| | return result; |
| | })(); |
| const ns = { | | const ns = { |
| 0: " (主名字空间)", | | 0: " 条目", |
| 1: "讨论", | | 1: "讨论", |
| 2: "用户", | | 2: "用户", |
| 3: "用户讨论", | | 3: "用户讨论", |
| 4: "萌娘 百科", | | 4: "H 萌娘", |
| 5: "萌娘 百科 讨论", | | 5: "H 萌娘讨论", |
| 6: "文件", | | 6: "文件", |
| 7: "文件讨论", | | 7: "文件讨论", |
| 第40行: |
第64行: |
| 2303: "gadget_definition_talk", | | 2303: "gadget_definition_talk", |
| }; | | }; |
| $("#mw-content-text > form").after('<fieldset><legend>链入情况</legend><p id="whatlinkshere" style="display: none;">加载中……</p></fieldset><fieldset><legend>嵌入情况</legend><p id="whatembeddedin" style="display: none;">加载中……</p></fieldset>'); | | const nslist = { |
| const list = await (async () => {
| | 0: { count: 0, redirect: 0 }, |
| const result = [];
| | 1: { count: 0, redirect: 0 }, |
| const eol = Symbol();
| | 2: { count: 0, redirect: 0 }, |
| let lhcontinue = undefined;
| | 3: { count: 0, redirect: 0 }, |
| while (lhcontinue !== eol) {
| | 4: { count: 0, redirect: 0 }, |
| const _result = await api.post({
| | 5: { count: 0, redirect: 0 }, |
| action: "query",
| | 6: { count: 0, redirect: 0 }, |
| format: "json",
| | 7: { count: 0, redirect: 0 }, |
| prop: "linkshere",
| | 8: { count: 0, redirect: 0 }, |
| titles: target,
| | 9: { count: 0, redirect: 0 }, |
| lhprop: "redirect|title|pageid",
| | 10: { count: 0, redirect: 0 }, |
| lhcontinue,
| | 11: { count: 0, redirect: 0 }, |
| lhlimit: "max",
| | 12: { count: 0, redirect: 0 }, |
| });
| | 13: { count: 0, redirect: 0 }, |
| if (_result.continue) {
| | 14: { count: 0, redirect: 0 }, |
| lhcontinue = _result.continue.lhcontinue;
| | 15: { count: 0, redirect: 0 }, |
| whatlinkshere.append("…");
| | 274: { count: 0, redirect: 0 }, |
| } else {
| | 275: { count: 0, redirect: 0 }, |
| lhcontinue = eol;
| | 710: { count: 0, redirect: 0 }, |
| }
| | 711: { count: 0, redirect: 0 }, |
| result.push(...Object.values(_result.query.pages)[0].linkshere || []);
| | 828: { count: 0, redirect: 0 }, |
| }
| | 829: { count: 0, redirect: 0 }, |
| return result;
| | 2300: { count: 0, redirect: 0 }, |
| })(); | | 2301: { count: 0, redirect: 0 }, |
| const nslist = {
| | 2302: { count: 0, redirect: 0 }, |
| 0: { count: 0, redirect: 0 },
| | 2303: { count: 0, redirect: 0 }, |
| 1: { count: 0, redirect: 0 },
| | }; |
| 2: { count: 0, redirect: 0 },
| | const global = { redirect: 0 }; |
| 3: { count: 0, redirect: 0 },
| | p.text(`共有${list.length}个页面含有到本页面的站内链接,其中有${list.filter((item) => "redirect" in item).length}个重定向页面。`); |
| 4: { count: 0, redirect: 0 },
| | if (list.length > 0) { p.append("按名字空间划分如下:"); } |
| 5: { count: 0, redirect: 0 },
| | const ul = $("<ul/>"); |
| 6: { count: 0, redirect: 0 },
| | list.forEach((item) => { |
| 7: { count: 0, redirect: 0 },
| | nslist[item.ns].count++; |
| 8: { count: 0, redirect: 0 },
| | if ("redirect" in item) { |
| 9: { count: 0, redirect: 0 },
| | nslist[item.ns].redirect++; |
| 10: { count: 0, redirect: 0 },
| |
| 11: { count: 0, redirect: 0 },
| |
| 12: { count: 0, redirect: 0 },
| |
| 13: { count: 0, redirect: 0 },
| |
| 14: { count: 0, redirect: 0 },
| |
| 15: { count: 0, redirect: 0 },
| |
| 274: { count: 0, redirect: 0 },
| |
| 275: { count: 0, redirect: 0 },
| |
| 710: { count: 0, redirect: 0 },
| |
| 711: { count: 0, redirect: 0 },
| |
| 828: { count: 0, redirect: 0 },
| |
| 829: { count: 0, redirect: 0 },
| |
| 2300: { count: 0, redirect: 0 },
| |
| 2301: { count: 0, redirect: 0 },
| |
| 2302: { count: 0, redirect: 0 },
| |
| 2303: { count: 0, redirect: 0 },
| |
| };
| |
| const global = { redirect: 0 };
| |
| whatlinkshere.text(`共有${list.length}个页面含有到本页面的站内链接 (不考虑嵌入) ,其中有${list.filter((item) => "redirect" in item).length}个重定向页面。`);
| |
| if (list.length > 0) { whatlinkshere.append("按名字空间划分如下:"); }
| |
| const ul = $("<ul/>");
| |
| list.forEach((item) => {
| |
| nslist[item.ns].count++;
| |
| if ("redirect" in item) {
| |
| nslist[item.ns].redirect++;
| |
| global.redirect++;
| |
| }
| |
| });
| |
| Object.entries(nslist).filter(([, { count }]) => count > 0).sort(([a], [b]) => a - b).forEach(([nsnumber, { count, redirect }]) => ul.append(`<li>${upperFirstCase(ns[nsnumber])}:${count}个页面(其中有${redirect}个重定向页面)`));
| |
| whatlinkshere.after(ul);
| |
| })();
| |
| queryWhatembeddedin.on("click", async () => {
| |
| queryWhatembeddedin.hide();
| |
| whatembeddedin.show();
| |
| const list = await (async () => {
| |
| const result = {
| |
| redirects: [],
| |
| all: [],
| |
| };
| |
| const eol = Symbol();
| |
| let eicontinue = undefined;
| |
| while (eicontinue !== eol) {
| |
| const _result = await api.post({
| |
| action: "query",
| |
| format: "json",
| |
| list: "embeddedin",
| |
| eititle: target,
| |
| einamespace: "*",
| |
| eifilterredir: "redirects",
| |
| eicontinue,
| |
| eilimit: "max",
| |
| });
| |
| if (_result.continue) {
| |
| eicontinue = _result.continue.eicontinue;
| |
| whatembeddedin.append("…");
| |
| } else {
| |
| eicontinue = eol;
| |
| }
| |
| result.redirects.push(..._result.query.embeddedin);
| |
| result.all.push(..._result.query.embeddedin);
| |
| }
| |
| eicontinue = undefined;
| |
| while (eicontinue !== eol) {
| |
| const _result = await api.post({
| |
| action: "query",
| |
| format: "json",
| |
| list: "embeddedin",
| |
| eititle: target,
| |
| einamespace: "*",
| |
| eifilterredir: "nonredirects",
| |
| eicontinue,
| |
| eilimit: "max",
| |
| });
| |
| if (_result.continue) {
| |
| eicontinue = _result.continue.eicontinue;
| |
| whatembeddedin.append("…");
| |
| } else {
| |
| eicontinue = eol;
| |
| }
| |
| result.all.push(..._result.query.embeddedin);
| |
| }
| |
| return result;
| |
| })();
| |
| const nslist = {
| |
| 0: { count: 0, redirect: [] },
| |
| 1: { count: 0, redirect: [] },
| |
| 2: { count: 0, redirect: [] },
| |
| 3: { count: 0, redirect: [] },
| |
| 4: { count: 0, redirect: [] },
| |
| 5: { count: 0, redirect: [] },
| |
| 6: { count: 0, redirect: [] },
| |
| 7: { count: 0, redirect: [] },
| |
| 8: { count: 0, redirect: [] },
| |
| 9: { count: 0, redirect: [] },
| |
| 10: { count: 0, redirect: [] },
| |
| 11: { count: 0, redirect: [] },
| |
| 12: { count: 0, redirect: [] },
| |
| 13: { count: 0, redirect: [] },
| |
| 14: { count: 0, redirect: [] },
| |
| 15: { count: 0, redirect: [] },
| |
| 274: { count: 0, redirect: [] },
| |
| 275: { count: 0, redirect: [] },
| |
| 710: { count: 0, redirect: [] },
| |
| 711: { count: 0, redirect: [] },
| |
| 828: { count: 0, redirect: [] },
| |
| 829: { count: 0, redirect: [] },
| |
| 2300: { count: 0, redirect: [] },
| |
| 2301: { count: 0, redirect: [] },
| |
| 2302: { count: 0, redirect: [] },
| |
| 2303: { count: 0, redirect: [] },
| |
| };
| |
| const global = { redirect: 0 };
| |
| whatembeddedin.text(`共有${list.all.length}个页面嵌入了本页面,其中有${list.redirects.length}个重定向页面。`);
| |
| if (list.all.length > 0) { whatembeddedin.append("按名字空间划分如下:"); }
| |
| const ul = $("<ul/>");
| |
| list.all.forEach(({ ns }) => {
| |
| nslist[ns].count++;
| |
| });
| |
| list.redirects.forEach(({ ns, title }) => {
| |
| nslist[ns].redirect.push(title);
| |
| global.redirect++; | | global.redirect++; |
| }); | | } |
| Object.entries(nslist).filter(([, { count }]) => count > 0).sort(([a], [b]) => a - b).forEach(([nsnumber, { count, redirect }]) => ul.append(`<li class="mw-parser-output">${upperFirstCase(ns[nsnumber])}:${count}个页面${redirect.length > 0 ? ` (其中有${redirect.length}个重定向页面 :${redirect.map((title) => `<a target="_blank" rel="nofollow noreferrer noopener" class="external text" href="https://zh.moegirl.org.cn/index.php?title=${encodeURIComponent(title)}&redirect=no">${title}</a>`).join("、")} )` : ""}`));
| | }); |
| whatembeddedin.after(ul);
| | Object.entries(nslist).filter(([, { count }]) => count > 0).sort(([a], [b]) => a - b).forEach(([nsnumber, { count, redirect }]) => ul.append(`<li>${nsnumber === 0 ? " (主名字空间)" : upperFirstCase(ns[nsnumber])}:${count}个页面(其中有${redirect}个重定向页面)`)); |
| })();
| | p.after(ul); |
| })()); | | })()); |
| // </pre> | | // </pre> |