利用者:Frozen-mikan/スクリプト置き場
Cite web
[編集]{{Cite web}} の必須項目を取得するブックマークレット。画面内でテキスト選択部分がある場合は、タイトルを上書きする。IEでは別ウィンドウが開くという警告が出るかもしれません。
javascript:(function(){
function getYMD (date) {
function pad (n) {
return '' +
(( n < 10 ) ? '0' : '') +
n;
}
if (typeof date == 'undefined') date = new Date();
return '' +
date.getFullYear() + '-' +
pad(date.getMonth() + 1) + '-' +
pad(date.getDate());
}
function getSelection() {
if (window.getSelection) {
return window.getSelection().toString();
} else if (document.selection) {
return document.selection.createRange().text;
}
return '';
}
function getPublisher() {
var title = document.title;
var re = /(.+)?(?: ([--|/:]) +|[:])(.+)$/;
var publisher = '';
if (re.test(title)) {
publisher = ' | publisher = ';
var m = re.exec(title);
if (m[1].length < m[3].length) {
publisher += escape(m[1]);
} else {
publisher += escape(m[3]);
}
}
return publisher;
}
/* テンプレート用 */
function escape (str) {
return str.replace(/[\[\]{|}]/g, function(p0) {
return '&#' + p0.charCodeAt(0) + ';';
});
}
function isPDF() {
return -1 != url.search(/\.pdf$/i);
}
var text = escape(getSelection());
var title = text ? text : escape(document.title);
var url = escape(window.location.href);
var output = '{{Cite web' +
' | title = ' + title +
' | url = ' + url +
(isPDF() ? ' | format = PDF' : '') +
getPublisher() +
' | accessdate = ' + getYMD() +
' }}';
prompt('コピーして下さい。', output);
})()
脚注の拡張
[編集]本文中にある脚注へのリンクのツールチップに、リンク先にあるテキストを表示するブックマークレット。XP+Chrome10, XP+Firefox4.0 で動作確認。XP+IE8でも動作確認はしているが、不安定。
javascript:(function(){
jQuery(document).ready(function($){
$("a[href^=#cite_note]").attr("title", function(i, attr){
var hash = /#(.+)$/.exec(this["href"])[1];
var e = document.getElementById(hash);
return $(e).text();
});
});
})()
バグ
[編集]- <ref name=""> の name に非アスキー文字列が含まれている場合に機能しない。jQuery で要素が取得できないことを確認。document.getElementById で回避できることを Chrome10, Firefox4.0 で確認。
失敗知識データベース
[編集]{{失敗知識データベース}} のパラメータを取得するためのブックマークレット。http://www.sozogaku.com/fkd/ で使用する。取得できないページで使用した際には何も起きないようにした。動作は XP+Chrome18で確認。
javascript:(function(){
var patId = /www\.sozogaku\.com\/fkd\/cf\/([^/]+)\.html/.exec(location.href);
if (patId === null) return;
var id = patId[1];
var patName = /> (.+)$/.exec(document.title);
if (patName === null) return;
var name = patName[1];
var str = '{{失敗知識データベース|' + id + '|' + name + '}}';
prompt('copy?', str);
})();
言語間リンクの一覧を取得
[編集]表示中のページからの言語間リンクを取得し、可能ならばコンソールに表示する。同じ言語へのリンクが複数ある場合には上書きします。
$j.getJSON(
location.protocol + '//' + location.host + '/w/api.php?',
{
format: 'json',
action: 'query',
prop: 'langlinks',
lllimit: 'max',
titles: mw.config.get( 'wgPageName' )
},
function(data){
function parseApiLanglinks(data) {
var page = data.query.pages[mw.config.get( 'wgArticleId' )];
var langlinks = page.langlinks;
var llmap = {};
for(var i = 0; i < langlinks.length; ++i) {
var ll = langlinks[i];
llmap[ll.lang] = ll['*'];
}
return llmap;
}
var llmap = parseApiLanglinks(data);
if (console) {
console.log(JSON.stringify(llmap));
}
}
);
言語コードからホスト名を生成
[編集]言語コードから姉妹ホスト名を生成する関数。ドットで区切られたホスト名の最初の部分が言語コードの場合を想定。
(function(){
var getHostName = (function(){
var baseHost = /^.+?(\..+)$/.exec(location.host)[1];
return function(lang) {
return lang + baseHost;
};
})();
return getHostName('en');
})();
ページ名と選択部を取得
[編集]ページ名と選択部を合わせたリンク用文字列をプロンプト・ダイアログで表示するスクリプト。選択部が無い場合はページ名のみを表示する。選択部は節の名前が選択されることを想定している。
(function (){
function getSelection() {
if (window.getSelection) {
return window.getSelection().toString();
} else if (document.selection) {
return document.selection.createRange().text;
}
return '';
}
function getPageName() {
return mw.config.get( 'wgPageName' ).replace('_', ' ');
}
function getPageAndSelection() {
var s = '';
s += getPageName();
var selection = getSelection();
if (selection != '') {
s += '#' + selection;
}
return s;
}
/* main */
prompt('<ページ名>#<選択部>', '[[' + getPageAndSelection() + ']]');
})()
編集要約欄の節リンクを拡張する
[編集]編集要約欄の節リンクの後方にトリガーとなるボタンを設置し、当時の最新版での節を表示する。
ブックマークレット
javascript:(function(b){b('.comment a[href*="#"]').each(function(f,a){var c=decodeURI(/(?:wiki\/)(.+)$/.exec(a.pathname)[1]),d=a.hash,e=/(?:oldid=)(\d+)/.exec(b(a).parents("td.diff-otitle, td.diff-ntitle, ul li, table.mw-enhanced-rc tr td").find('a[href*="oldid"]')[0].href)[1];b(a).after(b("<button>old</button>").click(function(a){a.preventDefault();b.getJSON("/w/api.php?format=json&action=query&prop=revisions&rvdir=older&rvlimit=1&rvprop=ids&redirects",{rvstartid:e,titles:c},function(a){a=a.query.pages;for(pid in a){var b=
"/w/index.php?oldid="+a[pid].revisions[0].revid+d;if(confirm("\u4ee5\u4e0b\u306eURL\u3092\u8868\u793a\u3057\u307e\u3059\u3002\n"+b))window.location.href=b}})}))})})(jQuery);
常駐スクリプト用の簡易展開版
jQuery(document).ready(function($){
$('.comment a[href*="#"]').each(function(index, elem) {
var p = decodeURI(/(?:wiki\/)(.+)$/.exec(elem.pathname)[1]);
var h = elem.hash;
var oldid = /(?:oldid=)(\d+)/.exec(
$(elem).parents(
'td.diff-otitle, td.diff-ntitle, ul li, table.mw-enhanced-rc tr td'
).find('a[href*="oldid"]')[0].href
)[1];
$(elem).after($('<button>old</button>').click(function(ev) {
ev.preventDefault();
var url = '/w/api.php?format=json&action=query' +
'&prop=revisions&rvdir=older&rvlimit=1&rvprop=ids&redirects';
var data = {rvstartid: oldid, titles: p};
$.getJSON(url, data, function(data) {
var pages = data.query.pages;
for (pid in pages) {
var revid = pages[pid].revisions[0].revid;
var href = '/w/index.php?oldid=' + revid + h;
if (confirm('以下のURLを表示します。\n' + href)) {
window.location.href = href;
}
}
});
}));
});
});
「他の言語」で指定言語を最初に表示する
[編集]サイドメニューにある「他の言語」で大量の言語リストに埋もれたリンクを使いやすくする。meta:Special:Mypage/global.js にコピペすると全ウィキで利用可能。
言語間リンクを取り出す際、単純にjQueryオブジェクトに追加するだけだと順番が自動ソートされてしまい、langsの順にならなかった。
/* 「他の言語」で指定言語を最初に表示する。 */
mw.config.get('skin') === 'vector' && jQuery(function($){
var langs = ['ja', 'en', 'de', 'fr'];
var list = $('#p-lang > div.body > ul');
function pickup(langs) {
var base = 'li.interwiki-';
var contents = [];
for (var i = 0; i < langs.length; ++i) {
var item = $(base + langs[i], list);
if (1 == item.length) {
contents.push(item);
}
}
var len = contents.length;
if (0 < len && list.children().length != len) {
contents.push($('<hr>'));
}
return contents;
}
var pickuped = pickup(langs);
while(0 < pickuped.length) {
list.prepend(pickuped.pop());
}
$('hr + hr', list).remove();
});
「この版への固定リンク」に機能を追加
[編集]リンク「この版への固定リンク」に機能を追加する。クリックするとダイアログが開く。
jQuery(function($) {
$('#t-permalink a').click(function(e) {
e.preventDefault();
var dialog_id = 'fm-oldid-dialog';
mw.messages.set({
'fm-oldid-output-label-text': 'この版への固定リンク',
'fm-oldid-output-option-pagename-label-text': 'ページ名を追加する'
});
function update() {
var link_oldid = location.protocol + mw.config.get('wgServer') +
mw.config.get('wgScript') + '?';
if ($('#fm-oldid-output-option-pagename').is(':checked')) {
link_oldid += 'title=' +
mw.util.wikiUrlencode(mw.config.get('wgPageName')) + '&';
}
var oldid = mw.util.getParamValue('oldid');
if (oldid == null) {
oldid = mw.config.get('wgCurRevisionId')
}
var query = {'oldid': oldid};
link_oldid += $.param(query);
$('#fm-oldid-output').val(link_oldid).select();
}
mw.loader.using('jquery.ui.dialog', function(){
var d = $('#' + dialog_id);
if (d.length == 0) {
d = $('<div />')
.attr({'id': dialog_id})
.append($('<label for="fm-oldid-output" />')
.text(mw.msg('fm-oldid-output-label-text')))
.append('<br />')
.append($('<textarea />')
.attr({'id': 'fm-oldid-output'})
.css({'display': 'block', width: '500px', height: '80px'})
)
.append($('<input type="checkbox" name="" />')
.attr({'id': 'fm-oldid-output-option-pagename',
checked: 'checked' })
.click(update)
)
.append($('<label for="fm-oldid-output-option-pagename" />')
.text(mw.msg('fm-oldid-output-option-pagename-label-text'))
);
}
d.dialog({
width: 'auto',
buttons: {
'OK': function(){ $(this).dialog('close'); }
},
open: function() {
update();
}
});
});
});
});
mw.util.$content の代入待ち
[編集]// たまに失敗
$(function() {
console.log(mw.util.$content);
});
// たまに失敗
mw.loader.using('mediawiki.util', function() {
console.log(mw.util.$content);
});
// たぶん大丈夫?
mw.loader.using('mediawiki.util', function() {
$(function() {
console.log(mw.util.$content);
});
});
[ブックマークレット] カテゴリで実行し、各ページの履歴へのリンクを追加する
[編集]minify済み。カテゴリページで実行するブックマークレット。そのカテゴリに含まれる各ページの履歴へのリンクを追加する。カテゴリページで表示中の各ページをAPIから取得する練習のため、APIを利用している。コンソールのログにて要約欄は50文字まで表示。
javascript:(function(){function l(c,a){return $.Deferred(function(b){a=a||"log";if(window.console&&console[a])console[a](c);b.resolve(c,a)})}function k(c){this.title=c}k.prototype.getGMembers=function(){var c=$.Deferred(),a="Category:"+this.title,b=mw.util.getParamValue("from"),f=mw.util.getParamValue("pagefrom"),a={url:"//ja.wikipedia.org/w/api.php",data:{format:"json",action:"query",generator:"categorymembers",gcmlimit:"200",gcmdir:"asc",gcmtitle:a,prop:"info|revisions|pageprops",inprop:"protection"}};null!==b&&(a.data.gcmstartsortkey=b);null!==f&&(a.data.gcmstartsortkeyprefix=f);"ja.wikipedia.org"!=location.host&&(a.dataType="jsonp");$.ajax(a).then(function(b){console.debug(b);if(b&&b.query){var a=b.query.pages,f;for(f in a)c.notify(a[f])}c.resolve(b)});return c.promise()};(function(){var c=mw.config.get("wgUserName"),a=mw.config.get("wgTitle");(new k(a)).getGMembers().then(function(){l("done?")},function(){},function(b){var a=b.revisions;if(a){var d="";b.pageprops&&b.pageprops.defaultsort&&(d=b.pageprops.defaultsort);var a=a[0],h=a.timestamp,h=(Date.now()-(new Date(h)).getTime())/864E5,e;a:{if(e=b.protection)for(var g=0;g<e.length;++g)if("edit"==e[g].type){e=e[g];break a}e=null}if(null===e||"sysop"!=e.level)console.log(b.title,d,h,a.user,a.comment.substring(0,50)),b=b.title,d=(d=a.user==c)?"*":"",b=b.replace(/ /g,"_"),d=' <a href="/w/index.php?title='+encodeURIComponent(b)+'&action=history">[\u5c65\u6b74]</a>'+d,a=$('li a[href="/wiki/'+mw.util.wikiUrlencode(b)+'"]'),0===a.length?console.warn(b,d):a.after(d)}})})()})();