import type { IconKey } from '../core/Icon';
import type { RefObject, ReactNode, ComponentType } from 'react';
import type { Options } from 'mdast-util-to-markdown';
import type { Config } from 'mdast-util-from-markdown/lib';
import type { Extension } from 'micromark-util-types';
import type { Content } from 'mdast';
import type { MdastImportVisitor, LexicalVisitor } from '../..';
import type { EditorSubscription, EditorInFocus, BlockType } from '../core';
import type { InitialEditorStateType } from '@lexical/react/LexicalComposer';
import type { JsxComponentDescriptor } from '../jsx';
import type { HistoryState } from '@lexical/history';
import type { LexicalEditor, RangeSelection, Klass, LexicalNode, TextFormatType, ElementNode, DecoratorNode } from 'lexical';
import type { SystemSpec, Realm, RealmNode, PluginConstructor, TypedRealm, ValueForKey, SystemKeys, ValuesForKeys, SystemDict } from '../../gurx';
///
import { CreateCodeBlockNodeOptions } from './CodeBlockNode';
import { VoidEmitter } from '../../utils/voidEmitter';
export type { CodeBlockEditorContextValue, CreateCodeBlockNodeOptions } from './CodeBlockNode';
export { useCodeBlockEditorContext } from './CodeBlockNode';
/**
* The properties passed to the {@link CodeBlockEditorDescriptor.Editor} component.
*/
export interface CodeBlockEditorProps {
/**
* The code to edit.
*/
code: string;
/**
* The language of the fenced code block.
*/
language: string;
/**
* The meta of the fenced code block.
*/
meta: string;
/**
* The key of the Lexical node - use this if you are dealing with the Lexical APIs.
*/
nodeKey: string;
/**
* An emitter that will execute its subscription when the editor should be focused.
* Note: you don't need to unsubscribe, the emiter has a single subscription model.
*/
focusEmitter: VoidEmitter;
}
/**
* Implement this interface to create a custom code block editor.
* Pass the object in the codeBlockPlugin parameters.
*/
export interface CodeBlockEditorDescriptor {
/**
* The priority of the descriptor when descriptors are matched against a given code block. Lower number means lower priority.
* This allows you to implement a catch-all generic editor and a more specific editor for a given language / meta.
*/
priority: number;
/**
* A function that returns true if the descriptor's editor should be used for the given code block.
* @param language - The language of the code block.
* @param meta - The meta of the code block.
*/
match: (language: string, meta: string) => boolean;
/**
* The React component to be used. See {@link CodeBlockEditorProps} for the props passed to the component.
*/
Editor: React.ComponentType;
}
/**
* @internal
*/
export declare const codeBlockSystem: SystemSpec<[SystemSpec<[], (r: Realm) => {
activeEditor: RealmNode;
inFocus: RealmNode;
historyState: RealmNode;
currentSelection: RealmNode;
jsxIsAvailable: RealmNode;
jsxComponentDescriptors: RealmNode;
initialRootEditorState: RealmNode;
rootEditor: RealmNode;
createRootEditorSubscription: RealmNode;
createActiveEditorSubscription: RealmNode;
importVisitors: RealmNode[]>;
syntaxExtensions: RealmNode;
mdastExtensions: RealmNode<(Partial | Partial[])[] | null | undefined>;
usedLexicalNodes: RealmNode[]>;
addImportVisitor: RealmNode>;
addLexicalNode: RealmNode>;
addSyntaxExtension: RealmNode;
addMdastExtension: RealmNode | Partial[]>;
toMarkdownExtensions: RealmNode;
toMarkdownOptions: RealmNode;
addToMarkdownExtension: RealmNode;
addExportVisitor: RealmNode;
exportVisitors: RealmNode;
initialMarkdown: RealmNode;
setMarkdown: RealmNode;
markdown: RealmNode;
markdownSignal: RealmNode;
editorRootElementRef: RealmNode | null>;
contentEditableClassName: RealmNode;
placeholder: RealmNode;
autoFocus: RealmNode;
readOnly: RealmNode;
composerChildren: RealmNode[]>;
addComposerChild: RealmNode>;
topAreaChildren: RealmNode[]>;
addTopAreaChild: RealmNode>;
nestedEditorChildren: RealmNode[]>;
addNestedEditorChild: RealmNode>;
editorWrappers: RealmNode[]>;
addEditorWrapper: RealmNode>;
currentFormat: RealmNode;
editorInFocus: RealmNode;
applyFormat: RealmNode;
currentBlockType: RealmNode;
applyBlockType: RealmNode;
convertSelectionToNode: RealmNode<() => ElementNode>;
insertDecoratorNode: RealmNode<() => DecoratorNode>;
onBlur: RealmNode;
iconComponentFor: RealmNode<(name: IconKey) => ReactNode>;
markdownProcessingError: RealmNode<{
error: string;
source: string;
} | null>;
markdownErrorSignal: RealmNode<{
error: string;
source: string;
}>;
}>], (r: Realm, [{ insertDecoratorNode }]: [{
activeEditor: RealmNode;
inFocus: RealmNode;
historyState: RealmNode;
currentSelection: RealmNode;
jsxIsAvailable: RealmNode;
jsxComponentDescriptors: RealmNode;
initialRootEditorState: RealmNode;
rootEditor: RealmNode;
createRootEditorSubscription: RealmNode;
createActiveEditorSubscription: RealmNode;
importVisitors: RealmNode[]>;
syntaxExtensions: RealmNode;
mdastExtensions: RealmNode<(Partial | Partial[])[] | null | undefined>;
usedLexicalNodes: RealmNode[]>;
addImportVisitor: RealmNode>;
addLexicalNode: RealmNode>;
addSyntaxExtension: RealmNode;
addMdastExtension: RealmNode | Partial[]>;
toMarkdownExtensions: RealmNode;
toMarkdownOptions: RealmNode;
addToMarkdownExtension: RealmNode;
addExportVisitor: RealmNode;
exportVisitors: RealmNode;
initialMarkdown: RealmNode;
setMarkdown: RealmNode;
markdown: RealmNode;
markdownSignal: RealmNode;
editorRootElementRef: RealmNode | null>;
contentEditableClassName: RealmNode;
placeholder: RealmNode;
autoFocus: RealmNode;
readOnly: RealmNode;
composerChildren: RealmNode[]>;
addComposerChild: RealmNode>;
topAreaChildren: RealmNode[]>;
addTopAreaChild: RealmNode>;
nestedEditorChildren: RealmNode[]>;
addNestedEditorChild: RealmNode>;
editorWrappers: RealmNode[]>;
addEditorWrapper: RealmNode>;
currentFormat: RealmNode;
editorInFocus: RealmNode;
applyFormat: RealmNode;
currentBlockType: RealmNode;
applyBlockType: RealmNode;
convertSelectionToNode: RealmNode<() => ElementNode>;
insertDecoratorNode: RealmNode<() => DecoratorNode>;
onBlur: RealmNode;
iconComponentFor: RealmNode<(name: IconKey) => ReactNode>;
markdownProcessingError: RealmNode<{
error: string;
source: string;
} | null>;
markdownErrorSignal: RealmNode<{
error: string;
source: string;
}>;
}]) => {
codeBlockEditorDescriptors: RealmNode;
defaultCodeBlockLanguage: RealmNode;
appendCodeBlockEditorDescriptor: RealmNode;
insertCodeBlock: RealmNode>;
}>;
/**
* The parameters passed to the codeBlockPlugin initializer.
*/
export interface CodeBlockPluginParams {
/**
* Use this to register custom code block editors.
*/
codeBlockEditorDescriptors?: CodeBlockEditorDescriptor[];
/**
* The default language to use when creating a new code block if no language is passed.
*/
defaultCodeBlockLanguage?: string;
}
export declare const
/**
* @internal
*/
codeBlockPlugin: PluginConstructor {
activeEditor: RealmNode;
inFocus: RealmNode;
historyState: RealmNode;
currentSelection: RealmNode;
jsxIsAvailable: RealmNode;
jsxComponentDescriptors: RealmNode;
initialRootEditorState: RealmNode;
rootEditor: RealmNode;
createRootEditorSubscription: RealmNode;
createActiveEditorSubscription: RealmNode;
importVisitors: RealmNode[]>;
syntaxExtensions: RealmNode;
mdastExtensions: RealmNode<(Partial | Partial[])[] | null | undefined>;
usedLexicalNodes: RealmNode[]>;
addImportVisitor: RealmNode>;
addLexicalNode: RealmNode>;
addSyntaxExtension: RealmNode;
addMdastExtension: RealmNode | Partial[]>;
toMarkdownExtensions: RealmNode;
toMarkdownOptions: RealmNode;
addToMarkdownExtension: RealmNode;
addExportVisitor: RealmNode;
exportVisitors: RealmNode;
initialMarkdown: RealmNode;
setMarkdown: RealmNode;
markdown: RealmNode;
markdownSignal: RealmNode;
editorRootElementRef: RealmNode | null>;
contentEditableClassName: RealmNode;
placeholder: RealmNode;
autoFocus: RealmNode;
readOnly: RealmNode;
composerChildren: RealmNode[]>;
addComposerChild: RealmNode>;
topAreaChildren: RealmNode[]>;
addTopAreaChild: RealmNode>;
nestedEditorChildren: RealmNode[]>;
addNestedEditorChild: RealmNode>;
editorWrappers: RealmNode[]>;
addEditorWrapper: RealmNode>;
currentFormat: RealmNode;
editorInFocus: RealmNode;
applyFormat: RealmNode;
currentBlockType: RealmNode;
applyBlockType: RealmNode;
convertSelectionToNode: RealmNode<() => ElementNode>;
insertDecoratorNode: RealmNode<() => DecoratorNode>;
onBlur: RealmNode;
iconComponentFor: RealmNode<(name: IconKey) => ReactNode>;
markdownProcessingError: RealmNode<{
error: string;
source: string;
} | null>;
markdownErrorSignal: RealmNode<{
error: string;
source: string;
}>;
}>], (r: Realm, [{ insertDecoratorNode }]: [{
activeEditor: RealmNode;
inFocus: RealmNode;
historyState: RealmNode;
currentSelection: RealmNode;
jsxIsAvailable: RealmNode;
jsxComponentDescriptors: RealmNode;
initialRootEditorState: RealmNode;
rootEditor: RealmNode;
createRootEditorSubscription: RealmNode;
createActiveEditorSubscription: RealmNode;
importVisitors: RealmNode[]>;
syntaxExtensions: RealmNode;
mdastExtensions: RealmNode<(Partial | Partial[])[] | null | undefined>;
usedLexicalNodes: RealmNode[]>;
addImportVisitor: RealmNode>;
addLexicalNode: RealmNode>;
addSyntaxExtension: RealmNode;
addMdastExtension: RealmNode | Partial[]>;
toMarkdownExtensions: RealmNode;
toMarkdownOptions: RealmNode;
addToMarkdownExtension: RealmNode;
addExportVisitor: RealmNode;
exportVisitors: RealmNode;
initialMarkdown: RealmNode;
setMarkdown: RealmNode;
markdown: RealmNode;
markdownSignal: RealmNode;
editorRootElementRef: RealmNode | null>;
contentEditableClassName: RealmNode;
placeholder: RealmNode;
autoFocus: RealmNode;
readOnly: RealmNode;
composerChildren: RealmNode[]>;
addComposerChild: RealmNode>;
topAreaChildren: RealmNode[]>;
addTopAreaChild: RealmNode>;
nestedEditorChildren: RealmNode[]>;
addNestedEditorChild: RealmNode>;
editorWrappers: RealmNode[]>;
addEditorWrapper: RealmNode>;
currentFormat: RealmNode;
editorInFocus: RealmNode;
applyFormat: RealmNode;
currentBlockType: RealmNode;
applyBlockType: RealmNode;
convertSelectionToNode: RealmNode<() => ElementNode>;
insertDecoratorNode: RealmNode<() => DecoratorNode>;
onBlur: RealmNode;
iconComponentFor: RealmNode<(name: IconKey) => ReactNode>;
markdownProcessingError: RealmNode<{
error: string;
source: string;
} | null>;
markdownErrorSignal: RealmNode<{
error: string;
source: string;
}>;
}]) => {
codeBlockEditorDescriptors: RealmNode;
defaultCodeBlockLanguage: RealmNode;
appendCodeBlockEditorDescriptor: RealmNode;
insertCodeBlock: RealmNode>;
}>, CodeBlockPluginParams>,
/**
* @internal
*/
codeBlockPluginHooks: {
useRealmContext: () => TypedRealm<{
codeBlockEditorDescriptors: RealmNode;
defaultCodeBlockLanguage: RealmNode;
appendCodeBlockEditorDescriptor: RealmNode;
insertCodeBlock: RealmNode>;
} & {
activeEditor: RealmNode;
inFocus: RealmNode;
historyState: RealmNode;
currentSelection: RealmNode;
jsxIsAvailable: RealmNode;
jsxComponentDescriptors: RealmNode;
initialRootEditorState: RealmNode;
rootEditor: RealmNode;
createRootEditorSubscription: RealmNode;
createActiveEditorSubscription: RealmNode;
importVisitors: RealmNode[]>;
syntaxExtensions: RealmNode;
mdastExtensions: RealmNode<(Partial | Partial[])[] | null | undefined>;
usedLexicalNodes: RealmNode[]>;
addImportVisitor: RealmNode>;
addLexicalNode: RealmNode>;
addSyntaxExtension: RealmNode;
addMdastExtension: RealmNode | Partial[]>;
toMarkdownExtensions: RealmNode;
toMarkdownOptions: RealmNode;
addToMarkdownExtension: RealmNode;
addExportVisitor: RealmNode;
exportVisitors: RealmNode;
initialMarkdown: RealmNode;
setMarkdown: RealmNode;
markdown: RealmNode;
markdownSignal: RealmNode;
editorRootElementRef: RealmNode | null>;
contentEditableClassName: RealmNode;
placeholder: RealmNode;
autoFocus: RealmNode;
readOnly: RealmNode;
composerChildren: RealmNode[]>;
addComposerChild: RealmNode>;
topAreaChildren: RealmNode[]>;
addTopAreaChild: RealmNode>;
nestedEditorChildren: RealmNode[]>;
addNestedEditorChild: RealmNode>;
editorWrappers: RealmNode[]>;
addEditorWrapper: RealmNode>;
currentFormat: RealmNode;
editorInFocus: RealmNode;
applyFormat: RealmNode