Greasy Fork

Greasy Fork is available in English.

dA_Channel_Footer

displays a channel as footer on all pages

当前为 2017-10-29 提交的版本,查看 最新版本

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Greasemonkey 油猴子Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Userscripts ,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展后才能安装此脚本。

(我已经安装了用户脚本管理器,让我安装!)

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

(我已经安装了用户样式管理器,让我安装!)

// ==UserScript==
// @name        dA_Channel_Footer
// @namespace   dA_Channel_Footer
// @description displays a channel as footer on all pages
// @match     *://*.deviantart.com/*
// @exclude   *.deviantart.com/submit/*
// @version     1.3
// @grant       GM_xmlhttpRequest
// @grant       GM_addStyle
// @grant       GM_getValue
// @grant       GM_setValue
// ==/UserScript==

/*
unevinout[t_, order_] := 
 If[2 t/d < 1, c/2*(2 t/d)^order + b, 
   c/2*((2 t/d - 2)^order + 2) + b] /. {d -> 1, c -> 5, b -> 0}
evinout[t_, order_] := 
 If[2 t/d < 1, 
   c/2*(2 t/d)^order + b, -c/2*((2 t/d - 2)^order - 2) + b] /. {d -> 
    1, c -> 5, b -> 0}
Plot[{unevinout[t, 3], evinout[t, 8]}, {t, 0, 1}]
*/
var settingsForm=null;
var disablescroll=false;
var barHeight=150;
var step=1;
var scrolInt;
// var DelayPerScroll=30;
var DelayOnRow=3000;
// var channel=3;
var el;
var defaultsite="http://www.deviantart.com/dailydeviations/"
var site=defaultsite;

if(typeof GM_getValue("site")!="undefined")site=GM_getValue("site");
if(typeof GM_getValue("disablescroll")!="undefined")disablescroll=GM_getValue("disablescroll");
if(typeof GM_getValue("barHeight")!="undefined")barHeight=GM_getValue("barHeight");
// if(typeof GM_getValue("channel")!="undefined")channel=GM_getValue("channel");






var parrowright="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABcAAAAOCAYAAADE84fzAAAAtklEQVQ4jdXUvQ6CMBQF4D4Sg0tBKPIPhTYKii46+PYdOvQFjgOBGHFBaaI36fqdk+bmEodR2HrEYRQ0T0CLBG6Zwi1TeFUGj2fY1jn8poAvCgSyBNtXCA8cYcux62pExwbRqUHcC8S9QHKWSC4S8t7/EK6Mtosro+3iymi7uDL6D5sv/vNNFKy2LfzWwRfpgBNChvYr7fnUehyHUWzi4Gt81vo5YAxZilfXdkJn8LuQjw7VyzwAJ99H0kJrFxkAAAAASUVORK5CYII=";
var parrowleft="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABcAAAAOCAYAAADE84fzAAAAs0lEQVQ4jdXUvQ6CMBQF4D4SA0tBfoQChUIbBa0uOvj2DAy8wHEw9X9RaKI36fqdk5ubEieisPWIE1GokwbbK7CdQqolUi2RbBskmwbLrkbcCsRrgWhVIVQlAskRNByLuoAvcvhVDq/M4JUZKGegBftBvB8HO3g/DnZwA8+O38P/1XzSzgOZQRy72a7FTcILTgi5tZ/pzq+wwU37qbibho+4CTAh1aH9GDfoC/wu5KuP6mnOpi1H0rwh70QAAAAASUVORK5CYII="
var aktpos=0;
var sscroll;
function shuffle(array) {
  var currentIndex = array.length, temporaryValue, randomIndex ;
  while (0 !== currentIndex) {
    randomIndex = Math.floor(Math.random() * currentIndex);
    currentIndex -= 1;
    temporaryValue = array[currentIndex];
    array[currentIndex] = array[randomIndex];
    array[randomIndex] = temporaryValue;
  }
  return array;
}
function scrollto(el,startP,endP,time){
	// el.scrollLeft=start;
	var t=0;
	var dt=(endP-startP)>0?1:(endP==startP)?0:-1;
	clearInterval(sscroll);
	
	sscroll=setInterval(function(){
		//LeftV[t_] := startP + (1.1*ArcTan[(time - totaltime/2)/(totaltime/10)]/(0.78*\[Pi]/2) + 1)*(stop - start)/2
		// var fac1=( 0.78 * Math.PI / 2);
		// var fac2=Math.atan((t-time/2)/(time/5)*1.1);
		// var fac3=(endP-startP)/2;
		// el.scrollLeft=startP+fac3*(fac2/fac1 +1);
		if(t<time){
			var fac1=(endP-startP)/2.0;
			var fac2=2.0*t/time;
			el.scrollLeft=fac1*(fac2<1?Math.pow(fac2,3):+1*(Math.pow(fac2-2,3)+2))+startP;
			// If[2 t/d < 1, c/2*(2 t/d)^order + b, -c/2*((2 t/d - 2)^order - 2) + b]
			t++;
			// console.log(el.scrollLeft,startP,endP,t,time,dt,fac1,fac2);
		}
		// if(el.scrollLeft-startP<Math.abs(endP-startP)/2)
			// el.scrollLeft=startP+Math.sign(endP-startP)*Math.pow(t,2);
		// else
			// el.scrollLeft=startP+Math.sign(endP-startP)*Math.pow(t-Math.abs(endP+startP),2);
			
			 // console.log(fac2,fac3*(fac2/fac1 +1),startP,endP);
		 // console.log(el.scrollLeft,startP,Math.abs(endP-startP)/2);
		if(t>=time||(dt==1&&el.scrollLeft>=endP)||(dt==-1&&el.scrollLeft<=endP)){
			// console.log(el.scrollLeft,endP,fac1,fac2,dt);
			clearInterval(sscroll);
		}
	},20);
}
function scroller(){
	if(disablescroll){return;};
	var ul = el.getElementsByClassName('tt-a');
	if(ul.length==0)return;
	scrollto(el,el.scrollLeft,ul[aktpos].offsetLeft,50);//50 ticks, 20ms per tick -> 1s per animation
	// console.log(aktpos,step,el.scrollLeft,ul[aktpos].offsetLeft);
	if(ul[aktpos-0].offsetLeft>=el.scrollWidth-el.clientWidth)step=-1;
	if(aktpos==0)step=1;
	aktpos+=step;
}

