<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="fr">
	<id>https://wicri-demo.istex.fr/Wicri/Incubateur/fr/index.php?action=history&amp;feed=atom&amp;title=MediaWiki%3AEdittools.js</id>
	<title>MediaWiki:Edittools.js - Historique des versions</title>
	<link rel="self" type="application/atom+xml" href="https://wicri-demo.istex.fr/Wicri/Incubateur/fr/index.php?action=history&amp;feed=atom&amp;title=MediaWiki%3AEdittools.js"/>
	<link rel="alternate" type="text/html" href="https://wicri-demo.istex.fr/Wicri/Incubateur/fr/index.php?title=MediaWiki:Edittools.js&amp;action=history"/>
	<updated>2026-04-27T10:43:47Z</updated>
	<subtitle>Historique des versions pour cette page sur le wiki</subtitle>
	<generator>MediaWiki 1.31.10</generator>
	<entry>
		<id>https://wicri-demo.istex.fr/Wicri/Incubateur/fr/index.php?title=MediaWiki:Edittools.js&amp;diff=2057&amp;oldid=prev</id>
		<title>imported&gt;Alice Hermann : Nouvelle page : // &lt;source lang=&quot;javascript&quot;&gt;  /*   EditTools support: add a selector, change into true buttons, enable for all text input fields   The special characters to insert are defined at [[...</title>
		<link rel="alternate" type="text/html" href="https://wicri-demo.istex.fr/Wicri/Incubateur/fr/index.php?title=MediaWiki:Edittools.js&amp;diff=2057&amp;oldid=prev"/>
		<updated>2009-03-24T15:28:27Z</updated>

		<summary type="html">&lt;p&gt;Nouvelle page : // &amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;  /*   EditTools support: add a selector, change into true buttons, enable for all text input fields   The special characters to insert are defined at [[...&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Nouvelle page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;// &amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/*&lt;br /&gt;
  EditTools support: add a selector, change into true buttons, enable for all text input fields&lt;br /&gt;
  The special characters to insert are defined at [[MediaWiki:Edittools]].&lt;br /&gt;
&lt;br /&gt;
  Uses several functions from MediaWiki:Common.js: getElementsByClassName, hookEvent, addEvent&lt;br /&gt;
*/&lt;br /&gt;
&lt;br /&gt;
if (load_edittools == true) { // Legacy. Do we really need this?&lt;br /&gt;
&lt;br /&gt;
if (typeof (EditTools_set_focus) == 'undefined')&lt;br /&gt;
  var EditTools_set_focus = true;&lt;br /&gt;
&lt;br /&gt;
if (typeof (EditTools_set_focus_initially) == 'undefined')&lt;br /&gt;
  var EditTools_set_focus_initially = EditTools_set_focus;&lt;br /&gt;
&lt;br /&gt;
var EditTools =&lt;br /&gt;
{&lt;br /&gt;
  createSelector : function ()&lt;br /&gt;
  {&lt;br /&gt;
    var spec = document.getElementById ('specialchars');&lt;br /&gt;
    if (!spec) return;&lt;br /&gt;
    var sb = getElementsByClassName (spec, 'p', 'specialbasic');&lt;br /&gt;
    if (sb.length&amp;lt;=1) return; // Only care if there is more than one&lt;br /&gt;
 &lt;br /&gt;
    var sel = document.createElement ('select');&lt;br /&gt;
    sel.style.display = 'inline';&lt;br /&gt;
    // sel.setAttribute ('onchange', 'EditTools.chooseCharSubset (selectedIndex, true);');&lt;br /&gt;
    // Apparently, this doesn't work on IE6. Use an explicit event handling function instead:    &lt;br /&gt;
    sel.onchange = EditTools.handleOnchange;&lt;br /&gt;
&lt;br /&gt;
    for (var i=0; i&amp;lt; sb.length; i++) {&lt;br /&gt;
      var o = document.createElement ('option');&lt;br /&gt;
      // Ugh. We have encoded Unicode characters in the names...&lt;br /&gt;
      var id = sb[i].id.replace (/.([0-9A-F][0-9A-F])/g, '%$1').replace(/_/g, ' ');      &lt;br /&gt;
      o.appendChild (document.createTextNode (decodeURIComponent (id)));&lt;br /&gt;
      sel.appendChild (o);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    spec.insertBefore (sel, spec.firstChild);&lt;br /&gt;
    EditTools.chooseCharSubset&lt;br /&gt;
     (0&lt;br /&gt;
      , (wgAction != 'submit')&lt;br /&gt;
        &amp;amp;&amp;amp; EditTools_set_focus_initially&lt;br /&gt;
        &amp;amp;&amp;amp; (wgCanonicalNamespace != 'Special' || wgCanonicalSpecialPageName != 'Upload')&lt;br /&gt;
     );&lt;br /&gt;
  },&lt;br /&gt;
     &lt;br /&gt;
  handleOnchange : function (evt)&lt;br /&gt;
  {&lt;br /&gt;
    var e    = evt || window.event;      // W3C, IE&lt;br /&gt;
    var node = e.target || e.srcElement; // W3C, IE&lt;br /&gt;
    &lt;br /&gt;
    EditTools.chooseCharSubset (node.selectedIndex, true);&lt;br /&gt;
    return true;&lt;br /&gt;
  },&lt;br /&gt;
&lt;br /&gt;
  chooseCharSubset : function (selected, set_focus)&lt;br /&gt;
  {&lt;br /&gt;
    var sb = getElementsByClassName (document.getElementById ('specialchars'), 'p', 'specialbasic');&lt;br /&gt;
    EditTools.makeButtons (sb[selected]);&lt;br /&gt;
    for (var i = 0; i &amp;lt; sb.length ; i++) {&lt;br /&gt;
      sb[i].style.display = i == selected ? 'inline' : 'none';&lt;br /&gt;
    }&lt;br /&gt;
    if (set_focus &amp;amp;&amp;amp; EditTools_set_focus) {&lt;br /&gt;
      var txtarea = EditTools.getTextArea ();&lt;br /&gt;
      if (txtarea) txtarea.focus ();&lt;br /&gt;
    }&lt;br /&gt;
  },&lt;br /&gt;
&lt;br /&gt;
  fixateWidth : function ()&lt;br /&gt;
  {&lt;br /&gt;
    var edit_bar = document.getElementById ('specialchars');&lt;br /&gt;
    if (!edit_bar) return;&lt;br /&gt;
    // Try to fixate the width of that bar, otherwise IE6 may make it wider, which will lead to&lt;br /&gt;
    // a table re-layout on the upload form resulting in the right column extending beyond the&lt;br /&gt;
    // right edge of the window.&lt;br /&gt;
    edit_bar.setAttribute ('width', &amp;quot;&amp;quot; + (edit_bar.clientWidth || edit_bar.offsetWidth));&lt;br /&gt;
    edit_bar.style.maxWidth = &amp;quot;&amp;quot; + (edit_bar.clientWidth || edit_bar.offsetWidth) + &amp;quot;px&amp;quot;;&lt;br /&gt;
    // If we're inside a table, fixate the containing table cell, too.&lt;br /&gt;
    var parent = edit_bar.parentNode;&lt;br /&gt;
    while (parent &amp;amp;&amp;amp; parent != document.body &amp;amp;&amp;amp; parent.nodeName.toLowerCase () != 'td')&lt;br /&gt;
      parent = parent.parentNode;&lt;br /&gt;
    if (parent &amp;amp;&amp;amp; parent != document.body) {&lt;br /&gt;
      parent.setAttribute ('width', &amp;quot;&amp;quot; + (parent.clientWidth || parent.offsetWidth));&lt;br /&gt;
      parent.style.maxWidth = &amp;quot;&amp;quot; + (parent.clientWidth || parent.offsetWidth) + &amp;quot;px&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
  },&lt;br /&gt;
&lt;br /&gt;
  makeButtons : function (section)&lt;br /&gt;
  {&lt;br /&gt;
    var edit_bar = section || document.getElementById ('specialchars');&lt;br /&gt;
    if (!edit_bar) return;&lt;br /&gt;
    var links = edit_bar.getElementsByTagName ('a');&lt;br /&gt;
    // 'links' is a *live* collection!&lt;br /&gt;
    var b = null;&lt;br /&gt;
    while (links.length) {&lt;br /&gt;
      b = document.createElement ('input');&lt;br /&gt;
      b.type = 'button';&lt;br /&gt;
      b.style.fontSize = '0.9em';&lt;br /&gt;
      b.style.paddingLeft = '1px';&lt;br /&gt;
      b.style.paddingRight = '1px';&lt;br /&gt;
      b.style.marginLeft = '1px';&lt;br /&gt;
      b.onclick = links[0].onclick;&lt;br /&gt;
      b.value = links[0].firstChild.data;&lt;br /&gt;
      var parent = links[0].parentNode;&lt;br /&gt;
      parent.replaceChild (b, links[0]); // This removes links[0] from links!&lt;br /&gt;
      b.blur (); // IE6 insists on marking some buttons as having the focus...&lt;br /&gt;
      var margin_added = false;&lt;br /&gt;
      // Remove text nodes (nodeType == Node.TEXT_NODE, but IE6 doesn't know that...)&lt;br /&gt;
      // Insert some spacing where desired.&lt;br /&gt;
      while (b.nextSibling &amp;amp;&amp;amp; b.nextSibling.nodeType == 3) {&lt;br /&gt;
        if (!margin_added &amp;amp;&amp;amp; b.nextSibling.data.search(/\S/) &amp;gt;= 0) {&lt;br /&gt;
          b.style.marginRight = '4px';&lt;br /&gt;
          margin_added = true;&lt;br /&gt;
        }&lt;br /&gt;
        parent.removeChild (b.nextSibling);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  },&lt;br /&gt;
&lt;br /&gt;
  enableForAllFields : function ()&lt;br /&gt;
  {&lt;br /&gt;
    if (typeof (insertTags) != 'function') return;&lt;br /&gt;
    // insertTags from the site-wide /skins-1.5/common/edit.js just inserts in the first&lt;br /&gt;
    // textarea in the document. Evidently, that's not good if we have multiple textareas.&lt;br /&gt;
    // My first idea was to simply add a hidden textarea as the first one, and redefine&lt;br /&gt;
    // insertTags such that it copied first the last active textareas contents over to that hidden&lt;br /&gt;
    // field, set the cursor or selection there, let the standard insertTags do its thing, and&lt;br /&gt;
    // then copy the hidden field's text, cursor position and selection back to the currently&lt;br /&gt;
    // active field. Unfortunately, that is just as complex as simply copying the whole code&lt;br /&gt;
    // from wikibits to here and let it work on the right text field in the first place.&lt;br /&gt;
    var texts = document.getElementsByTagName ('textarea');    &lt;br /&gt;
    for (var i = 0; i &amp;lt; texts.length; i++) {&lt;br /&gt;
      addEvent (texts[i], 'focus', EditTools.registerTextField);&lt;br /&gt;
    }&lt;br /&gt;
    // While we're at it, also enable it for input fields&lt;br /&gt;
    texts = document.getElementsByTagName ('input');&lt;br /&gt;
    for (var i = 0; i &amp;lt; texts.length; i++) {&lt;br /&gt;
      if (texts[i].type == 'text') addEvent (texts[i], 'focus', EditTools.registerTextField);&lt;br /&gt;
    }&lt;br /&gt;
    insertTags = EditTools.insertTags; // Redefine the global insertTags&lt;br /&gt;
  },&lt;br /&gt;
&lt;br /&gt;
  last_active_textfield : null,&lt;br /&gt;
&lt;br /&gt;
  registerTextField : function (evt)&lt;br /&gt;
  {&lt;br /&gt;
    var e = evt || window.event;&lt;br /&gt;
    var node = e.target || e.srcElement;&lt;br /&gt;
    if (!node) return;&lt;br /&gt;
    EditTools.last_active_textfield = node.id;&lt;br /&gt;
    return true;&lt;br /&gt;
  },&lt;br /&gt;
&lt;br /&gt;
  getTextArea : function ()&lt;br /&gt;
  {&lt;br /&gt;
    var txtarea = null;&lt;br /&gt;
    if (EditTools.last_active_textfield &amp;amp;&amp;amp; EditTools.last_active_textfield != &amp;quot;&amp;quot;)&lt;br /&gt;
      txtarea = document.getElementById (EditTools.last_active_textfield);&lt;br /&gt;
    if (!txtarea) {&lt;br /&gt;
      // Fallback option: old behaviour&lt;br /&gt;
      if (document.editform) {&lt;br /&gt;
        txtarea = document.editform.wpTextbox1;&lt;br /&gt;
      } else {&lt;br /&gt;
        // Some alternate form? Take the first one we can find&lt;br /&gt;
        txtarea = document.getElementsByTagName ('textarea');&lt;br /&gt;
        if (txtarea.length &amp;gt; 0) txtarea = txtarea[0]; else txtarea = null;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
    return txtarea;&lt;br /&gt;
  },&lt;br /&gt;
   &lt;br /&gt;
  insertTags : function (tagOpen, tagClose, sampleText)&lt;br /&gt;
  {&lt;br /&gt;
    var txtarea = EditTools.getTextArea ();&lt;br /&gt;
    if (!txtarea) return;&lt;br /&gt;
    var selText, isSample = false;&lt;br /&gt;
&lt;br /&gt;
    function checkSelectedText () {&lt;br /&gt;
      if (!selText) {&lt;br /&gt;
        selText = sampleText; isSample = true;&lt;br /&gt;
      } else if (selText.charAt (selText.length - 1) == ' ') { // Exclude ending space char&lt;br /&gt;
        selText = selText.substring (0, selText.length - 1);&lt;br /&gt;
        tagClose += ' '&lt;br /&gt;
      } &lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    if (document.selection &amp;amp;&amp;amp; document.selection.createRange) { // IE/Opera&lt;br /&gt;
      // Save window scroll position&lt;br /&gt;
      var winScroll = 0;&lt;br /&gt;
      if (document.documentElement &amp;amp;&amp;amp; document.documentElement.scrollTop)&lt;br /&gt;
        winScroll = document.documentElement.scrollTop;&lt;br /&gt;
      else if (document.body)&lt;br /&gt;
        winScroll = document.body.scrollTop;&lt;br /&gt;
      // Get current selection  &lt;br /&gt;
      txtarea.focus();&lt;br /&gt;
      var range = document.selection.createRange();&lt;br /&gt;
      selText = range.text;&lt;br /&gt;
      // Insert tags&lt;br /&gt;
      checkSelectedText ();&lt;br /&gt;
      range.text = tagOpen + selText + tagClose;&lt;br /&gt;
      // Mark sample text as selected&lt;br /&gt;
      if (isSample &amp;amp;&amp;amp; range.moveStart) {&lt;br /&gt;
        if (window.opera) tagClose = tagClose.replace (/\n/g, &amp;quot;&amp;quot;);&lt;br /&gt;
        range.moveStart( 'character', - tagClose.length - selText.length); &lt;br /&gt;
        range.moveEnd ('character', - tagClose.length); &lt;br /&gt;
      }&lt;br /&gt;
      range.select ();   &lt;br /&gt;
      // Restore window scroll position&lt;br /&gt;
      if (document.documentElement &amp;amp;&amp;amp; document.documentElement.scrollTop)&lt;br /&gt;
        document.documentElement.scrollTop = winScroll;&lt;br /&gt;
      else if (document.body)&lt;br /&gt;
        document.body.scrollTop = winScroll;&lt;br /&gt;
    } else if (txtarea.selectionStart || txtarea.selectionStart == '0') { // Mozilla&lt;br /&gt;
      // Save textarea scroll position&lt;br /&gt;
      var textScroll = txtarea.scrollTop;&lt;br /&gt;
      // Get current selection&lt;br /&gt;
      txtarea.focus();&lt;br /&gt;
      var startPos = txtarea.selectionStart;&lt;br /&gt;
      var endPos   = txtarea.selectionEnd;&lt;br /&gt;
      selText = txtarea.value.substring (startPos, endPos);&lt;br /&gt;
      // Insert tags&lt;br /&gt;
      checkSelectedText ();&lt;br /&gt;
      txtarea.value = txtarea.value.substring (0, startPos)&lt;br /&gt;
                    + tagOpen + selText + tagClose&lt;br /&gt;
                    + txtarea.value.substring (endPos);&lt;br /&gt;
      // Set new selection&lt;br /&gt;
      if (isSample) {&lt;br /&gt;
        txtarea.selectionStart = startPos + tagOpen.length;&lt;br /&gt;
        txtarea.selectionEnd = startPos + tagOpen.length + selText.length;&lt;br /&gt;
      } else {&lt;br /&gt;
        txtarea.selectionStart = startPos + tagOpen.length + selText.length + tagClose.length;&lt;br /&gt;
        txtarea.selectionEnd = txtarea.selectionStart;&lt;br /&gt;
      }&lt;br /&gt;
      // Restore textarea scroll position&lt;br /&gt;
      txtarea.scrollTop = textScroll;&lt;br /&gt;
    }&lt;br /&gt;
  }, // end insertTags&lt;br /&gt;
&lt;br /&gt;
  setup : function ()&lt;br /&gt;
  {&lt;br /&gt;
    EditTools.fixateWidth ();&lt;br /&gt;
    EditTools.createSelector ();&lt;br /&gt;
    EditTools.enableForAllFields ();&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
} // end EditTools&lt;br /&gt;
&lt;br /&gt;
// Do not use addOnloadHook; it runs *before* the onload event fires. At that time, onclick or&lt;br /&gt;
// onfocus handlers may not yet be set up properly.&lt;br /&gt;
hookEvent ('load', EditTools.setup);&lt;br /&gt;
&lt;br /&gt;
} // end if&lt;br /&gt;
&lt;br /&gt;
// &amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>imported&gt;Alice Hermann</name></author>
		
	</entry>
</feed>