Sleazy Fork is available in English.

filterSuperfluousOnDMM

DMM・FANZAの通販商品一覧からアウトレット、限定版、および BOD/DOD を除去

Tính đến 20-08-2020. Xem phiên bản mới nhất.

/* jshint esversion: 6 */
// ==UserScript==
// @name         filterSuperfluousOnDMM
// @namespace    https://greasyfork.org/ja/users/289387-unagionunagi
// @version      1.0.1
// @description  DMM・FANZAの通販商品一覧からアウトレット、限定版、および BOD/DOD を除去
// @author       unagiOnUnagi
// @include      /^https?://\w+\.dmm\.co(m|\.jp)/mono/(\w+/)?-/(list|search)/.*/
// @grant        GM_setValue
// @grant        GM_getValue
// @license      GPL-2.0-or-later
// ==/UserScript==

function resolvePropVal(isChecked) {
    // display プロパティ値を決定
    if (isChecked) return 'none';
    return document.URL.includes('/view=text/') ? 'table-row' : 'list-item';
}

function addStyleSheet() {
    // カスタムスタイルシートの作成
    let styleEl = document.createElement('style');
    styleEl.setAttribute('id', 'unagionunagi-filtersuperfluousondmm-css');
    document.head.appendChild(styleEl);

    let styleSheet = styleEl.sheet;

    //  .superfluous {display: none} を追加
    let value = resolvePropVal(GM_getValue('checked', true));
    styleSheet.insertRule(`.superfluous {display: ${value}}`, 0);

    return styleEl;
}

function blinkLabel(styleEl) {
    // 全作品フィルター時のラベルを点滅
    let styleSheet = styleEl.sheet;
    styleSheet.insertRule(
        '#unagionunagi-filtersuperfluousondmm-label ' +
            ' { animation: flash 0.8s linear 3;}', 1);
    styleSheet.insertRule(
        '@keyframes flash { '+
            ' 0%,100% { opacity: 1; }' +
            ' 50% { opacity: 0; }' +
            '}', 2);
}

function toggleFilter(ev) {
    // チェックボックスの状態を見て表示・非表示を切り換え
    let rule = document.getElementById("unagionunagi-filtersuperfluousondmm-css").sheet.rules[0];
    let isChecked = ev.target.checked;
    rule.style.display = resolvePropVal(isChecked);
    GM_setValue('checked', isChecked);
}

function filterSuperflouous(lineup, itemElm, getTitle) {
    // アウトレット、限定版、BOD/DOD を非表示に

    // カスタムスタイルシートの追加
    let styleEl = addStyleSheet();

    // 対象文字列正規表現
    const pattern = [/【(特選)?アウトレット】/,
                     /【(DMM|FANZA|数量)限定】/,
                     /([BD]OD)$/,
                     /アウトレット(BD)?】$/];

    const items = document.evaluate(itemElm, lineup, null,
                                    XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
    const itemsLength = items.snapshotLength;

    let nof = 0;
    for (let i=0; i < itemsLength; i++) {
        let item = items.snapshotItem(i);
        let title = getTitle(item);

        // パターンにマッチしたらクラスを追加
        if (pattern.some(re => re.test(title))) {
            item.classList.add('superfluous');
            nof++;
        }
    }

    // ページ内全作品が該当したとき
    let addLabel = '';
    if (nof == itemsLength) {
        addLabel = '(全作品が該当)';
        blinkLabel(styleEl);
    }

    // フィルターチェックボックス
    let lastSpan = document.querySelectorAll(
        '.d-area .list-capt .list-boxseparate div.list-unit');
    if (lastSpan.length) {
        lastSpan = lastSpan[lastSpan.length - 1];

        const indicator = `<span id="unagionunagi-filtersuperfluousondmm" ` +
              ` title="アウトレット、限定版、BOD/DOD を非表示にします (このページに ${nof} 個)" ` +
              ` style="margin-left: 10px">` +
              `<input type="checkbox" id="unagionunagi-filtersuperfluousondmm-cb" ` +
              ` name="unagionunagi-filtersuperfluousondmm-cb" />` +
              `<label for="unagionunagi-filtersuperfluousondmm-cb" ` +
              ` id="unagionunagi-filtersuperfluousondmm-label">フィルター${addLabel}</label></span>`;
        lastSpan.insertAdjacentHTML('afterend', indicator);

        let filterCb = document.getElementById('unagionunagi-filtersuperfluousondmm-cb');
        filterCb.checked = GM_getValue('checked', true);
        filterCb.addEventListener('change', toggleFilter);
    } else {
        console.log('Breadcrumb list not found');
    }
}

(function() {
    'use strict';
    let lineup;
    if ((lineup = document.getElementById('list'))) {
        // 画像形式表示
        filterSuperflouous(
            lineup, 'li',
            (item) => item.querySelector('div p.tmb a span img').getAttribute('alt'));
    } else if ((lineup = document.querySelector('table[summary=商品一覧] tbody'))) {
        // テキスト形式表示
        filterSuperflouous(
            lineup, 'tr[td]',
            (item) => item.querySelector('td p.ttl a').text.trim());
    }

})();