GM_addStyle("#dA_Channel_Footer {padding-top:3px;height: "+barHeight+"px; overflow-y: hidden; overflow-x: hidden;text-align:left;white-space: nowrap; }"+
"#dA_Channel_Wrapper img.buts{position:absolute;cursor:pointer;position: absolute;margin-top:3px;}"+
"#dA_Channel_Wrapper img.leftbut{left:10px;}"+
"#dA_Channel_Wrapper img.rightbut{right:10px;}"+
"#dA_Channel_Wrapper div.tt-a{display: inline-flex;vertical-align: middle;}"+
// "#dA_Channel_Wrapper div.tt-a a.thumb img{height:120px;width:auto;}"+
"#dA_Channel_Wrapper div.channelHeader>a, #dA_Channel_Wrapper div.channelHeader>div {display:inline-block;float:none; margin-top:3px;}"+
"#dA_Channel_Footer div.stream>div{width:200px;white-space: normal;}"+
"#dA_Channel_Footer a.thumb{margin:auto!important;}"+


"div#output footer#depths div#dA_Channel_Wrapper div#dA_Channel_Footer div.tt-a.huge.tt-ismature.ta span.tt-w span.shadow a.thumb.ismature div.thumb_agegate{white-space: normal;}"+
"div#output footer#depths div#dA_Channel_Wrapper div#dA_Channel_Footer div.tt-a.sq.tt-freeform span.tt-w span.shadow a.thumb.lit{white-space: normal; height:"+(barHeight-10)+"px; }"+
"#dA_Channel_Footer_scrolling,#dA_Channel_Footer_Ch{cursor:pointer;}"+
"#dA_Channel_Footer_Setting_wrapper{display:none;position:fixed; left:0;top:0;bottom:0;right:0;z-index:99999;}"+
"#dA_Channel_Footer_Setting{position:absolute;width:200px;height:200px; margin:auto auto;  left:0;top:0;bottom:0; right:0;background-color:#fff;border-radius:15px;padding:15px; border:1px solid green;}"+
"#dA_Channel_Footer_Setting dl{display:flex;flex-wrap:wrap;line-height:3em;}"+
"#dA_Channel_Footer_Setting dl dt{width:40%;}"+
"#dA_Channel_Footer_Setting dl dd{width:55%;margin-left:auto;}"+
"#dA_Channel_Footer_Setting dl dd input[type='text']{width:100%;}"+
"#dA_Channel_Footer_Setting div.buttons{display:flex;}"+
"#dA_Channel_Footer_Setting div.buttons div{user-select:none;cursor:pointer;flex:1;margin:0 20px;border:1px solid green; border-radius:5px; background-color:#dfd;text-align:center;padding:5px;}"+
"#dA_Channel_Footer_Setting div.buttons div:hover{background-color:#bfb}"+
"#dA_Channel_Footer_Setting div.buttons div:active{background-color:#ded}"+
"");

