mirror of
https://github.com/osmarks/mycorrhiza.git
synced 2025-01-08 02:40:26 +00:00
Editor shortcuts
This commit is contained in:
parent
0e3222c552
commit
83574105f5
@ -8,7 +8,7 @@
|
|||||||
(event.altKey ? 'Alt+' : '') +
|
(event.altKey ? 'Alt+' : '') +
|
||||||
(event.metaKey ? 'Meta+' : '') +
|
(event.metaKey ? 'Meta+' : '') +
|
||||||
(!elideShift && event.shiftKey ? 'Shift+' : '') +
|
(!elideShift && event.shiftKey ? 'Shift+' : '') +
|
||||||
event.key;
|
(event.key === ',' ? 'Comma' : event.key === ' ' ? 'Space' : event.key);
|
||||||
}
|
}
|
||||||
|
|
||||||
function isTextField(element) {
|
function isTextField(element) {
|
||||||
@ -20,7 +20,7 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
class ShortcutHandler {
|
class ShortcutHandler {
|
||||||
constructor(element, filter = () => {}) {
|
constructor(element, filter = () => true) {
|
||||||
this.element = element;
|
this.element = element;
|
||||||
this.map = {};
|
this.map = {};
|
||||||
this.active = this.map;
|
this.active = this.map;
|
||||||
@ -74,6 +74,7 @@
|
|||||||
this.active = this.active[shortcut];
|
this.active = this.active[shortcut];
|
||||||
if (this.active.action) {
|
if (this.active.action) {
|
||||||
this.active.action(event);
|
this.active.action(event);
|
||||||
|
event.preventDefault();
|
||||||
this.resetActive();
|
this.resetActive();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -113,9 +114,13 @@
|
|||||||
let notFormField = event => !(event.target instanceof Node && isTextField(event.target));
|
let notFormField = event => !(event.target instanceof Node && isTextField(event.target));
|
||||||
let globalShortcuts = new ShortcutHandler(document, notFormField);
|
let globalShortcuts = new ShortcutHandler(document, notFormField);
|
||||||
|
|
||||||
|
// Global shortcuts
|
||||||
|
|
||||||
let bindElement = bindElementFactory(globalShortcuts);
|
let bindElement = bindElementFactory(globalShortcuts);
|
||||||
let bindLink = bindLinkFactory(globalShortcuts);
|
let bindLink = bindLinkFactory(globalShortcuts);
|
||||||
|
|
||||||
|
// * Common shortcuts
|
||||||
|
|
||||||
bindElement('p, Alt+ArrowLeft', '.prevnext__prev', 'Next hypha');
|
bindElement('p, Alt+ArrowLeft', '.prevnext__prev', 'Next hypha');
|
||||||
bindElement('n, Alt+ArrowRight', '.prevnext__next', 'Previous hypha');
|
bindElement('n, Alt+ArrowRight', '.prevnext__next', 'Previous hypha');
|
||||||
bindElement('s, Alt+ArrowTop', $$('.navi-title a').slice(1, -1).slice(-1)[0], 'Parent hypha');
|
bindElement('s, Alt+ArrowTop', $$('.navi-title a').slice(1, -1).slice(-1)[0], 'Parent hypha');
|
||||||
@ -131,9 +136,44 @@
|
|||||||
bindElement(`g ${i}`, headerLinks[i-1], `Header link #${i}`);
|
bindElement(`g ${i}`, headerLinks[i-1], `Header link #${i}`);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// * Hypha shortcuts
|
||||||
|
|
||||||
let hyphaLinks = $$('article .wikilink');
|
let hyphaLinks = $$('article .wikilink');
|
||||||
for (let i = 1; i <= hyphaLinks.length && i < 10; i++) {
|
for (let i = 1; i <= hyphaLinks.length && i < 10; i++) {
|
||||||
bindElement(i.toString(), hyphaLinks[i-1], `Hypha link #${i}`);
|
bindElement(i.toString(), hyphaLinks[i-1], `Hypha link #${i}`);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Hypha editor shortcuts
|
||||||
|
|
||||||
|
if (typeof editTextarea !== 'undefined') {
|
||||||
|
let editorShortcuts = new ShortcutHandler(editTextarea);
|
||||||
|
|
||||||
|
let shortcuts = [
|
||||||
|
// Inspired by MS Word, Pages, Google Docs and Telegram desktop clients.
|
||||||
|
// And by myself, too.
|
||||||
|
|
||||||
|
// Win+Linux Mac Action Description
|
||||||
|
['Ctrl+b', 'Meta+b', wrapBold, 'Editor: Bold'],
|
||||||
|
['Ctrl+i', 'Meta+i', wrapItalic, 'Editor: Italic'],
|
||||||
|
['Ctrl+M', 'Meta+Shift+m', wrapMonospace, 'Editor: Monospaced'],
|
||||||
|
['Ctrl+I', 'Meta+Shift+i', wrapHighlighted, 'Editor: Highlight'],
|
||||||
|
['Ctrl+.', 'Meta+.', wrapLifted, 'Editor: Superscript'],
|
||||||
|
['Ctrl+Comma', 'Meta+Comma', wrapLowered, 'Editor: Subscript'],
|
||||||
|
// Strikethrough conflicts with 1Password on my machine but
|
||||||
|
// I'm probably the only Mycorrhiza user who uses 1Password.
|
||||||
|
['Ctrl+X', 'Meta+Shift+x', wrapStrikethrough, 'Editor: Strikethrough'],
|
||||||
|
['Ctrl+k', 'Meta+k', wrapLink, 'Editor: Link'],
|
||||||
|
];
|
||||||
|
|
||||||
|
let isMac = /Macintosh/.test(window.navigator.userAgent);
|
||||||
|
|
||||||
|
for (let shortcut of shortcuts) {
|
||||||
|
if (isMac) {
|
||||||
|
editorShortcuts.add(shortcut[1], ...shortcut.slice(2))
|
||||||
|
} else {
|
||||||
|
editorShortcuts.add(shortcut[0], ...shortcut.slice(2))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
});
|
});
|
||||||
})();
|
})();
|
Loading…
Reference in New Issue
Block a user