// ==UserScript==
// @name exmail.qq.com_view_plus
// @description 自制邮件聚合模式,吊打会话模式,让脚本改变世界(已支持腾讯企业邮箱)
// @version 1.4
// @namespace https://wanyaxing.com/blog/20190120150811.html
// @author wyx@wanyaxing.com
// @include https://exmail.qq.com/*
// @downloadURL none
// ==/UserScript==
// 腾讯企业邮箱-聚合模式
if (document.getElementById('frm')) {
function selectText(element) {
var selection = window.getSelection();
selection.setBaseAndExtent(element, 0, element, 1);
}
function watchTdTime(_this, tdTime) {
if (!tdTime)
{
var str = _this.innerText;
if (str.indexOf('前')>0) {
var num = parseInt((str.replace(/^(\d+?)[^\d]*$/,'$1'))) * 1000;
if (str.indexOf('分钟前')>0) {
num = num * 60;
} else if (str.indexOf('小时前')>0) {
num = num * 60 * 60;
}
var now = (new Date()).getTime();
tdTime = now - num;
}
}
if (tdTime) {
var time_now = new Date();
var t_over = time_now-tdTime ;
var timelabel,nextTime;
if (t_over>24*60*60000) {
timelabel = (parseInt(t_over/60/60000/24))+'天'+parseInt((t_over-parseInt(t_over/60/60000/24)*60*24*60000)/60/60000)+'小时前';
} else if (t_over>=60*60000) {
timelabel = (parseInt(t_over/60/60000))+'小时前';
} else if (t_over>60000) {
timelabel = parseInt(t_over/60000)+'分钟前';
nextTime = 60000;
}else {
timelabel = parseInt(t_over/1000)+'秒前';
nextTime = 1000;
}
_this.innerHTML = '
'+timelabel+'
';
if (nextTime) {
// console.log(nextTime,_this.innerHTML);
setTimeout(function(){
watchTdTime(_this, tdTime)
},nextTime);
}
}
}
function resetAsStoryLines() {
var graytipNode = document.querySelector('.graytip');
if (graytipNode && graytipNode.innerText.indexOf('会话模式')>=0) {
graytipNode.style.cssText = 'display:none;'
}
// 时间表头迁移
var timeTd = document.querySelector('#frm table').querySelector('tr').lastChild.previousSibling;
timeTd.parentNode.insertBefore(timeTd,timeTd.previousSibling);
var items = {};
document.getElementById('frm').querySelectorAll('.toarea>table').forEach(function(child){
var formNode = child.querySelector('.tl nobr');
var subjectNode = child.querySelector('.gt u');
var descNode = child.querySelector('.txt_hidden>b');
var tagDivNode = child.querySelector('.TagDiv');
var formText = formNode.innerText;
formText = formText.replace(/^[\s::\-]*(.*?)[\s::\-]*$/g,'$1');
// 主题提炼(移除辅助词如转发回复啥的
var subjectText = subjectNode.innerText;
subjectText = subjectText.replace(/(Re|转发|Fw|回复|发信方已撤回邮件)[::]/g,'');
subjectText = subjectText.replace(/(\d+-\d+-\d+|\d+\/\d+\/\d+|\d+月\d+日)/g,'');
subjectText = subjectText.replace(/(【.*?】|「.*?」|\[.*?\]|[\((]\s*?[\))])/g,'');
subjectText = subjectText.replace(/^[\s::\-]*(.*?)[\s::\-]*$/g,'$1');
subjectText = subjectText.replace(/^.{0,4}[::]/g,'');
if (subjectText == '') {
subjectText = subjectNode.innerText;
}
// 简情处理(移除签名信息等)
var descText = descNode.innerText;
descText = descText.replace(/---+.*/g,'');
descText = descText.replace(/原始邮件\s.*/g,'');
descText = descText.replace(/(From|Sender|发件人)[::].*/g,'');
descText = descText.replace(new RegExp('姓名:'+formText + '\\s.*','g'),'');
descText = descText.replace(/在\s\d+年\d+月\d+日,.*?写道.*/g,'');
descText = descText.replace(/\s[a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+(\.[a-zA-Z0-9_-]+)+\s*$/g,'');
descText = descText.replace(/^[\s::\-]*(.*?)[\s::\-]*$/g,'$1');
descNode.innerHTML = descText;
// 新窗口打开
child.querySelector('.ci .cir').style.cssText = 'position: absolute;width: 90%;background: none;';
// 时间栏 前移
var dtNode = child.querySelector('.dt');
dtNode.style.cssText = 'color:gray';
dtNode.parentNode.insertBefore(dtNode,dtNode.previousSibling);
watchTdTime(dtNode);//动态更新时间栏
if (subjectNode.innerText.indexOf('发信方已撤回邮件:')>=0) {
descNode.innerHTML = subjectNode.innerText;
descNode.style.cssText = 'text-decoration: line-through;';
}
if (!items[subjectText]){
subjectNode.innerHTML = subjectText;
child.style.cssText = 'padding-top:36px';
if (tagDivNode.firstChild) {
tagDivNode.insertBefore(subjectNode,tagDivNode.firstChild);
} else {
tagDivNode.appendChild(subjectNode);
}
subjectNode.style.cssText = 'float: right;margin-left: 14px;';
child.ondblclick = function(){
selectText(subjectNode);
return false;
}
tagDivNode.style.cssText = 'position: absolute;left: -250px;bottom: 28px;';
tagDivNode.parentNode.style.cssText = 'position: relative;overflow: visible;pointer-events: none;';
items[subjectText] = child;
} else {
subjectNode.style.cssText = 'display: none;';
tagDivNode.style.cssText = 'display: none;';
items[subjectText].parentNode.insertBefore(child,items[subjectText].nextSibling);
items[subjectText] = child;
}
formNode.style.cssText = 'float: right;color:gray;';
});
// console.log(items);
}
setTimeout(function(){
resetAsStoryLines();
},1);
}