reddit context menu options

Adds links for reddit-stream, snoopsnoo, and "copy link with context" to reddit

2017-03-09 기준 버전입니다. 최신 버전을 확인하세요.

이 스크립트를 설치하려면 Tampermonkey, Greasemonkey 또는 Violentmonkey와 같은 확장 프로그램이 필요합니다.

You will need to install an extension such as Tampermonkey to install this script.

이 스크립트를 설치하려면 Tampermonkey 또는 Violentmonkey와 같은 확장 프로그램이 필요합니다.

이 스크립트를 설치하려면 Tampermonkey 또는 Userscripts와 같은 확장 프로그램이 필요합니다.

이 스크립트를 설치하려면 Tampermonkey와 같은 확장 프로그램이 필요합니다.

이 스크립트를 설치하려면 유저 스크립트 관리자 확장 프로그램이 필요합니다.

(이미 유저 스크립트 관리자가 설치되어 있습니다. 설치를 진행합니다!)

이 스타일을 설치하려면 Stylus와 같은 확장 프로그램이 필요합니다.

이 스타일을 설치하려면 Stylus와 같은 확장 프로그램이 필요합니다.

이 스타일을 설치하려면 Stylus와 같은 확장 프로그램이 필요합니다.

이 스타일을 설치하려면 유저 스타일 관리자 확장 프로그램이 필요합니다.

이 스타일을 설치하려면 유저 스타일 관리자 확장 프로그램이 필요합니다.

이 스타일을 설치하려면 유저 스타일 관리자 확장 프로그램이 필요합니다.

(이미 유저 스타일 관리자가 설치되어 있습니다. 설치를 진행합니다!)

// ==UserScript==
// @name        reddit context menu options
// @description Adds links for reddit-stream, snoopsnoo, and "copy link with context" to reddit
// @namespace   org.stevenhoward
// @include     https://www.reddit.com/*
// @version     1
// @grant       GM_setClipboard
// ==/UserScript==
// jshint esversion: 6

function createMenu (parent, actions) {
    function randomId() {
        return Math.random().toString(36).replace(/[^a-z]+/g, '');
    }

    let id = randomId();

    let menu = document.createElement('menu');
    menu.id = id;
    menu.type = 'context';
    
    for (let action in actions) {
        let item = document.createElement('menuItem');
        item.label = action;
        item.onclick = actions[action];

        menu.appendChild(item);
    }

    parent.parentNode.appendChild(menu);
    parent.setAttribute('contextMenu', id);
}

function attachRedditStreamCommand(thing) {
    let streamLink = thing.href.replace(/reddit/, 'reddit-stream');
    createMenu(thing, {
        'open in reddit-stream': () => window.location = streamLink,
        'open in reddit-stream (new tab)': () => window.open(streamLink)
    });
}

function attachCopyContextCommand(thing) {
    let contextLink = thing.href + '?context=3';
    createMenu(thing, { 'Copy link with context': () => GM_setClipboard(contextLink) });
}

function attachSnoopSnooCommand(thing) {
    let user = thing.href.match('[^/]+$');
    if (user) {
        user = user[0];
        let snoopUrl = `http://snoopsnoo.com/u/${user}`;
        createMenu(thing, { 'SnoopSnoo': () => window.open(snoopUrl) });
    }
}

function findAndAttach(attachFn, selector, childSelector) {
    for (let node of document.querySelectorAll(selector)) {
        attachFn(node);
    }
}

findAndAttach(attachRedditStreamCommand, '.link a.title');
findAndAttach(attachCopyContextCommand, '.comment .bylink');
findAndAttach(attachSnoopSnooCommand, 'a.author, a[href^="/u/"]');