// ==UserScript==
// @name js-巴哈-文章列表-卡片化
// @namespace hbl917070
// @description 巴哈姆特深色主題
// @author hbl917070(深海異音)
// @homepage https://home.gamer.com.tw/homeindex.php?owner=hbl917070
// @include https://forum.gamer.com.tw/B.php?*
// @run-at document-start
// @grant GM_getValue
// @grant GM_setValue
// @version 1.23
// ==/UserScript==
/*
標題:js-巴哈-文章列表-卡片化
範圍:文章列表
最後修改日期:2019 / 10 / 03
作者:hbl917070(深海異音)
說明:把「縮圖」模式下的「文章列表」,轉為「卡片」的來顯示
必須搭配「深色主題」來使用,不然顏色會很奇怪
https://forum.gamer.com.tw/C.php?bsn=60076&snA=2621599
版本:
1.23:修復BUG
1.22:修復標題失效的問題
1.21:對應巴哈改變
1.20:微調物件排列順序
*/
(function () {
//-----------------------------------
var url = document.location.href;
var css = `
/*左右兩邊的框架*/
#LLL_0{
overflow-x:hidden;
overflow-y:auto;
}
#LLL_1,
#LLL_2 {
width: 465px;
}
#LLL_1{
float: left;
}
#LLL_2{
float: right;
}
.s_box a:link {
color: #FFF;
}
.s_box a:hover {
text-decoration: underline !important;
}
.s_box a:visited {
color: #FFF;
}
/*每一筆文章*/
.s_box {
width: 100%;
color: #FFF;
font-size: 16px;
font-family: "微軟正黑體", Microsoft JhengHei, "黑體-繁", "蘋果儷中黑", sans-serif;
border: 1px solid rgba(255, 255, 255, 0.4);
margin: 10px 0px;
padding: 10px;
box-sizing: border-box;
background-color: rgba(45,45,45,.4);
position: relative;
}
/*精華文章*/
.s_box_start {
position: absolute;
top: 0px;
right: 0px;
width: 40px;
height: 40px;
overflow: hidden;
}
.s_box_start::after {
background-color: rgb(250, 112, 0);
width: 40px;
height: 40px;
transform: rotate(135deg);
content: "";
display: block;
position: absolute;
top: -20px;
right: -20px;
}
.s_box_start svg {
z-index: 45;
position: absolute;
top: 0px;
right: 0px;
}
.s_box_0 {
overflow: auto;
margin-top: 10px;
}
/*勇造*/
.s_box_u_img {
width: 45px;
height: 45px;
background-size: contain;
float: left;
border-radius: 50%;
margin-right: 10px;
margin-bottom: 10px;
}
.s_box_1 {
overflow: hidden;
margin-top: -3px;
margin-bottom: 3px;
}
/*帳號*/
.s_box_user {
float: left;
/* margin-left: 10px; */
/* line-height: 40px; */
color: #87dfff !important;
text-decoration: none;
line-height: 20px;
}
/*.s_box_type::after {
float: left;
content: "▶";
margin-right: 10px;
font-size: 10px;
line-height: 20px;
}*/
.s_box_2 {
overflow: auto;
float: left;
line-height: 23px;
}
/*icon*/
.s_box_2 svg{
float: left;
width:20px;
height:20px;
margin-top: 2px;
margin-right: 3px;
}
.s_box_svg_color{
fill: rgba(255, 255, 255, 0.5);
}
.s_box_gp {
float: left;
margin-right: 15px;
}
/*回文數*/
.s_box_ret {
float: left;
margin-right: 15px;
}
/*觀看數*/
.s_box_see {
float: left;
margin-right: 15px;
}
/*最後回文時間*/
.s_box_lasttime {
float: left;
margin-right: 15px;
}
/*主題*/
.s_box_type {
float: left;
line-height: 23px;
}
.s_box_3 {
margin-bottom: 15px ;
line-height: 20px;
}
/*標題*/
.s_box_title {
text-decoration: none;
font-weight: 600;
font-size: 17px;
}
.s_box_title:hover {
color: #87dfff !important;
}
.s_box_title:visited {
color: rgb(160, 160, 160) !important;
}
/*標題後面的頁碼*/
.s_box_title_nub {
display: inline;
}
.s_box_title_nub a {
color: #87dfff !important;
text-decoration: none;
margin: 0 3px;
}
/*頁碼前面的 「»...」 符號*/
.s_box_title_nub a:first-child::before {
white-space: nowrap;
content: " » ...";
color: #FFF;
width: 20px;
height: 20px;
font-size: 10px;
margin: 0px 10px;
}
/*內文*/
.s_box_txt {
margin-bottom: 10px;
line-height: 20px;
font-size: 15px;
/*border-top: 1px solid rgba(255,255,255,0.4);
padding-top: 10px;*/
}
/*圖片*/
.s_box_img{
text-align: center;
position: relative;
}
.s_box_img img {
max-width: 100%;
max-height: 400px;
margin:auto;
}
/*影片*/
.s_box_img_video::after {
content: "";
display: block;
width:80px;
height:80px;
background-image: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgdmlld0JveD0iMCAwIDI0IDI0Ij48cGF0aCBkPSJNMCAwaDI0djI0SDB6IiBmaWxsPSJub25lIi8+PHBhdGggIGZpbGw9InJnYmEoMjU1LDI1NSwyNTUsMC42KSIgZD0iTTEyIDJDNi40OCAyIDIgNi40OCAyIDEyczQuNDggMTAgMTAgMTAgMTAtNC40OCAxMC0xMFMxNy41MiAyIDEyIDJ6bS0yIDE0LjV2LTlsNiA0LjUtNiA0LjV6Ii8+PC9zdmc+);
background-size: 100% 100%;
position: absolute;
top:0;
left: 0;
right: 0;
bottom: 0;
margin: auto;
pointer-events: none;
}
`;
//載入完成時
document.addEventListener("DOMContentLoaded", function () {
func_文章列表轉卡片();
});
// 插入 CSS
if (typeof GM_addStyle != "undefined") {
GM_addStyle(css);
} else if (typeof PRO_addStyle != "undefined") {
PRO_addStyle(css);
} else if (typeof addStyle != "undefined") {
addStyle(css);
} else {
var node = document.createElement("style");
node.type = "text/css";
node.appendChild(document.createTextNode(css));
var heads = document.getElementsByTagName("html");
if (heads.length > 0) {
heads[0].appendChild(node);
} else {
document.documentElement.appendChild(node);
}
}
/**
*
*/
function get_row_list_json() {
let ar = $('.b-list__row:not(.b-list__row--sticky').get();
let json_row = [];
for (let i = 0; i < ar.length; i++) {
//避免抓到廣告的列
if ($(ar[i]).find('.b-list_ad').get().length > 0) {
continue;
}
let 主題 = '';
let gp = '';
let 標題 = '';
let href = '';
let 子頁 = '';
let 作者 = '';
let 內文 = '';
let 圖片 = '';
let 精華 = false;
let 回文數 = '';
let 觀看數 = '';
let 最後回覆 = '';
let 影片 = false;
try {
主題 = $(ar[i]).find('a[data-subbsn]').html();
} catch (e) {
continue;
}
try {
gp = $(ar[i]).find('.b-list__summary__gp').html();
} catch (e) { }
標題 = $(ar[i]).find('.b-list__main__title').html();
try {
href = $(ar[i]).find('.b-list__main__title').get()[0].getAttribute('href');
if (href === undefined || href === null)
href = "";
} catch (e) { }
try {
子頁 = $(ar[i]).find('.b-list__main__pages').html().replace(/<span /ig, '<a ').replace(/<\/span>/ig, '</a>').replace(/ data-page=/ig, ' href=')
} catch (e) { }
作者 = $(ar[i]).find('.b-list__count .b-list__count__user a').html();
try {
內文 = $(ar[i]).find('.b-list__brief').html();
} catch (e) { }
try {
圖片 = $(ar[i]).find('.b-list__img').get()[0].getAttribute("data-thumbnail");
if (圖片.indexOf("https://i2.bahamut.com.tw/forum/no-img") == 0) {
圖片 = "";
}
} catch (e) { }
精華 = $(ar[i]).find('.b-list__summary__mark').get().length > 0;//判斷是否為精華
回文數 = $(ar[i]).find('.b-list__count__number span').get()[0].innerText;
觀看數 = $(ar[i]).find('.b-list__count__number span').get()[1].innerText;
最後回覆 = $(ar[i]).find('.b-list__time__edittime').get()[0].innerText;
影片 = $(ar[i]).find('.video-btn_play').get().length > 0;//判斷是否為影片
if (func_排除劇透(作者)) {
continue;
}
json_row.push({
主題: 主題,
gp: gp,
標題: 標題,
href: href,
子頁: 子頁,
作者: 作者,
內文: 內文,
圖片: 圖片,
精華: 精華,
回文數: 回文數,
觀看數: 觀看數,
最後回覆: 最後回覆,
影片: 影片
});
}
return json_row;
}
/**
*
*/
function func_排除劇透(ss) {
//劇透或令人不舒服的預覽圖
let ar_帳號排除 = [];
ar_帳號排除.push("smellycat");
ar_帳號排除.push("AKARI0301");
ar_帳號排除.push("lee14605");
ar_帳號排除.push("seven770706");
ar_帳號排除.push("kevin0924s");
ar_帳號排除.push("madaan40");
ar_帳號排除.push("huangct789");
ar_帳號排除.push("ygop5566");
ar_帳號排除.push("paul123123");
ar_帳號排除.push("a7320505");
ar_帳號排除.push("a126782179");
ar_帳號排除.push("louis38600");
ar_帳號排除.push("givemebanana");
ar_帳號排除.push("fg1289363");
ar_帳號排除.push("huangct789");
ar_帳號排除.push("dick199444");
ar_帳號排除.push("d5353351");
ar_帳號排除.push("f011222");
ar_帳號排除.push("a4755063");
ar_帳號排除.push("Kevin2980");
ar_帳號排除.push("zxcva47z81");
ar_帳號排除.push("orgenize");
ar_帳號排除.push("g8808088");
ar_帳號排除.push("p24888123");
ar_帳號排除.push("Terry85");
for (let j = 0; j < ar_帳號排除.length; j++) {
if (ss.toUpperCase() == ar_帳號排除[j].toUpperCase()) {
return true;
}
}
return false;
}
/**
*
*/
function func_文章列表轉卡片() {
//取得文章列表的json
let json_row = get_row_list_json();
//console.log(json_row);
if (json_row.length == 0) {
console.log("文章列表轉卡片 => 無資料");
return;
}
if ($(".now_stop").get().length == 0) {
console.log("文章列表轉卡片 => 無資料");
return;
}
if ($(".now_stop").html().indexOf("縮圖") < 0) {
console.log("文章列表轉卡片 => 目前不是縮圖模式");
return;
}
//產生存放卡片的兩個欄位
let obj_img_weap = document.getElementById("BH-master");
let l00 = document.createElement("div");
l00.setAttribute("id", "LLL_0");
let l01 = document.createElement("div");
l01.setAttribute("id", "LLL_1");
let l02 = document.createElement("div");
l02.setAttribute("id", "LLL_2");
l00.appendChild(l01);
l00.appendChild(l02);
obj_img_weap.insertBefore(l00, formm.nextSibling);
for (let i = 0; i < json_row.length; i++) {
//簡化文章列表的超連結
let int_index = json_row[i].href.indexOf("&tnum=");
if (int_index > 0) {
json_row[i].href = json_row[i].href.substr(0, int_index);
}
let s_隱藏圖片 = "";
if (json_row[i].圖片 == undefined || json_row[i].圖片 == "") {
s_隱藏圖片 = "style='display:none'";
}
let s_精華 = "";
if (json_row[i].精華 === false) {
s_精華 = "style='display:none'";
}
let s_u = json_row[i].作者.toLocaleLowerCase();
let s_user_img = `https://avatar2.bahamut.com.tw/avataruserpic/${s_u.substr(0, 1)}/${s_u.substr(1, 1)}/${s_u}/${s_u}_s.png`;
let s_小屋 = "https://home.gamer.com.tw/homeindex.php?owner=" + s_u;
//根數GP數量改變顏色
let s_gp_style = "";
if (json_row[i].gp == '') {
json_row[i].gp = 0;
s_gp_style = "style='color: #ffffff;'";
} else if (json_row[i].gp > 1000) {
s_gp_style = "style='color: #F3444F;'";
} else if (json_row[i].gp > 100) {
s_gp_style = "style='color: #F36D3C;'";
}
let s_內文_style = "";
if (json_row[i].內文 == '') {
s_內文_style = "style='display:none'";
}
let s_是否為影片 = "";
if (json_row[i].影片) {
s_是否為影片 = "s_box_img_video";
}
var html = `
<div class="s_box">
<div class="s_box_start" ${s_精華}>
<svg width="18" height="18" viewBox="0 0 18 18">
<path fill="#FFFFFF" d="M9 11.3l3.71 2.7-1.42-4.36L15 7h-4.55L9 2.5 7.55 7H3l3.71 2.64L5.29 14z"/>
<path fill="none" d="M0 0h18v18H0z"/>
</svg>
</div>
<div class="s_box_3">
<a href="${s_小屋}" target="_blank">
<div class="s_box_u_img" style="background-image: url(${s_user_img})"></div>
</a>
<div class="s_box_1">
<a class="s_box_user" href="${s_小屋}" target="_blank">${json_row[i].作者}</a>
</div>
<div class="s_box_title_box">
<a class="s_box_title" href="${json_row[i].href}">
${json_row[i].標題}
</a>
<div class="s_box_title_nub">
${json_row[i].子頁}
</div>
</div>
</div>
<div class="s_box_txt" ${s_內文_style}>${json_row[i].內文}</div>
<div class="s_box_img ${s_是否為影片}" ${s_隱藏圖片}>
<a href="${json_row[i].href}">
<img src="${json_row[i].圖片}" alt="">
</a>
</div>
<div class="s_box_0">
<div class="s_box_2">
<svg width="24" height="24" viewBox="0 0 24 24">
<path class="s_box_svg_color" d="M2 20h2c.55 0 1-.45 1-1v-9c0-.55-.45-1-1-1H2v11zm19.83-7.12c.11-.25.17-.52.17-.8V11c0-1.1-.9-2-2-2h-5.5l.92-4.65c.05-.22.02-.46-.08-.66-.23-.45-.52-.86-.88-1.22L14 2 7.59 8.41C7.21 8.79 7 9.3 7 9.83v7.84C7 18.95 8.05 20 9.34 20h8.11c.7 0 1.36-.37 1.72-.97l2.66-6.15z"/>
</svg>
<div class="s_box_gp" ${s_gp_style}>${json_row[i].gp}</div>
<svg width="24" height="24" viewBox="0 0 24 24">
<path class="s_box_svg_color"d="M21 6h-2v9H6v2c0 .55.45 1 1 1h11l4 4V7c0-.55-.45-1-1-1zm-4 6V3c0-.55-.45-1-1-1H3c-.55 0-1 .45-1 1v14l4-4h10c.55 0 1-.45 1-1z"/>
</svg>
<div class="s_box_ret">${json_row[i].回文數}</div>
<svg width="24" height="24" viewBox="0 0 24 24">
<path class="s_box_svg_color" d="M12 4.5C7 4.5 2.73 7.61 1 12c1.73 4.39 6 7.5 11 7.5s9.27-3.11 11-7.5c-1.73-4.39-6-7.5-11-7.5zM12 17c-2.76 0-5-2.24-5-5s2.24-5 5-5 5 2.24 5 5-2.24 5-5 5zm0-8c-1.66 0-3 1.34-3 3s1.34 3 3 3 3-1.34 3-3-1.34-3-3-3z"/>
</svg>
<div class="s_box_see">${json_row[i].觀看數}</div>
<svg width="24" height="24" viewBox="0 0 24 24">
<path class="s_box_svg_color" d="M11.99 2C6.47 2 2 6.48 2 12s4.47 10 9.99 10C17.52 22 22 17.52 22 12S17.52 2 11.99 2zM12 20c-4.42 0-8-3.58-8-8s3.58-8 8-8 8 3.58 8 8-3.58 8-8 8z"/>
<path class="s_box_svg_color" d="M12.5 7H11v6l5.25 3.15.75-1.23-4.5-2.67z"/>
</svg>
<div class="s_box_lasttime">${json_row[i].最後回覆}</div>
<svg width="24" height="24" viewBox="0 0 24 24">
<path class="s_box_svg_color" d="M20 6h-8l-2-2H4c-1.1 0-1.99.9-1.99 2L2 18c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2V8c0-1.1-.9-2-2-2zm0 12H4V8h16v10z"/>
</svg>
<div class="s_box_type">${json_row[i].主題}</div>
</div>
</div>
</div>`;
let item = document.createElement("div");
item.innerHTML = html;
if (i % 2 == 0) {
document.getElementById("LLL_1").appendChild(item);
} else {
document.getElementById("LLL_2").appendChild(item);
}
}//for
//隱藏已經處理過的文章
$('.b-list__row:not(.b-list__row--sticky').css("display", "none");
}
})();