feat: Allow commenting in code (#5953)

* Allow commenting in code marks

* Allow commenting in code blocks

* Floating comment toolbar in code block
This commit is contained in:
Tom Moor
2023-10-06 09:56:59 -04:00
committed by GitHub
parent ac319de1df
commit 9924fa6621
10 changed files with 42 additions and 27 deletions

View File

@@ -1,29 +1,40 @@
import { EditorState } from "prosemirror-state";
import isMarkActive from "./isMarkActive";
import isNodeActive from "./isNodeActive";
type Options = {
/** Only check if the selection is inside a code block. */
onlyBlock?: boolean;
/** Only check if the selection is inside a code mark. */
onlyMark?: boolean;
};
/**
* Returns true if the selection is inside a code block or code mark.
*
* @param state The editor state.
* @param options The options.
* @returns True if the selection is inside a code block or code mark.
*/
export default function isInCode(state: EditorState): boolean {
export default function isInCode(
state: EditorState,
options?: Options
): boolean {
const { nodes, marks } = state.schema;
if (nodes.code_block || nodes.code_fence) {
const $head = state.selection.$head;
for (let d = $head.depth; d > 0; d--) {
if (nodes.code_block && $head.node(d).type === nodes.code_block) {
return true;
}
if (nodes.code_fence && $head.node(d).type === nodes.code_fence) {
return true;
}
if (!options?.onlyMark) {
if (nodes.code_block && isNodeActive(nodes.code_block)(state)) {
return true;
}
if (nodes.code_fence && isNodeActive(nodes.code_fence)(state)) {
return true;
}
}
if (marks.code_inline) {
return isMarkActive(marks.code_inline)(state);
if (!options?.onlyBlock) {
if (marks.code_inline) {
return isMarkActive(marks.code_inline)(state);
}
}
return false;