diff --git a/date-button/index.js b/date-button/index.js new file mode 100644 index 0000000000000000000000000000000000000000..9b0d91304779a034fdc4c27427cfcbceeef257cd --- /dev/null +++ b/date-button/index.js @@ -0,0 +1,124 @@ +// ==UserScript== +// @name Date Button +// @namespace http://hugo.hornquist.se +// @version 0.1 +// @author hugo@lysator.liu.se +// @match * +// @description Inputs the current date into the current text field. +// @updateURL https://git.lysator.liu.se/hugo/web-monkey-scripts/raw/master/date-button/index.js +// @downloadURL https://git.lysator.liu.se/hugo/web-monkey-scripts/raw/master/date-button/index.js +// @grant GM_getValue +// @grant GM_setValue +// @grant GM_addStyle +// ==/UserScript== + +(function () { + 'use strict'; + + + function serialize_event(e) { + return { + 'key': e.key, + 'ctrl': e.ctrlKey, + 'alt': e.altKey, + 'shift': e.shiftKey, + } + } + + function deserialize_event(data) { + return new KeyboardEvent('keydown', { + ctrlKey: data.ctrl, + altKey: data.alt, + shiftKey: data.shift, + key: data.key, + }) + } + + function event_matches(a, b) { + return a.ctrlKey == b.ctrlKey && + a.altKey == b.altKey && + a.shiftKey == b.shiftKey && + a.key == b.key; + } + + function formatKeyEvent(e) { + let s = ''; + if (e.ctrlKey) s += 'Ctrl-'; + if (e.altKey) s += 'Alt-'; + if (e.shiftKey) s += 'Shift-'; + if (e.key != 'Shift' && e.key != 'Control' && e.key != 'Alt') s += e.key; + return s; + } + + let btn = document.createElement('button'); + + btn.style.position = 'absolute'; + btn.style.top = '1em'; + btn.style.left = '1em'; + + let registered_key_combo = GM_getValue('date-key'); + console.log(registered_key_combo); + + if (registered_key_combo == null) { + btn.textContent = 'Register keycode' + } else { + registered_key_combo = deserialize_event(registered_key_combo) + btn.textContent = formatKeyEvent(registered_key_combo); + } + console.log(registered_key_combo); + + btn.addEventListener('click', (e) => { + btn.textContent = 'Input key sequence ...' + }) + + document.body.appendChild(btn); + + let state = false + btn.addEventListener('keydown', (e) => { + console.log(e); + let s = formatKeyEvent(e) + console.log(s); + btn.textContent = s + state = 'down' + }) + + btn.addEventListener('keyup', (e) => { + if (state != 'down') return; + state = 'up' + registered_key_combo = e; + GM_setValue('date-key', serialize_event(e)) + btn.blur(); + e.preventDefault(); + }) + + document.addEventListener('keydown', (e) => { + if (event_matches(e, registered_key_combo)) { + if (! document.activeElement) return; + let start = document.activeElement.selectionStart; + let end = document.activeElement.selectionEnd; + if (start == undefined || end == undefined) return; + let s = document.activeElement.value + s = s.substring(0, start) + (new Date).toISOString() + s.substring(end) + document.activeElement.value = s; + e.preventDefault(); + } + }); + + let style = document.createElement('style'); + style.textContent = `button:focus {background: pink;})` + document.head.appendChild(style); + +})(); + + + + + + + + + + + + +