-
Notifications
You must be signed in to change notification settings - Fork 1
/
key_handlers.js
103 lines (82 loc) · 3.69 KB
/
key_handlers.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
import updateView from 'display/update_view';
import Path from 'models/path';
import Link from 'models/link';
import Paragraph from 'models/paragraph';
import { scrollElementToPosition } from 'display/helpers';
function topicParentLink() {
let link = Link.selection;
let newLink = Link.lastSelectionOfParagraph(link.enclosingParagraph.topicParagraph.parentParagraph) ||
link.enclosingParagraph.topicParagraph.parentLink;
return newLink?.select() || Link.deselect();
}
function moveToParent() {
let link = Link.selection;
let parentLink = link && link.parentLink && Link.lastSelectionOfParagraph(link.parentLink?.enclosingParagraph) || link.parentLink;
let selectionInRootParagraph = !parentLink;
if (selectionInRootParagraph && !link.isVisible) {
let sectionElement = Link.selection.enclosingParagraph.sectionElement;
return scrollElementToPosition(sectionElement, {targetRatio: 0.75, maxScrollRatio: 0.5, minDiff: 0, direction: 'up', behavior: 'smooth'});
}
if (selectionInRootParagraph && link.isVisible) {
return updateView(link.enclosingParagraph.path); // deselect link
}
if (parentLink && !parentLink.isVisible) {
return scrollElementToPosition(parentLink.element, {targetRatio: 0.3, maxScrollRatio: 0.5, minDiff: 50, direction: 'up', behavior: 'smooth'});
}
if (parentLink && parentLink.isVisible) {
return link.parentLink.select();
}
}
function moveDownOrRedirect({ newTab, altKey, shiftKey }) {
let firstChild = !Link.selection.isClosedCycle && Link.selection.firstChild;
if (firstChild && firstChild.isBelowViewport() && !Link.selection.isPathReference) {
return scrollElementToPosition(firstChild.element, {targetRatio: 0.25, maxScrollRatio: 0.5, minDiff: 50, direction: 'down', behavior: 'smooth', side: 'bottom'});
}
if (firstChild && firstChild.isAboveViewport() && !Link.selection.isPathReference) {
return scrollElementToPosition(firstChild.element, {targetRatio: 0.25, maxScrollRatio: 0.5, minDiff: 50, direction: 'up', behavior: 'smooth', side: 'bottom'});
}
if (Link.selection.isParent && !Link.selection.hasChildren && !Link.selection.cycle && !Link.selection.isPathReference) {
let sectionElement = Link.selection.targetParagraph.sectionElement;
return scrollElementToPosition(sectionElement, {targetRatio: 0.2, maxScrollRatio: 0.5, minDiff: 50, direction: 'down', behavior: 'smooth', side: 'bottom'});
}
if (firstChild && firstChild.isVisible && !firstChild.isSelected && !newTab && !Link.selection.isPathReference) { // selectALink
return firstChild.select({ newTab, redirect: altKey, inlineCycles: shiftKey });
}
return Link.selection.execute({ newTab, redirect: altKey, inlineCycles: shiftKey });
}
function inlineACycleLink() {
if (!Link.selection.isCycle) return moveInDirection('down');
return Link.selection.execute({ inlineCycles: true });
}
function copyDecodedUrl() {
navigator.clipboard.writeText(decodeURIComponent(window.location));
}
function goToDefaultTopic() {
return updateView(
Path.default,
null
);
}
function zoomOnLocalPath() {
let relativeLinkNumber = Link.selection.relativeLinkNumber;
return Link.selection?.inlinePath.lastSegment.display({ renderOnly: true }).then(() => {
Link.from(() => Link.selection?.inlinePath.lastSegment.parentParagraph.nthLink(relativeLinkNumber)).select({ scrollStyle: 'instant' });
});
}
function removeSelection() {
return updateView(Path.current.rootTopicPath, null, { scrollStyle: 'instant' });
}
function duplicate() {
return window.open(window.location.href, '_blank');
}
export {
moveToParent,
moveDownOrRedirect,
inlineACycleLink,
topicParentLink,
zoomOnLocalPath,
removeSelection,
duplicate,
copyDecodedUrl,
goToDefaultTopic
};