复制贴吧的贴子标题与链接
// ==UserScript==
// @name Copy Tieba Link
// @version 1.1
// @description 复制贴吧的贴子标题与链接
// @match *://tieba.baidu.com/*
// @include *://tieba.baidu.com/*
// @author 864907600cc
// @icon https://secure.gravatar.com/avatar/147834caf9ccb0a66b2505c753747867
// @run-at document-start
// @grant GM_setClipboard
// @grant GM_addStyle
// @namespace http://ext.ccloli.com
// ==/UserScript==
var setting = {
title: true, // 是否复制标题,默认为 true
author: false, // 是否复制作者(复制楼中楼时则为楼中楼作者),默认为 false
with_at: true, // 若复制作者,则是否需要添加 @,默认为 true
link: true, // 是否复制链接,默认为 true
split: "\n", // 分隔符,默认为换行符 \n
tips: true, // 是否显示提示信息,默认为 true
tips_time: 5 // 提示显示时间,默认为 5(秒)
};
var linkAnchor = document.createElement('a');
linkAnchor.className = 'tieba-link-anchor';
linkAnchor.textContent = '[复制链接]';
var linkPath = 'http://tieba.baidu.com/p/';
function copyLink(){
var textGroup = [];
var text;
var parent = this.parentElement;
if (this.dataset.linkText) text = this.dataset.linkText;
else {
switch (this.dataset.anchorType) {
case '0': // 贴子内页获取贴子链接
if (setting.title) textGroup.push(unsafeWindow.PageData.thread.title);
if (setting.author) textGroup.push((setting.with_at ? '@' : '') + unsafeWindow.PageData.thread.author + ' ');
if (setting.link) textGroup.push(linkPath + unsafeWindow.PageData.thread.thread_id);
break;
case '1': // 贴吧首页获取贴子链接
if (setting.title) textGroup.push(parent.getElementsByClassName('j_th_tit')[0].getAttribute('title'));
if (setting.author) textGroup.push((setting.with_at ? '@' : '') + parent.nextElementSibling.getElementsByClassName('j_user_card')[0].textContent + ' ');
if (setting.link) textGroup.push(parent.getElementsByClassName('j_th_tit')[0].href);
break;
case '2': // 贴子内页获取楼层链接
var floorData = JSON.parse(parent.parentElement.parentElement.parentElement.dataset.field);
if (setting.title) textGroup.push(unsafeWindow.PageData.thread.title + ' #' + floorData.content.post_no);
if (setting.author) textGroup.push((setting.with_at ? '@' : '') + floorData.author.user_name + ' ');
if (setting.link) textGroup.push(linkPath + unsafeWindow.PageData.thread.thread_id + '?pid=' + floorData.content.post_id + '#' + floorData.content.post_id);
break;
}
console.log(textGroup);
text = textGroup.join(setting.split);
this.setAttribute('data-link-text', text);
}
GM_setClipboard(text);
if (setting.tips) showTips('以下内容已复制到剪贴板:\n\n' + text);
}
function showTips(text) {
var text = text.replace(/</g, '<').replace(/>/g, '>').replace(/\n/g, '<br>');
var node = document.createElement('div');
node.className = 'tieba-link-tips';
node.innerHTML = text;
document.body.appendChild(node);
setTimeout(function(){
document.body.removeChild(node);
}, setting.tips_time * 1000);
}
function catchLinkTarget(event) {
if (event.animationName !== 'tiebaLinkTarget') return;
var target = event.target;
var classList = target.classList;
var curAnchor = linkAnchor.cloneNode(true);
curAnchor.addEventListener('click', copyLink);
if (classList.contains('threadlist_title')) {
curAnchor.setAttribute('data-anchor-type', '1');
target.insertBefore(curAnchor, target.getElementsByClassName('j_th_tit')[0]);
}
else if (classList.contains('core_title')) {
curAnchor.setAttribute('data-anchor-type', '0');
target.appendChild(curAnchor);
}
else if (classList.contains('core_reply_tail')) {
curAnchor.setAttribute('data-anchor-type', '2');
target.appendChild(curAnchor);
}
}
// 使用 animation 事件,方便处理贴吧 ajax 加载数据
document.addEventListener('animationstart', catchLinkTarget, false);
document.addEventListener('MSAnimationStart', catchLinkTarget, false);
document.addEventListener('webkitAnimationStart', catchLinkTarget, false);
GM_addStyle(`
@-webkit-keyframes tiebaLinkTarget {}
@-moz-keyframes tiebaLinkTarget {}
@keyframes tiebaLinkTarget {}
@-webkit-keyframes tiebaLinkTips {
from {
opacity: 0;
bottom: -75px;
}
20% {
opacity: 1;
bottom: 10px;
}
80% {
opacity: 1;
bottom: 10px;
}
to {
opacity: 0;
bottom: -75px;
}
}
@-moz-keyframes tiebaLinkTips {
from {
opacity: 0;
bottom: -75px;
}
20% {
opacity: 1;
bottom: 10px;
}
80% {
opacity: 1;
bottom: 10px;
}
to {
opacity: 0;
bottom: -75px;
}
}
@keyframes tiebaLinkTips {
from {
opacity: 0;
bottom: -75px;
}
20% {
opacity: 1;
bottom: 10px;
}
80% {
opacity: 1;
bottom: 10px;
}
to {
opacity: 0;
bottom: -75px;
}
}
.tieba-link-anchor {
display: none;
color: #319630 !important;
cursor: pointer;
float: right;
}
.j_thread_list:hover .tieba-link-anchor,
.l_post:hover .tieba-link-anchor,
.core_title:hover .tieba-link-anchor,
.tieba-link-anchor:hover {
display: inline-block;
}
.threadlist_title,
.core_reply_tail,
.core_title {
-webkit-animation: tiebaLinkTarget;
-moz-animation: tiebaLinkTarget;
animation: tiebaLinkTarget;
}
.core_title:hover .core_title_txt {
width: 420px !important;
}
.tieba-link-tips {
background: #ff7f3e;
font-size: 14px;
padding: 10px;
border-radius: 3s;
position: fixed;
right: 10px;
color: #ffffff;
z-index: 99999999;
pointer-events: none;
-webkit-animation: tiebaLinkTips ` + setting.tips_time + `s;
-moz-animation: tiebaLinkTips ` + setting.tips_time + `s;
animation: tiebaLinkTips ` + setting.tips_time + `s;
}
`);