Created
October 22, 2010 02:05
-
-
Save edvakf/639783 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// ==UserScript== | |
// @name pixiv-favtag.js | |
// @namespace http://js.d2no.info/ | |
// @include http://www.pixiv.net/* | |
// ==/UserScript== | |
(function(){ | |
var settings = { | |
position: 2, // メニューを表示させる位置(0=左上,1=右上,2=右下,3=左下) | |
blankwin: 1, // 常に別窓で開く | |
allconfirm: 0, // 全部開くを選んだときに確認する=1/しない=0 | |
full:[[ // 完全一致検索 '~'で囲って , で区切る | |
'創作' | |
,'版権' | |
],[]], | |
fullcolor: '#e00084', // 完全一致検索の色 | |
part:[[ // 部分一致検索 '~'で囲って , で区切る orとか-とか使える | |
'創作 女の子 -ファンタジー' | |
,'講座 or メイキング' | |
],[]], | |
partcolor: '#75d100' // 部分一致検索の色 | |
} | |
,$x=function(a,b){return document.evaluate(a,(b?b:document),null,9,null).singleNodeValue} | |
,$a=function(a,b){var a=document.evaluate(a,(b?b:document),null,7,null),res=new Array(),i,l;for(i=0,l=a.snapshotLength;i<l;i++){res.push(a.snapshotItem(i))}return res} | |
,$b=function(a,b,c){return a.addEventListener(b,c,false)} | |
,$c=function(a,b,c){var e=document.createElement(a);if(b)e.id=b;if(c)e.className=c;return e;} | |
,$d=function(a){return document.getElementById(a);} | |
,$e=function(a,b){for(var i=0,l=a.length;i<l;++i){if(b(a[i],i))break}return a}; | |
//if(!Array.prototype.contains){Array.prototype.contains=function(value){for(var i in this){if(this.hasOwnProperty(i)&&this[i]===value){return true}}return false}} | |
var parseCookie=function(){ | |
var c=document.cookie.match(new RegExp(' ?'+cname+'=(.+);?')); | |
if(!c) return; | |
c=c[1]; | |
c=c.split('<*>'); | |
if(c[0]){ | |
c[0]=c[0].split('<>'); | |
settings.full[1]=[]; | |
for(var i=0,l=c[0].length;i<l;i++){ | |
settings.full[1].push(decodeURIComponent(c[0][i])); | |
} | |
} | |
if(c[1]){ | |
c[1]=c[1].split('<>'); | |
settings.part[1]=[]; | |
for(var i=0,l=c[1].length;i<l;i++){ | |
settings.part[1].push(decodeURIComponent(c[1][i])); | |
} | |
} | |
return; | |
} | |
,createLink=function(){ | |
var r=[[],[]],t=(settings.blankwin)?' target="_blank"':''; | |
var full=settings.full[0].concat(settings.full[1]); | |
var part=settings.part[0].concat(settings.part[1]); | |
r[0].push('<li><span class="allOpen">【全部開く】</span></li>'); | |
r[1].push('<li><span class="allOpen">【全部開く】</span></li>'); | |
for(var i=0,l=full.length;i<l;i++){ | |
r[0].push('<li><a href="tags.php?tag='+encodeURIComponent(full[i])+'"'+t+'>'+full[i]+'</a></li>'); | |
} | |
for(var i=0,l=part.length;i<l;i++){ | |
r[1].push('<li><a href="search.php?s_mode=s_tag&word='+encodeURIComponent(part[i]).replace(/%20/g,'+')+'"'+t+'>'+part[i]+'</a></li>'); | |
} | |
return r; | |
} | |
,addHtml=function(){ | |
switch(settings.position){ | |
case 0: pos='top:0px;left:0px'; break; | |
case 1: pos='top:0px;right:0px;'; break; | |
case 2: pos='bottom:0px;right:0px;'; break; | |
case 3: pos='bottom:0px;left:0px;'; break; | |
} | |
var s=$c('style'); | |
s.innerHTML+='<style>' | |
+'#favTag_box{position:fixed;'+pos+';background-color:#fff;font-size:11px;border:2px solid #999;}' | |
+'#favTag_box #body{margin:4px 8px;}#favTag_box .btn span{cursor:pointer;color:#444;}#favTag_box .btn span:hover{color:#999;}' | |
+'#favTag_box #list{clear:both;display:none;width:240px;}' | |
+'#favTag_box #list #tagslist{margin:.5em 0;}#favTag_box #list ul{list-style-type:none;}' | |
+'#favTag_box #list ul li{margin:0 0 0 12px;}#favTag_box #list ul li:first-child{margin-left:0px;}' | |
+'#favTag_box #list .allOpen,#favTag_box #list ul li a{text-decoration:none;cursor:pointer;} #favTag_box #list .allOpen:hover,#favTag_box #list ul li a:hover{text-decoration:underline;}' | |
+'#favTag_box #list #full .allOpen,#favTag_box #list #full a{color:'+settings.fullcolor+';}' | |
+'#favTag_box #list #part .allOpen,#favTag_box #list #part a{color:'+settings.partcolor+';}' | |
+'</style>'; | |
$x('//head').appendChild(s); | |
var d=$c('div','favTag_box'); | |
var a=createLink(); | |
$x('//body').appendChild(d); | |
d.innerHTML+='<div id="body"><div id="list">' | |
+'<div id="regist" class="btn"></div><div id="tagslist">' | |
+'<ul id="full">'+a[0].join('')+'</ul>' | |
+'<ul id="part">'+a[1].join('')+'</ul></div>' | |
+'<div style="clear:both;"/></div></div>'; | |
var f=$x('//*[@id="favTag_box"]'); | |
$b(f,'mouseover',function(e){ | |
$x('//*[@id="list"]').style.display='block'; | |
}); | |
$b(f,'mouseout',function(e){ | |
$x('//*[@id="list"]').style.display='none'; | |
}); | |
$b($x('//ul[@id="full"]/li/*[@class="allOpen"]'),'click',function(e){ | |
allopen('full'); | |
if(e)e.preventDefault(); | |
}); | |
$b($x('//ul[@id="part"]/li/*[@class="allOpen"]'),'click',function(e){ | |
allopen('part'); | |
if(e)e.preventDefault(); | |
}); | |
} | |
,allopen=function(bool){ | |
var ary=settings[bool][0].concat(settings[bool][1]); | |
if(settings.allconfirm) if(!confirm(ary.length+'件開きます。よろしいですか?')) return; | |
for(var i=0,l=ary.length;i<l;i++){ | |
window.open((bool=='full'?'tags':'search')+'.php?'+(bool=='full'?'tag':'s_mode=s_tag&word')+'='+encodeURIComponent(ary[i]).replace(/%20/g,'+')); | |
} | |
} | |
,regist=function(bool,word){ | |
settings[bool][1].push(word); | |
var buf=formatWords(); | |
document.cookie=' '+cname+'='+buf+'; '+climit; | |
alert('登録しました'); | |
$x('//*[@id="'+bool+'"]').innerHTML+='<li><a href="'+(bool=='full'?'tags':'search')+'.php?'+(bool=='full'?'tag':'s_mode=s_tag&word')+'='+encodeURIComponent(word)+'"'+((settings.blankwin)?' target="_blank"':'')+'>'+word+'</a></li>'; | |
} | |
,deltag=function(bool,word){ | |
for(var i=0,l=settings[bool][1].length;i<l;i++){ | |
if(settings[bool][1][i]==word) break; | |
} | |
settings[bool][1].splice(i,1); | |
var buf=formatWords(); | |
document.cookie=' '+cname+'='+buf+'; '+climit; | |
alert('削除しました'); | |
var li=$x('//*[@id="'+bool+'"]/li[./a[text()="'+word+'"]]'); | |
li.parentNode.removeChild(li); | |
} | |
,formatWords=function(){ | |
var full=[],part=[]; | |
for(var i=0,l=settings.full[1].length;i<l;i++){ | |
full.push(encodeURIComponent(settings.full[1][i])); | |
} | |
for(var i=0,l=settings.part[1].length;i<l;i++){ | |
part.push(encodeURIComponent(settings.part[1][i])); | |
} | |
full=full.join('<>'); part=part.join('<>'); | |
return full+'<*>'+part; | |
} | |
,cname='__gm_favoritetags', climit='expires=Tue, 31-Dec-2030 23:59:59; ' | |
$b(window,'DOMContentLoaded',function(){ | |
parseCookie(); | |
addHtml(); | |
var url=decodeURIComponent(document.URL); | |
var bool='none',php='',query=''; | |
var reg=$x('//*[@id="list"]/*[@id="regist"]'); | |
var word=url.replace('&s_mode=s_tag','').match(/(tags=(.+)|word=(.+))/); | |
if(!word) return; | |
else { | |
if(word[2]) word=decodeURIComponent(word[2]); | |
else if(word[3]){ | |
word=decodeURIComponent(word[3]).replace(/\+/g,' '); | |
} | |
} | |
if(url.indexOf('tags.')>-1){ bool='full'; php='tags'; query='tags'; } | |
if(url.indexOf('search.')>-1){ bool='part'; php='search'; query='word';} | |
if(bool!='none'){ | |
var str=(bool=='full')?'完全一致検索タグ\n ':(bool=='part')?'部分一致検索テキスト\n ':'' | |
,btntext='',check=settings[bool][0].indexOf(word)>=0?1:settings[bool][1].indexOf(word)>=0?2:0; | |
switch(check){ | |
case 0: | |
btntext='<span>[現在のタグを登録する]</span>'; | |
$b(reg,'click',function(e){ | |
if(confirm(str+word+'\nを登録しますか?')){ | |
regist(bool,word); | |
if(e)e.preventDefault(); | |
} | |
}); | |
break; | |
case 1: | |
btntext='(スクリプト登録済タグです)'; | |
break; | |
case 2: | |
btntext='<span>[現在のタグを削除する]</span>'; | |
$b(reg,'click',function(e){ | |
if(confirm(str+word+'\nを削除しますか?')){ | |
deltag(bool,word); | |
if(e)e.preventDefault(); | |
} | |
}); | |
break; | |
} | |
reg.innerHTML=btntext; | |
} | |
}); | |
})(); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment