MediaWiki:Gadget-Upload.js

Aus Wikiversity

Hinweis: Leere nach dem Veröffentlichen den Browser-Cache, um die Änderungen sehen zu können.

  • Firefox/Safari: Umschalttaste drücken und gleichzeitig Aktualisieren anklicken oder entweder Strg+F5 oder Strg+R (⌘+R auf dem Mac) drücken
  • Google Chrome: Umschalttaste+Strg+R (⌘+Umschalttaste+R auf dem Mac) drücken
  • Internet Explorer/Edge: Strg+F5 drücken oder Strg drücken und gleichzeitig Aktualisieren anklicken
  • Opera: Strg+F5
// <source lang=javascript">

// Einfache Validierung des Hochlade-Formulars. Füllt Vorlage:Information ins Beschreibungsfeld und validiert vor dem Hochladen,
// dass Beschreibung, Quelle, Urheber und Lizenz angegeben sind. Andernfalls wird eine entsprechende Fehlermeldung angezeigt und
// das Hochladen abgebrochen.
//
// Autor: Benutzer:Lupo, Juni 2013.
// Lizenz: CC-Zero

(function($, mw) {

  if (mw.config.get('wgNamespaceNumber') >= 0 || mw.config.get('wgCanonicalSpecialPageName') !== 'Upload') {
    return;
  }

  $(document).ready(function() {
    var form      = document.getElementById ('mw-upload-form');
    var descField = document.getElementById ('wpUploadDescription');

    if (!form || !descField) return;

    var destFile  = document.getElementById ('wpDestFile');

    // Fix a bug that was present in some MediaWiki versions
    if (destFile && destFile.disabled) {
      destFile.readOnly = true;
      destFile.disabled = false;
    }

    // Auto-fill
    if (!descField.value && !simpleIsReupload()) {
      descField.value =
        '{{Information\n'
       +'|Beschreibung = \n'
       +'|Quelle = \n'
       +'|Urheber = \n'
       +'|Datum = \n'
       +'|Genehmigung = \n'
       +'|Andere Versionen = \n'
       +'|Anmerkungen = \n'
       +'}}'
      ;
    }

    var submitButton = (function () {
      var tmp = document.getElementById ('wpUpload');
      if (tmp) return tmp;
      tmp = document.getElementsByName ('wpUpload');
      for (var i = 0; tmp && i < tmp.length; i++) {
        if (tmp[i].tagName.toLowerCase() === 'input' && tmp[i].type.toLowerCase() === 'submit') return tmp[i];
      }
      return null;
    }) ();

    if (!submitButton) return;

    var licenseMenu  = document.getElementById ('wpLicense');

    // Allowed licenses. Standard licenses all start with "Bild-". User-specified licenses
    // must be substed, and must be subpages in user space, either named "User:Foo/Lizenz"
    // or having the prefix "User:Foo/Lizenz-". (Or "Benutzer:Foo...", or instead of "Lizenz"
    // "Bild".) Note that a user license is only accepted if it is in the uploader's user space.
    var licenseRE    =
      new RegExp (
          '\\{\\{(([Ss]ubst:([Uu]ser|[Bb]enutzer):'
        + (mw.config.get('wgUserName') || "").replace(/([\\\^\$\.\?\*\+\(\)\[\]\|\{\}])/g, "\\$1")
        + '/([Ll]izenz|[Bb]ild)(-(\\w|-)+)?)'
        + '|([Bb]ild-(\\w|-)+)'
        + '|[Dd]ruckversion|[Bb]ildzitat'
        + ')(\\|[^\\}]*)?\\}\\}'
      );
    var endRE        =
      /(\n\|)|(\n\}\})|$/g;

    var checks = [
      { re: /\n\|\s*[Bb]eschreibung\s*=/g,
        msg : 'errNoDesc'
      }
     ,{ re: /\n\|\s*[Qq]uelle\s*=/g,
        msg : 'errNoSource'
      }
     ,{ re: /\n\|\s*[Uu]rheber\s*=/g,
        msg : 'errNoAuthor'
      }
    ];

    function check_field (check, error_list) {
      check.re.lastIndex = 0;
      var startMatch = check.re.exec (descField.value);
      if (!startMatch) {
        error_list[error_list.length] = check.msg;
      } else {
        endRE.lastIndex = check.re.lastIndex;
        var endMatch = endRE.exec (descField.value);
        var desc = descField.value.substring (check.re.lastIndex, endMatch.index)
                                  .replace(/\s+|\r|\n/g, "");
        if (desc.length == 0) error_list[error_list.length] = check.msg;
      }
      return error_list;
    }

    function simpleIsReupload () {
      // First check the hidden input field
      var reupload = document.getElementById ('wpForReUpload');
      if (reupload) return !!reupload.value;
      // If that doesn't exist, check whether destFile is editable
      return destFile && destFile.readOnly;
    }

    function isReupload () {
      // First check the hidden input field
      var reupload = document.getElementById ('wpForReUpload');
      if (reupload) return !!reupload.value;
      // If that doesn't exist, check whether destFile is editable and has a value
      if (!destFile || destFile.readOnly || !destFile.value)
        return true;
      // If it is, check whether we had an overwrite warning
      if (document.getElementById ('wpUploadWarningFileexists')) return true;
      var destfile_warning = document.getElementById ('wpDestFile-warning');
      if (!destfile_warning) return false;
      // We had some warning. Go through the list of links, if one of them points to the filename
      // given in the destFile field, we have a reupload.
      var lks = destfile_warning.getElementsByTagName ('a');
      if (lks == null || lks.length == 0) return false;
      var filename = destFile.value.replace(/^\s\s*/, '').replace(/\s\s*$/, '').replace(/ /g, '_');
      for (var i = 0; i < lks.length; i++) {
        var href = lks[i].getAttribute ('href', 2);
        if (href.indexOf (mw.config.get('wgScript')) == 0 || href.indexOf (mw.config.get('wgServer') + mw.config.get('wgScript')) == 0) {
          var m = /[&?]title=([^&]*)/.exec (href);
          if (m && m.length > 1) href = m[1]; else href = null;
        } else {
          var prefix = mw.config.get('wgArticlePath').replace ('$1', "");
          if (href.indexOf (prefix) != 0) prefix = mw.config.get('wgServer') + prefix; // Fully expanded URL?
          if (href.indexOf (prefix) == 0) href = href.substring (prefix.length); else href = null;
        }
        if (!href) continue;
        href = decodeURIComponent (href).replace (/ /g, '_');
        if (href.substring(href.indexOf(':') + 1) == filename) return true;
      }
      return false;
    }

    form.onsubmit = (function (old_onsubmit) {
      return (function () {
        var errors = [];
        if (!isReupload()) {
          // License check
          if (licenseMenu.selectedIndex === 0 || !licenseMenu.options[licenseMenu.selectedIndex].value) {
            // No license chosen: search the description for a license template.
            // All license templates must start with 'License-', or with "subst:User:License".
            if (!licenseRE.test (descField.value)) {
              errors[errors.length] = 'errNoLicense';
            }
          }
          // Description checks
          if (descField.value.length == 0) {
            errors[errors.length] = 'errNoDesc';
          } else {
            for (var i = 0; i < checks.length; i++)
              errors = check_field (checks[i], errors);
          }
        } // end if isReupload
        showErrors (errors);
        if (errors.length > 0) return false;
        // Call previous handler, if any)
        return (!old_onsubmit 
                 ? true 
                 : (typeof (old_onsubmit) == 'string'
                     ? eval (old_onsubmit)
                     : old_onsubmit.apply (form, arguments)
                   )
               );
      });
    }) (form.onsubmit);
  
    var errorMsgs = {
      'errNoLicense' : { msg   : "Es ist keine Lizenz angegeben. Ohne Lizenzangabe darf die Datei nicht hochgeladen werden."
                        ,field : descField }
     ,'errNoSource'  : { msg   : "Die Quellenangabe fehlt. Woher stammt die Datei ursprünglich?"
                        ,field : descField }
     ,'errNoAuthor'  : { msg   : "Es ist kein Urheber des Inhalts der Datei angegeben. Wer hat diesen Inhalt erstellt?"
                        ,field : descField }
     ,'errNoDesc'    : { msg   : "Es muss eine Beschreibung des Inhalts der Datei vorhanden sein."
                        ,field : descField }
    };

    var errorDisplay = (function () {
      var tmp = document.createElement ('div');
      tmp.width = '100%';
      tmp.style.border          = '1px solid red';
      tmp.style.backgroundColor = 'lightpink';
      tmp.style.padding         = '0.5em';
      tmp.style.marginBottom    = '0.5em';
      tmp.style.display         = 'none';
      return tmp;
    })();

    submitButton.parentNode.insertBefore (errorDisplay, submitButton);

    function showErrors (error_list) {
      if (!error_list || error_list.length == 0) {
        errorDisplay.style.display = 'none';
        return;
      }
      var msgs = document.createElement ('ul');
      msgs.style.paddingLeft = '1.0em';
      msgs.style.marginLeft = '0';
      for (var i = 0; i < error_list.length; i++) {
        var li = document.createElement ('li');
        li.appendChild (document.createTextNode (errorMsgs[error_list[i]].msg));
        msgs.appendChild (li);            
      }
      // And then display the messages
      if (errorDisplay.firstChild)
        errorDisplay.replaceChild (msgs, errorDisplay.firstChild);
      else
        errorDisplay.appendChild (msgs);
      errorDisplay.style.display = 'block';
    }

  });


})(jQuery, mediaWiki);
// </source>