MediaWiki:Gadget-Template-lang.js
Note : après avoir enregistré vos modifications, il se peut que vous deviez forcer le rechargement complet du cache de votre navigateur pour voir les changements.
- Firefox / Safari : Maintenez la touche Maj (Shift) en cliquant sur le bouton Actualiser ou pressez Ctrl-F5 ou Ctrl-R (⌘-R sur un Mac) ;
- Google Chrome : Appuyez sur Ctrl-Maj-R (⌘-Shift-R sur un Mac) ;
- Internet Explorer : Maintenez la touche Ctrl en cliquant sur le bouton Actualiser ou pressez Ctrl-F5 ;
- Opera : Allez dans Menu → Settings (Opera → Préférences sur un Mac) et ensuite à Confidentialité & sécurité → Effacer les données d'exploration → Images et fichiers en cache.
/*
* Author: w:fr:Phe
*
* Insère le modèle lang en tentant de deviner la langue utilisé en fonction du contenu
* de la sélection. Dans le cas où le texte sélectionné est un <poem> le modèle lang
* n’est pas utilisé mais les attributs de langue sont directement ajoutés à la balise
* <poem>
*
*/
function count_symbol(val, matcher) {
var count = 0;
for (var i = 0; i < val.length; ++i) {
if (val.substr(i, 1).search(matcher) == 0)
count += 1;
}
return count / val.length;
}
function guess_lang_by_char(val) {
var char_range = {
"grc" : /[\u0370-\u03ff]/,
"he" : /[\u0590-\u05ff]/,
// FIXME
"zh" : /[\u4e00-\u9fcc]/,
"syr" : /[\u0700-\u074f]/,
};
var best_match = 0.0;
var lang_code = null;
for (var idx in char_range) {
var match = count_symbol(val, char_range[idx]);
if (match > best_match) {
best_match = match;
lang_code = idx;
}
}
return lang_code;
}
function count_word(words, matcher) {
var count = 0;
for (var i = 0; i < words.length; ++i) {
for (var j = 0; j < matcher.length; ++j) {
if (words[i] == matcher[j]) {
count += 1;
break;
}
}
}
return count / words.length;
}
function split_word(val) {
var char_min = "a-zéèàùâêîôûŷäëïöüÿçœæſñ";
var char_maj = "A-ZÉÈÀÂÙÊÎÔÛŶÄËÏÖÏŸÇŒÆÑ";
var char = char_min + char_maj;
return val.split(new RegExp("[^" + char + "’]+"));
}
function guess_lang_by_word(val) {
var words = split_word(val);
for (var i = 0; i < words.length; ++i) {
words[i] = words[i].toLowerCase();
}
// 100 most frequent word gathered from use of template lang on fr.wp 2012/12/11
var matchers = {
"la" : [ " in", "de", "et", "est", "ad", "non", "ut", "qui", "quod", "cum", "ex", "quæ", "si", "per", "a", "ab", "esse", "sed", "sunt", "à", "quam", "anno", "aut", "pro", "se", "vel", "nec", "me", "ac", "hoc", "die", "ne", "sub", "quo", "te", "ejus", "rege", "atque", "sit", "quid", "dei", "inter", "regnante", "quia", "c", "id", "etiam", "sine", "omnia", "mense", "seu", "omnes", "deus", "ego", "quasi", "enim", "mihi", "sic", "autem", "nunc", "l", "ille", "res", "rerum", "nihil", "jam", "tibi", "quibus", "quem", "hæc", "post", "nos", "nisi", "dies", "apud", "quis", "hic", "sibi", "erat", "re", "ita", "habet", "super", "nemo", "ante", "neque", "sive", "ipse", "ubi", "nomine", "eum", "pater", "tamen", "potest", "domini", "jure", "fuit", "regis", "quoque", "è", ],
"de" : [ "der", "die", "und", "des", "zeitung", "geschichte", "das", "ruolandes", "neue", "liet", "zur", "den", "von", "über", "zu", "rheinische", "karl", "deutschen", "zeit", "für", "ueber", "kritik", "untersuchungen", "kepler", "ein", "deutsche", "meinet", "lage", "justins", "jahrbücher", "aus", "kapital", "ist", "frankreich", "arbeitenden", "rolandssaülen", "leben", "enthüllungen", "wir", "renaissance", "philosophie", "märtyrers", "mathematische", "kölnische", "klassen", "theorie", "lehre", "es", "einer", "deutschland", "deutsch", "auf", "theol", "sprache", "seine", "s", "politischen", "im", "ihre", "dem", "begründung", "an", "wissenschaft", "wie", "verhältniss", "unnd", "sozialismus", "schlosser", "nicht", "national", "mit", "ludwigslied", "lohnarbeit", "litteratur", "literatur", "kulturgeschichte", "kommunistenprozess", "kirche", "justin", "ich", "griechische", "f", "eine", "bei", "als", "alle", "œkonomie", "zum", "werke", "was", "staat", "sein", "schriften", "nationalökonomie", "nach", "menschliches", "man", "justinus", ],
"en" : [ "of", "the", "and", "a", "to", "on", "newton", "s", "for", "is", "by", "as", "that", "an", "reports", "be", "money", "political", "it", "clearing", "trade", "with", "from", "house", "london", "economy", "or", "his", "fact", "into", "report", "insp", "i", "value", "he", "currency", "history", "bank", "all", "act", "which", "but", "oct", "not", "inquiry", "are", "this", "times", "rep", "at", "labour", "hodgson", "principles", "have", "essay", "its", "faith", "their", "st", "healing", "great", "wealth", "was", "england", "free", "mathematical", "journal", "factory", "th", "society", "no", "nature", "poor", "will", "rent", "april", "would", "there", "country", "who", "they", "some", "new", "theory", "silver", "public", "observations", "if", "commodities", "child", "other", "one", "me", ],
"it" : [ "di", "e", "la", "che", "il", "della", "del", "l", "non", "a", "le", "è", "delle", "d", "de", "si", "per", "dell", "i", "economia", "reali", "un", "gli", "da", "alla", "mi", "dei", "con", "vita", "orlando", "degli", "à", "una", "o", "al", "se", "politica", "più", "moneta", "nel", "ed", "cose", "come", "spagna", "signor", "parte", "ogni", "giornale", "me", "dal", "trattato", "sono", "ne", "monte", "lo", "economisti", "chi", "bene", "tal", "suo", "sulla", "sempre", "s", "moderna", "ma", "et", "commercio", "altri", "tutto", "saggio", "piu", "nuova", "nella", "matematica", "donna", "ch", "ad", "vuoi", "va", "tutti", "trombone", "sopra", "scienze", "palazzo", "mio", "m", "io", "anno", "all", "terra", "tanto", "sull", "senza", "quando", "morte", "monete", "lago", "italiani", ],
"ga" : [ "file", "filé", "geis", "drui", "bard", "tuath", "tiyern", "tarbh", "senchus", "scélaige", "scél", "rédh", "rian", "riagol", "riadhy", "riad", "ri", "reidh", "orc", "nêt", "nuadu", "mor", "lurech", "liac", "iraird", "intlecht", "idon", "grian", "gearr", "gan", "foglama", "find", "fer", "fadesin", "dun", "druidecht", "druad", "dliged", "cóic", "cumal", "corain", "cluain", "ceathair", "cath", "cain", "cadeiriawg", "brithem", "bodb", "bith", "ban", "ainech", "acht", "a", ],
"es" : [ "de", "que", "la", "y", "el", "los", "a", "del", "en", "general", "mi", "yo", "cronica", "campo", "señor", "me", "mariscal", "las", "con", "por", "no", "al", "su", "soy", "alteza", "un", "le", "todos", "se", "o", "contrabandista", "hermanos", "es", "dios", "te", "rey", "hombres", "esta", "escuchate", "casa", "muerte", "historia", "diez", "una", "si", "rabia", "quiere", "porque", "paris", "para", "hombre", "como", "à", "usted", "mala", "franceses", "españa", "dona", "demonios", "amor", "amigos", "alda", "ya", "visteis", "tiempo", "tengo", "sus", "sin", "siete", "ser", "romancero", "ojo", "non", "nada", "muerto", "maldicho", "lo", "les", "hermoso", "has", "hablar", "frío", "francia", "este", "era", "decir", "cura", "ciencia", "carlomagno", "caramba", "buen", "blanco", "basta", "vostra", "vosotros", "son", "reyna", ],
"nl" : [ "van", "die", "was", "sijn", "den", "de", "und", "nie", "ist", "ie", "en", "dat", "willeme", "wat", "wart", "ware", "taele", "sîn", "studiën", "ouch", "oringhen", "ooc", "niet", "mit", "karlen", "karle", "ir", "hœrt", "het", "goet", "een", "des", "der", "dan", "beste", "al", "übr", "wârn", "wârheit", "wâr", "wunderlich", "wordt", "wiskunde", "wirde", "wilne", "willem", "werder", "wel", "waren", "walsce", "waert", "waer", "votteimittiss", "vortbringen", "vonder", "volge", "vloeke", "verslagen", "verclaert", "vander", "v", "underswanc", "underreit", "tot", "theorie", "theoretische", "theolog", "theol", "tafelronden", "süezer", "sô", "sîne", "swer", "stüende", "strijt", "stonden", "staatshuiskunde", "spreke", "spehen", "spaengien", "some", "so", "slaathuishoudkunde", "singhen", "sinen", "si", "seg", "se", "scheminckelberg", "saken", "rîche", "roncevale", "roelant", "rode", "ridder", "rede", "quasi", "prœve", ],
"br" : [ "ar", "a", "h", "ha", "c", "me", "euz", "breiz", "oa", "la", "d", "ann", "am", "lez", "ti", "roue", "pa", "ma", "he", "gant", "gan", "da", "barzaz", "an", "zo", "ur", "tud", "tiern", "oc", "nik", "mor", "meur", "mar", "m", "ho", "e", "bélek", "é", "vel", "tre", "roazon", "riou", "plac", "pillaouer", "penn", "paotr", "oan", "neb", "marchosi", "mad", "lu", "leûn", "lezou", "laez", "korrik", "korrigan", "korr", "kloer", "kler", "kinnig", "kenta", "karet", "hini", "han", "gwennek", "gwell", "gret", "goustadik", "gorrigan", "gand", "evuruz", "eur", "eta", "en", "ed", "duz", "disket", "denved", "bre", "braz", "bi", "barz", "az", "arsa", "armoricq", "adar", "abarz", "zôn", "zour", "zorseraj", "zet", "zent", "zad", "zabbad", "z", "wit", "wir", "welet", "wel", ],
"cy" : [ "rwydd", "mabinogion", "h", "gwelet", "gwelais", "cad", "ydyw", "wy", "wenn", "welais", "uid", "twrch", "trwyth", "trioed", "ti", "teyrn", "tarian", "taran", "prydain", "prif", "pic", "petguar", "penllu", "pedwar", "pali", "orl", "ore", "olwen", "oes", "o", "nudd", "ni", "namyn", "na", "myrdin", "myrdhin", "morgesyg", "morfarch", "mes", "merdhyn", "merddin", "mawr", "mael", "léan", "lyfr", "lurig", "lludd", "lluched", "lestr", "ledryc", "lean", "lawr", "law", "kys", "kyn", "kyllyngu", "kulhwch", "koridgwen", "kib", "kelling", "keinioc", "inis", "iar", "hit", "hergest", "gwynig", "gwo", "gwen", "gwell", "gwareiddiuw", "gorwyddfarch", "goc", "go", "glyweis", "gelyn", "forwyn", "ffroi", "ffrawdduniaw", "et", "ericed", "emrys", "efelhenn", "edrec", "dysgyl", "dysgl", "dydd", "duw", "dewin", "devin", "derwen", "corres", "corr", "chwys", "caïn", "cadwr", "byth", "brenn", "brenin", "bre", "bath", ],
};
var best_match = 0;
var lang_code = null;
for (var idx in matchers) {
var match = count_word(words, matchers[idx]);
if (match > best_match) {
best_match = match;
lang_code = idx;
}
}
return lang_code;
}
function guess_lang(val) {
// FIXME: remove html tag
var lang_code = guess_lang_by_char(val);
if (!lang_code)
lang_code = guess_lang_by_word(val);
if (!lang_code)
lang_code = self.gadget_lang.default_lang;
return lang_code;
}
function force_lang(lang_code) {
if (self.gadget_lang.force_lang[lang_code])
lang_code = self.gadget_lang.force_lang[lang_code];
return lang_code;
}
function is_poem(val) {
return val.search("<poem") == 0;
}
function extract_poem_class(val) {
var regexp = /^<poem class=([^>]*)>[\s\S]*$/m;
var result = regexp.exec(val);
var temp = "";
if (result) {
temp = result[1].replace(/^"(.*)"$/g, "$1");
temp = temp.replace(/^'(.*)'$/g, "$1");
temp = temp.replace(/^ (.*) $/g, "$1");
}
return temp;
}
function do_lang() {
var currentFocused = $("#wpTextbox1");
if (currentFocused && currentFocused.length) {
var val = currentFocused.textSelection( "getSelection", {} );
if (!val.length)
return;
var lang_code = guess_lang(val);
lang_code = force_lang(lang_code);
var pre = "{{lang|" + lang_code + "|";
var post = "}}";
if (is_poem(val)) {
var cls = extract_poem_class(val);
val = val.replace(/^<poem[^>]*>([\s\S]*)<\/poem>$/m, "$1");
if (cls) {
pre = '<poem class="lang-' + lang_code + " " + cls + '" ' + 'lang="' + lang_code + '">';
} else {
pre = '<poem class="lang-' + lang_code + '" ' + 'lang="' + lang_code + '">';
}
post = "</poem>";
}
currentFocused.textSelection(
"encapsulateSelection", {
"pre" : pre,
"peri" : val,
"post" : post,
"replace" : true
}
);
}
}
function addButtonLang() {
mw.loader.using('ext.wikiEditor', function() {
$(function() {
$('#wpTextbox1').wikiEditor('addToToolbar', {
section: 'main',
group: 'insert',
tools: {
'LanG': {
label: 'Insertion du modèle lang',
type: 'button',
oouiIcon: 'language',
action: {
type: 'callback',
execute: do_lang
}
}
}
});
});
});
}
/* Localisation section, you can provide your own data before loading this script to
* change the script behavior. Help page show how to customize this gadget.
*/
if (!self.gadget_lang) {
self.gadget_lang = {}
}
if (!self.gadget_lang.default_lang) {
self.gadget_lang.default_lang = "la";
}
if (!self.gadget_lang.force_lang) {
self.gadget_lang.force_lang = { };
}
/* end of localisation section */
if ($.inArray(mw.config.get("wgAction"), [ "edit", "submit"]) != -1) {
addButtonLang();
}