コンテンツにスキップ

利用者:Frozen-mikan/MoveToCommons.js

お知らせ: 保存した後、ブラウザのキャッシュをクリアしてページを再読み込みする必要があります。

多くの WindowsLinux のブラウザ

  • Ctrl を押しながら F5 を押す。

Mac における Safari

  • Shift を押しながら、更新ボタン をクリックする。

Mac における ChromeFirefox

  • Cmd Shift を押しながら R を押す。

詳細についてはWikipedia:キャッシュを消すをご覧ください。

$(function() {
  function createElement(name, attr, inner) {
    if (!name) {
    	return null;
    }
    var element = document.createElement(name);
    
    // attr
    for (var key in attr) {
      if (key == 'style') {
        for (var styleKey in attr[key]) {
          element[key][styleKey] = attr[key][styleKey];
        }
      } else {
        element.setAttribute(key, attr[key]);
      }
    }
    
    // inner
    if (typeof inner == 'undefined') return element;
    for (var i=0; i<inner.length; ++i) {
      if (typeof inner[i] == 'string') {
        element.appendChild(document.createTextNode(inner[i]));
      } else {
        element.appendChild(inner[i]);
      }
    }
    return element;
  }
  
  /* ファイル名前空間を閲覧時のみ(コモンズからの呼び出しは除く) */
  if (
  	mw.config.get('wgNamespaceNumber') != 6 ||
  	mw.config.get('wgAction') != 'view' ||
  	mw.config.get('wgArticleId') === 0
  ) {
  	return;
  }
  
  var ignoreCategories = ['屋外美術を含む画像',
    '本国において著作権が存続しているためにウィキメディア・コモンズに移動できないパブリックドメイン画像'];
  
  var wgCategories = mw.get.config('wgCategories');
  if (typeof wgCategories == 'undefined') { wgCategories = []; }
  
  /* ファイルが特定のカテゴリに含まれている場合、終了 */
  for (var i = 0; i < ignoreCategories.length; ++i) {
    for (var j = 0; j < wgCategories.length; ++j) {
      if (ignoreCategories[i] == wgCategories[j]) {
      	return;
      }
    }
  }
  
  /* UI追加場所の確保(無ければ終了) */
  var contentSub = document.getElementById('contentSub');
  if (!contentSub
    || !contentSub.parentNode
    || !contentSub.parentNode.insertBefore
  ) {
    if (console) {
      console.log('Do not find the "id=contentSub". Exit!');
    }
    return;
  }
  
  /* 必要なデータを保管 */
  var data = {};
  
  /* その他 */
  var formId = 'upload_to_commons';
  
  /* ファイル情報の取得に API を使う */
  var apiBase = wgServer + wgScriptPath + '/api.php?action=query&format=json&pageids=' + wgArticleId;
  var fileHistory = apiBase + '&prop=imageinfo&iilimit=500&iiprop=timestamp|size|user|comment';
  var pageHistory = apiBase + '&prop=revisions&rvlimit=500&rvdir=newer&rvprop=timestamp|flags|user|comment|ids';
  var pageContent = apiBase + '&prop=revisions&rvlimit=1&rvprop=content|timestamp|user';
  
  /* load 完了後に実行。load 完了後に読み込んだ場合には即実行 */
  $(function() {createFormForUploadingToCommons(contentSub)});
  
  function requestForFileHistory() {
    request(fileHistory, function(obj) {
      var wgArticleId = mw.config.get('wgArticleId');
      if ( !obj
        || !obj.query
        || !obj.query.pages
        || !obj.query.pages[wgArticleId]
        || !obj.query.pages[wgArticleId].imageinfo
      ) {
        if (console) {
          console.log('Result of requestForFileHistory: ' + obj);
        }
        return;
      }
      data.files = obj.query.pages[wgArticleId].imageinfo;
      if (obj['query-continue']) {
        if (console) {
          console.log(obj['query-continue']);
        }
        alert('ファイルの履歴数がテンプレートに入りきりません。\n現在、取得漏れを再取得する機能はありません。');
      }
      expandingForm();
    });
  }
  
  function requestForPageHistory() {
    request(pageHistory, function(obj) {
      var wgArticleId = mw.config.get('wgArticleId');
      if ( !obj
        || !obj.query
        || !obj.query.pages
        || !obj.query.pages[wgArticleId]
        || !obj.query.pages[wgArticleId].revisions
      ) {
        if (console) {
          console.log('Result of requestForPageHistory: ' + obj);
        }
        return;
      }
      data.pages = obj.query.pages[wgArticleId].revisions;
      if (obj['query-continue'])
        if (console) {
          console.log(obj['query-continue']);
        }
      expandingForm();
    });
  }
  
  function requestForPageContent() {
    request(pageContent, function(obj) {
      var wgArticleId = mw.config.get('wgArticleId');
      if ( !obj
        || !obj.query
        || !obj.query.pages
        || !obj.query.pages[wgArticleId]
        || !obj.query.pages[wgArticleId].revisions
        || !obj.query.pages[wgArticleId].revisions[0]
      ) {
        if (console) {
          console.log('Result of requestForPageContent: ' + obj);
        }
        return;
      }
      var latest = obj.query.pages[wgArticleId].revisions[0];
      data.latestRev = latest;
      expandingForm();
    });
  }
  
  /* url を AJAX で GET して callback */
  function request(url, callback) {
    var request0 = sajax_init_object();
    if (request0 === null) {
      return;
    }
    request0.open('GET', url, true);
    request0.onreadystatechange = function() {
      if (request0.readyState == 4) {
        try {
          var responseText = request0.responseText;
          var obj = JSON.parse(responseText);
          callback(obj);
          return obj;
        } catch (err) {
          if (console)
            console.log("RequestError: " + err);
          return;
        }
      }
    };
    request0.setRequestHeader ('Pragma', 'cache=yes');
    request0.setRequestHeader ('Cache-Control', 'no-transform');
    request0.send(null);
  }
  
  /* エントリーポイント */
  function createFormForUploadingToCommons(beforeNode) {
    /* NoScript で XSS が検出されます。 */
    var actionURL = 'http://commons.wikimedia.org/wiki/Special:Upload?uploadformstyle=basic&uselang=ja';
    var button = createElement('button', {'type': 'button'}, ['情報取得']);
    var formItems = [button];
    var form = createElement('form',
      {'id': formId, 'method': 'post', 'target': '_blank',
        'action': actionURL, 'enctype': 'application/x-www-form-urlencoded'},
      formItems);
    $(button).on('click', function() {
      button.disabled='true';
      $(botton).injectSpinner('get_info');
      requestForFileHistory();
      requestForPageHistory();
      requestForPageContent();
    });
    beforeNode.parentNode.insertBefore(form, contentSub.nextSibling);
  }
  
  /* 情報取得後、Form の表示領域を拡張する */
  function expandingForm() {
    if (!data.pages || !data.files || !data.latestRev) { return; }
    $.removeSpinner('get_info');
    var pages = data.pages || [];
    var files = data.files || [];
    var author = (0 === files.length || !files[0].user) ? '' : files[0].user;
    if (console) {
      console.log('author: ' + author);
    }
    var content = data.latestRev['*'] || '';
    files.reverse();
    
    // 最新の版と思われる作成日時を比較する
    if (
    	0 < pages.length && pages[pages.length-1] &&
    	pages[pages.length-1].timestamp != data.latestRev.timestamp
    ) {
      	alert('最新の版の日時が一致しません。');
    }
    var form = document.getElementById(formId);
    if (!form) {
      if (console) {
        console.log('<form id="' + formId + '"> が見つかりません。');
      }
      return;
    }
    var submit = createElement('button', {'type': 'submit'}, ['コモンズ・アップロード編集画面に送信']);
    var filename = createElement('input', {'name': 'wpDestFile', 'size': '60'});
    var desc = createElement('textarea', {'id':'wpUploadDescription', 'name':'wpUploadDescription', 'cols': '80', 'rows': '12'});
    form.appendChild(submit);
    form.appendChild(filename);
    form.appendChild(desc);
    form.wpDestFile.value = wgTitle;
    form.wpUploadDescription.value = '== {' + '{int:filedesc}} ==\n'
      + templateInformation(content, author)
      + templateMovedFromJapaneseWikipedia(pages, files, wgTitle, content)
      + '\n== {' + '{int:license}} ==\n'; // license and categories
  }
  
  /* [[commons:Template:Information]] */
  function templateInformation(content, author) {
    if (/\{\{\s*[Ii]nformation/.test(content)) return content + '\n';
    var wikitext = '{' + '{Information'
      + '\n |Description = {' + '{ja|' + content + '}}'
      + '\n |Source ='
      + '\n |Date = '
      + '\n |Author ='
      + '\n |Permission ='
      + '\n |other_versions ='
      + '\n}}'
      + '\n';
    return wikitext;
  }
  
  /* [[commons:Template:Moved from Japanese Wikipedia]] */
  function templateMovedFromJapaneseWikipedia(pages, files, title, content) {
    var t = '{' + '{Moved from Japanese Wikipedia'
      + '\n |filename          = ' + title
      + '\n |description       = <nowiki>' + content + '</nowiki>'
      + '\n |file_history      = ' + templateMovedFromJapaneseWikipediaFileHistory(files)
      + '\n |page_history      = ' + templateMovedFromJapaneseWikipediaPageHistory(pages)
      + '\n |other_information = '
      + '\n}}'
      + '\n';
    return t;
  }
  
    /* [[commons:Template:Moved from Japanese Wikipedia/FileHistory]] */
  var maxNumberMovedFromJapaneseWikipediaFileHistory = 9;
  
  function templateMovedFromJapaneseWikipediaFileHistory(files, offset) {
    offset = offset || 0;
    if (files.length <= offset) return '';
    var pos, limit, capacity;
    var n, t, file, fileComment;
    capacity = offset + maxNumberMovedFromJapaneseWikipediaFileHistory;
    limit = capacity < files.length ? capacity : files.length;
    t = '{' + '{Moved from Japanese Wikipedia/FileHistory'
      + '\n  |timezone    = UTC';


    // parameter (n)umber
    for (pos = offset, n = 1; pos < limit; ++pos, ++n) {
      file = files[pos];
      fileComment = (typeof file.comment != 'undefined') ? file.comment : '';
      t += ''
      + '\n  |datetime' + n + '   = ' + file.timestamp.substr(0, 16)
      + '\n  |demensions' + n + ' = ' + file.width + ' x ' + file.height
      + '\n  |user' + n + '       = ' + file.user
      + '\n  |comment' + n + '    = <nowiki>(' + fileComment + ')</nowiki>';
    }
    t += '\n }}' + arguments.callee(files, limit);
    return t;
  }
  
  /* [[commons:Template:Moved from Japanese Wikipedia/PageHistory]] */
  var maxNumberMovedFromJapaneseWikipediaPageHistory = 19;
  
  function templateMovedFromJapaneseWikipediaPageHistory(pages, offset) {
    offset = offset || 0;
    if (pages.length <= offset) {
    	return '';
    }
    var pos, limit, capacity;
    var n, t, page, pageComment;
    capacity = offset + maxNumberMovedFromJapaneseWikipediaPageHistory;
    limit = capacity < pages.length ? capacity : pages.length;
    t = '{' + '{Moved from Japanese Wikipedia/PageHistory'
      + '\n  |timezone    = UTC';


    // parameter (n)umber
    for (pos = offset, n = 1; pos < limit; ++pos, ++n) {
      page = pages[pos];
      pageComment = (typeof page.comment != 'undefined') ? page.comment : '';
      t += ''
      + '\n  |datetime' + n + '   = ' + page.timestamp.substr(0, 16)
      + '\n  |user' + n + '       = ' + page.user
      + '\n  |summary' + n + '    = <nowiki>(' + pageComment + ')</nowiki>';
      t += ((typeof page.minor == 'string') 
      ? '\n  |flag' + n + '       = m' : '');
    }
    t += '\n }}' + arguments.callee(pages, limit);
    return t;
  }
  window.mc = window.mc || data;
});