利用者:Frozen-mikan/MoveToCommons.js
表示
お知らせ: 保存した後、ブラウザのキャッシュをクリアしてページを再読み込みする必要があります。
多くの Windows や Linux のブラウザ
- Ctrl を押しながら F5 を押す。
Mac における Safari
Mac における Chrome や Firefox
- ⌘ 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;
});