pr0gramm Keybindings remapper

Rebind pr0gramm.com keybindings to your liking. Defaults are for Colemak-DH keyboard layout (easily customizable)

K instalaci tototo skriptu si budete muset nainstalovat rozšíření jako Tampermonkey, Greasemonkey nebo Violentmonkey.

K instalaci tohoto skriptu si budete muset nainstalovat rozšíření jako Tampermonkey nebo Violentmonkey.

K instalaci tohoto skriptu si budete muset nainstalovat rozšíření jako Tampermonkey nebo Violentmonkey.

K instalaci tohoto skriptu si budete muset nainstalovat rozšíření jako Tampermonkey nebo Userscripts.

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

K instalaci tohoto skriptu si budete muset nainstalovat manažer uživatelských skriptů.

(Už mám manažer uživatelských skriptů, nechte mě ho nainstalovat!)

You will need to install an extension such as Stylus to install this style.

You will need to install an extension such as Stylus to install this style.

You will need to install an extension such as Stylus to install this style.

You will need to install a user style manager extension to install this style.

You will need to install a user style manager extension to install this style.

You will need to install a user style manager extension to install this style.

(Už mám manažer uživatelských stylů, nechte mě ho nainstalovat!)

// ==UserScript==
// @name         pr0gramm Keybindings remapper
// @namespace    http://tampermonkey.net/
// @version      1.0
// @description  Rebind pr0gramm.com keybindings to your liking. Defaults are for Colemak-DH keyboard layout (easily customizable)
// @author       wallawallah
// @match        https://pr0gramm.com/*
// @icon         https://pr0gramm.com/favicon.ico
// @match        https://www.pr0gramm.com/*
// @grant        none
// @license      MIT
// ==/UserScript==

(function() {
    'use strict';

    // Colemak-DH key mappings for ortholinear keyboard
    // New key you press -> Original QWERTY key pr0gramm expects
    const keyMappings = {
        // Navigation
        'r': 'a',  // Press R -> sends A (Previous upload)
        't': 'd',  // Press T -> sends D (Next upload)

        // Voting
        'f': 'w',  // Press F -> sends W (Downvote)

        // Actions
        'g': 'f',  // Press G -> sends F (Favorite)
    };

    // Function to intercept and remap keydown events
    function remapKeyboardEvent(event) {
        // Skip if this event was already remapped by us
        if (event.remappedByColemakDH) {
            return;
        }

        // Only process if no modifier keys are pressed
        if (event.ctrlKey || event.altKey || event.metaKey || event.shiftKey) {
            return;
        }

        // Only process if not in an input field
        const activeElement = document.activeElement;
        if (activeElement && (
            activeElement.tagName === 'INPUT' ||
            activeElement.tagName === 'TEXTAREA' ||
            activeElement.contentEditable === 'true'
        )) {
            return;
        }

        const pressedKey = event.key.toLowerCase();

        // Check if this key should be remapped
        if (keyMappings.hasOwnProperty(pressedKey)) {
            const targetKey = keyMappings[pressedKey];

            // Prevent the original event
            event.preventDefault();
            event.stopPropagation();

            // Create and dispatch a new event with the target key
            const newEvent = new KeyboardEvent('keydown', {
                key: targetKey,
                code: `Key${targetKey.toUpperCase()}`,
                keyCode: targetKey.toUpperCase().charCodeAt(0),
                which: targetKey.toUpperCase().charCodeAt(0),
                bubbles: true,
                cancelable: true
            });

            // Mark this event as already remapped to prevent re-processing
            newEvent.remappedByColemakDH = true;

            // Dispatch the remapped event to the same target
            event.target.dispatchEvent(newEvent);

            console.log(`pr0gramm Colemak-DH: Remapped ${pressedKey.toUpperCase()} -> ${targetKey.toUpperCase()}`);
            return;
        }
    }

    // Function to show current key mappings
    function showKeyMappings() {
        console.log('pr0gramm Colemak-DH Ortholinear Key Mappings:');
        console.log('============================================');
        console.log('Press Key -> Function (sends original key)');
        console.log('R -> Previous upload (sends A)');
        console.log('T -> Next upload (sends D)');
        console.log('F -> Upvote upload (sends W)');
        console.log('G -> Favorite upload (sends F)');
        console.log('============================================');
    }

    // Initialize the script
    function init() {
        console.log('pr0gramm Colemak-DH keybinding remapper loaded');

        // Add event listener for keydown events
        document.addEventListener('keydown', remapKeyboardEvent, true);

        // Show mappings on load
        showKeyMappings();

        // Add a way to show mappings again (Ctrl+Shift+?)
        document.addEventListener('keydown', (event) => {
            if (event.ctrlKey && event.shiftKey && event.key === '?') {
                showKeyMappings();
            }
        });
    }

    // Wait for page to load
    if (document.readyState === 'loading') {
        document.addEventListener('DOMContentLoaded', init);
    } else {
        init();
    }

})();