CNKI学位论文搜索学校标记(985211)(华工域名)

CNKI 学校 标记 985 211

您需要先安装一个扩展,例如 篡改猴Greasemonkey暴力猴,之后才能安装此脚本。

您需要先安装一个扩展,例如 篡改猴暴力猴,之后才能安装此脚本。

您需要先安装一个扩展,例如 篡改猴暴力猴,之后才能安装此脚本。

您需要先安装一个扩展,例如 篡改猴Userscripts ,之后才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。

您需要先安装用户脚本管理器扩展后才能安装此脚本。

(我已经安装了用户脚本管理器,让我安装!)

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

(我已经安装了用户样式管理器,让我安装!)

// ==UserScript==
// @name         CNKI学位论文搜索学校标记(985211)(华工域名)
// @namespace    http://tampermonkey.net/
// @version      1.0
// @description  CNKI 学校 标记 985 211
// @author       Kratos
// @match        https://kns-cnki-net-443.webvpn.scut.edu.cn/*
// @icon         https://www.google.com/s2/favicons?sz=64&domain=cnki.net
// @grant        none
// @license MIT
// ==/UserScript==

(function () {
    'use strict';

    function plog(msg) {
        const e = "border-radius: 2px 0 0 2px; background: #004fd9; color: #fff;";
        const t = "color: #004fd9;font-weight: bold;";
        console.log(`%c CNKI_SchoolTag %c ${msg} `, e, t);
    }

    // --- 985 大学列表(完整) ---
    const universities985 = [
        "清华大学", "北京大学", "厦门大学", "南京大学", "复旦大学",
        "天津大学", "浙江大学", "南开大学", "西安交通大学", "东南大学",
        "武汉大学", "上海交通大学", "山东大学", "湖南大学", "中国人民大学",
        "吉林大学", "重庆大学", "电子科技大学", "四川大学", "中山大学",
        "华南理工大学", "兰州大学", "东北大学", "西北工业大学", "哈尔滨工业大学",
        "华中科技大学", "中国海洋大学", "北京理工大学", "大连理工大学", "北京航空航天大学",
        "北京师范大学", "同济大学", "中南大学", "中国科学技术大学",
        "中国农业大学", "国防科学技术大学", "中央民族大学", "华东师范大学", "西北农林科技大学"
    ];

    // --- 211 大学列表(完整) ---
    const universities211 = [
        // 北京(26所)
        "清华大学", "北京大学", "中国人民大学", "北京工业大学", "北京理工大学",
        "北京航空航天大学", "北京化工大学", "北京邮电大学", "对外经济贸易大学",
        "中国传媒大学", "中央民族大学", "中国矿业大学", "中央财经大学",
        "中国政法大学", "中国石油大学", "中央音乐学院", "北京体育大学",
        "北京外国语大学", "北京交通大学", "北京科技大学", "北京林业大学",
        "中国农业大学", "北京中医药大学", "华北电力大学", "北京师范大学",
        "中国地质大学",
        // 上海(9所)
        "复旦大学", "华东师范大学", "上海外国语大学", "上海大学", "同济大学",
        "华东理工大学", "东华大学", "上海财经大学", "上海交通大学",
        // 天津(4所)
        "南开大学", "天津大学", "天津医科大学",
        // 重庆(2所)
        "重庆大学", "西南大学",
        // 河北(1所)
        "华北电力大学(保定)",
        // 山西(1所)
        "太原理工大学",
        // 内蒙古(1所)
        "内蒙古大学",
        // 辽宁(4所)
        "大连理工大学", "东北大学", "辽宁大学", "大连海事大学",
        // 吉林(3所)
        "吉林大学", "东北师范大学", "延边大学",
        // 黑龙江(4所)
        "东北农业大学", "东北林业大学", "哈尔滨工业大学", "哈尔滨工程大学",
        // 江苏(11所)
        "南京大学", "东南大学", "苏州大学", "河海大学", "中国药科大学",
        "中国矿业大学(徐州)", "南京师范大学", "南京理工大学", "南京航空航天大学",
        "江南大学", "南京农业大学",
        // 浙江(1所)
        "浙江大学",
        // 安徽(3所)
        "安徽大学", "合肥工业大学", "中国科学技术大学",
        // 福建(2所)
        "厦门大学", "福州大学",
        // 江西(1所)
        "南昌大学",
        // 山东(3所)
        "山东大学", "中国海洋大学", "中国石油大学(华东)",
        // 河南(1所)
        "郑州大学",
        // 湖北(7所)
        "武汉大学", "华中科技大学", "中国地质大学(武汉)", "华中师范大学",
        "华中农业大学", "中南财经政法大学", "武汉理工大学",
        // 湖南(3所)
        "湖南大学", "中南大学", "湖南师范大学",
        // 广东(4所)
        "中山大学", "暨南大学", "华南理工大学", "华南师范大学",
        // 广西(1所)
        "广西大学",
        // 四川(5所)
        "四川大学", "西南交通大学", "电子科技大学", "西南财经大学", "四川农业大学",
        // 云南(1所)
        "云南大学",
        // 贵州(1所)
        "贵州大学",
        // 陕西(7所)
        "西北大学", "西安交通大学", "西北工业大学", "陕西师范大学",
        "西北农林科技大学", "西安电子科技大学", "长安大学",
        // 甘肃(1所)
        "兰州大学",
        // 新疆(2所)
        "新疆大学", "石河子大学",
        // 海南(1所)
        "海南大学",
        // 宁夏(1所)
        "宁夏大学",
        // 青海(1所)
        "青海大学",
        // 西藏(1所)
        "西藏大学",
        // 军事系统(3所)
        "第二军医大学", "第四军医大学", "国防科学技术大学"
    ];


    function tagUniversity(unitElement) {
        // 检查是否已经添加了标签,避免重复添加
        if (unitElement.querySelector('span.cnki-school-tag')) {
            return;
        }

        // 尝试从单元格中找到链接元素
        const aEle = unitElement.querySelector('a');
        if (!aEle) {
            return;
        }

        // 获取学校名称
        const universityName = aEle.textContent.trim();
        let tagText = '';
        let tagColor = '';

        if (universities985.includes(universityName)) {
            tagText = '985';
            tagColor = '#fe9898'; // 红色系 for 985
        } else if (universities211.includes(universityName)) {
            tagText = '211';
            tagColor = '#98befe'; // 蓝色系 for 211
        } else {
            return; // 不是985也不是211,直接返回
        }

        // 创建并设置标签样式
        const span = document.createElement('span');
        span.textContent = tagText;
        span.className = 'cnki-school-tag';
        span.style.marginLeft = '5px';
        span.style.fontFamily = '"Times New Roman", sans-serif';
        span.style.borderRadius = '9px';
        span.style.whiteSpace = 'nowrap';
        span.style.padding = '1px 7px 1px';
        span.style.fontSize = '12px';
        span.style.color = '#000';
        span.style.background = tagColor;
        span.style.fontWeight = 'bold';

        // 将标签添加到链接元素后面
        aEle.appendChild(span);
        // plog(`已标记学校: ${universityName} 为 ${tagText}`);
    }


    function processResults() {
        // 优先尝试新版 CNKI 列表结构(来自您的第一张截图)
        const unitsNew = document.querySelectorAll('table.data-table tbody tr td:nth-child(4)');
        if (unitsNew.length > 0) {
            // plog(`新版结构: 发现 ${unitsNew.length} 个结果,开始标记...`);
            unitsNew.forEach(tagUniversity);
            return;
        }

        // 其次尝试旧版 CNKI/特定视图结构(来自您的 XPath 提示)
        // CNKI学位论文结果列表的学校/机构字段通常在 class="unit" 的 <td> 中,
        // 或者像您提示的那样,通过 #gridTable 里面的第4个 td 找到链接。
        const unitsOld = document.querySelectorAll('#gridTable td:nth-child(4)');

        if (unitsOld.length > 0) {
            // plog(`旧版结构: 发现 ${unitsOld.length} 个结果,开始标记...`);
            unitsOld.forEach(tagUniversity);
            return;
        }

        // 最后尝试原先经典的选择器(可能也匹配某些子页面)
        const unitsClassic = document.querySelectorAll('table.result-table-list tbody tr td.unit');
         if (unitsClassic.length > 0) {
            // plog(`经典结构: 发现 ${unitsClassic.length} 个结果,开始标记...`);
            unitsClassic.forEach(tagUniversity);
            return;
        }

        // plog('未找到任何匹配的学校元素。');
    }


    // 创建一个 MutationObserver 实例,用于监听分页和排序导致的DOM更新
    const observer = new MutationObserver((mutationsList, observer) => {
        // 在新版CNKI中,DOM变化后通常需要稍等片刻让数据完全加载
        setTimeout(processResults, 100);
    });

    // 等待最有可能的搜索结果容器加载完成
    function waitForResultContainer() {
        // 兼容新版 (.result-list-box) 和旧版 (#ModuleSearchResult / #gridTable)
        const resultContainer = document.querySelector('.result-list-box') ||
                                document.querySelector('#ModuleSearchResult') ||
                                document.querySelector('#gridTable');

        if (resultContainer) {
            plog('结果列表容器已找到,启动观察器。');

            // 首次加载页面时先执行一次标记
            processResults();

            // 配置观察选项: 观察子节点变化和深层子树 (用于捕获分页/排序)
            const config = {
                childList: true,
                subtree: true,
                attributes: false,
                characterData: false
            };

            // 开始观察
            observer.observe(resultContainer, config);

        } else {
            // 如果元素还没有加载,等待500ms后再次检查
            setTimeout(waitForResultContainer, 500);
        }
    }

    // 启动监控流程
    if (document.readyState === 'loading') {
        window.addEventListener('DOMContentLoaded', waitForResultContainer);
    } else {
        waitForResultContainer();
    }

    // 页面卸载时清理
    window.addEventListener('unload', () => observer.disconnect());
})();