// ==UserScript==
// @name dblp.org CCF等级标注
// @namespace https://github.com/symant233/PublicTools
// @icon https://dblp.uni-trier.de/img/favicon.ico
// @match https://dblp.uni-trier.de/*
// @match https://dblp.org/*
// @match https://dblp.dagstuhl.de/*
// @grant GM_addStyle
// @run-at document-end
// @version 2.1.6
// @author symant233
// @description 学术会议、学术期刊 CCF等级标注
// @homepageURL https://github.com/symant233/PublicTools
// @supportURL https://github.com/symant233/PublicTools/issues
// @license GPL-3.0
// ==/UserScript==
;(function() {
'use strict';
console.log('CCF等级标注已载入...');
const COLORS = ['mistyrose', 'oldlace', 'honeydew']; // ABC
if (localStorage.getItem('showOthers') === null) localStorage.setItem('showOthers', 'true');
let showOthers = localStorage.getItem('showOthers') === 'false' ? false : true; // 是否显示非CCF的论文 默认显示
// 学术会议开始
const CCFA = [
"conf/cscw/",
"conf/chi/",
"conf/sigmod/",
"conf/kdd/",
"conf/icde/",
"conf/sigir/",
"conf/vldb/",
"conf/ppopp/",
"conf/fast/",
"conf/dac/",
"conf/hpca/",
"conf/micro/",
"conf/sc/",
"conf/asplos/",
"conf/isca/",
"conf/usenix/",
"conf/sigcomm/",
"conf/mobicom/",
"conf/infocom/",
"conf/nsdi/",
"conf/ccs/",
"conf/eurocrypt/",
"conf/sp/",
"conf/crypto/",
"conf/uss/",
"conf/pldi/",
"conf/popl/",
"conf/sigsoft/",
"conf/sosp/",
"conf/oopsla/",
"conf/kbse/",
"conf/icse/",
"conf/issta/",
"conf/osdi/",
"conf/pldi/",
"conf/popl/",
"conf/sigsoft/",
"conf/sosp/",
"conf/oopsla/",
"conf/kbse/",
"conf/icse/",
"conf/issta/",
"conf/osdi/",
"conf/stoc/",
"conf/soda/",
"conf/cav/",
"conf/focs/",
"conf/lics/",
"conf/mm/",
"conf/siggraph/",
"conf/vr/",
"conf/visualization/",
"conf/aaai/",
"conf/nips/",
"conf/acl/",
"conf/cvpr/",
"conf/iccv/",
"conf/icml/",
"conf/ijcai/",
"conf/aaai/",
"conf/nips/",
"conf/acl/",
"conf/cvpr/",
"conf/iccv/",
"conf/icml/",
"conf/ijcai/",
"conf/www/",
"conf/rtss/"
];
const CCFB = [
"conf/cikm/",
"conf/wsdm/",
"conf/pods/",
"conf/dasfaa/",
"conf/ecml/",
"conf/pkdd/",
"conf/semweb/",
"conf/icdm/",
"conf/icdt/",
"conf/edbt/",
"conf/cidr/",
"conf/sdm/",
"conf/cloud/",
"conf/spaa/",
"conf/podc/",
"conf/fpga/",
"conf/cgo/",
"conf/date/",
"conf/eurosys/",
"conf/cluster/",
"conf/iccd/",
"conf/iccad/",
"conf/icdcs/",
"conf/codes/",
"conf/hipeac/",
"conf/sigmetrics/",
"conf/IEEEpact/",
"conf/icpp/",
"conf/ics/",
"conf/vee/",
"conf/ipps/",
"conf/performance/",
"conf/hpdc/",
"conf/itc/",
"conf/lisa/",
"conf/mss/",
"conf/rtas/",
"conf/sensys/",
"conf/conext/",
"conf/secon/",
"conf/ipsn/",
"conf/mobisys/",
"conf/icnp/",
"conf/mobihoc/",
"conf/nossdav/",
"conf/iwqos/",
"conf/imc/",
"conf/acsac/",
"conf/asiacrypt/",
"conf/esorics/",
"conf/fse/",
"conf/csfw/",
"conf/srds/",
"conf/ches/",
"conf/dsn/",
"conf/raid/",
"conf/pkc/",
"conf/ndss/",
"conf/tcc/",
"conf/ecoop/",
"conf/etaps/",
"conf/iwpc/",
"conf/re/",
"conf/caise/",
"conf/icfp/",
"conf/lctrts/",
"conf/models/",
"conf/cp/",
"conf/icsoc/",
"conf/wcre/",
"conf/icsm/",
"conf/vmcai/",
"conf/icws/",
"conf/middleware/",
"conf/sas/",
"conf/esem/",
"conf/fm/",
"conf/issre/",
"conf/hotos/",
"conf/ecoop/",
"conf/etaps/",
"conf/iwpc/",
"conf/re/",
"conf/caise/",
"conf/icfp/",
"conf/lctrts/",
"conf/models/",
"conf/cp/",
"conf/icsoc/",
"conf/wcre/",
"conf/icsm/",
"conf/vmcai/",
"conf/icws/",
"conf/middleware/",
"conf/sas/",
"conf/esem/",
"conf/fm/",
"conf/issre/",
"conf/hotos/",
"conf/compgeom/",
"conf/esa/",
"conf/coco/",
"conf/icalp/",
"conf/cade/",
"conf/concur/",
"conf/hybrid/",
"conf/sat/",
"conf/mir/",
"conf/si3d/",
"conf/sca/",
"conf/dcc/",
"conf/eurographics/",
"conf/vissym/",
"conf/sgp/",
"conf/rt/",
"conf/icassp/",
"conf/icmcs/",
"conf/ismar/",
"conf/pg/",
"conf/sma/",
"conf/colt/",
"conf/emnlp/",
"conf/ecai/",
"conf/eccv/",
"conf/icra/",
"conf/aips/",
"conf/iccbr/",
"conf/coling/",
"conf/kr/",
"conf/uai/",
"conf/atal/",
"conf/ppsn/",
"conf/group/",
"conf/iui/",
"conf/tabletop/",
"conf/uist/",
"conf/ecscw/",
"conf/percom/",
"conf/mhci/",
"conf/cogsci/",
"conf/bibm/",
"conf/emsoft/",
"conf/recomb/",
"conf/par/"
];
const CCFC = [
"conf/ACMdis/",
"conf/assets/",
"conf/conll/",
"conf/cf/",
"conf/nocs/",
"conf/asap/",
"conf/aspdac/",
"conf/systor/",
"conf/europar/",
"conf/ets/",
"conf/fpl/",
"conf/fccm/",
"conf/glvlsi/",
"conf/ats/",
"conf/hpcc/",
"conf/hipc/",
"conf/mascots/",
"conf/ispa/",
"conf/ccgrid/",
"conf/npc/",
"conf/ica3pp/",
"conf/cases/",
"conf/fpt/",
"conf/icpads/",
"conf/iscas/",
"conf/islped/",
"conf/ispd/",
"conf/hoti/",
"conf/vts/",
"conf/ancs/",
"conf/apnoms/",
"conf/forte/",
"conf/lcn/",
"conf/globecom/",
"conf/icc/",
"conf/icccn/",
"conf/mass/",
"conf/p2p/",
"conf/ipccc/",
"conf/wowmom/",
"conf/iscc/",
"conf/wcnc/",
"conf/networking/",
"conf/im/",
"conf/msn/",
"conf/mswim/",
"conf/wasa/",
"conf/hotnets/",
"conf/wisec/",
"conf/sacmat/",
"conf/drm/",
"conf/ih/",
"conf/acns/",
"conf/ccs/",
"conf/acisp/",
"conf/ctrsa/",
"conf/dimva/",
"conf/dfrws/",
"conf/fc/",
"conf/trustcom/",
"conf/sec/",
"conf/securecomm/",
"conf/isw/",
"conf/icdf2c/",
"conf/icics/",
"conf/nspw/",
"conf/pam/",
"conf/pet/",
"conf/sacrypt/",
"conf/soups/",
"conf/pepm/",
"conf/paste/",
"conf/aplas/",
"conf/apsec/",
"conf/ease/",
"conf/iceccs/",
"conf/icst/",
"conf/ispass/",
"conf/scam/",
"conf/compsac/",
"conf/icfem/",
"conf/tools/",
"conf/qsic/",
"conf/IEEEscc/",
"conf/ispw/",
"conf/seke/",
"conf/icsr/",
"conf/icwe/",
"conf/spin/",
"conf/atva/",
"conf/lopstr/",
"conf/tase/",
"conf/msr/",
"conf/refsq/",
"conf/wicsa/",
"conf/apweb/",
"conf/dexa/",
"conf/ecir/",
"conf/esws/",
"conf/webdb/",
"conf/er/",
"conf/mdm/",
"conf/ssdbm/",
"conf/waim/",
"conf/ssd/",
"conf/pakdd/",
"conf/wise/",
"conf/csl/",
"conf/fmcad/",
"conf/fsttcs/",
"conf/dsaa/",
"conf/ictac/",
"conf/ipco/",
"conf/rta/",
"conf/isaac/",
"conf/mfcs/",
"conf/stacs/",
"conf/vrst/",
"conf/ca/",
"conf/cgi/",
"conf/interspeech/",
"conf/gmp/",
"conf/apvis/",
"conf/3dim/",
"conf/cadgraphics/",
"conf/icip/",
"conf/mmm/",
"conf/pcm/",
"conf/smi/",
"conf/aistats/",
"conf/accv/",
"conf/acml/",
"conf/bmvc/",
"conf/nlpcc/",
"conf/gecco/",
"conf/ictai/",
"conf/iros/",
"conf/alt/",
"conf/icann/",
"conf/fgr/",
"conf/icdar/",
"conf/ilp/",
"conf/ksem/",
"conf/iconip/",
"conf/icpr/",
"conf/icb/",
"conf/ijcnn/",
"conf/pricai/",
"conf/naacl/",
"conf/icmi/",
"conf/graphicsinterface/",
"conf/uic/",
"conf/haptics/",
"conf/interact/",
"conf/acmidc/",
"conf/cscwd/",
"conf/coopis/",
"conf/mobiquitous/",
"conf/avi/",
"conf/amia/",
"conf/apbc/",
"conf/bigdataconf/",
"conf/IEEEcloud/",
"conf/smc/",
"conf/cosit/",
"conf/isbra/"
];
// 学术期刊开始
const JCCFA = [
"journals/tocs/",
"journals/tos/",
"journals/tcad/",
"journals/tc/",
"journals/tpds/",
"journals/jsac/",
"journals/tmc/",
"journals/ton/",
"journals/tdsc/",
"journals/tifs/",
"journals/joc/",
"journals/toplas/",
"journals/tosem/",
"journals/tse/",
"journals/tods/",
"journals/tois/",
"journals/tkde/",
"journals/vldb/",
"journals/tit/",
"journals/iandc/",
"journals/siamcomp/",
"journals/tog/",
"journals/tip/",
"journals/tvcg/",
"journals/ai/",
"journals/pami/",
"journals/ijcv/",
"journals/jmlr/",
"journals/jacm/",
"journals/pieee/"
];
const JCCFB = [
"journals/taco/",
"journals/taas/",
"journals/todaes/",
"journals/tecs/",
"journals/trets/",
"journals/tvlsi/",
"journals/jpdc/",
"journals/jsa/",
"journals/toit/",
"journals/tomccap/",
"journals/tosn/",
"journals/cn/",
"journals/tcom/",
"journals/twc/",
"journals/tissec/",
"journals/compsec/",
"journals/dcc/",
"journals/jcs/",
"journals/ase/",
"journals/ese/",
"journals/tsc/",
"journals/iet-sen/",
"journals/infsof/",
"journals/jfp/",
"journals/smr/",
"journals/jss/",
"journals/re/",
"journals/scp/",
"journals/sosym/",
"journals/stvr/",
"journals/spe/",
"journals/tkdd/",
"journals/tweb/",
"journals/aei/",
"journals/dke/",
"journals/datamine/",
"journals/ejis/",
"journals/geoinformatica/",
"journals/ipm/",
"journals/isci/",
"journals/is/",
"journals/jasis/",
"journals/ws/",
"journals/kais/",
"journals/talg/",
"journals/tocl/",
"journals/toms/",
"journals/algorithmica/",
"journals/cc/",
"journals/fac/",
"journals/fmsd/",
"journals/informs/",
"journals/jcss/",
"journals/jgo/",
"journals/jsc/",
"journals/mscs/",
"journals/tcs/",
"journals/tomccap/",
"journals/cagd/",
"journals/cgf/",
"journals/cad/",
"journals/cvgip/",
"journals/tcsv/",
"journals/tmm/",
"journals/siamis/",
"journals/speech/",
"journals/tap/",
"journals/tslp/",
"journals/aamas/",
"journals/coling/",
"journals/cviu/",
"journals/dke/",
"journals/ec/",
"journals/taffco/",
"journals/taslp/",
"journals/tcyb/",
"journals/tec/",
"journals/tfs/",
"journals/tnn/",
"journals/ijar/",
"journals/jair/",
"journals/jar/",
"journals/ml/",
"journals/neco/",
"journals/nn/",
"journals/bioinformatics/",
"journals/bib/",
"journals/tase/",
"journals/tgrs/",
"journals/tits/",
"journals/tmi/",
"journals/trob/",
"journals/tcbb/",
"journals/jcst/",
"journals/jamia/",
"journals/ploscb/",
"journals/chinaf/",
"journals/cj/",
"journals/wwwj/"
];
const JCCFC = [
"journals/iet-its/",
"journals/jetc/",
"journals/concurrency/",
"journals/dc/",
"journals/fgcs/",
"journals/tcc/",
"journals/integration/",
"journals/grid/",
"journals/mam/",
"journals/rts/",
"journals/tjs/",
"journals/adhoc/",
"journals/comcom/",
"journals/tnsm/",
"journals/iet-com/",
"journals/jnca/",
"journals/monet/",
"journals/networks/",
"journals/ppna/",
"journals/wicomm/",
"journals/winet/",
"journals/ejisec/",
"journals/iet-ifs/",
"journals/imcs/",
"journals/ijics/",
"journals/ijisp/",
"journals/istr/",
"journals/scn/",
"journals/cl/",
"journals/ijseke/",
"journals/sttt/",
"journals/jlp/",
"journals/jwe/",
"journals/soca/",
"journals/sqj/",
"journals/tplp/",
"journals/dpd/",
"journals/iam/",
"journals/ipl/",
"journals/ir/",
"journals/ijcis/",
"journals/gis/",
"journals/ijis/",
"journals/ijkm/",
"journals/ijswis/",
"journals/jcis/",
"journals/jdm/",
"journals/jiis/",
"journals/jsis/",
"journals/acta/",
"journals/apal/",
"journals/dam/",
"journals/fuin/",
"journals/lisp/",
"journals/ipl/",
"journals/jc/",
"journals/logcom/",
"journals/jsyml/",
"journals/lmcs/",
"journals/siamdm/",
"journals/mst/",
"journals/comgeo/",
"journals/cg/",
"journals/dcg/",
"journals/spl/",
"journals/iet-ipr/",
"journals/jvcir/",
"journals/mms/",
"journals/mta/",
"journals/sigpro/",
"journals/spic/",
"journals/vc/",
"journals/talip/",
"journals/apin/",
"journals/artmed/",
"journals/alife/",
"journals/ci/",
"journals/csl/",
"journals/connection/",
"journals/dss/",
"journals/eaai/",
"journals/es/",
"journals/eswa/",
"journals/fss/",
"journals/tciaig/",
"journals/ivc/",
"journals/ida/",
"journals/ijcia/",
"journals/ijis/",
"journals/ijns/",
"journals/ijprai/",
"journals/ijufks/",
"journals/ijdar/",
"journals/jetai/",
"journals/kbs/",
"journals/mt/",
"journals/mva/",
"journals/nc/",
"journals/nle/",
"journals/nca/",
"journals/npl/",
"journals/ijon/",
"journals/paa/",
"journals/prl/",
"journals/soco/",
"journals/wias/",
"journals/bmcbi/",
"journals/cas/",
"journals/fcsc/",
"journals/lgrs/",
"journals/titb/",
"journals/tbd/",
"journals/jbi/",
"journals/mia/"
];
const reg = /(conf|journals)\/.*\//i;
// 遍历标记函数
function tagging() {
const nodes = document.querySelectorAll('.publ-list > li[class*="entry"]');
nodes.forEach((n) => {
if (!n.style.background || (!showOthers && n.style.display != "none") || (showOthers && n.style.display == "none")) { // 若已有背景颜色or不看其余论文且没被设为不显示,则不修改
let s = reg.exec(n.id);
if (s && s[0].startsWith('conf')) {
if (CCFA.indexOf(s[0]) !== -1) n.style.background = COLORS[0];
else if (CCFB.indexOf(s[0]) !== -1) n.style.background = COLORS[1];
else if (CCFC.indexOf(s[0]) !== -1) n.style.background = COLORS[2];
else {
n.style.background = "rgb(255 255 255 / 0%)";
if (!showOthers) {n.style.display = "none";}
else {n.style.display = "table";}
}
} else if (s) { // starts with journals
if (JCCFA.indexOf(s[0]) !== -1) n.style.background = COLORS[0];
else if (JCCFB.indexOf(s[0]) !== -1) n.style.background = COLORS[1];
else if (JCCFC.indexOf(s[0]) !== -1) n.style.background = COLORS[2];
else {
n.style.background = "rgb(255 255 255 / 0%)";
if (!showOthers) {n.style.display = "none";}
else {n.style.display = "table";}
}
}
// 根据DOI一键跳转到sci-hub
try{
let doi = n.getElementsByTagName('a')[0]
if (!doi.href.startsWith('https://sci')) {
doi.href = 'https://sci-hub.ru/' + doi.href.replace(/^.+doi\.org\//i,'');
}
}catch(e){}
}
})
}
// 选择需要观察变动的节点
const targetNode = document.querySelector('#main');
const config = { attributes: false, childList: true, subtree: true };
// 当观察到变动时执行的回调函数
const callback = function(mutationsList, observer) {
console.log('mutations length:', mutationsList.length);
tagging();
};
tagging();
// 创建一个观察器实例并传入回调函数
const observer = new MutationObserver(callback);
// 以上述配置开始观察目标节点
observer.observe(targetNode, config);
// 把图标背景换成透明的
GM_addStyle(`
.drop-down>.head {
background: rgba(0,0,0,0) !important;
border: 2px rgba(0,0,0, 0) solid !important;
}
.display-none{
display: block !important;
}
`);
// head 中添加 <base target="_blank"> 默认新标签页打开链接
const b = document.createElement('base');
b.setAttribute('target', '_blank');
document.querySelector('head').appendChild(b);
// switch CCF display
document.toogleCCF = function() {
showOthers = !showOthers;
localStorage.setItem('showOthers', showOthers);
tagging();
}
$(`<div class="refine-by">
<p><b>refined by CCF</b></p>
<ul class="options">
<li style="background-color:powderblue;"><button class="text" onclick="toogleCCF()">switch</button></li>
</ul></div>
`).prependTo("#completesearch-facets > div.hide-body");
})();