/*
* @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\d+$/.test(location.hash)) {
// 怒涛の parentNode に困惑してぺけぱす書いたらもっと長くなったからそのまま
//a = document.evaluate(`//div[h3/span/a[@name="${location.hash}"]]/div[@class="f-left"]/a`, document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue;
a = $(`a[name="${location.hash}"]`).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;
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 + '/');
})();