@blankdotpage/cake 0.1.14 → 0.1.16
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +4 -0
- package/dist/cake/core/runtime.d.ts +32 -72
- package/dist/cake/core/runtime.d.ts.map +1 -1
- package/dist/cake/core/runtime.js +260 -235
- package/dist/cake/dom/dom-map.d.ts.map +1 -1
- package/dist/cake/dom/dom-map.js +3 -1
- package/dist/cake/dom/render.d.ts +3 -3
- package/dist/cake/dom/render.d.ts.map +1 -1
- package/dist/cake/dom/render.js +12 -27
- package/dist/cake/editor/cake-editor.d.ts +42 -5
- package/dist/cake/editor/cake-editor.d.ts.map +1 -1
- package/dist/cake/editor/cake-editor.js +228 -69
- package/dist/cake/editor/extension-types.d.ts +7 -0
- package/dist/cake/editor/extension-types.d.ts.map +1 -0
- package/dist/cake/editor/extension-types.js +1 -0
- package/dist/cake/editor/selection/selection-geometry-dom.d.ts.map +1 -1
- package/dist/cake/editor/selection/selection-geometry-dom.js +2 -1
- package/dist/cake/editor/selection/selection-layout-dom.d.ts.map +1 -1
- package/dist/cake/editor/selection/selection-layout-dom.js +2 -2
- package/dist/cake/editor/selection/selection-navigation.d.ts.map +1 -1
- package/dist/cake/editor/selection/selection-navigation.js +5 -1
- package/dist/cake/extensions/blockquote/blockquote.d.ts +2 -1
- package/dist/cake/extensions/blockquote/blockquote.d.ts.map +1 -1
- package/dist/cake/extensions/blockquote/blockquote.js +15 -12
- package/dist/cake/extensions/bold/bold.d.ts +2 -1
- package/dist/cake/extensions/bold/bold.d.ts.map +1 -1
- package/dist/cake/extensions/bold/bold.js +23 -18
- package/dist/cake/extensions/combined-emphasis/combined-emphasis.d.ts +2 -1
- package/dist/cake/extensions/combined-emphasis/combined-emphasis.d.ts.map +1 -1
- package/dist/cake/extensions/combined-emphasis/combined-emphasis.js +5 -6
- package/dist/cake/extensions/heading/heading.d.ts +2 -1
- package/dist/cake/extensions/heading/heading.d.ts.map +1 -1
- package/dist/cake/extensions/heading/heading.js +21 -15
- package/dist/cake/extensions/image/image.d.ts +2 -1
- package/dist/cake/extensions/image/image.d.ts.map +1 -1
- package/dist/cake/extensions/image/image.js +15 -12
- package/dist/cake/extensions/italic/italic.d.ts +2 -1
- package/dist/cake/extensions/italic/italic.d.ts.map +1 -1
- package/dist/cake/extensions/italic/italic.js +23 -18
- package/dist/cake/extensions/link/link-popover.d.ts +3 -15
- package/dist/cake/extensions/link/link-popover.d.ts.map +1 -1
- package/dist/cake/extensions/link/link-popover.js +30 -3
- package/dist/cake/extensions/link/link.d.ts +2 -1
- package/dist/cake/extensions/link/link.d.ts.map +1 -1
- package/dist/cake/extensions/link/link.js +23 -26
- package/dist/cake/extensions/list/list.d.ts +2 -1
- package/dist/cake/extensions/list/list.d.ts.map +1 -1
- package/dist/cake/extensions/list/list.js +13 -10
- package/dist/cake/extensions/scrollbar/index.d.ts +2 -1
- package/dist/cake/extensions/scrollbar/index.d.ts.map +1 -1
- package/dist/cake/extensions/scrollbar/index.js +10 -8
- package/dist/cake/extensions/strikethrough/strikethrough.d.ts +2 -1
- package/dist/cake/extensions/strikethrough/strikethrough.d.ts.map +1 -1
- package/dist/cake/extensions/strikethrough/strikethrough.js +23 -18
- package/dist/cake/extensions/types.d.ts +1 -1
- package/dist/cake/extensions/types.d.ts.map +1 -1
- package/dist/cake/extensions/underline/underline.d.ts +2 -1
- package/dist/cake/extensions/underline/underline.d.ts.map +1 -1
- package/dist/cake/extensions/underline/underline.js +40 -21
- package/dist/cake/index.d.ts +1 -1
- package/dist/cake/index.d.ts.map +1 -1
- package/dist/cake/react/index.d.ts.map +1 -1
- package/dist/cake/react/index.js +7 -49
- package/dist/cake/test/harness.d.ts +1 -1
- package/dist/cake/test/harness.d.ts.map +1 -1
- package/dist/cake/test/harness.js +4 -50
- package/dist/index.d.ts +2 -1
- package/dist/index.d.ts.map +1 -1
- package/package.json +4 -1
package/README.md
CHANGED
|
@@ -119,3 +119,7 @@ engine.destroy();
|
|
|
119
119
|
- `plainTextListExtension` - Ordered and unordered lists
|
|
120
120
|
- `scrollbarExtension` - Custom scrollbar styling
|
|
121
121
|
- `strikethroughExtension` - Strikethrough (`~~text~~`)
|
|
122
|
+
|
|
123
|
+
## Writing extensions
|
|
124
|
+
|
|
125
|
+
See [docs/extensions.md](docs/extensions.md) for the full extension API, including examples of pure logic extensions and React-based UI extensions.
|
|
@@ -1,25 +1,8 @@
|
|
|
1
1
|
import type { Block, Doc, Inline, Selection } from "./types";
|
|
2
|
-
import type {
|
|
2
|
+
import type { CakeExtension } from "../editor/extension-types";
|
|
3
|
+
export type { CakeExtension, CakeUIComponent } from "../editor/extension-types";
|
|
3
4
|
import { type CursorSourceMap } from "./mapping/cursor-source-map";
|
|
4
5
|
import type { DomRenderContext } from "../dom/types";
|
|
5
|
-
export type OverlayExtensionContext = {
|
|
6
|
-
container: HTMLElement;
|
|
7
|
-
insertText: (text: string) => void;
|
|
8
|
-
replaceText: (oldText: string, newText: string) => void;
|
|
9
|
-
getSelection: () => {
|
|
10
|
-
start: number;
|
|
11
|
-
end: number;
|
|
12
|
-
} | null;
|
|
13
|
-
executeCommand: (command: EditCommand) => boolean;
|
|
14
|
-
contentRoot?: HTMLElement;
|
|
15
|
-
overlayRoot?: HTMLElement;
|
|
16
|
-
toOverlayRect?: (rect: DOMRectReadOnly) => {
|
|
17
|
-
top: number;
|
|
18
|
-
left: number;
|
|
19
|
-
width: number;
|
|
20
|
-
height: number;
|
|
21
|
-
};
|
|
22
|
-
};
|
|
23
6
|
type BlockParseResult = {
|
|
24
7
|
block: Block;
|
|
25
8
|
nextPos: number;
|
|
@@ -105,57 +88,15 @@ export type ExtensionContext = {
|
|
|
105
88
|
serializeInline: (inline: Inline) => SerializeInlineResult;
|
|
106
89
|
serializeBlock: (block: Block) => SerializeBlockResult;
|
|
107
90
|
};
|
|
108
|
-
export type
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
toggleInline?: {
|
|
117
|
-
kind: string;
|
|
118
|
-
markers: Array<string | {
|
|
119
|
-
open: string;
|
|
120
|
-
close: string;
|
|
121
|
-
}>;
|
|
122
|
-
};
|
|
123
|
-
parseBlock?: (source: string, start: number, context: ExtensionContext) => ParseBlockResult;
|
|
124
|
-
parseInline?: (source: string, start: number, end: number, context: ExtensionContext) => ParseInlineResult;
|
|
125
|
-
serializeBlock?: (block: Block, context: ExtensionContext) => SerializeBlockResult | null;
|
|
126
|
-
serializeInline?: (inline: Inline, context: ExtensionContext) => SerializeInlineResult | null;
|
|
127
|
-
normalizeBlock?: (block: Block) => Block | null;
|
|
128
|
-
normalizeInline?: (inline: Inline) => Inline | null;
|
|
129
|
-
onEdit?: (command: EditCommand, state: RuntimeState) => EditResult | EditCommand | null;
|
|
130
|
-
onPasteText?: (text: string, state: RuntimeState) => EditCommand | null;
|
|
131
|
-
keybindings?: KeyBinding[];
|
|
132
|
-
renderInline?: (inline: Inline, context: DomRenderContext) => Node | Node[] | null;
|
|
133
|
-
renderBlock?: (block: Block, context: DomRenderContext) => Node | Node[] | null;
|
|
134
|
-
renderOverlay?: (context: OverlayExtensionContext) => ReactElement | null;
|
|
135
|
-
};
|
|
136
|
-
/**
|
|
137
|
-
* Extension config with typed custom commands.
|
|
138
|
-
*/
|
|
139
|
-
export type ExtensionConfig<TCommand extends ExtensionCommand> = Omit<CakeExtension, "onEdit"> & {
|
|
140
|
-
onEdit?: (command: EditCommand | TCommand, state: RuntimeState) => EditResult | EditCommand | TCommand | null;
|
|
91
|
+
export type DomInlineRenderer = (inline: Inline, context: DomRenderContext) => Node | Node[] | null;
|
|
92
|
+
export type DomBlockRenderer = (block: Block, context: DomRenderContext) => Node | Node[] | null;
|
|
93
|
+
export type ToggleInlineSpec = {
|
|
94
|
+
kind: string;
|
|
95
|
+
markers: Array<string | {
|
|
96
|
+
open: string;
|
|
97
|
+
close: string;
|
|
98
|
+
}>;
|
|
141
99
|
};
|
|
142
|
-
/**
|
|
143
|
-
* Define an extension with typed custom commands.
|
|
144
|
-
*
|
|
145
|
-
* @example
|
|
146
|
-
* type MyCommand = { type: "my-command"; value: number };
|
|
147
|
-
* export const myExtension = defineExtension<MyCommand>({
|
|
148
|
-
* name: "my-extension",
|
|
149
|
-
* onEdit(command, state) {
|
|
150
|
-
* if (command.type === "my-command") {
|
|
151
|
-
* // command is narrowed to MyCommand here
|
|
152
|
-
* console.log(command.value);
|
|
153
|
-
* }
|
|
154
|
-
* return null;
|
|
155
|
-
* },
|
|
156
|
-
* });
|
|
157
|
-
*/
|
|
158
|
-
export declare function defineExtension<TCommand extends ExtensionCommand>(extension: ExtensionConfig<TCommand>): CakeExtension;
|
|
159
100
|
export type RuntimeState = {
|
|
160
101
|
source: string;
|
|
161
102
|
selection: Selection;
|
|
@@ -164,7 +105,10 @@ export type RuntimeState = {
|
|
|
164
105
|
runtime: Runtime;
|
|
165
106
|
};
|
|
166
107
|
export type Runtime = {
|
|
167
|
-
|
|
108
|
+
dom: {
|
|
109
|
+
inlineRenderers: DomInlineRenderer[];
|
|
110
|
+
blockRenderers: DomBlockRenderer[];
|
|
111
|
+
};
|
|
168
112
|
parse(source: string): Doc;
|
|
169
113
|
serialize(doc: Doc): {
|
|
170
114
|
source: string;
|
|
@@ -178,6 +122,22 @@ export type Runtime = {
|
|
|
178
122
|
serializeSelectionToHtml(state: RuntimeState, selection: Selection): string;
|
|
179
123
|
applyEdit(command: EditCommand, state: RuntimeState): RuntimeState;
|
|
180
124
|
};
|
|
181
|
-
export declare function
|
|
182
|
-
export {
|
|
125
|
+
export declare function createRuntimeForTests(extensions: CakeExtension[]): Runtime;
|
|
126
|
+
export declare function createRuntimeFromRegistry(registry: {
|
|
127
|
+
toggleMarkerToSpec: Map<string, {
|
|
128
|
+
kind: string;
|
|
129
|
+
open: string;
|
|
130
|
+
close: string;
|
|
131
|
+
}>;
|
|
132
|
+
inclusiveAtEndByKind: Map<string, boolean>;
|
|
133
|
+
parseBlockFns: Array<(source: string, start: number, context: ExtensionContext) => ParseBlockResult>;
|
|
134
|
+
parseInlineFns: Array<(source: string, start: number, end: number, context: ExtensionContext) => ParseInlineResult>;
|
|
135
|
+
serializeBlockFns: Array<(block: Block, context: ExtensionContext) => SerializeBlockResult | null>;
|
|
136
|
+
serializeInlineFns: Array<(inline: Inline, context: ExtensionContext) => SerializeInlineResult | null>;
|
|
137
|
+
normalizeBlockFns: Array<(block: Block) => Block | null>;
|
|
138
|
+
normalizeInlineFns: Array<(inline: Inline) => Inline | null>;
|
|
139
|
+
onEditFns: Array<(command: EditCommand, state: RuntimeState) => EditResult | EditCommand | null>;
|
|
140
|
+
domInlineRenderers: DomInlineRenderer[];
|
|
141
|
+
domBlockRenderers: DomBlockRenderer[];
|
|
142
|
+
}): Runtime;
|
|
183
143
|
//# sourceMappingURL=runtime.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../../../src/cake/core/runtime.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../../../src/cake/core/runtime.ts"],"names":[],"mappings":"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"}
|