Skip to content

Instantly share code, notes, and snippets.

@edvakf
Created October 22, 2010 02:05
Show Gist options
  • Save edvakf/639783 to your computer and use it in GitHub Desktop.
Save edvakf/639783 to your computer and use it in GitHub Desktop.
// ==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