Truly Ergonomic keycode table editor

Truly Ergonomic keycode table editor

by yurikhan

HTML

<address>created by <a href="[email protected]">Yuri Khan</a>, released into public domain</address>

<select id="layout">
    <option value="ansi" selected="selected">ANSI</option>
    <option value="iso">ISO</option>
    <option value="jis">JIS</option>
    <option value="keypad">Keypad</option>
    <option value="rare">Rare keys</option>
</select>

<label><input type="checkbox" id="warn"/>Dim Linux-incompatible keys</label>

<div id="sources" class="ansi"><div id="warning-wrapper">
    <div id="kbd">
    <div id="fkeys" class="row">
        <div class="main"
            ><span id="esc" class="dark" data-u="29">Esc</span
            ><span class="spacer"></span
            ><span data-u="3A">F1</span
            ><span data-u="3B">F2</span
            ><span data-u="3C">F3</span
            ><span data-u="3D">F4</span
            ><span class="spacer"></span
            ><span class="dark" data-u="3E">F5</span
            ><span class="dark" data-u="3F">F6</span
            ><span class="dark" data-u="40">F7</span
            ><span class="dark" data-u="41">F8</span
            ><span class="spacer"></span
            ><span data-u="42">F9</span
            ><span data-u="43">F10</span
            ><span data-u="44">F11</span
            ><span data-u="45">F12</span
        ></div>
        <div class="nav"
            ><span class="dark" data-u="46">⎙</span
            ><span class="dark" data-u="47">⇳</span
            ><span class="dark" data-u="48">⎊</span
        ></div>
        <div class="keypad"></div>
    </div>
    <div class="row">
        <div class="main">
            <div><span id="grave" data-u="35">`~</span
                ><span id="hankaku" class="dark" data-u="94">半角</span
                ><span data-u="1E">1!</span
                ><span data-u="1F">2@</span
                ><span data-u="20">3#</span
                ><span data-u="21">4$</span
                ><span data-u="22">5%</span
                ><span data-u="23">6^</span
       ...

CSS

address { float: right; opacity: 0.5; font-size: smaller; }
form { display: block; margin-top: 5mm; background-color: #d3d7cf; color: black; padding: 5mm; }
textarea { width: 100%; height: 18em; background-color: #2e3436; color: #73d216; font-family: monospace; }

#targets>div { display: inline-block; vertical-align: top; width: 157mm; }
#targets>#teck { text-align: center;
    padding: 5mm 5mm 20mm 5mm; background-color: #2e3436; color: #f7f8f5;
    border-radius: 3mm;
}
#targets>#notes { display: inline-block; width: 81mm; }
#targets input { width: 9mm; height: 9mm;
    background-color: #2e3436; color: #f7f8f5;
    border-top: 2px solid #555753; border-left: 2px solid #555753;
    border-bottom: 2px solid #000000; border-right: 2px solid #000000;
    border-radius: 4px;
}
#targets .spacer { display: inline-block; width: 4mm; }
#targets #t-fkeys { margin-bottom: 4mm; }
#targets #t-gui, #targets #t-hen, #targets #t-tab, #targets #t-bksp,
#targets #t-enter { width: 14.75mm; }
#targets #t-lsh, #targets #t-rsh, #targets #t-lctrl, #targets #t-rctrl,
#targets #t-apps, #targets #t-space { width: 19mm; }
.cross { vertical-align: top; display: inline-block; height: 19.5mm; margin-bottom: -12mm;}
.cross>input, .cross>.stack { vertical-align: middle; display: inline-block; }
.cross>.stack>input { display: block; }

#sources { width: 239mm; padding: 3mm; border: 2px solid #ecf0eb;
    margin-bottom: 5mm;
    background-color: #f7f8f5; color: #000000; }
#sources .sup { color: #888a85; }
#sources .note { float: right }
#sources div { margin: 0.75mm 0mm 0.75mm 0mm; }
#sources .row { display: table-row; }
#sources .main, #sources .nav, #sources .keypad { display: table-cell; padding: 1mm 1mm; }
#sources .main div, #sources .nav div, #sources .keypad div { height: 9.5mm; }
#sources .nav div { text-align: center; }
#sources .nav div * { text-align: left; }
#sources.ansi #keypad, #sources.iso #keypad, #sources.jis #keypad, #sources.rare #keypad,
#sources.ansi #rare, #sources.iso...

JavaScript

function warn(warning) {
    function _warn(data)
    {
        if (typeof(data) === 'string')
        {
            return _warn([data]);
        }
        var result = data;
        result.warning = warning;
        return result;
    }
    return _warn;
}

var L = warn('Ignored by Linux kernel module');
var W = warn('Wide Linux keycode, unusable by XKB');

var usages = [
    '', '01h', '02h', '03h', 'A', 'B', 'C', 'D',
    'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L',
    'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T',
    'U', 'V', 'W', 'X', 'Y', 'Z', ['1!', '1'], ['2@', '2'],
    ['3#', '3'], ['4$', '4'], ['5%', '5'], ['6^', '6'], ['7&', '7'], ['8*', '8'], ['9(', '9'], ['0)', '0'],
    ['⏎', 'Enter'], ['⎋', 'Esc'], ['⌫', 'Backspace', 'Bksp'], ['↹', 'Tab'], ['␣', 'Space'], ['-_', '-'], ['=+', '='], ['[{', '['],
    [']}', ']'], ['\\|', '\\'], ['€#~', 'Euro1'], [';:', ';'], ['\'"', '\''], ['`~', '`'], [',<', ','], ['.>', '.'],
    ['/?', '/'], ['⇬', 'Caps Lock', 'Caps'], 'F1', 'F2', 'F3', 'F4', 'F5', 'F6',
    'F7', 'F8', 'F9', 'F10', 'F11', 'F12', ['⎙', 'PrtScr', 'PrtSc'], ['⇳⃢', 'Scroll Lock', 'Scroll'],
    ['⎉', 'Pause'], ['⎀', 'Insert', 'Ins'], ['⇱', 'Home'], ['⎗', 'Page Up', 'PgUp'], ['⌦', 'Delete', 'Del'], ['⇲', 'End'], ['⎘', 'Page Down', 'PgDn'], ['→', 'Right'],
    ['←', 'Left'], ['↓', 'Down'], ['↑', 'Up'], ['⇭', 'Num Lock', 'Num'], ['÷', 'K/'], ['×', 'K*'], ['−', 'K-'], ['+', 'K+'],
    ['⎆', 'KEnter'], ['1⇲', 'K1'], ['2↓', 'K2'], ['3⎘', 'K3'], ['4←', 'K4'], ['5⎅', 'K5'], ['6→', 'K6'], ['7⇱', 'K7'],
    ['8↑', 'K8'], ['9⎗', 'K9'], ['0⎀', 'K0'], ['.⌦', 'K.'], ['€\\|', 'Euro2'], ['▤', 'Apps', 'App'], ['Ⓘ', 'Power'], ['=', 'K='],
    'F13', 'F14', 'F15', 'F16', 'F17', 'F18', 'F19', 'F20',
    'F21', 'F22', 'F23', 'F24', 'Exec', 'Help', 'Menu', 'Select',
    'Stop', 'Again', 'Undo', 'Cut', 'Copy', 'Paste', 'Find', 'Mute',
    'Vol+', 'Vol−', L(['⇬⃞', 'Locking Caps']), L(['⇭⃞', 'Locking Num']), L(['⇳⃞', 'Locking Scroll']), [',⌦', 'K,'], L(['=⃞', 'K= AS/400']), ['\\_',...