Utilisateur:Orlodrim/PaStec-pagesliees.js

Note : après avoir enregistré la page, vous devrez forcer le rechargement complet du cache de votre navigateur pour voir les changements.

Mozilla / Firefox / Konqueror / Safari : maintenez la touche Majuscule (Shift) en cliquant sur le bouton Actualiser (Reload) ou pressez Maj-Ctrl-R (Cmd-R sur Apple Mac) ;

Chrome / Internet Explorer / Opera : maintenez la touche Ctrl en cliquant sur le bouton Actualiser ou pressez Ctrl-F5.
if (typeof(rblOpenInNewWindow) == 'undefined') rblOpenInNewWindow = true;

var rblFrame;
var rblPage;

function rblMakeActionLink(page, url, action) {
  var formattedPage = mw.html.escape(page);
  if (page.substr(0, 14) == 'Modèle:Palette') {
    formattedPage = '<b>' + formattedPage + '</b>';
  }
  var target = rblOpenInNewWindow ? ' target="rblWindow"' : '';
  return formattedPage + ' [<a href="' + mw.html.escape(url) + '"' + target + '>' + mw.html.escape(action) + '</a>]';
}

function rblMakeArticleLink(page, linkTarget) {
  var url = mw.util.getUrl(page, {'action': 'edit', 'rblink': linkTarget}) + '#editform';
  return rblMakeActionLink(page, url, 'éditer');
}

function rblMakeRedirLink(page) {
  if (mw.config.get('wgUserGroups') && mw.config.get('wgUserGroups').indexOf('sysop') != -1) {
    var reason = 'Redirection vers la page « ' + rblPage + ' », supprimée par [[' + mw.config.get('wgPageName') + '|décision PàS]]';
    var url = mw.util.getUrl(page, {'action': 'delete', 'wpReason': reason});
    return rblMakeActionLink(page, url, 'supprimer la redirection');
  } else {
    return mw.html.escape(page) + ' (redirection)';
  }
}

function rblIgnoreNamespace(namespace) {
  return namespace != 0 && namespace != 10;
}

function rblReadList(obj) {
  var html = '';
  for (var i = 0; i < obj.query.backlinks.length; i++) {
    var bl = obj.query.backlinks[i];
    if (rblIgnoreNamespace(bl.ns)) continue;
    if (typeof bl.redirect != 'undefined') {
      var rlTags = bl.redirlinks;
      html += rblMakeRedirLink(bl.title) + '<br>';
      if (typeof bl.redirlinks != 'undefined') {
        for (var j = 0; j < bl.redirlinks.length; j++) {
          if (rblIgnoreNamespace(bl.redirlinks[j].ns)) continue;
          html += '- ' + rblMakeArticleLink(bl.redirlinks[j].title, bl.title) + '<br>';
        }
      }
    } else {
      html += rblMakeArticleLink(bl.title, rblPage) + '<br>';
    }
  }
  if (obj.query.embeddedin.length > 0) {
    html += rblMakeActionLink('Utilisations en tant que modèle, par transclusion',
        mw.util.getUrl('Spécial:Pages_liées/' + rblPage, {'hidelinks': 1, 'hideredirs': 1}), 'voir') + '<br>';
  }
  if (html != '') {
    html = 'Liste des pages liées :<br>' + html + '[<a href="javascript:rblCreateList();">rafraîchir</a>]';
  } else {
    html = "Il n'y a pas de pages liées";
  }
  rblFrame.innerHTML = html;
}

function rblCreateList() {
  var ns = mw.config.get('wgNamespaceNumber');
  rblPage = (ns == 1 ? '' : mw.config.get('wgFormattedNamespaces')[ns - 1] + ':') +
      mw.config.get('wgTitle').replace(/\/Suppression$/, "");
  rblFrame = document.getElementById("rblFrame");
  if (!rblFrame) {
    rblFrame = document.createElement("div");
    rblFrame.id = "rblFrame";
    var nextElement = document.getElementById("firstHeading").nextSibling;
    nextElement.parentNode.insertBefore(rblFrame, nextElement);
  }
  rblFrame.innerHTML = "Chargement des pages liées...";
  query = {'format': 'json', 'action': 'query', 'list': 'backlinks|embeddedin',
           'bltitle': rblPage, 'blredirect': 1, 'bllimit': 250,
           'eititle': rblPage, 'eilimit': 100};
  $.getJSON(mw.util.wikiScript('api'), query, rblReadList);
}

// Recherche des liens sur les pages d'édition

var rblList;
var rblLastPos;

function rblNormalizeLink(s) {
  var i = s.indexOf("#");
  if (i == -1) i = s.length;
  var article = s.substr(0, i).replace(/^ +/, "").replace(/ +$/, "").replace(/ /g, "_");
  if (article == "")
    article = mw.config.get('wgPageName');
  else if (article[0] == ":")
    article = article.substr(1);
  article = article.substr(0, 1).toUpperCase() + article.substr(1); // Ne marche que dans l'espace principal
  return article;
}

