DMM・FANZAの通販商品一覧からアウトレット、限定版、および BOD/DOD を除去
Version au
/* jshint esversion: 6 */
// ==UserScript==
// @name filterSuperfluousOnDMM
// @namespace https://greasyfork.org/ja/users/289387-unagionunagi
// @version 0.9
// @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() {
// display プロパティ値を決定
return document.URL.includes('/view=text/') ? "table-row" : "list-item";
}
function addStylesheet() {
// カスタムスタイルシート .superfluous {display: none !important} を追加
let styleEl = document.createElement('style');
styleEl.setAttribute('id', 'unagionunagi-filtersuperfluousondmm-css');
document.head.appendChild(styleEl);
let styleSheet = styleEl.sheet;
let value = GM_getValue('checked', true) ? "none" : resolvePropVal();
styleSheet.insertRule(`.superfluous {display: ${value}`);
}
function toggleFilter(ev) {
// チェックボックスの状態を見て表示・非表示を切り換え
let rule = document.getElementById("unagionunagi-filtersuperfluousondmm-css").sheet.rules[0];
let isChecked = ev.target.checked;
rule.style.display = isChecked ? "none" : resolvePropVal();
GM_setValue('checked', isChecked);
}
function filterSuperflouous(lineup, itemElm, getTitle) {
// アウトレット、限定版、BOD/DOD を非表示に
// カスタムスタイルシートの追加
addStylesheet();
// 対象文字列正規表現
const pattern = [/^【(特選)?アウトレット】/,
/^【(DMM|FANZA|数量)限定】/,
/([BD]OD)$/,
/アウトレット(BD)?】$/]
let nof = 0;
let items = document.evaluate(itemElm, lineup, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
let itemsLength = items.snapshotLength;
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 += 1;
}
}
let isChecked = GM_getValue('checked', true);
// let nod = document.querySelector('.number .current').textContent.trim();
// if (isChecked && nod == nof) {
// // ページ内全作品がフィルターされていたらその旨表示
// lineup.insertAdjacentHTML(
// 'afterbegin',
// '<b>ページ内の全作品がフィルターされています。(filterSuperfluousOnDMM)</b>');
// }
// フィルターチェックボックス
let lastSpan = document.querySelectorAll('.d-area .list-capt .list-boxseparate div.list-unit');
if (lastSpan.length) {
lastSpan = lastSpan[lastSpan.length - 1];
let 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">フィルター</label></span>`;
lastSpan.insertAdjacentHTML('afterend', indicator);
let filterCb = document.getElementById('unagionunagi-filtersuperfluousondmm-cb');
filterCb.checked = isChecked;
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());
}
})();