MediaWiki:Gadget-EvilUnicodeConverter.js

De Disposition de clavier bépo

Note : après avoir publié 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 appuyez sur Ctrl + F5 ou Ctrl + R (⌘ + R sur un Mac).
  • Google Chrome : appuyez sur Ctrl + Maj + R (⌘ + Shift + R sur un Mac).
  • Internet Explorer / Edge : maintenez la touche Ctrl en cliquant sur le bouton Actualiser ou pressez Ctrl + F5.
  • Opera : appuyez sur Ctrl + F5.
/* "Evil Unicode Conversion" script thingy for invisible unicode. [Version 0.0.5]
Converts trouble unicode characters to hexidecimal entities, and then back to unicode on page save.

NOTES: 
1. It may be tempting to leave them as entities on save, but certain MediaWiki: messages don't take kindly to it.
2. Any of these registered characters that exist in the document as entities before load will be converted to decimal 
entities. This allows pre-existing cases to remain un-reconverted on document save. So #x202e; would become #8238; on
load. Note that because of this, the ampersand escaping is no longer required.
3. This list now includes most characters of type:
 * Unicode spaces, whitespaces, non-breaking spaces.
 * Directional control, directional override, BiDi formatting.
 * Paragraph/newline formatting and visible-zero-width.
 * Silly unicode not suitable for markup.
*/

if(wgAction == 'edit' || wgAction == 'submit') {
  var eucTextbox = 'wpTextbox1';
} else if(wgCanonicalSpecialPageName == 'Upload') {
  var eucTextbox = 'wpUploadDescription';
}
if(window.eucTextbox) addOnloadHook(unconvertEvilUnicodeChars);
var eucChars = [160,173,847,1536,1537,1538,1539,1757,1807,3852,4447,4448,5760,6155,6156,6157,6158,8192,8193,8194,8195,8196,8197,8198,8199,8200,8201,8202,8203,8204,8205,8206,8207,8209,8232,8233,8234,8235,8236,8237,8238,8239,8239,8260,8287,8288,8289,8290,8291,8292,8298,8299,8300,8301,8302,8303,12272,12273,12274,12275,12276,12277,12278,12279,12280,12281,12282,12283,12288,12350,65279,65408,65532]

function unconvertEvilUnicodeChars() {
  var obj = document.getElementById(eucTextbox);
  if(!obj) return
  if(obj.readOnly) return

  //add handlers to convert just before save/preview/upload
  var eucBtns = ['wpSave','wpPreview','wpDiff','wpUpload'];
  var numbut = 0;
  for(var i=0;i<eucBtns.length;i++) {
    var btn = getElementByIdOrName(eucBtns[i]);
    if(btn) { 
      addClickHandler(btn,convertEvilUnicodeChars);
      numbut++;
    }
  }
  if(numbut == 0) return

  var token = getElementByIdOrName('wpEditToken');
  if(token.value.indexOf('!euc!') == -1) { 
    token.value += '!euc!';
  } else {
    return;
  }

  if(window.eucCharsCustom) eucChars = eucCharsCustom
  var str = obj.value;

  for(var i=0;i<eucChars.length;i++) {
    var pattern = new RegExp('&#x' + hx4(eucChars[i]) + ';','g');
    if(str.search(pattern)!=-1) str = str.replace(pattern,'&#' + eucChars[i] + ';')
  }

  for(var i=0;i<eucChars.length;i++) {
    var pattern = new RegExp(String.fromCharCode(eucChars[i]),'g');
    if(str.search(pattern)!=-1) str = str.replace(pattern,'&#x' + hx4(eucChars[i]) + ';')
  }
  obj.value = str;
}

function convertEvilUnicodeChars() {
  var token = getElementByIdOrName('wpEditToken');
  if(token.value.indexOf('!euc!') != -1) {
    token.value = token.value.replace(/!euc!/,'');
  } else {
    return;
  }

  if(window.eucCharsCustom) eucChars = eucCharsCustom
  var obj = document.getElementById(eucTextbox);
  var str = obj.value;

  for(var i=0;i<eucChars.length;i++) {
    var pattern = new RegExp('&#x' + hx4(eucChars[i]) + ';','g');
    if(str.search(pattern)!=-1) str = str.replace(pattern,String.fromCharCode(eucChars[i]))
  }
  obj.value = str;
}

function hx4(dec) {
  var h = dec.toString(16);
  while(h.length < 4) h = '0' + h;
  return h;
}

//Needed because the upload form submit has no ID
function getElementByIdOrName(idorname,par) {
  var parent = (!par) ? document : par
  if(parent.getElementById(idorname)) {
    return parent.getElementById(idorname);
  } else if(parent.getElementsByName(idorname)[0]) {
    return parent.getElementsByName(idorname)[0];
  } else {
    return false;
  }
}