Skip to content
This repository was archived by the owner on Nov 28, 2022. It is now read-only.

Commit 3b61ca4

Browse files
committed
✨ Koenig - Implement full set of text editing shortcuts
refs TryGhost/Ghost#9724 - <kbd>Ctrl+Alt+1</kbd> - Togggle heading level 1 - <kbd>Ctrl+Alt+2</kbd> - Togggle heading level 2 - <kbd>Ctrl+Alt+3</kbd> - Togggle heading level 3 - <kbd>Ctrl+Alt+4</kbd> - Togggle heading level 4 - <kbd>Ctrl+Alt+5</kbd> - Togggle heading level 5 - <kbd>Ctrl+Alt+6</kbd> - Togggle heading level 6 - <kbd>Ctrl/Cmd+H</kbd> - Cycle through heading levels 2-6 - <kbd>Ctrl+Q</kbd> - Toggle blockquote - <kbd>Ctrl+L</kbd> - Toggle unordered list - <kbd>Ctrl/Cmd+K</kbd> - Toggle link - <kbd>Ctrl/Cmd+B</kbd> - Toggle bold - <kbd>Ctrl/Cmd+I</kbd> - Toggle italic - <kbd>Ctrl/Cmd+U</kbd> - Toggle underline - <kbd>Ctrl+Alt+U</kbd> - Toggle strikethrough - <kbd>Ctrl/Cmd+Shift+K</kbd> - Toggle code
1 parent 3a7108c commit 3b61ca4

File tree

1 file changed

+137
-0
lines changed

1 file changed

+137
-0
lines changed

lib/koenig-editor/addon/options/key-commands.js

+137
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,46 @@ import {
88
// Key commands will run any time a particular key or key combination is pressed
99
// https://github.com/bustlelabs/mobiledoc-kit#configuring-hot-keys
1010

11+
const setHeader = function setHeader(headerTag, editor, koenig) {
12+
if (!editor.activeSection.isMarkerable) {
13+
return;
14+
}
15+
16+
let range = editor.range;
17+
let canKeepRange = !editor.activeSection.isListItem;
18+
19+
editor.run((postEditor) => {
20+
koenig.send('toggleHeaderSection', headerTag, postEditor, {force: true});
21+
if (canKeepRange) {
22+
postEditor.setRange(range);
23+
}
24+
});
25+
};
26+
27+
// cycle through H2-H6. Starts with H2 so that heirarchy with the story title is
28+
// kept. H1 should be explicitly selected with CTRL+ALT+1 or using `#` text expansion
29+
const cycleHeaderLevel = function cycleHeaderLevel(editor, koenig) {
30+
if (!editor.activeSection.isMarkerable) {
31+
return;
32+
}
33+
34+
let headerMatch = editor.activeSection.tagName.match(/^h(\d)$/i);
35+
let headerTag = 'h2';
36+
37+
if (headerMatch) {
38+
let newLevel = parseInt(headerMatch[1]) + 1;
39+
40+
if (newLevel > 6) {
41+
// remove header tag before starting the cycle again
42+
headerTag = headerMatch[0];
43+
} else {
44+
headerTag = `h${newLevel}`;
45+
}
46+
}
47+
48+
setHeader(headerTag, editor, koenig);
49+
};
50+
1151
export const DEFAULT_KEY_COMMANDS = [{
1252
str: 'ENTER',
1353
run(editor, koenig) {
@@ -242,6 +282,80 @@ export const DEFAULT_KEY_COMMANDS = [{
242282

243283
return false;
244284
}
285+
}, {
286+
str: 'CTRL+ALT+1',
287+
run(editor, koenig) {
288+
return setHeader('h1', editor, koenig);
289+
}
290+
}, {
291+
str: 'CTRL+ALT+2',
292+
run(editor, koenig) {
293+
return setHeader('h2', editor, koenig);
294+
}
295+
}, {
296+
str: 'CTRL+ALT+3',
297+
run(editor, koenig) {
298+
return setHeader('h3', editor, koenig);
299+
}
300+
}, {
301+
str: 'CTRL+ALT+4',
302+
run(editor, koenig) {
303+
return setHeader('h4', editor, koenig);
304+
}
305+
}, {
306+
str: 'CTRL+ALT+5',
307+
run(editor, koenig) {
308+
return setHeader('h5', editor, koenig);
309+
}
310+
}, {
311+
str: 'CTRL+ALT+6',
312+
run(editor, koenig) {
313+
return setHeader('h6', editor, koenig);
314+
}
315+
}, {
316+
str: 'CTRL+H',
317+
run(editor, koenig) {
318+
if (!Browser.isMac()) {
319+
return cycleHeaderLevel(editor, koenig);
320+
}
321+
322+
return false;
323+
}
324+
}, {
325+
str: 'META+H',
326+
run(editor, koenig) {
327+
if (Browser.isMac()) {
328+
return cycleHeaderLevel(editor, koenig);
329+
}
330+
331+
return false;
332+
}
333+
}, {
334+
str: 'CTRL+Q',
335+
run(editor, koenig) {
336+
if (!editor.activeSection.isMarkerable) {
337+
return;
338+
}
339+
340+
let range = editor.range;
341+
let canKeepRange = !editor.activeSection.isListItem;
342+
343+
editor.run((postEditor) => {
344+
koenig.send('toggleSection', 'blockquote', postEditor);
345+
if (canKeepRange) {
346+
postEditor.setRange(range);
347+
}
348+
});
349+
}
350+
}, {
351+
str: 'CTRL+L',
352+
run(editor, koenig) {
353+
if (!editor.activeSection.isMarkerable) {
354+
return;
355+
}
356+
357+
koenig.send('toggleSection', 'ul');
358+
}
245359
}, {
246360
str: 'CTRL+K',
247361
run(editor, koenig) {
@@ -257,6 +371,29 @@ export const DEFAULT_KEY_COMMANDS = [{
257371
run(editor, koenig) {
258372
return koenig.send('editLink', editor.range);
259373
}
374+
}, {
375+
str: 'CTRL+ALT+U',
376+
run(editor, koenig) {
377+
return koenig.send('toggleMarkup', 's');
378+
}
379+
}, {
380+
str: 'CTRL+SHIFT+K',
381+
run(editor, koenig) {
382+
if (!Browser.isMac()) {
383+
return koenig.send('toggleMarkup', 'code');
384+
}
385+
386+
return false;
387+
}
388+
}, {
389+
str: 'META+SHIFT+K',
390+
run(editor, koenig) {
391+
if (Browser.isMac()) {
392+
return koenig.send('toggleMarkup', 'code');
393+
}
394+
395+
return false;
396+
}
260397
}];
261398

262399
export default function registerKeyCommands(editor, koenig) {

0 commit comments

Comments
 (0)