DMM番号展示

在标题下方增加展示番号车牌,便于资源搜索

目前为 2025-01-31 提交的版本。查看 最新版本

// ==UserScript==
// @name         DMM番号展示
// @namespace    https://github.com/candymagicshow/dmm_bangou_shower
// @version      3.3
// @license      GPL License
// @description  在标题下方增加展示番号车牌,便于资源搜索
// @author       candymagic
// @include      https://*.dmm.co.*/*
// @icon         https://www.google.com/s2/favicons?sz=64&domain=dmm.co.jp
// @grant        none
// @run-at       document-end
// ==/UserScript==

(function() {
    'use strict';

    // 容器样式配置
    const containerStyle = {
        position: 'relative',
        display: 'block',
        marginTop: '4px' // 与标题的间距
    };

    // CID样式配置
    const cidStyle = {
        display: 'inline-block',
        color: '#d32f2f',
        fontSize: '11px',
        fontWeight: 'bold',
        padding: '2px 8px',
        backgroundColor: '#ffebee',
        borderRadius: '4px',
        border: '1px solid #ffcdd2',
        marginTop: '4px',
        boxShadow: '0 2px 4px rgba(0,0,0,0.1)'
    };

    // CID处理模块
    const processCID = {
        // 通用CID提取
        extract: (url) => {
            const cidMatch = url.match(/\/(?:cid=|cid\/)([^\/?]+)/i);
            return cidMatch ? cidMatch[1] : null;
        },

        // 智能格式化
        format: (rawCID) => {
            const match = rawCID.match(/.*?([a-z]+)(\d+)$/i);
            if (!match) return rawCID;

            const letters = match[1].toUpperCase();
            let numbers = match[2].replace(/^0+/, ''); // 去除前导零

            // 处理全零的特殊情况
            if (numbers === '') numbers = '0';

            // 短编号补零逻辑
            numbers = numbers.padStart(3, '0');
            // 但保留超过3位的长编号
            numbers = numbers.length > 3 ? numbers.replace(/^0+/, '') : numbers;

            return `${letters}-${numbers}`;
        },

        // 创建展示元素
        createElement: (cid) => {
            const badge = document.createElement('div');
            badge.textContent = cid;
            Object.assign(badge.style, cidStyle);
            return badge;
        }
    };

    // 定位插入点
    const findParentContainer = (target) => {
        let parent = target;
        while (parent.parentElement) {
            if (parent.getAttribute('data-e2eid')) {
                return parent.parentElement;
            }
            parent = parent.parentElement;
        }
        return target.closest('.c-item') || target.parentElement;
    };

    // 主处理逻辑
    const processTitles = () => {
        document.querySelectorAll('a[href*="/cid="]:not([data-cid-v3])').forEach(link => {
            // 如果链接包含data-e2eid="title",则跳过该链接
            if (link.hasAttribute('data-e2eid') && link.getAttribute('data-e2eid') === 'title') {
                return;
            }

            const rawCID = processCID.extract(link.href);
            if (!rawCID) return;

            // 格式化CID
            const formattedCID = processCID.format(rawCID);

            // 获取商品项父容器
            const container = findParentContainer(link);

            // 创建专用容器
            const cidElement = processCID.createElement(formattedCID);

            // 插入到商品容器末尾
            container.appendChild(cidElement);

            // 修改所有.product-items_package元素的高度样式
            const packageElements = document.querySelectorAll('.product-items_package');
            packageElements.forEach(packageElement => {
                //添加 height: 400px
                packageElement.style.height = '400px';
            });

            // 标记处理状态
            link.dataset.cidV3 = 'processed';
        });
    };

    // DOM监听优化
    const observer = new MutationObserver(mutations => {
        mutations.forEach(mutation => {
            if (mutation.addedNodes.length) {
                requestAnimationFrame(processTitles);
            }
        });
    });

    observer.observe(document, {
        childList: true,
        subtree: true,
        attributes: false
    });

    // 初始化执行
    processTitles();
})();