MediaWiki:Gadget-admin-update-data.js
Hoppa till navigering
Hoppa till sök
OBS: Efter du har publicerat sidan kan du behöva tömma din webbläsares cache för att se ändringarna.
- Firefox / Safari: Håll ned Skift och klicka på Uppdatera sidan eller tryck Ctrl-F5 eller Ctrl-R (⌘-R på Mac)
- Google Chrome: Tryck Ctrl-Skift-R (⌘-Skift-R på Mac)
- Internet Explorer / Edge: Håll ned Ctrl och klicka på Uppdatera eller tryck Ctrl-F5
- Opera: Tryck Ctrl-F5.
// Uppdatera data genom att gå till [[Wiktionary:Finesser/Uppdatera data]]
// @ts-check
var mw = window.mw;
var $ = window.$;
var OO = window.OO;
if (
mw.config.get("wgAction") === "view" &&
mw.config.get("wgPageName") === "Wiktionary:Finesser/Uppdatera_data"
) {
mw.loader.using(["oojs-ui-core"]).then(function () {
$("#gadget-data-update-ui").text("");
var p = getPages();
for (var pageName in p) {
showButton(pageName, p[pageName]);
}
});
}
function getPages() {
return {
"[[MediaWiki:Gadget-data-lang.json]]": function () {
var langData = JSON.parse($("#lang-data pre").text())[0];
var språknamn = Object.fromEntries(
$arr("#lang-språknamn [data-template=språk]").map(function (x) {
x = $(x).data();
return [
x.langCode,
{
name: x.langName,
onlyEtym: x.onlyEtym,
},
];
})
);
var langCodes = Array.from(
new Set(Object.keys(langData).concat(Object.keys(språknamn)))
);
var errors = langCodes
.map(function (x) {
if (!langData[x]) {
return x + " saknas i [[Modul:lang/data]]";
}
if (!språknamn[x]) {
return x + " saknas på [[Wiktionary:Stilguide/Språknamn]]";
}
if (langData[x].name !== språknamn[x].name) {
return (
x +
" har namn " +
langData[x].name +
" i [[Modul:lang/data]] men namn " +
språknamn[x].name +
" på [[Wiktionary:Stilguide/Språknamn]]"
);
}
if (Boolean(langData[x].nolemma) !== språknamn[x].onlyEtym) {
return (
x +
" har nolemma=" +
langData[x].nolemma +
" i [[Modul:lang/data]] men onlyEtym=" +
språknamn[x].onlyEtym +
" på [[Wiktionary:Stilguide/Språknamn]]"
);
}
})
.filter(Boolean)
.join("\n");
if (errors) {
throw new Error(errors);
}
var entries = langCodes
.map(function (x) {
return [x, ucFirst(langData[x].name), langData[x]];
})
.sort(function (a, b) {
return a[1].localeCompare(b[1], "sv");
});
return {
main: Object.fromEntries(
entries.filter(function (x) {
return !x[2].nolemma;
})
),
onlyEtym: Object.fromEntries(
entries.filter(function (x) {
return x[2].nolemma;
})
),
};
},
"[[MediaWiki:Gadget-data-lang-code-templates.json]]": function () {
return Object.fromEntries(
$arr("#lang-code-templates [data-template]").map(function (x) {
x = $(x).data();
return [x.template, x.språk ? "språk" : [x.min, x.max || 99]];
})
);
},
"[[MediaWiki:Gadget-data-lang-replacements.json]]": function () {
return Object.fromEntries(
$arr("#lang-språknamn [data-template=ersättningsspråk]").map(function (
x
) {
x = $(x).data();
return [x.langName, x.replacement];
})
);
},
"[[MediaWiki:Gadget-data-h3.json]]": function () {
var h3 = JSON.parse($("#h3-data pre").text());
// There are duplicate values in the JSON, but fromEntries() will only return one value per key.
return Object.fromEntries(
Object.values(h3)
.map(function (x) {
return [x.short, ucFirst(x.long_sing)];
})
.sort()
);
},
// Information about all headings other than language headings and other
"[[MediaWiki:Gadget-data-headings.json]]": function () {
return {
// For languages, see [[MediaWiki:Gadget-data-lang.json]].
h2: $textToArr("#h2-headings"),
// For H3 headings with H3 templates, see [[MediaWiki:Gadget-data-h3.json]].
h4: $textToArr("#h4-headings"),
// Exceptions to be grandfathered in.
h2Exceptions: $textToArr("#h2-exceptions"),
h3Exceptions: $textToArr("#h3-exceptions"),
h4Exceptions: $textToArr("#h4-exceptions"),
};
},
};
}
function $arr(selector) {
return Array.from($(selector));
}
function $textToArr(selector) {
return String($(selector).text())
.split(/,|\n/)
.map(function (x) {
return x.trim();
})
.filter(Boolean);
}
/** @param {string} str */
function ucFirst(str) {
return str && str[0].toUpperCase() + str.slice(1).toLowerCase();
}
function hidden(name, val) {
return $("<input>", { type: "hidden", name: name }).val(val);
}
/**
* @param {string} page
* @param {() => unknown} getCurrent
*/
function showButton(page, getCurrent) {
page = page.replace(/[\[\]]/g, "");
var button = new OO.ui.ButtonInputWidget({
label: "Laddar...",
disabled: true,
name: "wpDiff",
type: "submit",
flags: ["primary", "progressive"],
});
var textbox = hidden("wpTextbox1", "");
var link = $("<a>", { text: page, href: "/wiki/" + page });
var form = $("<form>", {
method: "post",
target: "_blank",
action: "/wiki/" + page + "?action=submit",
css: { margin: "1.5em 0" },
})
.append(
hidden(
"wpSummary",
"Uppdatera utifrån [[Wiktionary:Finesser/Uppdatera data]]"
),
textbox,
button.$element,
" ",
link,
hidden("wpUltimateParam", "1")
)
.appendTo("#gadget-data-update-ui");
function error(e) {
$("<div>", { css: { whiteSpace: "pre-wrap" } })
.append($("<strong>", { class: "error", text: e.message || e }))
.appendTo(form);
return null;
}
fetch("/w/rest.php/v1/page/" + page)
.then(function (x) {
if (x.status === 404) {
link.addClass("new");
return null;
}
return x.json().then(function (x) {
return JSON.parse(x.source);
});
})
.catch(error)
.then(function (saved) {
return { page: page, saved: saved, current: getCurrent() };
})
.then(function (x) {
console.log(x);
if (JSON.stringify(x.current) === JSON.stringify(x.saved)) {
button.setLabel("Redan uppdaterad");
} else {
textbox.val(
JSON.stringify(x.current, null, "\t")
// Slightly nicer formatting.
.replace(/\[\s+(\d+),\s+(\d+)\s+\]/g, "[$1, $2]")
);
button.setDisabled(false);
button.setLabel("Visa ändringar");
}
})
.catch(error);
}