// ==UserScript==
// @name 卡特個人化功能
// @namespace http://tampermonkey.net/
// @version 0.3.02
// @license MIT
// @description RT
// @author SmallYue1
// @match https://kater.me
// @match https://kater.me/*
// @require https://code.jquery.com/jquery-3.4.1.min.js
// @require https://greasyfork.org/scripts/14208-datejs/code/Datejs.js?version=89671
// @grant GM_getValue
// @grant GM_setValue
// @run-at document-body
// ==/UserScript==
var _自訂首頁,_收藏文章,_關圖;
var BlockList,FavoriteList,User_Settings;
function 覆寫樓層(PostStream_Item,Li_User)
{
if(!PostStream_Item.getAttribute("haschild")) return;
if($(Li_User.parentNode).find("#ClosePictures_Icon").length !== 0) return;
var Li_ClosePictures = document.createElement('li');
var Btn_ClosePictures = document.createElement('button');
var Icon_ClosePictures = document.createElement('i');
Li_ClosePictures.setAttribute("class","TextEditor-toolbar");
Btn_ClosePictures.setAttribute("class","Button Button--icon Button--link hasIcon");
Icon_ClosePictures.setAttribute("id","ClosePictures_Icon");
Icon_ClosePictures.setAttribute("class","icon fas fa-eye-slash Button-icon");
Li_User.parentNode.appendChild(Li_ClosePictures);
Li_ClosePictures.appendChild(Btn_ClosePictures);
Btn_ClosePictures.appendChild(Icon_ClosePictures);
Li_ClosePictures.addEventListener("click",function(e) {
var Iframes = $(PostStream_Item).find("iframe");
var Imgs = $(PostStream_Item).find("img[class != 'Avatar PostUser-avatar']");
var icon = this.firstElementChild.firstElementChild;
if(icon.getAttribute("class") !== "icon fas fa-eye-slash Button-icon")
{
//關圖
icon.setAttribute("class","icon fas fa-eye-slash Button-icon");
for(var Iframe of Iframes)
{
Iframe.setAttribute("style_pre",Iframe.getAttribute("style"));
Iframe.setAttribute("style","display:none");
Iframe.setAttribute("src_pre",Iframe.getAttribute("src"));
Iframe.setAttribute("src","");
}
for(var Img of Imgs)
{
Img.setAttribute("style_pre",Img.getAttribute("style"));
Img.setAttribute("style","display:none");
Img.setAttribute("src_pre",Img.getAttribute("src"));
Img.setAttribute("src","");
}
}
else
{
//開圖
icon.setAttribute("class","icon fas fa-eye Button-icon");
for(Iframe of Iframes)
{
Iframe.setAttribute("style",Iframe.getAttribute("style_pre"));
Iframe.setAttribute("src",Iframe.getAttribute("src_pre"));
}
for(Img of Imgs)
{
Img.setAttribute("style",Img.getAttribute("style_pre"));
Img.setAttribute("src",Img.getAttribute("src_pre"));
}
}
},false);
}
function 覆寫Ul(Ul,Data_Id)
{
var Li = document.createElement('li');
Li.innerHTML = `<button class=" hasIcon" type="button" title="收藏"><i></i><span class="Button-label">收藏</span></button>`;
Li.setAttribute("class","item-subscription");
Li.setAttribute("data-id",Data_Id);
if(FavoriteList.indexOf(Data_Id) === -1)
{
Li.firstElementChild.firstElementChild.setAttribute("class","icon far fa-star Button-icon");
}
else if(FavoriteList.indexOf(Data_Id) !== -1)
{
Li.firstElementChild.firstElementChild.setAttribute("class","icon fas fa-star Button-icon");
}
Ul.insertBefore(Li,Ul.firstElementChild);
Li.addEventListener("click",function(){
var Data_Id = this.getAttribute("data-id");
if(FavoriteList.indexOf(Data_Id) === -1)
{
//新增收藏
FavoriteList.push(Data_Id)
GM_setValue("Kater_FavoriteList", FavoriteList);
this.firstElementChild.firstElementChild.setAttribute("class","icon fas fa-star Button-icon");
}
else if(FavoriteList.indexOf(Data_Id) !== -1)
{
//解除收藏
FavoriteList.splice(FavoriteList.indexOf(Data_Id), 1);
GM_setValue("Kater_FavoriteList", FavoriteList);
this.firstElementChild.firstElementChild.setAttribute("class","icon far fa-star Button-icon");
}
},false);
}
function 新增腳本工具列按鈕()
{
if($("ul.Header-controls").length>=2)
{
if($("#Script_Btn").length != 0) return;
var Ul = $("ul.Header-controls")[1];
var Li_Setting = document.createElement('li');
Li_Setting.innerHTML = `<div id="custom-dropdown-div" class="ButtonGroup Dropdown dropdown SessionDropdown"><button class=\"Dropdown-toggle Button Button--flat\" data-toggle=\"dropdown\"><i class=\"icon fas fa-cogs Button-icon\"></i><span>腳本設定</span></button><ul class="Dropdown-menu dropdown-menu Dropdown-menu--right"></ul></div>`;
Ul.appendChild(Li_Setting);
新增功能(Li_Setting.firstElementChild.lastElementChild);
Li_Setting.setAttribute("id","Script_Btn");
}
else
{
setTimeout(() => 新增腳本工具列按鈕(),25);
}
}
function 新增功能(Ul)
{
if(_自訂首頁)自訂首頁(Ul);
if(_收藏文章)收藏文章(Ul);
卡特個人化功能(Ul);
}
function 卡特個人化功能(Ul)
{
var Li = document.createElement('li');
Ul.setAttribute("id","custom-dropdown-ul1")
Ul.appendChild(Li);
Ul.addEventListener("click", (e) => {e.stopPropagation();});
Li.innerHTML = `<button class=" hasIcon" type="button" title="卡特個人化功能"><i class="icon fas fa-cog Button-icon"></i><span class="Button-label">卡特個人化功能</span></button>`;
Li.setAttribute("class","item-profile");
Li.addEventListener("click",() => {document.getElementById('custom-dropdown-ul1').setAttribute("style","display:none");建立卡特個人化功能頁面();});
}
function 收藏文章(Ul)
{
var Li = document.createElement('li');
Ul.appendChild(Li);
Li.innerHTML = `<button class=" hasIcon" type="button" title="收藏文章"><i class="icon fas fa-star Button-icon"></i><span class="Button-label">收藏文章</span></button>`;
Li.setAttribute("class","item-profile");
Li.addEventListener("click",() => {建立收藏頁面()});
}
function 自訂首頁(Ul)
{
var Li = document.createElement('li');
Ul.appendChild(Li);
Li.innerHTML = `<button class=" hasIcon" type="button" title="自訂首頁"><i class="icon fas fa-user-edit Button-icon"></i><span class="Button-label">自訂首頁</span></button>`;
Li.setAttribute("class","item-profile");
Li.addEventListener("click",() => {取得Tag資料();document.getElementById('custom-dropdown-ul1').setAttribute("style","display:none");});
}
function 建立卡特個人化功能頁面()
{
var Div = document.getElementById('custom-dropdown-div');
var Tags = document.createElement('ul');
Tags.setAttribute("id","custom-dropdown-ul2");
Tags.setAttribute("class","Dropdown-menu dropdown-menu Dropdown-menu--right");
Tags.addEventListener("click", (e) => {e.stopPropagation();});
新增卡特個人化功能頁面中的按鈕(Tags,"返回","fas fa-chevron-left",true);
新增卡特個人化功能頁面中的按鈕(Tags,"自訂首頁","fas fa-user-edit",_自訂首頁);
新增卡特個人化功能頁面中的按鈕(Tags,"收藏文章","fas fa-star",_收藏文章);
新增卡特個人化功能頁面中的按鈕(Tags,"關圖","fas fa-eye-slash",_關圖);
新增卡特個人化功能頁面中的按鈕(Tags,"套用(重整頁面)","far fa-save",true);
Div.appendChild(Tags);
var Back_To_Kater = document.createElement('div');
Back_To_Kater.setAttribute("style","text-align:center;width:100%;height:100%;");
Back_To_Kater.innerHTML = `<div style="margin:0 auto;"><a href="https://kater.me/"><button class="Button Button--primary IndexPage-newDiscussion hasIcon" itemclassname="App-primaryControl" type="button" title="回到卡特"><i class="icon fas fa-edit Button-icon"></i><span class="Button-label">回到卡特</span></button></a></div>`;
}
function 新增卡特個人化功能頁面中的按鈕(Tags,Name,Icon,Value)
{
var Tag_Iteam = document.createElement('li');
Tag_Iteam.innerHTML = `<a class="TagLinkButton hasIcon" style="text-align:center;width:100%;color:${Value ? "" : "#7c7c7c"};"><i class="icon ${Icon} Button-icon" style="float:initial;color:${Value ? "" : "#7c7c7c"};"></i>${Name}</a>`;
Tag_Iteam.setAttribute("name",Name);
Tag_Iteam.setAttribute("value",Value);
Tag_Iteam.setAttribute("class","item-profile");
Name =="返回" ? Tag_Iteam.addEventListener("click",(e) => {document.getElementById('custom-dropdown-ul1').setAttribute("style","");document.getElementById('custom-dropdown-ul2').remove();},false) : Name == "套用(重整頁面)" ? Tag_Iteam.addEventListener("click",(e) => {location.reload();}) : Tag_Iteam.addEventListener("click",(e) => {個人化頁面按鈕點擊事件(e);},false);
Tags.appendChild(Tag_Iteam);
}
function 個人化頁面按鈕點擊事件(e)
{
var Target = $(e.target).parents("li")[0];
var Name = Target.getAttribute("name");
var Value = Target.getAttribute("value");
var Text_Color,Icon_Color;
if(Value === "true")
{
變更使用者設定(Name,Value)
GM_setValue("Kater_User_Settings", [_自訂首頁,_收藏文章,_關圖]);
Target.setAttribute("value",false);
Icon_Color = "#7c7c7c";
Text_Color = "#7c7c7c";
}
else
{
變更使用者設定(Name,Value)
GM_setValue("Kater_User_Settings", [_自訂首頁,_收藏文章,_關圖]);
Target.setAttribute("value",true);
Icon_Color = "";
Text_Color = "";
}
Target.firstElementChild.setAttribute("style",`text-align:center;width:100%;color:${Text_Color};`);
Target.firstElementChild.firstElementChild.setAttribute("style",`float:initial;color:${Icon_Color};`);
}
function 變更使用者設定(Name,Value)
{
switch (Name) {
case "自訂首頁":
if(Value === "true")
{
_自訂首頁 = false;
}
else
{
_自訂首頁 = true;
}
break;
case "收藏文章":
if(Value === "true")
{
_收藏文章 = false;
}
else
{
_收藏文章 = true;
}
break;
case "關圖":
if(Value === "true")
{
_關圖 = false;
}
else
{
_關圖 = true;
}
break;
default:
console.log("變更使用者設定失敗!");
console.log(Name+Value);
}
}
async function 建立收藏頁面()
{
var Ul,Data,Data_Id,Article_Card,Li_Display;
document.body.innerHTML = "<body></body>";
var Back_To_Kater = document.createElement('div');
Back_To_Kater.setAttribute("style","text-align:center;width:100%;height:auto;position:fixed;display:block;z-index:5;");
Back_To_Kater.innerHTML = `<div class="header-secondary" style="width:100%"><a href="https://kater.me/"><button itemclassname="App-primaryControl" type="button" title="回到卡特" style="width:100%" class="Button Button--primary IndexPage-newDiscussion hasIcon"><span class="Button-label">回到卡特</span></button></a></div>`;
document.body.appendChild(Back_To_Kater);
var Article_List = document.createElement('ul');
document.body.appendChild(Article_List);
Article_List.setAttribute("class","PostsUserPage-list");
Article_List.setAttribute("style","width:80%;padding-top:45px;padding-bottom:45px;padding-left:20%;");
for(var Favorite of FavoriteList)
{
Data = await 取得收藏資料(Favorite);
Article_Card = document.createElement('li');
Article_List.appendChild(Article_Card);
Article_Card.innerHTML = `<div class="PostsUserPage-discussion">於 <a href="https://kater.me/d/${Data.discussions_id}/${Data.floor}">${Data.title}</a></div>
<article class="Post CommentPost">
<div>
<header class="Post-header">
<ul>
<li class="item-user">
<div class="PostUser">
<h3><a href="https://kater.me/u/${Data.uid}"><img class="Avatar PostUser-avatar" src="${Data.avatarUrl}"><span class="username">${Data.username}</span></a></h3>
<ul class="badges">
</ul>
</div>
</li>
<li class="item-meta">
<div class="Dropdown PostMeta">
<a class="Dropdown-toggle" data-toggle="dropdown" aria-expanded="false">
<time pubdate="true" datetime="${Data.time}" title="${Date.parse(Data.time)}" data-humantime="true">${Date.parse(Data.time).toString("yyyy/M/d HH:mm:ss")}</time>
</a>
</div>
</li>
<li class="TextEditor-toolbar">
<button class="Button Button--icon Button--link hasIcon">
<i class="icon far fa-eye-slash Button-icon"></i>
</button>
</li>
</ul>
</header>
<div class="Post-body" style = "display:none;">${Data.contentHtml}</div>
<aside class="Post-actions">
<ul></ul>
</aside>
</div>
</article>`;
Ul = Article_Card.lastElementChild.firstElementChild.lastElementChild.firstElementChild;
Data_Id = Data.data_id;
await 覆寫Ul(Ul,Data_Id);
Ul.firstElementChild.removeAttribute("class");
Ul.firstElementChild.firstElementChild.setAttribute("class","Dropdown-toggle Button Button--icon Button--flat");
Ul.firstElementChild.addEventListener("click",function(){
var Data_Id = this.getAttribute("data-id");
$(this).parents("li")[0].setAttribute("style","display:none;");
},false);
Li_Display = Article_Card.lastElementChild.firstElementChild.firstElementChild.firstElementChild.lastElementChild;
Li_Display.addEventListener("click",function() {
var icon = this.firstElementChild.firstElementChild;
if(icon.getAttribute("class") !== "icon far fa-eye-slash Button-icon")
{
this.parentNode.parentNode.parentNode.children[1].setAttribute("style","display:none;");
icon.setAttribute("class","icon far fa-eye-slash Button-icon");
}
else
{
this.parentNode.parentNode.parentNode.children[1].setAttribute("style","");
icon.setAttribute("class","icon far fa-eye Button-icon");
}
},false);
}
}
async function 取得收藏資料(Favorite)
{
try{
return new Promise((resolve,reject) => {
var settings = {
"url":"https://kater.me/api/posts/"+Favorite,
"method":"GET",
"headers":{
"X-CSRF-TOKEN":app.data.session.csrfToken
},
success:function(e){
for(var item of e.included)
{
if(item.type === "discussions")
{
var title = item.attributes.title;
var discussions_id = item.id;
}
}
var Data = {
"data_id":e.data.id,
"floor":e.data.attributes.number,
"time":e.data.attributes.createdAt,
"contentHtml":e.data.attributes.contentHtml,
"username":e.included[0].attributes.username,
"avatarUrl":e.included[0].attributes.avatarUrl,
"uid":e.included[0].id,
"discussions_id":discussions_id,
"title":title
};
resolve(Data);
},
error:function(e){
console.log(e);
reject("Error");
}
}
$.ajax(settings);
});
}
catch(e)
{
}
}
function 取得Tag資料()
{
var datas = [],datas_has_parent = [];
var settings = {
"url":"https://kater.me/api/tags",
"method":"GET",
"headers":{
"X-CSRF-TOKEN":app.data.session.csrfToken
},
success:function(e){
for(var data of e.data)
{
try{
if(data.relationships.parent.data.id !== "")
{
var Tempt2 = {
"id":data.id,
"position":data.attributes.position,
"name":data.attributes.name,
"icon":data.attributes.icon,
"color":data.attributes.color,
"parent_id":data.relationships.parent.data.id
};
datas_has_parent.push(Tempt2);
}
}
catch(d)
{
var Tempt = {
"id":data.id,
"position":data.attributes.position,
"name":data.attributes.name,
"icon":data.attributes.icon,
"color":data.attributes.color,
"parent_id":""
};
datas.push(Tempt);
}
}
建立自訂首頁頁面(datas,datas_has_parent);
},
error:function(e){
console.log(e);
}
}
try{
$.ajax(settings);
}
catch(e)
{
}
}
function 建立自訂首頁頁面(datas,datas_has_parent)
{
var Div = document.getElementById('custom-dropdown-div');
var Tags = document.createElement('ul');
var Adjust_Tag_Iteam = document.createElement('li');
var Return_Tag_Iteam = document.createElement('li');
Tags.setAttribute("id","custom-dropdown-ul3");
Tags.setAttribute("class","Dropdown-menu dropdown-menu Dropdown-menu--right");
Tags.setAttribute("style","height:calc(80vh);overflow:auto;");
Tags.addEventListener("click", (e) => {e.stopPropagation();});
Return_Tag_Iteam.innerHTML = `<a class="TagLinkButton hasIcon" style="text-align:center;width:100%;"><i class="icon fas fa-chevron-left Button-icon" style="float:initial;"></i>返回</a>`;
Return_Tag_Iteam.setAttribute("name","返回");
Return_Tag_Iteam.setAttribute("class","item-profile");
Return_Tag_Iteam.addEventListener("click",(e) => {document.getElementById('custom-dropdown-ul1').setAttribute("style","");document.getElementById('custom-dropdown-ul3').remove();},false)
Tags.appendChild(Return_Tag_Iteam);
datas.sort(function (a, b) {
return a.position < b.position ? -1 : 1;
});
datas_has_parent.sort(function (a, b) {
return a.position > b.position ? -1 : 1;
});
for(var data of datas)
{
var Tag_Iteam = document.createElement('li');
Tag_Iteam.innerHTML = `<a class="TagLinkButton hasIcon" style="text-align:center;width:100%;color:${BlockList.indexOf(data.name) === -1 ? "" : "#7c7c7c"};"><i class="icon ${data.icon} Button-icon" style="float:initial;color:${BlockList.indexOf(data.name) === -1 ? data.color : "#7c7c7c"};"></i>${data.name}</a>`;
Tag_Iteam.setAttribute("id",data.id);
Tag_Iteam.setAttribute("name",data.name);
Tag_Iteam.setAttribute("color",data.color);
Tag_Iteam.setAttribute("class","item-profile");
Tag_Iteam.addEventListener("click",(e) => {自訂首頁頁面按鈕點擊事件(e);},false);
Tags.appendChild(Tag_Iteam);
}
Div.appendChild(Tags);
for(data of datas_has_parent)
{
var Parent_Tag_Iteam = document.getElementById(data.parent_id);
Tag_Iteam = document.createElement('li');
Tag_Iteam.innerHTML = `<a class="TagLinkButton hasIcon child" style = "text-align:center;width:100%;color:${BlockList.indexOf(data.name) === -1 ? "" : "#7c7c7c"};max-width:100%;box-sizing:border-box;padding-left:50px;margin-left:0px;"><i class="icon ${data.icon} Button-icon" style="float:initial;color:${BlockList.indexOf(data.name) === -1 ? data.color : "#7c7c7c"};"></i>${data.name}</a>`;
Tag_Iteam.setAttribute("id",data.id);
Tag_Iteam.setAttribute("name",data.name);
Tag_Iteam.setAttribute("color",data.color);
Tag_Iteam.setAttribute("class","item-profile");
Tag_Iteam.addEventListener("click",(e) => {自訂首頁頁面按鈕點擊事件(e);},false);
insertAfter(Tag_Iteam,Parent_Tag_Iteam);
}
Adjust_Tag_Iteam.innerHTML = `<a class="TagLinkButton hasIcon" style="text-align:center;width:100%;"><i class="icon far fa-save Button-icon" style="float:initial;"></i>套用(重整頁面)</a>`;
Adjust_Tag_Iteam.setAttribute("name","套用(重整頁面)");
Adjust_Tag_Iteam.setAttribute("class","item-profile");
Adjust_Tag_Iteam.addEventListener("click",(e) => {location.reload();},false)
Tags.appendChild(Adjust_Tag_Iteam);
}
function 自訂首頁頁面按鈕點擊事件(e)
{
var Target = $(e.target).parents("li")[0];
var Block_Text = Target.getAttribute("name");
var Text_Color,Icon_Color;
if(BlockList.indexOf(Block_Text) === -1)
{
//新增屏蔽
BlockList.push(Block_Text)
GM_setValue("Kater_BlockList", BlockList);
Icon_Color = "#7c7c7c";
Text_Color = "#7c7c7c";
}
else
{
//解除屏蔽
BlockList.splice(BlockList.indexOf(Block_Text), 1);
GM_setValue("Kater_BlockList", BlockList);
Icon_Color = Target.getAttribute("color");
Text_Color = "";
}
Target.firstElementChild.setAttribute("style",`text-align:center;width:100%;color:${Text_Color};`);
Target.firstElementChild.firstElementChild.setAttribute("style",`float:initial;color:${Icon_Color};`);
}
function insertAfter(newE,targetE)
{
var parentE = targetE.parentNode;
if(parentE.lastChild == targetE)
{
parentE.appendChild(newE);
}else
{
parentE.insertBefore(newE,targetE.nextSibling);
}
}
if(!GM_getValue("Kater_User_Settings"))
{
[_自訂首頁,_收藏文章,_關圖] = [true,true,true,false];
GM_setValue("Kater_User_Settings", [true,true,true,false]);
console.log("偵測到初次使用腳本 O_Ob");
}
else
{
[_自訂首頁,_收藏文章,_關圖] = GM_getValue("Kater_User_Settings");
console.log([_自訂首頁,_收藏文章,_關圖]);
}
if(_自訂首頁)
{
if(!GM_getValue("Kater_BlockList"))
{
BlockList = [];
GM_setValue("Kater_BlockList", []);
console.log("偵測到初次使用腳本 O_Ob");
}
else
{
BlockList = GM_getValue("Kater_BlockList");
console.log(BlockList);
}
}
if(_收藏文章)
{
if(!GM_getValue("Kater_FavoriteList"))
{
FavoriteList = [];
GM_setValue("Kater_FavoriteList", []);
console.log("偵測到初次使用腳本 O_Ob");
}
else
{
FavoriteList = GM_getValue("Kater_FavoriteList");
console.log(FavoriteList);
}
}
var callback = function (records){
records.map(function(record){
if(record.target.length == 0) return;
if(record.addedNodes.length == 0) return;
if(record.previousSibling != null) return;
if(location.href.indexOf("/d/") !== -1)
{
var Article = $(record.target).find("article.CommentPost")[0];
if(Article == undefined) return;
var Ul = Article.firstElementChild.lastElementChild.previousSibling.firstElementChild.lastElementChild.firstElementChild.lastElementChild;
var Li_User = Article.firstElementChild.firstElementChild.firstElementChild.firstElementChild;
if(Ul == undefined || Li_User == undefined) return;
if(_收藏文章)
{
if(Ul.firstElementChild.className !== "item-subscription")
{
var Data_Id = Article.parentElement.getAttribute("data-id");
覆寫Ul(Ul,Data_Id)
}
}
if(_關圖)
{
var PostStream_Item = $(Li_User).parents("div.PostStream-item")[0];
var Iframes = $(PostStream_Item).find("iframe");
var Imgs = $(PostStream_Item).find("img[class != 'Avatar PostUser-avatar']");
for(var Iframe of Iframes)
{
if(Iframe.getAttribute("style") !== "display:none")
{
PostStream_Item.setAttribute("haschild",true);
Iframe.setAttribute("style_pre",Iframe.getAttribute("style"));
Iframe.setAttribute("style","display:none");
Iframe.setAttribute("src_pre",Iframe.getAttribute("src"));
Iframe.setAttribute("src","");
}
}
for(var Img of Imgs)
{
if((Img.getAttribute("style") !== "display:none") && (Img.className !== "emoji"))
{
PostStream_Item.setAttribute("haschild",true);
Img.setAttribute("style_pre",Img.getAttribute("style"));
Img.setAttribute("style","display:none");
Img.setAttribute("src_pre",Img.getAttribute("src"));
Img.setAttribute("src","");
}
}
覆寫樓層(PostStream_Item,Li_User);
}
}
else
{
var Div = $(record.target).find("div.DiscussionListItem")[0];
if(Div == undefined) return;
if(!_自訂首頁) return;
var Tags = $(Div).find("span.TagLabel-text");
for(var Tag of Tags)
{
if(BlockList.indexOf(Tag.innerText.replace(/ /g,"")) == -1) return;
Tag.parentElement.parentElement.parentElement.parentElement.parentElement.parentElement.parentElement.setAttribute("style","display:none;");
}
}
});
};
var mo = new MutationObserver(callback);
var option = {
'childList': true,
'subtree' : true
};
try{
mo.observe(document.getElementById("content"), option);
}
catch(e){
}
新增腳本工具列按鈕();