151 lines
4.6 KiB
TypeScript
151 lines
4.6 KiB
TypeScript
export const mobileEditorSetupScript = `
|
|
document.documentElement.lang = navigator.language || "en";
|
|
document.addEventListener("keydown", function(event) {
|
|
if (isFileNewShortcut(event)) {
|
|
event.preventDefault();
|
|
postEditorMessage({ type: "shortcut", command: "fileNewNote" });
|
|
return;
|
|
}
|
|
if (!isTabInsideEditor(event)) return;
|
|
event.preventDefault();
|
|
postEditorMessage({
|
|
type: "listIndent",
|
|
direction: event.shiftKey ? "out" : "in"
|
|
});
|
|
}, true);
|
|
document.addEventListener("click", function(event) {
|
|
var link = event.target && event.target.closest && event.target.closest("a[href^='tolaria-note:']");
|
|
if (!link) return;
|
|
event.preventDefault();
|
|
postEditorMessage({
|
|
type: "openWikilink",
|
|
target: decodeURIComponent(String(link.getAttribute("href") || "").replace(/^tolaria-note:/, ""))
|
|
});
|
|
}, true);
|
|
function isFileNewShortcut(event) {
|
|
return (event.metaKey || event.ctrlKey)
|
|
&& !event.altKey
|
|
&& String(event.key).toLowerCase() === "n";
|
|
}
|
|
function isTabInsideEditor(event) {
|
|
if (event.key !== "Tab") return false;
|
|
var selection = window.getSelection();
|
|
var node = selection && selection.anchorNode;
|
|
return Boolean(node && containingEditor(node));
|
|
}
|
|
function containingEditor(node) {
|
|
var editor = document.querySelector(".ProseMirror");
|
|
var container = node.nodeType === 1 ? node : node.parentNode;
|
|
return editor && container && editor.contains(container);
|
|
}
|
|
function activeWikilinkQuery() {
|
|
var selection = window.getSelection();
|
|
if (!isCollapsedTextSelection(selection)) return null;
|
|
if (!containingEditor(selection.anchorNode)) return null;
|
|
return wikilinkQueryBeforeCursor(selection);
|
|
}
|
|
function isCollapsedTextSelection(selection) {
|
|
return Boolean(selection
|
|
&& selection.anchorNode
|
|
&& selection.anchorNode.nodeType === 3
|
|
&& selection.rangeCount > 0
|
|
&& selection.isCollapsed);
|
|
}
|
|
function wikilinkQueryBeforeCursor(selection) {
|
|
var prefix = String(selection.anchorNode.textContent || "").slice(0, selection.anchorOffset);
|
|
var start = prefix.lastIndexOf("[[");
|
|
if (start < 0) return null;
|
|
var query = cleanWikilinkQuery(prefix.slice(start + 2));
|
|
if (query === null) return null;
|
|
return {
|
|
frame: wikilinkQueryFrame(selection),
|
|
query: query
|
|
};
|
|
}
|
|
function cleanWikilinkQuery(query) {
|
|
return query.indexOf("]]") >= 0 || query.indexOf("\\n") >= 0 ? null : query;
|
|
}
|
|
function emitWikilinkQuery() {
|
|
var activeQuery = activeWikilinkQuery();
|
|
postEditorMessage({
|
|
type: "wikilinkQuery",
|
|
frame: activeQuery ? activeQuery.frame : null,
|
|
query: activeQuery ? activeQuery.query : null
|
|
});
|
|
}
|
|
function wikilinkQueryFrame(selection) {
|
|
var range = selection.getRangeAt(0).cloneRange();
|
|
var rect = range.getBoundingClientRect();
|
|
if (hasVisibleFrame(rect)) {
|
|
return {
|
|
bottom: rect.bottom,
|
|
left: rect.left
|
|
};
|
|
}
|
|
return fallbackWikilinkQueryFrame(selection);
|
|
}
|
|
function fallbackWikilinkQueryFrame(selection) {
|
|
var container = selection.anchorNode && selection.anchorNode.parentElement;
|
|
var rect = container && container.getBoundingClientRect && container.getBoundingClientRect();
|
|
return {
|
|
bottom: rect ? rect.bottom : 0,
|
|
left: rect ? rect.left : 0
|
|
};
|
|
}
|
|
function hasVisibleFrame(rect) {
|
|
if (!rect) return false;
|
|
return Boolean(rect.bottom || rect.left);
|
|
}
|
|
function postEditorMessage(message) {
|
|
window.ReactNativeWebView && window.ReactNativeWebView.postMessage(JSON.stringify(message));
|
|
}
|
|
document.addEventListener("keyup", emitWikilinkQuery, true);
|
|
document.addEventListener("mouseup", emitWikilinkQuery, true);
|
|
document.addEventListener("selectionchange", emitWikilinkQuery, true);
|
|
true;
|
|
`
|
|
|
|
export const mobileEditorCss = `
|
|
* {
|
|
font-family: -apple-system, BlinkMacSystemFont, "SF Pro Text", "Segoe UI", sans-serif !important;
|
|
}
|
|
|
|
html,
|
|
body,
|
|
#root,
|
|
.ProseMirror {
|
|
color: #292825;
|
|
font-family: -apple-system, BlinkMacSystemFont, "SF Pro Text", "Segoe UI", sans-serif;
|
|
font-size: 18px;
|
|
line-height: 1.55;
|
|
}
|
|
|
|
.ProseMirror {
|
|
padding: 0;
|
|
}
|
|
|
|
.ProseMirror h1 {
|
|
font-family: inherit;
|
|
font-size: 42px;
|
|
font-weight: 760;
|
|
letter-spacing: 0;
|
|
line-height: 1.08;
|
|
margin: 18px 0 28px;
|
|
}
|
|
|
|
.ProseMirror p,
|
|
.ProseMirror li,
|
|
.ProseMirror blockquote {
|
|
font-family: inherit;
|
|
}
|
|
|
|
.ProseMirror a[href^="tolaria-note:"] {
|
|
color: #3367f6;
|
|
font-weight: 650;
|
|
text-decoration: none;
|
|
border-radius: 5px;
|
|
background: #e8eeff;
|
|
padding: 1px 4px;
|
|
}
|
|
`
|