function showSettingsWindow(){
	settingsForm=document.getElementById("dA_Channel_Footer_Setting_wrapper");
	if(!settingsForm)return;
	
	settingsForm.getElementsByClassName("cb_scrolling")[0].checked=!disablescroll;
	settingsForm.getElementsByClassName("edit_height")[0].value=barHeight;
	settingsForm.getElementsByClassName("edit_channel")[0].value=site;	
	
	settingsForm.style.display="block";
}

function start(data){	
	var text=data.responseText;
	var channels=[]; //0: garbage. after that: index
	var Pos=text.indexOf('<div class="channelHeader"');
	
	//---------- convert source to list of displayed images.
	/* old
	while(Pos!=-1){
		channels.push("<"+text.substring(0,Pos))
		text=text.substring(Pos+1);
		Pos=text.indexOf('<div class="channelHeader"');
	}
	Pos=text.indexOf('<div id="slots-preload"');
	channels.push("<"+text.substring(0,Pos));
		
	if(channel>channels.length-1)channel=channels.length-1;
		
	*/
	// console.log(text);
	var virtWrap=document.createElement("div");
	virtWrap.innerHTML=text;
	// console.log(virtWrap);
	var imgs=virtWrap.querySelectorAll("div.tt-a");
	// console.log(imgs);
	// Pos=text.indexOf("<td class=\"f\">")
	// while(Pos!=-1){
		// channels.push("<"+text.substring(0,Pos))
		// text=text.substring(Pos+1);
		// Pos=text.indexOf('<div class="channelHeader"');
	// }
	var zwitab="";
	var remEl;
	for(var i=0;i<imgs.length;i++){
		// imgs[i].className+="tt-a";
		if(imgs[i].className.indexOf("stash-tt-a")!=-1)continue;
		remEl=imgs[i].querySelector(".tt-bb");
		if(remEl!=null)remEl.parentNode.removeChild(remEl);
		if(imgs[i].querySelector("span.details")==null){
			imgs[i].querySelector("div.tt-a a.thumb img").style='height:'+(barHeight-10)+'px;width:auto;'; //DDs
		}else{			
			imgs[i].querySelector("div.tt-a a.thumb img").style='height:'+(barHeight-10)+'px;width:auto;'; //thumbs with descr
		}
		zwitab+=" "+imgs[i].outerHTML;
	}
	// zwitab+="</tr></table>";
	channels.push(zwitab);
	// console.log(channels[0]);
	
	//---------------------------
	
	el=document.createElement("div");
	el.id="dA_Channel_Footer";		
	el.innerHTML=channels[0];
	var ul = el.getElementsByClassName('tt-a');
	if(ul.length>0&&typeof ul[0].parentNode!="undefined")
		for (var i = ul.length; i >= 0; i--) {
			ul[0].parentNode.appendChild(ul[Math.floor(Math.random() * ul.length)]);
		}	
	
	var wel=document.createElement("div");
	wel.id="dA_Channel_Wrapper";
	var channelheader=el.getElementsByClassName("channelHeader")[0];
	var img;
	img=document.createElement("a");
	img.id="dA_Channel_Footer_scrolling";
	img.onclick="return false;";
	img.innerHTML="Settigs";//disablescroll?"enable scrolling":"disable scrolling";
    if(typeof channelheader=="undefined"){channelheader=document.createElement("div");channelheader.className="channelHeader";}
	channelheader.appendChild(img);
	img.addEventListener("click", showSettingsWindow
      /*function(){
			disablescroll=!disablescroll;
			GM_setValue("disablescroll",disablescroll);
			document.getElementById("dA_Channel_Footer_scrolling").innerHTML=disablescroll?"enable scrolling":"disable scrolling";
			if(disablescroll)clearInterval(scrolInt);else scrolInt=setInterval(scroller,DelayOnRow);
		}
		*/,false);
	/*img=document.createElement("a");
	img.id="dA_Channel_Footer_Ch";
	img.onclick="return false;";
	img.innerHTML="Channel: "+site;		
	channelheader.appendChild(img);
	img.addEventListener("click",function(){
			// channel=parseInt(prompt("Insert the channel-Index you would like to display!\nTo display the first Channel, use 1, 4th: 4 etc.\nTo see or change your current channel-settings, visit http://www.deviantart.com/channels/"));
			// if(channel<1||isNaN(channel))channel=1;
			// if(channel>channels.length-1)channel=channels.length-1;	
			// GM_setValue("channel",channel);
			// disablescroll=true;
			// aktpos=0;
			// clearInterval(scrolInt);
			// clearInterval(sscroll);
			// var wel=document.getElementById("dA_Channel_Wrapper");
			// wel.parentNode.removeChild(wel);			
			// start(data);
			site= prompt("Please paste the URL to the search result you want to have displayed here ,e.g. http://www.deviantart.com/browse/all/photography/nature/landscapes/?q=beach ",site);
			GM_setValue("site",site);
			disablescroll=true;
			aktpos=0;
			clearInterval(scrolInt);
			clearInterval(sscroll);
			var wel=document.getElementById("dA_Channel_Wrapper");
			wel.parentNode.removeChild(wel);	
			GM_xmlhttpRequest({
				url: site,
				method: "get",
				onload:start
			});			
		},false);
		*/
	img=document.createElement("img");
	img.className='leftbut buts';
	img.src=parrowleft;
	channelheader.appendChild(img);
	img.addEventListener("click",function(){
			if(aktpos>0)aktpos--;
			if(typeof ul[aktpos]=="undefined")return;
			step=-1;
			disablescroll=true;
			GM_setValue("disablescroll",disablescroll);
			// document.getElementById("dA_Channel_Footer_scrolling").innerHTML="enable scrolling";
			scrollto(el,el.scrollLeft,ul[aktpos].offsetLeft,25); //25 ticks, 20ms/tick = 0.5s animation
		},false);
	img=document.createElement("img");
	img.className='rightbut buts';
	img.src=parrowright;
	channelheader.appendChild(img);
	img.addEventListener("click",function(){
			// console.log(aktpos,ul[aktpos],ul.length,ul[aktpos].offsetLeft,el,el.scrollWidth-el.clientWidth);
			if(aktpos<ul.length-1&&ul[aktpos].offsetLeft<el.scrollWidth-el.clientWidth)aktpos++;
			if(typeof ul[aktpos]=="undefined")return;
			step=1;
			disablescroll=true;
			GM_setValue("disablescroll",disablescroll);
			// document.getElementById("dA_Channel_Footer_scrolling").innerHTML="enable scrolling";
			scrollto(el,el.scrollLeft,ul[aktpos].offsetLeft,25);
		},false);
	
	wel.appendChild(channelheader);		
	wel.appendChild(el);
	document.getElementById("depths").insertBefore(wel,document.getElementById("depths").firstChild);

	scrolInt=setInterval(scroller,DelayOnRow);
	 
	 
	settingsForm=document.createElement("div");
	settingsForm.id="dA_Channel_Footer_Setting_wrapper";
	settingsForm.innerHTML="<div id='dA_Channel_Footer_Setting'><h1>Settings</h1>"+
		"<dl>"+
		"<dt>Scrolling</dt><dd><input type='checkbox' class='cb_scrolling'/></dd>"+
		"<dt>Height (px)</dt><dd><input type='text' class='edit_height'/></dd>"+
		"<dt>Channel</dt><dd><input type='text' class='edit_channel'/></dd>"+
		"</dl>"+
		"<div class='buttons'>"+
		"<div class='cancel'>Cancel</div>"+
		"<div class='save'>Save</div>"+
		"</div></div>";
	document.body.appendChild(settingsForm);
	settingsForm.getElementsByClassName("cancel")[0].addEventListener("click",function(){
		document.getElementById("dA_Channel_Footer_Setting_wrapper").style.display="none";
	},false);
	settingsForm.getElementsByClassName("save")[0].addEventListener("click",function(){
		disablescroll=!settingsForm.getElementsByClassName("cb_scrolling")[0].checked;
		barHeight=settingsForm.getElementsByClassName("edit_height")[0].value;
		site=settingsForm.getElementsByClassName("edit_channel")[0].value;
		
		if(site=="")site=defaultsite;
		
		GM_setValue("site",site);
		GM_setValue("disablescroll",disablescroll);
		GM_setValue("barHeight",barHeight);
		
		document.getElementById("dA_Channel_Footer").style.height=barHeight+"px";
		
		document.getElementById("dA_Channel_Footer_Setting_wrapper").style.display="none";
	},false);
	
	document.getElementById("dA_Channel_Footer").style.height=barHeight+"px";
}
// console.log(site);
GM_xmlhttpRequest({
	url: site,
	method: "get",
	onload:start
});