Dcinside 단축키 복원

단축키 복원

// ==UserScript==
// @name         Dcinside 단축키 복원
// @namespace    http://tampermonkey.net/
// @version      1
// @description  단축키 복원
// @match        *://gall.dcinside.com/*
// @grant        none
// ==/UserScript==

(function () {
  'use strict';

  document.addEventListener('keydown', (e) => {
  if (e.target.tagName === 'INPUT' || e.target.tagName === 'TEXTAREA') return;

    let key = e.key;

    if (key === '0') key = '10';
    if (!/^[1-9]$|^10$/.test(key)) return;

    const index = parseInt(key, 10) - 1;

    const posts = Array.from(document.querySelectorAll('.us-post'))
      .filter(row => !row.querySelector('.icon_notice'));

    if (index < posts.length) {
    const link = posts[index].querySelector('.gall_tit > a');
    if (link) {
       location.href = link.href;
    }
  }
});

  function goToPage(offset) {
    const url = new URL(location.href);
    const params = url.searchParams;
    let page = parseInt(params.get('page') || '1', 10);
    page += offset;
    if (page < 1) page = 1;
    params.set('page', page);
    url.search = params.toString();
    url.hash = '';
    location.href = url.toString();
  }

  function goToPost(offset) {
    const url = new URL(location.href);
    const params = url.searchParams;
    let no = parseInt(params.get('no') || '1', 10);
    no += offset;
    if (no < 1) no = 1;
    params.set('no', no);
    url.search = params.toString();
    url.hash = '';
    location.href = url.toString();
  }

  document.addEventListener('keydown', function (e) {
    const activeTag = document.activeElement.tagName;
    const key = e.key.toUpperCase();

    if (activeTag === 'INPUT' || activeTag === 'TEXTAREA') return;

    if (key === 'F') {
      e.preventDefault();
      return;
    }

    const url = location.href;
    const isViewPage = url.includes('/view/');

    if (!isViewPage && !isNaN(key) && key >= 1 && key <= 9) {
      const posts = document.querySelectorAll('.ub-content.us-post');
      const index = parseInt(key, 10) - 1;
      if (posts[index]) {
        const link = posts[index].querySelector('a.ub-word');
        if (link) location.href = link.href;
      }
    }

    switch (key) {
      case 'W': {
        const writeBtn = document.querySelector('#btn_write');
        if (writeBtn) {
          const onclickAttr = writeBtn.getAttribute('onclick');
          if (onclickAttr && onclickAttr.includes('goWrite(')) {
            const urlMatch = onclickAttr.match(/goWrite\('([^']+)'/);
            if (urlMatch && urlMatch[1]) {
              location.href = urlMatch[1];
              break;
            }
          }
          writeBtn.click();
        }
        break;
      }
      case 'R':
        location.reload();
        break;
      case 'S': {
        const searchInput = document.querySelector('input.in_keyword[name="search_keyword"]');
        if (searchInput) {
          searchInput.focus();
          e.preventDefault();
        }
        break;
      }
      case 'C': {
        const commentLink = document.querySelector('a[href="#focus_cmt"]');
        if (commentLink) {
          commentLink.click();
        } else {
          const cmtSection = document.querySelector('#focus_cmt');
          if (cmtSection) {
            cmtSection.scrollIntoView({ behavior: 'smooth' });
          }
        }
        break;
      }
      case 'B': {
        if (isViewPage) {
          goToPost(-1);
        }
        break;
      }
      case 'N': {
        if (isViewPage) {
          goToPost(1);
        }
        break;
      }
      case 'U':
        window.scrollBy(0, 200);
        break;
      case 'I':
        window.scrollBy(0, -200);
        break;
      case 'J':
        window.scrollBy(0, window.innerHeight);
        break;
      case 'K':
        window.scrollBy(0, -window.innerHeight);
        break;
      case 'G':
        if (!isViewPage) goToPage(-1);
        break;
      case 'H':
        if (!isViewPage) goToPage(1);
        break;
      case 'L': {
        if (!isViewPage) {
          const url = new URL(location.href);
          url.searchParams.set('page', '1');
          url.hash = '';
          location.href = url.toString();
        }
        break;
      }
    }
  });
})();