MediaWiki:Gadget-InsertCW.js

Материал из ВикиИслама — веб-ресурса, посвященного Исламу
Перейти к навигации Перейти к поиску

Замечание: Возможно, после публикации вам придётся очистить кэш своего браузера, чтобы увидеть изменения.

  • Firefox / Safari: Удерживая клавишу Shift, нажмите на панели инструментов Обновить либо нажмите Ctrl+F5 или Ctrl+R (⌘+R на Mac)
  • Google Chrome: Нажмите Ctrl+Shift+R (⌘+Shift+R на Mac)
  • Internet Explorer / Edge: Удерживая Ctrl, нажмите Обновить либо нажмите Ctrl+F5
  • Opera: Нажмите Ctrl+F5.
  if ($.inArray (mw.config.get ('wgAction'), ['edit', 'submit']) !== -1) { mw.loader.using ('user.options', function () { if ( mw.user.options.get ('usebetatoolbar')) { mw.loader.using ('ext.wikiEditor.toolbar', function () { mw.loader.using ('ext.wikiEditor.dialogs', function () { $(document).ready (function () {

    var idPrefix = 'wikieditor-toolbar-cw-';

    var languages = [
      { name: 'Английский', template: '{{Англ}}' }
    ];

    var id = function (id) {
      return idPrefix + id;
    }

    var extendWikiEditor = function () {
      $('#wpTextbox1').wikiEditor ('addDialog', {
        'insert-cw': {
          title: 'Вставка подробной ссылки',
          id: id ('dialog'),
          resizeme : false,
          init: dialogInit,
          html: dialogHtml (),
          dialog: {
            width: 750,
            buttons: {
              'wikieditor-toolbar-tool-reference-insert': insertCWAction
            },
            dialogClass: 'wikiEditor-toolbar-dialog',
            open: dialogOpen
          }
        }
      });
      $('#wpTextbox1').wikiEditor ('addToToolbar', {
        'section': 'main',
        'group': 'insert',
        'tools': {
          'cite-web': {
            label: 'Подробная ссылка',
            type: 'button',
            icon: $.wikiEditor.imgPath + 'dialogs/insert-link-external.png',
            action: {
              type: 'dialog',
              module: 'insert-cw'
            }
          }
        }
      });
    }

    var dialogHtml = function () {
      var row = function (fieldId, label, fieldHtml, toolsHtml) {
        var tools = typeof toolsHtml != 'undefined';
        return '<tr><td class="label"><label for="' + id (fieldId) + '">' + label + ':</label></td><td' + (tools ? '' : ' colspan="2"') + ' class="field">' + fieldHtml + '</td>' + (tools ? '<td class="tools">' + toolsHtml + '</td>' : '') + '</tr>';
      }
      var input = function (fieldId, placeholder) {
        return '<input type="text" id="' + id (fieldId) + '"' + (typeof placeholder == 'undefined' ? '' : ' placeholder="' + placeholder + '"') + ' />';
      }
      var button = function (fieldId, text, hint) {
        return '<button id="' + id (fieldId) + '"' + (typeof hint == 'undefined' ? '' : ' title="' + hint + '"') + '>' + text + '</button>';
      }
      var languagesSelect = function (fieldId, emptyText) {
        var html = '<select id="' + id (fieldId) + '"><option value="">' + emptyText + '</option>';
        for (var i in languages)
          html += '<option value="' + i + '">' + languages[i].name + '</option>';
        return html + '</select>';
      }
      var checkbox = function (fieldId) {
        return '<input type="checkbox" id="' + id (fieldId) + '" />';
      }
      return [
        '<table id="' + id ('container') + '">',

          row ('url', 'Ссылка', input ('url'), [
            button ('open-url', 'открыть'),
            button ('open-archive-is', '<img src="http://archive.is/favicon.ico" width="16" />', 'Просмотреть список архивов на archive.is'),
            button ('open-archive-org', '<img src="http://archive.org/favicon.ico" width="16" />', 'Просмотреть список архивов на archive.org')
          ].join ('')),

          row ('title', 'Заголовок', input ('title')),

          row ('quote', 'Цитата', input ('quote', 'Без крайних кавычек и без точки в конце')),

          row ('author', 'Автор', input ('author', 'Несколько авторов указываются через запятую')),

          row ('language', 'Язык', languagesSelect ('language', '(нет)')),

          row ('publisher', 'Издатель', input ('publisher')),

          row ('date', 'Дата', input ('date', 'гггг-мм-дд'), button ('insert-date', 'сегодня')),

          row ('access-date', 'Дата проверки', input ('access-date', 'гггг-мм-дд'), button ('insert-access-date', 'сегодня')),

          row ('broken-link', 'Битая ссылка', checkbox ('broken-link')),

          row ('archive-url', 'Ссылка на архив', input ('archive-url', 'URL или конструкция с применением {{Reference archive}}'), [
            button ('create-new-archive', '<img src="http://archive.is/favicon.ico" width="16" /> новый'),
            button ('parse-archive-url', 'распознать', 'Распознать URL и дату создания архива по содержимому поля')
          ].join ('')),

          row ('archive-date', 'Дата архива', input ('archive-date', 'гггг-мм-дд'), button ('insert-archive-date', 'сегодня')),

          row ('extra', 'Дополнительно', input ('extra', 'Например: т. 1, гл. 4, стр. 46')),

        '</table>',
      ].join ('');
    }

    var dialogInit = function () {
      $('#' + id ('open-url')).click (openUrlAction);
      $('#' + id ('open-archive-is')).click (openArchiveIsAction);
      $('#' + id ('open-archive-org')).click (openArchiveOrgAction);
      $('#' + id ('insert-date')).click (insertDateAction);
      $('#' + id ('insert-access-date')).click (insertDateAction);
      $('#' + id ('insert-archive-date')).click (insertDateAction);
      $('#' + id ('create-new-archive')).click (createNewArchiveAction);
      $('#' + id ('parse-archive-url')).click (parseArchiveUrlAction);
    }

    var dialogOpen = function () {
      $('#' + id ('container') + ' :input').each (function () {
        switch (this.type) {
          case 'password':
          case 'select-multiple':
          case 'text':
          case 'textarea':
            $(this).val ('');
            break;
          case 'checkbox':
          case 'radio':
            this.checked = false;
          case 'select-one':
            $(this).val ('');
        }
      });
    }

    var requireValue = function (inputId, cb) {
      var input = $('#' + id (inputId));
      var value = input.val ();
      if (value == '') {
        input.focus ();
      } else {
        cb (value, input);
      }
    }

    var requireUrl = function (cb) {
      requireValue ('url', cb);
    }

    var insertDate = function (fieldId) {
      var input = $('#' + id (fieldId));
      input.val (new Date ().format ('yyyy-mm-dd'));
    }

    var openUrlAction = function () {
      requireUrl (function (url) {
        window.open (url);
      });
    }

    var openArchiveIsAction = function () {
      requireUrl (function (url) {
        window.open ('http://archive.is/' + url);
      });
    }

    var openArchiveOrgAction = function () {
      requireUrl (function (url) {
        window.open ('http://web.archive.org/web/*/' + url);
      });
    }

    var insertDateAction = function () {
      var rgx = new RegExp (id ('insert-') + '(.+)$', 'g');
      var res = rgx.exec ($(this).attr ('id'));
      insertDate (res[1]);
    }

    var createNewArchiveAction = function () {
      requireUrl (function (url) {
        insertDate ('archive-date');
        window.open ('http://archive.is/?run=1&url=' + url);
      });
    }

    var parseArchiveUrlAction = function () {
      requireValue ('archive-url', function (value) {
        var rgx = new RegExp ('http://web\\.archive\\.org/web/([0-9]{4})([0-9]{2})([0-9]{2})[0-9]{6}/(.+)', 'g');
        var res = rgx.exec (value);
        if (res !== null) {
          $('#' + id ('archive-date')).val ('' + res[1] + '-' + res[2] + '-' + res[3]);
          $('#' + id ('url')).val (res[4]);
        } else {
          rgx = new RegExp ('{{reference.*archive\\|1=(.+)\\|2=([0-9]{4})-([0-9]{2})-([0-9]{2})}}', 'gi');
          res = rgx.exec (value);
          if (res !== null) {
            $('#' + id ('archive-date')).val ('' + res[2] + '-' + res[3] + '-' + res[4]);
            $('#' + id ('url')).val (res[1]);
          }
        }
      });
    }

    var insertCWAction = function () {
      var ids = [
        ['url', 'ссылка'],
        ['title', 'заголовок'],
        ['quote', 'цитата'],
        ['author', 'автор'],
        ['language', 'язык'],
        ['publisher', 'издатель'],
        ['date', 'дата'],
        ['access-date', 'датаДоступности'],
        ['broken-link', 'битая'],
        ['archive-url', 'архив'],
        ['archive-date', 'датаАрхива'],
        ['extra', 'дополнительно']
      ];
      var params = [];
      for (var i in ids) {
        var fieldId = ids[i][0];
        var paramName = ids[i][1];
        var element = $('#' + id (fieldId));
        switch (fieldId) {
          case 'language':
            var value = element.val ();
            if (value != '') {
              params.push ([paramName, languages[parseInt (value)].template]);
            }
            break;
          case 'broken-link':
            if (element.is (':checked'))
              params.push ([paramName, 1]);
            break;
          default:
            var value = element.val ();
            if (value != '')
              params.push ([paramName, value]);
            break;
        }
      }
      var str = '{{CW';
      for (var i in params)
        str += '|' + params[i][0] + '=' + params[i][1];
      str += '}}';
      $.wikiEditor.modules.toolbar.fn.doAction ($(this).data ('context'), {
        type: 'replace',
        options: {
          pre: str,
          peri: '',
          post: ''
        }
      }, $(this));
      $(this).dialog ('close');
    }

    window.importScriptURI ('http://stevenlevithan.com/assets/misc/date.format.js');
    extendWikiEditor ();

  });});});}});}