pr0gramm Keybindings remapper

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

Vous devrez installer une extension telle que Tampermonkey, Greasemonkey ou Violentmonkey pour installer ce script.

Vous devrez installer une extension telle que Tampermonkey ou Violentmonkey pour installer ce script.

Vous devrez installer une extension telle que Tampermonkey ou Violentmonkey pour installer ce script.

Vous devrez installer une extension telle que Tampermonkey ou Userscripts pour installer ce script.

Vous devrez installer une extension telle que Tampermonkey pour installer ce script.

Vous devrez installer une extension de gestionnaire de script utilisateur pour installer ce script.

(J'ai déjà un gestionnaire de scripts utilisateur, laissez-moi l'installer !)

Vous devrez installer une extension telle que Stylus pour installer ce style.

Vous devrez installer une extension telle que Stylus pour installer ce style.

Vous devrez installer une extension telle que Stylus pour installer ce style.

Vous devrez installer une extension du gestionnaire de style pour utilisateur pour installer ce style.

Vous devrez installer une extension du gestionnaire de style pour utilisateur pour installer ce style.

Vous devrez installer une extension du gestionnaire de style pour utilisateur pour installer ce style.

(J'ai déjà un gestionnaire de style utilisateur, laissez-moi l'installer!)

// ==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();
    }

})();