/* Rend inactif un lien javascript, de façon visible. */
function rblDisableLink(link) {
  link.href = "javascript:;";
  link.style.color = "silver";
  link.style.cursor = "default";
  link.style.textDecoration = "none";
}

/* Recherche la première occurence d'une ancre à partir d'une position donnée. */
function rblFindNext(s, link, start) {
  var i = start, j, k, pageLink;
  var linkN = rblNormalizeLink(link);
  while (true) {
    i = s.indexOf("[[", i);
    if (i == -1) return false;
    i += 2;
    j = s.indexOf("]]", i);
    if (j == -1) return false;
    pageLink = s.substr(i, j - i);
    k = pageLink.indexOf("|");
    if (k != -1)
      pageLink = pageLink.substr(0, k);
    else
      k = pageLink.length;
    if (linkN == rblNormalizeLink(pageLink))
      return [i, i + k];
    i = j + 2;
  }
}

function rblSetSelection(start, end) {
  var txt = document.getElementById('editform').getElementsByTagName('textarea')[0];
  txt.focus();
  txt.setSelectionRange(start, start);
  var evt = document.createEvent('KeyEvents');
  evt.initKeyEvent('keypress', true, true, window, false, false, false, false, 0, 32);
  txt.dispatchEvent(evt);
  evt = document.createEvent('KeyEvents');
  evt.initKeyEvent('keypress', true, true, window, false, false, false, false, 8, 0);
  txt.dispatchEvent(evt);
  txt.setSelectionRange(start, end);
}

function rblSelectLink2() {
  rblSelectLink();
}

/* Sélectionne l'occurence suivante d'une ancre brisée donnée. */
function rblSelectLink() {
  var s = document.getElementById("editform").getElementsByTagName("textarea")[0].value;
  var pos = rblFindNext(s, rblPage, rblLastPos[1]);
  var msg = document.getElementById("rblMsg");
  if (!pos) var pos = rblFindNext(s, rblPage, 0);
  if (!pos) {
    msg.innerHTML = "(non trouvé)";
    return false;
  }
  rblLastPos = pos;
  msg.innerHTML = rblFindNext(s, rblPage, pos[1]) ? "" : "[dernière occurence]";
  rblSetSelection(pos[0], pos[1]);
  return true;
}

function rblRemoveLink() {
  var textArea = document.getElementById('editform').getElementsByTagName('textarea')[0];
  var txt = textArea.value;
  var i = rblLastPos[0], j = rblLastPos[1];
  if (i != j && i >= 2 && txt.substr(i - 2, 2) == "[[" &&
      rblNormalizeLink(txt.substr(i, j - i)) == rblNormalizeLink(rblPage)) {
    if (txt.substr(j, 1) == "|") {
      var k = txt.indexOf("]]", j + 1);
      if (k == -1) k = txt.length;
      textArea.value = txt.substr(0, i - 2) + txt.substr(j + 1, k - j - 1) + txt.substr(k + 2);
      rblLastPos = [i - 2, i - 2];
      if (!rblSelectLink()) rblSetSelection(i - 2, i - 2 + k - j - 1);
    } else if (txt.substr(j, 2) == "]]") {
      textArea.value = txt.substr(0, i - 2) + txt.substr(i, j - i) + txt.substr(j + 2);
      rblLastPos = [i - 2, i - 2];
      if (!rblSelectLink()) rblSetSelection(i - 2, i - 2 + j - i);
    }
  }
}

/* Crée des liens sous la fenêtre d'édition pour chercher les différentes
   occurrences du lien dans l'article. */
function rblFormatEditPage() {
  var rblList = document.createElement("span");
  var p = document.getElementById("MediaWiki-summary");
  p.insertBefore(rblList, p.firstChild);

  var wpSummary = document.getElementById("wpSummary");
  if (wpSummary) wpSummary.value = "Retrait du lien vers la page « " + rblPage + " » supprimée par décision PàS";
  var wpMinoredit = document.getElementById("wpMinoredit");
  if (wpMinoredit) wpMinoredit.checked = true;

  var copyWarn = document.getElementById("editpage-copywarn");
  if (copyWarn) copyWarn.style.display = "none";

  rblList.innerHTML = mw.html.escape(rblPage) +
          " (<a href=\"javascript:rblSelectLink2();\">chercher</a> | <a href=\"javascript:rblRemoveLink();\" id=\"rblRBLLink\">déwikifier</a>)" +
          " <span id=\"rblMsg\"></span><br />";
  rblLastPos = [0, 0];
  rblSelectLink();
}

$(function() {
  var action = mw.config.get('wgAction');
  if (action == 'view' && mw.config.get('wgTitle').match(/\/Suppression$/)) {
    mw.loader.using('mediawiki.util', function() {
      mw.util.addPortletLink('p-tb', 'javascript:rblCreateList();', 'Déwikif pages liées', 'r-blinks', 'Assistant de suppression des liens vers cette page');
    });
  } else if (action == 'edit') {
    rblPage = mw.util.getParamValue('rblink');
    if (rblPage !== null) rblFormatEditPage();
  }
});