Skip to content

Instantly share code, notes, and snippets.

@oflow
Last active August 29, 2015 14:00
Show Gist options
  • Save oflow/11361985 to your computer and use it in GitHub Desktop.
Save oflow/11361985 to your computer and use it in GitHub Desktop.
17sai.user.js
// -*- coding: utf-8 -*-
// ==UserScript==
// @name They are all 17 years old
// @author HIRATA Yasuyuki <[email protected]>
// @namespace http://yasu.asuka.net/
// @version 1.1.0
// @include http://www.google.tld/search?*
// @include https://www.google.tld/search?*
// @include https://www.google.tld/webhp?*
// @include https://www.google.tld/#q=*
// @released 2013-04-23
// @updated 2014-05-26
// ==/UserScript==
/*
* 17sai.user.js は https://gist.github.com/hirataya/5442881 を元にあれこれ修正してます。
* なんかもう適当に追加していったらこうなったのでGoogleの仕様変わったら死にます。
* class名が変わるのでXPathで強引に取得してます。やっぱり重いです。
* 17歳でなく17才が正しいようです。
*/
(function(){
/* 17歳教 - ニコニコ大百科 - http://dic.nicovideo.jp/a/17%E6%AD%B3%E6%95%99 */
/* 17歳教☆チームT - Togetter - http://togetter.com/li/360631 */
/* 23歳教 - ニコニコ大百科 - http://dic.nicovideo.jp/a/23%E6%AD%B3%E6%95%99 */
/* 田中敦子17歳 - Twitter - https://twitter.com/atuwosyousa/status/220026704066904064 */
/* 「17歳教」ではなく「17才教」が正しい - 井上喜久子 オフィシャルサイト http://www.manbow.com/profile */
var members = {
/* 名前: [年齢, 年, 月, 日] */
'井上喜久子': [17, 1964, 9, 25],
'田村ゆかり': [17, 1976, 2, 27],
'野川さくら': [17, 1978, 3, 1],
'佐藤利奈': [17, 1981, 5, 2],
'堀江由衣': [17, 1976, 9, 20],
'石田燿子': [17, 1973, 10, 7],
'松澤由美': [17, 1974, 3, 29],
'こやまきみこ': [17, 1979, 1, 27],
'池澤春菜': [17, 1975, 12, 15],
'石黒千尋': [17, 1983, 1, 24],
'田中敦子': [17, 1962, 11, 14],
// '水落幸子': [17, null, 12, 18], わからんかった
'寺田はるひ': [17, 1973, 2, 11],
'榊原ゆい': [19, 1980, 10, 13],
'たかはし智秋': [23, 1977, 5, 8],
// '今井麻美': [23, 1977, 5, 16],
'後藤邑子': [29, 1975, 8, 28]
};
/* 正規表現で調べるやつ */
var regExpStr = '';
for (name in members) {
regExpStr += '|' + name;
}
var regExpName = new RegExp('(' + regExpStr.substring(1) + ')');
function getElmsXPath(elm, xpath) {
var nodes = document.evaluate(xpath, elm, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
for (var i = 0, elm = [], length = nodes.snapshotLength; i < length; i++) {
elm.push(nodes.snapshotItem(i));
}
return elm;
}
function getElmXPath(elm, xpath) {
var result = document.evaluate(xpath, elm, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null);
return result.singleNodeValue;
}
function fix17sai() {
var mod = document.querySelectorAll('li.mod');
/* ○○○ 年齢 と検索したとき上に出てくるやつ */
// ○歳 (YYYY年MM月DD日) となってないと失敗
var a = getElmXPath(mod[1], './div/*[contains(text(), "歳")]');
// 名前、年齢
var n = getElmXPath(mod[1], './div/*[contains(text(), "年齢")]');
if (a && n) {
if (/(.+)\s/.test(n.textContent)) {
var age = members[RegExp.$1];
}
if (age && /^([\d]+)\s/.test(a.textContent)) {
a.textContent = a.textContent.replace(RegExp.$1, get17days(age, false));
}
}
/* おまけで3人ほど年齢表示されるので対応させる */
/* className.contains('ellip') */
var ellip = mod[2].getElementsByClassName('ellip');
for (var i = 0; i < ellip.length; i += 2) {
var age = members[ellip[i].textContent];
if (age && /([\d]+)$/.test(ellip[i + 1].textContent)) {
ellip[i + 1].innerHTML = get17days(age, true);
}
}
/* 右側のプロフィールも年齢間違えてる */
var knoecrpt = document.getElementsByClassName('kno-ecr-pt')[0];
if (knoecrpt) {
var age = members[knoecrpt.textContent];
if (age) {
var knofv = document.getElementsByClassName('kno-fv')[0];
if (/\(([\d]+)\)/.test(knofv.textContent)) {
knofv.textContent = knofv.textContent.replace(RegExp.$1, get17days(age, false));
}
}
}
/* サムネみたいに表示される箇所 */
var kltat = document.getElementsByClassName('kltat');
for (var i = 0; i < kltat.length; i++) {
var age = members[kltat[i].textContent];
if (age) {
var klfact = kltat[i].parentNode.getElementsByClassName('klfact')[0];
klfact.innerHTML = get17days(age, false);
}
}
/* 検索結果 わりと適当 */
var h3 = document.getElementsByClassName('r');
for (var i = 0; i < h3.length; i++) {
if (regExpName.test(h3[i].textContent) && h3[i].className.indexOf('17sai') == -1) {
var age = members[RegExp.$1];
if (age) {
/* 説明文に年齢 */
var st = h3[i].parentNode.getElementsByClassName('st')[0];
if (/[\(]([\d]+)[\)]/.test(st.textContent)) {
st.innerHTML = st.innerHTML.replace(RegExp.$1, get17days(age, false));
}
/* タイトルに年齢 */
if (/([\d]+)/.test(h3[i].textContent)) {
h3[i].innerHTML = h3[i].innerHTML.replace(RegExp.$1, get17days(age, false));
}
h3[i].className += ' 17sai';
}
}
}
}
function get17days(age, br) {
var baseBirthday = new Date(
Number(age[1]) + age[0],
Number(age[2]) - 1,
Number(age[3])
);
var sai = (age[0] == 17 ? '才' : '歳');
var today = Date.now();
if (age[0] == 19) {
/* 今のところ榊原ゆいだけ */
return '永遠のナインティーン';
} else {
var days = Math.floor((today - baseBirthday)/(60*60*24*1000));
return age[0] + sai + 'と' + (br ? '<br>' : '') + days + '日';
}
}
fix17sai();
var observer = new MutationObserver(function(mutations) {
mutations.forEach(function(mutation) {
if (mutation.type == 'childList') {
fix17sai();
}
});
});
observer.observe(document.body, {childList: true});
})();
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment