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();
}