この人のはてなプロフィール Fork

  • /*
     * @title この人のはてなプロフィール
     * @description profile.hatena.ne.jp に飛びます。
     * @include *
     * @license MIT License
     * @javascript_url
     */
    
     /*
     人間性センターに行ってみたかったので自分用のやつをひとまず投稿 (作成ページ行く前に人間性問われた)
     確実にプロフある状況でしか使ってないからあんまちゃんとしてない
     */
    (function() {
    
    var i, a;
    var u = location.href.match(/^https?:\/\/.*?([^\.]*)\.?(hatena\.ne\.jp|hatelabo\.jp|hatena\.com)\/([^\/]+)(.*)$/);
    var $ = q => document.querySelector(q);
    var d = (c, q) => { i = (c && (a = $(q))) ? a.getAttribute('href').replace(/^(\/users?\/|\/)([^\/]+)\/?.*$/g, '$2') : (/^users?$/.test(u[3]) ? u[4].replace(/^\/([^\/]+)\/?.*$/, '$1') : u[3]) };
    
    // ざっくりとしたはてなブログ扱い
    if (!u) {
    
    	// はてなブログ Media (http://business.hatenastaff.com/entry/ownedmedia_case) 系はライターじゃなく企業の id が出てくるけど気にしない
    	if (a = $('html[data-author]')) i = a.getAttribute('data-author');
    
    } else {
    
    	switch (u[1]) {
    
    	case 'daishonin':
    
    		d(false, '');
    		break;
    
    	case 'daichkr':
    
    		d((u[3] == 'antenna'), 'div.created a');
    		break;
    
    	case 'quyo':
    
    		d((u[3] == 'items'), 'div.author a');
    		break;
    
    	case 'copie':
    
    		d((u[3] == 'cp'), 'div[class="banner"] a');
    		break;
    
    	case 'counting':
    
    		d((u[3] == 'count'), 'a.username');
    		break;
    
    	case 'serif':
    
    		// 画像ページもセリフページも同じセレクタで取れた
    		// ./list の時は誰のことか特定できないからほっとく
    		d((u[3].length == 40), 'a.userlink');
    		break;
    
    	case 'q':
    
    		if (a = location.hash.match(/(a\d+)/)) {
    
    			// 怒涛の parentNode に困惑してぺけぱす書いたらもっと長くなったからそのまま
    			//a = document.evaluate(`//div[h3/span/a[@name="${a[1]}"]]/div[@class="f-left"]/a`, document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue;
    			a = $(`a[name="${a[1]}"]`).parentNode.parentNode.parentNode.querySelector('div.f-left a');
    			if (a) i = a.getAttribute('href').replace(/\//g, '');
    			
    		} else d(/^\d+$/.test(u[3]), 'div.questioner-title a');
    
    		break;
    
    
    	case 'a':
    
    		i = (a = location.search.match(/uid=([^&]+)/)) ? a[1] : u[3];
    		break;
    
    	case 'd':
    
    		i = u[3].replace(/\+.+$/, '');
    		break;
    
    	case 'b':
    
    		i = (a = u[4].match(/\/comment\/(.+)/)) ? a[1] : u[3];
    		break;
    
    	default:
    
    		i = u[3];
    
    	}
    }
    
    // はてな id 取れてなかったら潔く諦める
    // recent とか help とか search とか list とかでも id 扱いして飛んじゃうけど気にしない
    // `http://profile.hatena.ne.jp/${i}/` にしたら let が切れた
    if (i && /^[a-zA-Z][\w\-]{1,30}[a-zA-Z\d]$/.test(i)) window.open('http://profile.hatena.ne.jp/' + i + '/');
    
    })();
    
  • Permalink
    このページへの個別リンクです。
    RAW
    書かれたコードへの直接のリンクです。
    Packed
    文字列が圧縮された書かれたコードへのリンクです。
    Userscript
    Greasemonkey 等で利用する場合の .user.js へのリンクです。
    Loader
    @require やソースコードが長い場合に多段ロードする Loader コミのコードへのリンクです。
    Metadata
    コード中にコメントで @xxx と書かれたメタデータの JSON です。

History

  1. 2016/12/07 04:37:35 - 2016-12-07
  2. 2016/12/07 04:18:40 - 2016-12-07
  3. 2016/12/07 03:52:01 - 2016-12-07
  4. 2016/12/07 03:47:52 - 2016-12-07