Filter 17Lands data

Adds a input to quickly filter cards by name. Separate by commas to see multiple cards. Click `/` to quickly focus on input

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Greasemonkey 油猴子Violentmonkey 暴力猴,才能安装此脚本。

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

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

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

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

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

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

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

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

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

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

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

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

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

// ==UserScript==
// @name        Filter 17Lands data
// @namespace   Violentmonkey Scripts
// @match       https://www.17lands.com/*
// @grant       none
// @version     1.3.5
// @author      rsromanowski
// @license     MIT
// @description Adds a input to quickly filter cards by name. Separate by commas to see multiple cards. Click `/` to quickly focus on input
// @require https://cdn.jsdelivr.net/npm/@violentmonkey/dom@2
// @require https://cdn.jsdelivr.net/npm/@violentmonkey/shortcut@1
// ==/UserScript==

switch(window.location.pathname) {
  case '/card_data':
    initCardData()
    break
  case '/card_data/details':
    initCardDetails()
    break
  default: 
    console.log(`Nothing to do on page: ${window.location.pathname}`)
    break
}

function initCardData() {
  function prettify() {
    const toolbar = document.querySelector('div > div > select').parentElement.parentElement
    toolbar.style.cssText += " justify-content: space-between"
  
    const divs = document.querySelectorAll('#app > div > div')
    divs.forEach(d => d.classList.add('container'))
  }
  
  function filterTable(filter) {
    const columns = [
      { name: 'Name', index: 0, isFilter: true },
      { name: 'Color', index: 1, isFilter: false },
      { name: 'Rarity', index: 2, isFilter: false },
    ]
  
    const filterColumns = columns.filter(c => c.isFilter).map(c => c.index)
  
    const rarityRegex = new RegExp('r[:=]([curm])', 'i')
    const colorRegex = new RegExp('c[:=]([wubrgcm])', 'i')
  
    // Currently only one table on page
    // Headers are in thead
    const rows = document.querySelectorAll(`table > tbody > tr`)
  
    const clauses = filter.split(",")
    const rarityClauses = clauses.filter(c => rarityRegex.test(c))
    const colorClauses = clauses.filter(c => colorRegex.test(c))
    const nameClauses = clauses.filter(c => !rarityRegex.test(c) && !colorRegex.test(c))
  
    const orFilter = nameClauses.filter(f => f.trim().length > 0).map(f => f.trim()).join("|")
    const regex = new RegExp(`${orFilter}`, 'i')
    const isFoundInTds = td => regex.test(td.innerHTML)
    const isFound = childrenArr => childrenArr.some(isFoundInTds)
    const setTrStyleDisplay = ({ style, children }) => {
      style.display = isFound([
        ...filterColumns.map(c => children[c]) // <-- filter Columns
      ]) ? '' : 'none'
    }
  
    rows.forEach(setTrStyleDisplay)
  }
  
  function createQueryInput() {
    const div = document.querySelector('.main-text')
    const i = document.createElement('input')
    i.id = "q"
    i.className = "form-control"
    i.placeholder = 'Press \'/\' to focus. Search by partial card names. i.e. "Candy Grapple" or "candy,torch"'
    div.appendChild(i)
  
    i.addEventListener("input", (event) => { filterTable(event.target.value) })
  
    // Select all text of focus for quick overwrite
    i.addEventListener("focus", function () { this.select() })
  }

  VM.observe(document.body, () => {
    const table = document.querySelector('table')

    if (table) {
      createQueryInput()
      prettify()

      return true // disconnect observer
    }
  })

  VM.shortcut.register('/', () => {
    document.getElementById("q").focus()
  })
}

function initCardDetails() {
  console.log(`details baby`)
  
  VM.shortcut.register('k', () => {
    console.log('k')
    const dropdown = document.getElementById('card')
    dropdown.selectedIndex = Math.max(0, dropdown.selectedIndex - 1)
    dropdown.dispatchEvent(new window.Event('change', { bubbles: true }))
  })
  VM.shortcut.register('j', () => {
    console.log('j')
    const dropdown = document.getElementById('card')
    dropdown.selectedIndex = Math.min(dropdown.childElementCount - 1, dropdown.selectedIndex + 1)
    dropdown.dispatchEvent(new window.Event('change', { bubbles: true }))
  })
}