User:Surjection/linkLanguageHeaders.js
Jump to navigation
Jump to search
Note – after saving, you may have to bypass your browser’s cache to see the changes.
- Mozilla / Firefox / Safari: hold Shift while clicking Reload, or press either Ctrl-F5 or Ctrl-R (Command-R on a Macintosh);
- Konqueror and Chrome: click Reload or press F5;
- Opera: clear the cache in Tools → Preferences;
- Internet Explorer: hold Ctrl while clicking Refresh, or press Ctrl-F5.
- This script lacks a documentation subpage. Please create it.
- Useful links: root page • root page’s subpages • links • redirects • your own
"use strict";
// {{documentation}}
// <nowiki>
(function linkLanguageHeaders() {
var CACHE_DURATION = 24 * 60 * 60; // 24 hours
var ALLOWED_NAMESPACES = [
0, // main
118 // Reconstruction
];
function categoryNameFromLanguageName(name) {
return (name + " language").replace(/ Language language$/, " Language");
}
function getLanguageCodesByCanonicalName(callback, cacheDuration) {
var KEY = "enwiktLanguageCanonicalNamesJson";
var timeNow = new Date().getTime() * 1e-3;
try {
var cachedData = JSON.parse(localStorage.getItem(KEY));
if (timeNow - cachedData.timestamp < cacheDuration) {
callback(cachedData.data);
return;
}
} catch (e) { }
var request = new mw.Api().get({
"action": "parse",
"page": "Module:languages/canonical names.json",
"prop": "wikitext",
"formatversion": 2,
"format": "json"
});
request.done(function(response) {
var languageData = JSON.parse(response.parse.wikitext);
callback(languageData);
localStorage.setItem(KEY, JSON.stringify({
timestamp: timeNow,
data: languageData
}));
});
}
function linkLanguageHeaders(codeByCanonicalName) {
$("#mw-content-text h2 .mw-headline").each(function() {
var headline = $(this);
var languageName = headline.text();
var languageCode = codeByCanonicalName[languageName];
if (languageCode) {
var categoryName = categoryNameFromLanguageName(languageName);
var pageName = mw.config.get("wgFormattedNamespaces")[14] + ":" + categoryName;
headline.html($("<a>", {
text: languageName,
title: languageName + " [" + languageCode + "]",
href: mw.config.get("wgArticlePath").replace("$1", encodeURIComponent(pageName.replace(/ /g, "_")))
}));
}
});
}
mw.hook("wikipage.content").add(function($) {
if (mw.config.get("wgAction") === "view" &&
ALLOWED_NAMESPACES.indexOf(mw.config.get("wgNamespaceNumber")) >= 0) {
getLanguageCodesByCanonicalName(function (codeByCanonicalName) {
linkLanguageHeaders(codeByCanonicalName);
}, CACHE_DURATION);
}
});
})();
// </nowiki>