组卷网-组卷中心一键清理

[2024.12.01]删除影响阅读的不必要元素,微调样式以方便观看,增加设置功能,能够设置是否保留试卷标题、大题、大题留白高度

// ==UserScript==
// @name         组卷网-组卷中心一键清理
// @namespace    http://tampermonkey.net/
// @version      0.30
// @description  [2024.12.01]删除影响阅读的不必要元素,微调样式以方便观看,增加设置功能,能够设置是否保留试卷标题、大题、大题留白高度
// @author       TheOneAdonis
// @match        https://zujuan.xkw.com/zujuan
// @grant        GM_setValue
// @grant        GM_getValue
// @license      MIT
// ==/UserScript==

(function() {
    'use strict';

    let globalSpecialQuestions = {};

    // 默认设置
    const defaultSettings = {
        preservePaperName: false,
        preserveQuestionTitles: false,
        specialQuestionPadding: 120
    };

    // 获取用户设置
    function getSettings() {
        return {
            preservePaperName: GM_getValue('preservePaperName', defaultSettings.preservePaperName),
            preserveQuestionTitles: GM_getValue('preserveQuestionTitles', defaultSettings.preserveQuestionTitles),
            specialQuestionPadding: GM_getValue('specialQuestionPadding', defaultSettings.specialQuestionPadding)
        };
    }

    // 保存用户设置
    function saveSettings(settings) {
        GM_setValue('preservePaperName', settings.preservePaperName);
        GM_setValue('preserveQuestionTitles', settings.preserveQuestionTitles);
        GM_setValue('specialQuestionPadding', settings.specialQuestionPadding);
    }

    // 重置设置
    function resetSettings() {
        saveSettings(defaultSettings);
        return defaultSettings;
    }

    // 记录需要留空的题目
    const recordSpecialQuestions = () => {
        const specialTypes = [
            '简答题', '材料题', '综合题', '解答题',
            '辨析题', '计算题', '情境探究题', '分析说明题'
        ];

        const specialQuestions = {};

        const quesTypeElements = document.querySelectorAll('.ques-type');

        quesTypeElements.forEach(element => {
            const typeName = element.getAttribute('name');

            if (specialTypes.includes(typeName)) {
                if (!specialQuestions[typeName]) {
                    specialQuestions[typeName] = [];
                }

                const questionBody = element.querySelector('.questype-body');
                if (questionBody) {
                    const questions = questionBody.querySelectorAll('.ques-item');

                    questions.forEach((question, index) => {
                        const questionNumberElement = question.querySelector('.quesindex');
                        const questionNumber = questionNumberElement
                            ? questionNumberElement.textContent.trim()
                            : `未知题号 ${index + 1}`;

                        specialQuestions[typeName].push({
                            questionNumber: questionNumber,
                            index: index + 1,
                            element: question,
                            text: question.textContent.trim()
                        });
                    });
                }
            }
        });

        globalSpecialQuestions = specialQuestions;
        console.log('特殊题目记录:', specialQuestions);

        return specialQuestions;
    };

    // 创建设置模态框
        function createSettingsModal() {
        const modal = document.createElement('div');
        modal.style.cssText = `
            position: fixed;
            top: 50%;
            left: 50%;
            transform: translate(-50%, -50%);
            width: 500px;
            background: white;
            border-radius: 10px;
            box-shadow: 0 0 5px gray;
            border: 2px solid blue;
            padding: 20px;
            z-index: 2000;
            display: none;
        `;

        const settings = getSettings();

        modal.innerHTML = `
            <h2 style="text-align: center; margin-bottom: 20px;">页面清理设置</h2>

            <div style="display: flex; justify-content: space-between; align-items: center; margin-bottom: 15px;">
                <label>保留试卷名</label>
                <input type="checkbox" id="preservePaperName"
                    ${settings.preservePaperName ? 'checked' : ''}>
            </div>

            <div style="display: flex; justify-content: space-between; align-items: center; margin-bottom: 15px;">
                <label>保留题型</label>
                <input type="checkbox" id="preserveQuestionTitles"
                    ${settings.preserveQuestionTitles ? 'checked' : ''}>
            </div>

            <div style="margin-bottom: 15px;">
                <label>大题留白高度:</label>
                <input type="range" id="specialQuestionPadding"
                    min="60" max="240" step="10"
                    value="${settings.specialQuestionPadding}">
                    <span id="paddingValue">${settings.specialQuestionPadding}px</span>
            </div>

            <div style="display: flex; justify-content: space-between;">
                <button id="saveSettings">保存</button>
                <button id="resetSettings">重置默认</button>
                <button id="closeSettings">取消</button>
            </div>
        `;
        document.body.appendChild(modal);

        // 实时更新留白高度显示
        const paddingSlider = modal.querySelector('#specialQuestionPadding');
        const paddingValue = modal.querySelector('#paddingValue');
        paddingSlider.addEventListener('input', (e) => {
            paddingValue.textContent = `${e.target.value}px`;
        });

        return modal;
    }



    // 页面加载完成后立即记录
    window.addEventListener('load', () => {
        recordSpecialQuestions();

        // 清理按钮
        const cleanButton = document.createElement('button');
        cleanButton.textContent = '清理';
        cleanButton.style.cssText = `
            position: fixed; right: 60px; top: 10px; z-index: 1000;
            padding: 10px; background-color: #2877ff;
            color: white; border: none; border-radius: 5px;
            cursor: pointer; margin-right: 10px;
        `;

        // 设置按钮
        const settingsButton = document.createElement('button');
        settingsButton.innerHTML = '⚙️';
        settingsButton.style.cssText = `
            position: fixed; right: 10px; top: 10px; z-index: 1000;
            padding: 10px; background-color: #f0f0f0;
            border: 1px solid #ccc; border-radius: 5px;
            cursor: pointer;
        `;

        const settingsModal = createSettingsModal();

        // 清理按钮事件
        cleanButton.addEventListener('click', function() {
            const settings = getSettings();

            // 删除元素列表
            const elementsToDelete = [
                'body > header',
                'body > div.bread-nav',
                'body > div.fiexd-nav',
                'body > main > aside',
                'body > main > article > div.seal-line',
                'body > main > article > div.paper-main > div.paper-body > div:nth-child(1) > div.part-head',
                '#part-head-box2',
                'body > main > article > div.paper-main > div.deleted-box',
                'body > div.footer',
                '#pui_studentinput',
                document.querySelector("#pui_studentinput") // 新增的元素选择器
            ];

            // 删除指定的元素
            elementsToDelete.forEach(selector => {
                if (typeof selector === 'string') {
                    const element = document.querySelector(selector);
                    if (element) element.remove();
                }
            });

            // 控制试卷名和标题
            if (!settings.preservePaperName) {
                const paperHead = document.querySelector('body > main > article > div.paper-main > div.paper-head');
                if (paperHead) paperHead.remove();
            }

            if (!settings.preserveQuestionTitles) {
                const questypeHeads = document.querySelectorAll('.questype-head');
                questypeHeads.forEach(element => element.remove());
            }

            // 为部分题型添加底部空白
            Object.values(globalSpecialQuestions).forEach(typeQuestions => {
                typeQuestions.forEach(question => {
                    question.element.style.paddingBottom = `${settings.specialQuestionPadding}px`;
                });
            });

            // 设置字体大小和页面样式
            document.querySelectorAll('*').forEach(el => {
                // 查找试卷标题
                const excludeElement = document.querySelector(
                    'body > main > article > div > div.paper-head > div.paper-title > #pui_maintitle'
                );

                // 跳过试卷标题
                if (el === excludeElement) {
                    return;
                }

                // 设置字体大小为 14px
                el.style.fontSize = '14px';

                // 如果当前元素不是 <body> 下的 <main> 元素,则设置外边距为 0px
                if (el !== document.querySelector('body > main')) {
                    el.style.margin = '0px';
                }
            });



            const paperCnt = document.querySelector('.paper-cnt.clearfix');
            if (paperCnt) paperCnt.style.maxWidth = '100%';

            const quesItems = document.querySelectorAll('.ques-item');
            quesItems.forEach(item => {
                item.style.paddingTop = '0';
                if (!item.style.paddingBottom || item.style.paddingBottom === '') {
                    item.style.paddingBottom = '0';
                }
            });

            // 清理按钮和设置按钮都消失
            cleanButton.remove();
            settingsButton.remove();
        });

        // 设置按钮事件
        settingsButton.addEventListener('click', () => {
            settingsModal.style.display = 'block';
        });

        // 保存设置
        settingsModal.querySelector('#saveSettings').addEventListener('click', () => {
            const newSettings = {
                preservePaperName: document.getElementById('preservePaperName').checked,
                preserveQuestionTitles: document.getElementById('preserveQuestionTitles').checked,
                specialQuestionPadding: parseInt(document.getElementById('specialQuestionPadding').value)
            };
            saveSettings(newSettings);
            settingsModal.style.display = 'none';
        });

        // 重置设置
        settingsModal.querySelector('#resetSettings').addEventListener('click', () => {
            settingsModal.style.display = 'none';
            const resetSettings = resetSettings();
            document.getElementById('preservePaperName').checked = resetSettings.preservePaperName;
            document.getElementById('preserveQuestionTitles').checked = resetSettings.preserveQuestionTitles;
            document.getElementById('specialQuestionPadding').value = resetSettings.specialQuestionPadding;
        });

        // 关闭设置框
        settingsModal.querySelector('#closeSettings').addEventListener('click', () => {
            settingsModal.style.display = 'none';
        });

        document.body.appendChild(cleanButton);
        document.body.appendChild(settingsButton);
    });
})();