mirror of
https://github.com/streetwriters/notesnook.git
synced 2025-12-16 11:47:54 +01:00
editor: get rid of @remirror/core-utils
(cherry picked from commit c74f15c86b2f25c9f572ea74f47243e1b52f9c1f)
This commit is contained in:
1389
packages/editor/package-lock.json
generated
1389
packages/editor/package-lock.json
generated
File diff suppressed because it is too large
Load Diff
@@ -6,7 +6,6 @@
|
|||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@emotion/react": "^11.10.0",
|
"@emotion/react": "^11.10.0",
|
||||||
"@notesnook/theme": "*",
|
"@notesnook/theme": "*",
|
||||||
"@remirror/core-utils": "^2.0.10",
|
|
||||||
"@social-embed/lib": "^0.0.2-next.1",
|
"@social-embed/lib": "^0.0.2-next.1",
|
||||||
"@theme-ui/components": "^0.14.7",
|
"@theme-ui/components": "^0.14.7",
|
||||||
"@theme-ui/core": "^0.14.7",
|
"@theme-ui/core": "^0.14.7",
|
||||||
|
|||||||
@@ -22,15 +22,15 @@ import { Decoration, DecorationSet } from "prosemirror-view";
|
|||||||
import {
|
import {
|
||||||
findChildren,
|
findChildren,
|
||||||
findParentNodeClosestToPos,
|
findParentNodeClosestToPos,
|
||||||
NodeWithPos,
|
NodeWithPos
|
||||||
} from "@tiptap/core";
|
} from "@tiptap/core";
|
||||||
import { Root, refractor } from "refractor/lib/core";
|
import { Root, refractor } from "refractor/lib/core";
|
||||||
import { RootContent } from "hast";
|
import { RootContent } from "hast";
|
||||||
import { ReplaceAroundStep, ReplaceStep } from "prosemirror-transform";
|
import { ReplaceAroundStep, ReplaceStep } from "prosemirror-transform";
|
||||||
import { toCaretPosition, toCodeLines } from "./code-block";
|
import { toCaretPosition, toCodeLines } from "./code-block";
|
||||||
import { getChangedNodes } from "@remirror/core-utils";
|
|
||||||
import Languages from "./languages.json";
|
import Languages from "./languages.json";
|
||||||
import { loadLanguage } from "./loader";
|
import { loadLanguage } from "./loader";
|
||||||
|
import { getChangedNodes } from "../../utils/prosemirror";
|
||||||
|
|
||||||
export type ReplaceMergedStep = ReplaceAroundStep | ReplaceStep;
|
export type ReplaceMergedStep = ReplaceAroundStep | ReplaceStep;
|
||||||
|
|
||||||
@@ -66,7 +66,7 @@ function getHighlightNodes(result: Root) {
|
|||||||
|
|
||||||
function getDecorations({
|
function getDecorations({
|
||||||
block,
|
block,
|
||||||
defaultLanguage,
|
defaultLanguage
|
||||||
}: {
|
}: {
|
||||||
block: NodeWithPos;
|
block: NodeWithPos;
|
||||||
defaultLanguage: string | null | undefined;
|
defaultLanguage: string | null | undefined;
|
||||||
@@ -87,7 +87,7 @@ function getDecorations({
|
|||||||
const to = from + node.text.length;
|
const to = from + node.text.length;
|
||||||
if (node.classes.length) {
|
if (node.classes.length) {
|
||||||
const decoration = Decoration.inline(from, to, {
|
const decoration = Decoration.inline(from, to, {
|
||||||
class: node.classes.join(" "),
|
class: node.classes.join(" ")
|
||||||
});
|
});
|
||||||
decorations.push(decoration);
|
decorations.push(decoration);
|
||||||
}
|
}
|
||||||
@@ -104,7 +104,7 @@ type HighlighterState = {
|
|||||||
|
|
||||||
export function HighlighterPlugin({
|
export function HighlighterPlugin({
|
||||||
name,
|
name,
|
||||||
defaultLanguage,
|
defaultLanguage
|
||||||
}: {
|
}: {
|
||||||
name: string;
|
name: string;
|
||||||
defaultLanguage: string | null | undefined;
|
defaultLanguage: string | null | undefined;
|
||||||
@@ -168,7 +168,7 @@ export function HighlighterPlugin({
|
|||||||
});
|
});
|
||||||
view.dispatch(tr);
|
view.dispatch(tr);
|
||||||
}
|
}
|
||||||
},
|
}
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
state: {
|
state: {
|
||||||
@@ -189,7 +189,7 @@ export function HighlighterPlugin({
|
|||||||
if (tr.docChanged && !tr.getMeta("selectionUpdate")) {
|
if (tr.docChanged && !tr.getMeta("selectionUpdate")) {
|
||||||
const changedBlocks = getChangedNodes(tr, {
|
const changedBlocks = getChangedNodes(tr, {
|
||||||
descend: true,
|
descend: true,
|
||||||
predicate: (n) => n.type.name === name,
|
predicate: (n) => n.type.name === name
|
||||||
});
|
});
|
||||||
if (changedBlocks.length > 0) {
|
if (changedBlocks.length > 0) {
|
||||||
const updated: Set<number> = new Set();
|
const updated: Set<number> = new Set();
|
||||||
@@ -201,7 +201,7 @@ export function HighlighterPlugin({
|
|||||||
if (languages[id]) {
|
if (languages[id]) {
|
||||||
const newDecorations = getDecorations({
|
const newDecorations = getDecorations({
|
||||||
block,
|
block,
|
||||||
defaultLanguage,
|
defaultLanguage
|
||||||
});
|
});
|
||||||
if (!newDecorations) return;
|
if (!newDecorations) return;
|
||||||
|
|
||||||
@@ -234,20 +234,20 @@ export function HighlighterPlugin({
|
|||||||
|
|
||||||
return {
|
return {
|
||||||
decorations: decorations.map(tr.mapping, tr.doc),
|
decorations: decorations.map(tr.mapping, tr.doc),
|
||||||
languages,
|
languages
|
||||||
};
|
};
|
||||||
},
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
props: {
|
props: {
|
||||||
decorations(state) {
|
decorations(state) {
|
||||||
return HIGHLIGHTER_PLUGIN_KEY.getState(state)?.decorations;
|
return HIGHLIGHTER_PLUGIN_KEY.getState(state)?.decorations;
|
||||||
},
|
}
|
||||||
},
|
},
|
||||||
appendTransaction(transactions, oldState, newState) {
|
appendTransaction(transactions, oldState, newState) {
|
||||||
const isDocChanged = transactions.some((tr) => tr.docChanged);
|
const isDocChanged = transactions.some((tr) => tr.docChanged);
|
||||||
return updateSelection(name, oldState, newState, isDocChanged);
|
return updateSelection(name, oldState, newState, isDocChanged);
|
||||||
},
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -22,16 +22,18 @@ import {
|
|||||||
findParentNode,
|
findParentNode,
|
||||||
NodeWithPos,
|
NodeWithPos,
|
||||||
Predicate,
|
Predicate,
|
||||||
findParentNodeClosestToPos
|
findParentNodeClosestToPos,
|
||||||
|
getChangedRanges
|
||||||
} from "@tiptap/core";
|
} from "@tiptap/core";
|
||||||
import {
|
import {
|
||||||
|
NodeRange,
|
||||||
Node as ProsemirrorNode,
|
Node as ProsemirrorNode,
|
||||||
Mark,
|
Mark,
|
||||||
NodeType,
|
NodeType,
|
||||||
ResolvedPos,
|
ResolvedPos,
|
||||||
Attrs
|
Attrs
|
||||||
} from "prosemirror-model";
|
} from "prosemirror-model";
|
||||||
import { EditorState, Selection } from "prosemirror-state";
|
import { EditorState, Selection, Transaction } from "prosemirror-state";
|
||||||
import { BulletList } from "../extensions/bullet-list";
|
import { BulletList } from "../extensions/bullet-list";
|
||||||
import { ListItem } from "../extensions/list-item";
|
import { ListItem } from "../extensions/list-item";
|
||||||
import { OrderedList } from "../extensions/ordered-list";
|
import { OrderedList } from "../extensions/ordered-list";
|
||||||
@@ -194,3 +196,87 @@ const equalNodeType = (
|
|||||||
node.type === nodeType
|
node.type === nodeType
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
export function getChangedNodeRanges(tr: Transaction): NodeRange[] {
|
||||||
|
// The container of the ranges to be returned from this function.
|
||||||
|
const nodeRanges: NodeRange[] = [];
|
||||||
|
const ranges = getChangedRanges(tr);
|
||||||
|
|
||||||
|
for (const range of ranges) {
|
||||||
|
try {
|
||||||
|
const $from = tr.doc.resolve(range.newRange.from);
|
||||||
|
const $to = tr.doc.resolve(range.newRange.to);
|
||||||
|
|
||||||
|
// Find the node range for this provided range.
|
||||||
|
const nodeRange = $from.blockRange($to);
|
||||||
|
|
||||||
|
// Make sure a valid node is available.
|
||||||
|
if (nodeRange) {
|
||||||
|
nodeRanges.push(nodeRange);
|
||||||
|
}
|
||||||
|
} catch {
|
||||||
|
// Changed ranged outside the document
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return nodeRanges;
|
||||||
|
}
|
||||||
|
|
||||||
|
interface GetChangedNodesOptions {
|
||||||
|
/**
|
||||||
|
* Whether to descend into child nodes.
|
||||||
|
*
|
||||||
|
* @defaultValue false
|
||||||
|
*/
|
||||||
|
descend?: boolean;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A predicate test for node which was found. Return `false` to skip the node.
|
||||||
|
*
|
||||||
|
* @param node - the node that was found
|
||||||
|
* @param pos - the pos of that node
|
||||||
|
* @param range - the `NodeRange` which contained this node.
|
||||||
|
*/
|
||||||
|
predicate?: (node: ProsemirrorNode, pos: number, range: NodeRange) => boolean;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get all the changed nodes from the provided transaction.
|
||||||
|
*
|
||||||
|
* The following example will give us all the text nodes in the provided
|
||||||
|
* transaction.
|
||||||
|
*
|
||||||
|
* ```ts
|
||||||
|
* import { getChangedNodes } from 'remirror/core';
|
||||||
|
*
|
||||||
|
* const changedTextNodes = getChangeNodes(tr, { descend: true, predicate: (node) => node.isText });
|
||||||
|
* ```
|
||||||
|
*/
|
||||||
|
export function getChangedNodes(
|
||||||
|
tr: Transaction,
|
||||||
|
options: GetChangedNodesOptions = {}
|
||||||
|
): NodeWithPos[] {
|
||||||
|
const { descend = false, predicate } = options;
|
||||||
|
const nodeRange = getChangedNodeRanges(tr);
|
||||||
|
|
||||||
|
// The container for the nodes which have been added..
|
||||||
|
const nodes: NodeWithPos[] = [];
|
||||||
|
|
||||||
|
for (const range of nodeRange) {
|
||||||
|
const { start, end } = range;
|
||||||
|
|
||||||
|
// Find all the nodes between the provided node range.
|
||||||
|
tr.doc.nodesBetween(start, end, (node, pos) => {
|
||||||
|
// Check wether this is a node that should be added.
|
||||||
|
const shouldAdd = predicate?.(node, pos, range) ?? true;
|
||||||
|
|
||||||
|
if (shouldAdd) {
|
||||||
|
nodes.push({ node, pos });
|
||||||
|
}
|
||||||
|
|
||||||
|
return descend;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
return nodes;
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user