MediaWiki:WikiEditor-insert-Zitat.js

Aus Open Source Ecology - Germany
Zur Navigation springen Zur Suche springen

Hinweis: Leere nach dem Speichern 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: Strg+F5 drücken oder Strg drücken und gleichzeitig Aktualisieren anklicken
  • Opera: Gehe zu Menü → Einstellungen (Opera → Einstellungen auf dem Mac) und dann auf Datenschutz & Sicherheit → Browserdaten löschen → Gespeicherte Bilder und Dateien.
/* <pre>*/
/* global $, mw */
/*jslint es5: true, sloppy: true, todo: true, white: true, indent: 2 */
/* 
   This script is specific to this Wiki
   
   insert a German {{Zitat|Literature key|alternative text}}
  DEPENDENCIES:
   * Template:Literatur
   * Template:Literaturdaten
   * Template:Zitat
   * Property:Autor
   * Kategorie:Literatur
   * CSS classes vertical-align-top booktable

  USAGE:
   if (mw.config.get('wgAction') == "edit" || mw.config.get('wgAction') == "submit" ) {
     mw.loader.load( mw.config.get('wgScript') + '?title=MediaWiki:WikiEditor-insert-Zitat.js&action=raw&ctype=text/javascript' );;// Wizard to insert template:Zitat
   }
  TODO
   * Autor oder Herausgeber sind nicht speziefisch an Literaturquelle gebunden, 
     es werden ALLE Autoren oder ALLE Herausgeber gefunden, unabhängig, wo sie im Wiki auftauchen. 
     Ein Vorfilter ist nicht so leicht möglich (Internes Objekt?).
*/
$('#wpTextbox1').on('wikiEditor-toolbar-doneInitialSections', function () {
var iconInsertZitat = 'https://wiki.opensourceecology.de/images/a/a3/Toolbar_insert_reference_text.png',
  iconFormEdit = 'https://wiki.opensourceecology.de/images/thumb/4/4d/Farm-Fresh_application_form_edit.png/22px-Farm-Fresh_application_form_edit.png',
  zitatTool = function () {
    return {
      module: {
        'insert-zitat': {
          title: 'Assistent für ein Literaturzitat',
          id: 'wikieditor-toolbar-zitat-dialog',
          html: '<div class="wikieditor-toolbar-dialog-wrapper">\
          <fieldset><div class="wikieditor-toolbar-table-form">\
            Aus der ↗&nbsp:<a href="'+ mw.config.get("wgServer") + mw.config.get("wgArticlePath").replace(/\$1/,'Kategorie:Literatur')
                  +'" target="_blank">Kategorie:Literatur</a> stammende Referenzen können hier für ein Zitat ausgewählt werden.\
             Geben Sie zuerst einen Autor ein, dann wird Ihnen eine Liste gefundener Literatureinträge gezeigt. Klicken Sie auf ein Zitat, dass Sie verwenden möchten&nbsp;– fügen gegebenenfalls einen anderen Anzeigetext hinzu&nbsp;– und klicken Sie abschließend auf Einfügen.<br/>\
            Tip: Am Ende einer Wikiseite können Sie mit {{Literaturverzeichnis}} ein automatisches Verzeichnis erstellen.\
            <div class="wikieditor-toolbar-field-wrapper">\
              <table>\
                <tr><td>\
                  <label for="wikieditor-toolbar-zitat-autor-search"><b>Autor suchen:</b></label>\
                </td><td>\
                  <input type="text" id="wikieditor-toolbar-zitat-autor-search" placeholder="Autor eingeben" size="35"/> oder\
                </td></tr>\
                <tr><td>\
                  <label for="wikieditor-toolbar-zitat-herausgeber-search"><b>Herausgeber suchen:</b></label>\
                </td><td>\
                  <input type="text" id="wikieditor-toolbar-zitat-herausgeber-search" placeholder="Herausgeber eingeben" size="35"/>\
                </td></tr>\
              </table><br/>\
              <div style="overflow-y:scroll;max-height:30ex;"><table class="vertical-align-top booktable" id="wikieditor-toolbar-zitat-foundreferences" ></table></div>\
              <code>{{Zitat|<input type="text" id="wikieditor-toolbar-zitat-text" placeholder="Literaturschlüssel" size="35"/>|<input type="text" id="wikieditor-toolbar-zitat-alttext" placeholder="Optionaler Alternativtext"/>}}</code>\
            </div>\
          </div>\
          </fieldset>\
          </div>',
          init: function () {
            // Insert translated strings into labels
            $(this).find('[rel]').each(function () {
              $(this).text(mw.msg($(this).attr('rel')));
            });
            /**
             * list references in #wikieditor-toolbar-zitat-foundreferences
             * @param {object} data from action=ask query.results
             * @returns {undefined}
             */
            function generateRefList (data) {
              var results = data.query.results;
              //  console.log("generateRefList(data)");
              //  console.log(data);
              $('#wikieditor-toolbar-zitat-foundreferences').html('');// reset list
              if (!results) {
                $('<tr><th>Zitiere</th><th>Literatureintrag</th></tr>'
                  + '<tr><td colspan="2">Keinen Eintrag gefunden</td></tr>').appendTo('#wikieditor-toolbar-zitat-foundreferences');
              } else {
                $('<tr><th>Zitiere</th><th>Literatureintrag</th></tr>').appendTo('#wikieditor-toolbar-zitat-foundreferences');
                $.map(results, function(itemresult, item) {
                  //console.log("DEBUG map(indexresult, item)");
                  //console.log(itemresult);
                  //console.log(item);
                  var pageName = itemresult.fulltext, 
                    itemHtmlId = encodeURIComponent(pageName).replace(/'/,"%27").replace(/[%\.]/g,"_");// id with . is problematic
                  $.ajax({
                    url: mw.config.get("wgServer") + mw.config.get("wgScriptPath") + "/api.php",
                    dataType: "json",
                    data: {
                      action: "parse",
                      text: "{{Literaturdaten|" + pageName + "}}",
                      format: "json"
                    }
                  })
                  .done(function(data) {
                    //console.log(data);
                    $.map(data.parse.text, function(refitem) {
                      $('<tr>'
                        +'<td id="insert_ref_'+itemHtmlId+'"></td>'
                        +'<td style="padding-left:1em!important;">'
                          + '<div style="float:right;margin-left:5px;" title="Eintrag bearbeiten"><a '
                          + ' href="'+ mw.config.get("wgServer") + mw.config.get("wgArticlePath").replace(/\$1/,'Special:FormEdit/Literatur/' + pageName.replace(/ /g,"_")) +'"'
                          + ' target="_blank" '
                          + ' >'
                            + '<img src="' + iconFormEdit + '" />'
                          + '</a></div>'
                          + refitem 
                          + '</td>'
                      +'</tr>')
                        .appendTo('#wikieditor-toolbar-zitat-foundreferences');
                      $('<a href="#">' + pageName.replace(/^(.*)\s+([^\s]+)$/,"$1 ($2)") + '</a>')
                        .button()
                        .on('click', function () {
                          $('#wikieditor-toolbar-zitat-text').val($(this).text());
                        })
                        .appendTo('#insert_ref_'+itemHtmlId);
                    });// map
                  });
                });// map result
              }// if else found data
            }// function generateRefList(data)
            /**
             * generates a reflist form an Autor input. Used in autocomplete
             * @param {object} ui autocomplete
             * @param {string} property 
             * @returns generateRefList(data);
             */
            function getAutorData2Reflist(ui, property) {
              //http://wiki.bayernflora.de/w/api.php?action=ask&query=[[Autor::~*Vollrath, H.*]][[Kategorie:Literatur]]|%3FAutor|order%3Ddesc&format=jsonfm
              $.ajax({// get pages for author
                url: mw.config.get("wgServer") + mw.config.get("wgScriptPath") + "/api.php",
                dataType: "json",
                data: {
                  action: "ask",
                  // Like Query does not work for strings longer than 40 characters http://sourceforge.net/p/semediawiki/mailman/message/31876801/
                  query: "[["+property+"::~*" + (ui.item.value.length > 40 ? ui.item.value : ui.item.value + "*") + "]][[Kategorie:Literatur]]|?"+property,
                  format: "json"
                }
              })
              .done(function(data) {
                //console.log(data);
                if (typeof data.query.results === "object") {
                  generateRefList(data);
                }
              });
            }// getAutorData2Reflist()
            if (typeof mw !== "undefined"){
              mw.loader.using("jquery.ui.autocomplete", function () {
                $( "#wikieditor-toolbar-zitat-autor-search" ).autocomplete({
                  'source': function( request, response ) {
                    $.ajax({
                      url: mw.config.get("wgServer") + mw.config.get("wgScriptPath") + "/api.php",
                      dataType: "json",
                      data: {
                        action: "pfautocomplete",
                        substr: $('#wikieditor-toolbar-zitat-autor-search').val().toLowerCase(),
                        category: "Literatur",// TODO cannot be combined. todo: filter only for Literatur (solution: internal objects "Literatureintrag hat Autor"?
                        property: "Autor",
                        format: "json"
                      }
                    })
                    .done(function(data) {
                      //console.log(data);
                      response( $.map(data.pfautocomplete, function(item) {
                        return { label: item.title, value: item.title };
                      }));
                    });
                  },
                  'select': function( event, ui ) {// when selecting Autor
                    getAutorData2Reflist(ui, "Autor");
                  }// select
                  /*,'focus': function( event, ui ) {// when focus Autor
                    getAutorData2Reflist(ui);
                  }// focus*/
                });// autocomplete-autor
                $( "#wikieditor-toolbar-zitat-herausgeber-search" ).autocomplete({
                  'source': function( request, response ) {
                    $.ajax({
                      url: mw.config.get("wgServer") + mw.config.get("wgScriptPath") + "/api.php",
                      dataType: "json",
                      data: {
                        action: "pfautocomplete",
                        substr: $('#wikieditor-toolbar-zitat-herausgeber-search').val().toLowerCase(),
                        category: "Literatur",
                        property: "Herausgeber",
                        format: "json"
                      }
                    })
                    .done(function(data) {
                      //console.log(data);
                      response( $.map(data.pfautocomplete, function(item) {
                        return { label: item.title, value: item.title };
                      }));
                    });
                  },
                  'select': function( event, ui ) {// when selecting Herausgeber
                    getAutorData2Reflist(ui, "Herausgeber");
                  }// select
                  /*,'focus': function( event, ui ) {// when focus Autor
                    getAutorData2Reflist(ui);
                  }// focus*/
                });// autocomplete
              });
            }
            
          },// end init
          dialog: {
            dialogClass: 'wikiEditor-toolbar-dialog',
            width: 650,
            buttons: {
              'wikieditor-toolbar-tool-reference-insert': function () {// use translated default buttons of insert-reference
                var insertText = $('#wikieditor-toolbar-zitat-text').val(),
                        altText = $('#wikieditor-toolbar-zitat-alttext').val();
                // Close the dialog
                $(this).dialog('close');
                $.wikiEditor.modules.toolbar.fn.doAction(
                  $(this).data('context'),
                  {
                    type: 'replace',
                    options: {
                      pre: '{{Zitat|',
                      peri: ( insertText.length === 0 ? "Literaturschlüssel fehlt" :  insertText ) + (altText.length ? "|" + altText : "" ) ,
                      post: '}}'
                    }
                  },
                  $(this)
                );
                // Restore form state
                // $('#wikieditor-toolbar-zitat-text').val('');
              },
              'wikieditor-toolbar-tool-reference-cancel': function () {// use translated default buttons of insert-reference
                $(this).dialog('close');
              }
            },
            open: function () {
              if (!($(this).data('dialogkeypressset'))) {
                $(this).data('dialogkeypressset', true);
                // Execute the action associated with the first button
                // when the user presses Enter
                $(this).closest('.ui-dialog').keypress(function (e) {
                  if ((e.keyCode || e.which) === 13) {
                    var button = $(this).data('dialogaction') || $(this).find('button:first');
                    button.click();
                    e.preventDefault();
                  }
                });
                // Make tabbing to a button and pressing
                // Enter do what people expect
                $(this).closest('.ui-dialog').find('button').focus(function () {
                  $(this).closest('.ui-dialog').data('dialogaction', this);
                });
              }
            }
          }
        }
      }
    };//end return object
  };//module zitatTool
  $('#wpTextbox1').wikiEditor('addModule', zitatTool());
/*
if ( [ 'edit', 'submit' ].indexOf( mw.config.get( 'wgAction' ) ) !== -1 ) {
  // Add a hook handler.
  mw.hook( 'wikiEditor.toolbarReady' ).add( function ( $textarea ) {
    // Configure a new toolbar entry on the given $textarea jQuery object.
    $textarea.wikiEditor( 'addToToolbar', {
      'section': 'main',
      'group': 'insert',
      'tools': {
        'zitat': {
          'label': 'Quellenangabe {{Zitat}}', // or use labelMsg for a localized label, see above
          'type': 'button',
          'icon': iconInsertZitat,
          'action': {
            'type': 'dialog',
            'module': 'insert-zitat'
          }
        }
      }
    } );
  } );
}
*/
  $('#wpTextbox1').wikiEditor('addToToolbar', {
    'section': 'main',
    'group': 'insert',
    'tools': {
      'zitat': {
        'label': 'Quellenangabe {{Zitat}}', // or use labelMsg for a localized label, see above
        'type': 'button',
        'icon': iconInsertZitat,
        'action': {
          'type': 'dialog',
          'module': 'insert-zitat'
        }
      }
    }
  });// END addToToolbar
});// on 'wikiEditor-toolbar-doneInitialSections'
/* </pre>*/