@lofcz/platejs-code-drawing 52.3.0

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/LICENSE ADDED
@@ -0,0 +1,24 @@
1
+ The MIT License (MIT)
2
+
3
+ Copyright (c) Ziad Beyens, Dylan Schiemann, Joe Anderson, Felix Feng
4
+
5
+ Unless otherwise specified in a LICENSE file within an individual package directory,
6
+ this license applies to all files in this repository outside of those package directories.
7
+
8
+ Permission is hereby granted, free of charge, to any person obtaining a copy
9
+ of this software and associated documentation files (the "Software"), to deal
10
+ in the Software without restriction, including without limitation the rights
11
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
12
+ copies of the Software, and to permit persons to whom the Software is
13
+ furnished to do so, subject to the following conditions:
14
+
15
+ The above copyright notice and this permission notice shall be included in
16
+ all copies or substantial portions of the Software.
17
+
18
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
19
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
20
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
21
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
22
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
23
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
24
+ THE SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,11 @@
1
+ # Plate code-drawing plugin
2
+
3
+ This package implements the code-drawing plugin for Plate, supporting PlantUml, Graphviz, Flowchart, and Mermaid diagrams.
4
+
5
+ ## Documentation
6
+
7
+ Check out [Code Drawing](https://platejs.org/docs/code-drawing).
8
+
9
+ ## License
10
+
11
+ [MIT](../../LICENSE)
@@ -0,0 +1,16 @@
1
+ import { createSlatePlugin } from "platejs";
2
+
3
+ //#region src/lib/BaseCodeDrawingPlugin.ts
4
+ const CODE_DRAWING_KEY = "code_drawing";
5
+ /** Enables support for code drawing (PlantUml, Graphviz, Flowchart, Mermaid) within a Slate document */
6
+ const BaseCodeDrawingPlugin = createSlatePlugin({
7
+ key: CODE_DRAWING_KEY,
8
+ node: {
9
+ isElement: true,
10
+ isVoid: true
11
+ }
12
+ });
13
+
14
+ //#endregion
15
+ export { CODE_DRAWING_KEY as n, BaseCodeDrawingPlugin as t };
16
+ //# sourceMappingURL=BaseCodeDrawingPlugin-BTeDVejh.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BaseCodeDrawingPlugin-BTeDVejh.js","names":["TElement","createSlatePlugin","CodeDrawingData","CODE_DRAWING_KEY","const","TCodeDrawingElement","data","BaseCodeDrawingPlugin","key","node","isElement","isVoid"],"sources":["../src/lib/BaseCodeDrawingPlugin.ts"],"sourcesContent":["import { type TElement, createSlatePlugin } from 'platejs';\n\nimport type { CodeDrawingData } from './types';\n\nexport const CODE_DRAWING_KEY = 'code_drawing' as const;\n\nexport interface TCodeDrawingElement extends TElement {\n data?: CodeDrawingData;\n}\n\n/** Enables support for code drawing (PlantUml, Graphviz, Flowchart, Mermaid) within a Slate document */\nexport const BaseCodeDrawingPlugin = createSlatePlugin({\n key: CODE_DRAWING_KEY,\n node: { isElement: true, isVoid: true },\n});\n"],"mappings":";;;AAIA,MAAaG,mBAAmB;;AAOhC,MAAaI,wBAAwBN,kBAAkB;CACrDO,KAAKL;CACLM,MAAM;EAAEC,WAAW;EAAMC,QAAQ;EAAK;CACvC,CAAC"}
@@ -0,0 +1,91 @@
1
+ import { InsertNodesOptions, NodeProps, SlateEditor, TElement } from "platejs";
2
+
3
+ //#region src/lib/constants.d.ts
4
+ declare const CODE_DRAWING_TYPE: {
5
+ readonly PlantUml: "PlantUml";
6
+ readonly Graphviz: "Graphviz";
7
+ readonly Flowchart: "Flowchart";
8
+ readonly Mermaid: "Mermaid";
9
+ };
10
+ declare const CODE_DRAWING_TYPE_ARRAY: readonly [{
11
+ readonly value: "PlantUml";
12
+ readonly label: "PlantUml";
13
+ }, {
14
+ readonly value: "Graphviz";
15
+ readonly label: "Graphviz";
16
+ }, {
17
+ readonly value: "Flowchart";
18
+ readonly label: "Flowchart";
19
+ }, {
20
+ readonly value: "Mermaid";
21
+ readonly label: "Mermaid";
22
+ }];
23
+ type CodeDrawingType = (typeof CODE_DRAWING_TYPE)[keyof typeof CODE_DRAWING_TYPE];
24
+ declare const VIEW_MODE: {
25
+ readonly Both: "Both";
26
+ readonly Code: "Code";
27
+ readonly Image: "Image";
28
+ };
29
+ declare const VIEW_MODE_ARRAY: readonly [{
30
+ readonly value: "Both";
31
+ readonly label: "Both";
32
+ }, {
33
+ readonly value: "Code";
34
+ readonly label: "Code";
35
+ }, {
36
+ readonly value: "Image";
37
+ readonly label: "Image";
38
+ }];
39
+ type ViewMode = (typeof VIEW_MODE)[keyof typeof VIEW_MODE];
40
+ declare const DEFAULT_MIN_HEIGHT = 300;
41
+ declare const RENDER_DEBOUNCE_DELAY = 500;
42
+ declare const DOWNLOAD_FILENAME = "code-drawing.png";
43
+ //#endregion
44
+ //#region src/lib/types.d.ts
45
+ type CodeDrawingData = {
46
+ drawingType?: CodeDrawingType;
47
+ drawingMode?: ViewMode;
48
+ code?: string;
49
+ };
50
+ //#endregion
51
+ //#region src/lib/BaseCodeDrawingPlugin.d.ts
52
+ declare const CODE_DRAWING_KEY: "code_drawing";
53
+ interface TCodeDrawingElement extends TElement {
54
+ data?: CodeDrawingData;
55
+ }
56
+ /** Enables support for code drawing (PlantUml, Graphviz, Flowchart, Mermaid) within a Slate document */
57
+ declare const BaseCodeDrawingPlugin: any;
58
+ //#endregion
59
+ //#region src/lib/transforms/insertCodeDrawing.d.ts
60
+ declare const insertCodeDrawing: (editor: SlateEditor, props?: NodeProps<TCodeDrawingElement>, options?: InsertNodesOptions) => void;
61
+ //#endregion
62
+ //#region src/lib/utils/download.d.ts
63
+ /**
64
+ * Download image from data URL
65
+ */
66
+ declare function downloadImage(imageDataUrl: string, filename?: string): void;
67
+ //#endregion
68
+ //#region src/lib/utils/renderers.d.ts
69
+ /**
70
+ * Render PlantUml diagram
71
+ * Uses plantuml-encoder to encode content and fetches SVG from PlantUml server
72
+ */
73
+ declare function renderPlantUml(content: string): Promise<string>;
74
+ /**
75
+ * Render Graphviz diagram
76
+ * Uses viz.js to render Graphviz DOT syntax to SVG
77
+ */
78
+ declare function renderGraphviz(content: string): Promise<string>;
79
+ /**
80
+ * Render Flowchart diagram
81
+ * Uses flowchart.js to parse and render flowchart syntax
82
+ */
83
+ declare function renderFlowchart(content: string): Promise<string>;
84
+ declare function renderMermaid(content: string): Promise<string>;
85
+ /**
86
+ * Render code drawing based on type
87
+ */
88
+ declare function renderCodeDrawing(type: CodeDrawingType, content: string): Promise<string>;
89
+ //#endregion
90
+ export { BaseCodeDrawingPlugin, CODE_DRAWING_KEY, CODE_DRAWING_TYPE, CODE_DRAWING_TYPE_ARRAY, CodeDrawingData, CodeDrawingType, DEFAULT_MIN_HEIGHT, DOWNLOAD_FILENAME, RENDER_DEBOUNCE_DELAY, TCodeDrawingElement, VIEW_MODE, VIEW_MODE_ARRAY, ViewMode, downloadImage, insertCodeDrawing, renderCodeDrawing, renderFlowchart, renderGraphviz, renderMermaid, renderPlantUml };
91
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","names":[],"sources":["../src/lib/constants.ts","../src/lib/types.ts","../src/lib/BaseCodeDrawingPlugin.ts","../src/lib/transforms/insertCodeDrawing.ts","../src/lib/utils/download.ts","../src/lib/utils/renderers.ts"],"sourcesContent":[],"mappings":";;;cAAa;;;EAAA,SAAA,SAAA,EAKH,WAAA;EAEG,SAAA,OAAA,EAAA,SAiBH;AAEV,CAAA;AAIa,cAvBA,uBA2BH,EAAA,SAAA,CAAA;EAEG,SAAA,KAAA,EAAA,UAaH;EAEE,SAAA,KAAQ,EAAA,UAAW;AAG/B,CAAA,EAAA;EACa,SAAA,KAAA,EAAA,UAAqB;EACrB,SAAA,KAAA,EAAA,UAAiB;;;;ACtD9B,CAAA,EAAA;;;;ACEa,KFsBD,eAAA,GEtB2C,CAAA,OFuB7C,iBEvB6C,CAAA,CAAA,MAAA,OFuBb,iBEvBa,CAAA;AAEtC,cFwBJ,SExBwB,EAAA;EAKxB,SAAA,IAAA,EAAA,MAAA;;;;ACNA,cH+BA,eGPZ,EAAA,SAAA,CAAA;EAvBS,SAAA,KAAA,EAAA,MAAA;EACS,SAAA,KAAA,EAAA,MAAA;CAAV,EAAA;EACE,SAAA,KAAA,EAAA,MAAA;EAAuB,SAAA,KAAA,EAAA,MAAA;;;;ACLlC,CAAA,CAAA;KJgDY,QAAA,WAAmB,wBAAwB;cAG1C,kBAAA;cACA,qBAAA;AKxBS,cLyBT,iBAAA,GKzBiD,kBAAA;;;KJ7BlD,eAAA;gBACI;EDHH,WAAA,CAAA,ECIG,QDCN;EAEG,IAAA,CAAA,EAAA,MAAA;AAmBb,CAAA;;;cEtBa;AFJA,UEMI,mBAAA,SAA4B,QFDnC,CAAA;EAEG,IAAA,CAAA,EEAJ,eFAI;AAmBb;AAIA;AAMa,cEzBA,qBFsCH,EAAA,GAAA;;;cG5CG,4BACH,qBACD,UAAU,gCACR;;;;;;AHRE,iBIGG,aAAA,CJEN,YAAA,EAAA,MAAA,EAAA,QAAA,CAAA,EAAA,MAAA,CAAA,EAAA,IAAA;;;;;AALV;AAOA;AAmBY,iBKKU,cAAA,CLJZ,OAAA,EAAA,MAAgC,CAAA,EKIa,OLJb,CAAA,MAAiB,CAAA;AAG3D;AAMA;AAeA;AAGA;AACa,iBKAS,cAAA,CLAY,OAAA,EAAA,MAAA,CAAA,EKAqB,OLArB,CAAA,MAAA,CAAA;AAClC;;;;ACtDY,iBI8FU,eAAA,CJ7FN,OAAA,EAAA,MACA,CAAA,EI4FwC,OJ5FhC,CAAA,MAAA,CAAA;iBIuHF,aAAA,mBAAgC;;;AHvHtD;AAEiB,iBGgJK,iBAAA,CH/Ib,IAAA,EGgJD,eHjJ6C,EAAA,OAAA,EAAA,MAAA,CAAA,EGmJlD,OHnJkD,CAAA,MAAA,CAAA"}
package/dist/index.js ADDED
@@ -0,0 +1,215 @@
1
+ import { n as CODE_DRAWING_KEY, t as BaseCodeDrawingPlugin } from "./BaseCodeDrawingPlugin-BTeDVejh.js";
2
+
3
+ //#region src/lib/constants.ts
4
+ const CODE_DRAWING_TYPE = {
5
+ PlantUml: "PlantUml",
6
+ Graphviz: "Graphviz",
7
+ Flowchart: "Flowchart",
8
+ Mermaid: "Mermaid"
9
+ };
10
+ const CODE_DRAWING_TYPE_ARRAY = [
11
+ {
12
+ value: CODE_DRAWING_TYPE.PlantUml,
13
+ label: CODE_DRAWING_TYPE.PlantUml
14
+ },
15
+ {
16
+ value: CODE_DRAWING_TYPE.Graphviz,
17
+ label: CODE_DRAWING_TYPE.Graphviz
18
+ },
19
+ {
20
+ value: CODE_DRAWING_TYPE.Flowchart,
21
+ label: CODE_DRAWING_TYPE.Flowchart
22
+ },
23
+ {
24
+ value: CODE_DRAWING_TYPE.Mermaid,
25
+ label: CODE_DRAWING_TYPE.Mermaid
26
+ }
27
+ ];
28
+ const VIEW_MODE = {
29
+ Both: "Both",
30
+ Code: "Code",
31
+ Image: "Image"
32
+ };
33
+ const VIEW_MODE_ARRAY = [
34
+ {
35
+ value: VIEW_MODE.Both,
36
+ label: VIEW_MODE.Both
37
+ },
38
+ {
39
+ value: VIEW_MODE.Code,
40
+ label: VIEW_MODE.Code
41
+ },
42
+ {
43
+ value: VIEW_MODE.Image,
44
+ label: VIEW_MODE.Image
45
+ }
46
+ ];
47
+ const DEFAULT_MIN_HEIGHT = 300;
48
+ const RENDER_DEBOUNCE_DELAY = 500;
49
+ const DOWNLOAD_FILENAME = "code-drawing.png";
50
+
51
+ //#endregion
52
+ //#region src/lib/transforms/insertCodeDrawing.ts
53
+ const insertCodeDrawing = (editor, props = {}, options = {}) => {
54
+ editor.tf.insertNodes({
55
+ children: [{ text: "" }],
56
+ type: editor.getType(CODE_DRAWING_KEY),
57
+ data: {
58
+ drawingType: "Mermaid",
59
+ drawingMode: "Both",
60
+ code: "",
61
+ ...typeof props.data === "object" && props.data !== null ? props.data : {}
62
+ },
63
+ ...props && typeof props === "object" ? props : {}
64
+ }, {
65
+ nextBlock: true,
66
+ ...options && typeof options === "object" ? options : {}
67
+ });
68
+ };
69
+
70
+ //#endregion
71
+ //#region src/lib/utils/download.ts
72
+ /**
73
+ * Download image from data URL
74
+ */
75
+ function downloadImage(imageDataUrl, filename = "code-drawing.png") {
76
+ const imageEl = new Image();
77
+ imageEl.src = imageDataUrl;
78
+ imageEl.onload = () => {
79
+ const canvas = document.createElement("canvas");
80
+ canvas.width = imageEl.width;
81
+ canvas.height = imageEl.height;
82
+ const context = canvas.getContext("2d");
83
+ if (context) {
84
+ context.drawImage(imageEl, 0, 0);
85
+ const a = document.createElement("a");
86
+ a.href = canvas.toDataURL("image/png");
87
+ a.download = filename;
88
+ a.click();
89
+ }
90
+ };
91
+ }
92
+
93
+ //#endregion
94
+ //#region src/lib/utils/renderers.ts
95
+ /**
96
+ * Generate a random string for unique IDs
97
+ */
98
+ function randomString(length, type = "lowerCase") {
99
+ const chars = type === "lowerCase" ? "abcdefghijklmnopqrstuvwxyz" : "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
100
+ let result = "";
101
+ for (let i = 0; i < length; i++) result += chars.charAt(Math.floor(Math.random() * chars.length));
102
+ return result;
103
+ }
104
+ /**
105
+ * Convert SVG string to data URL
106
+ */
107
+ function svgToDataUrl(svg) {
108
+ return `data:image/svg+xml;base64,${window.btoa(unescape(encodeURIComponent(svg)))}`;
109
+ }
110
+ /**
111
+ * Render PlantUml diagram
112
+ * Uses plantuml-encoder to encode content and fetches SVG from PlantUml server
113
+ */
114
+ async function renderPlantUml(content) {
115
+ try {
116
+ const svgUrl = `https://www.plantuml.com/plantuml/svg/${(await import("plantuml-encoder")).default.encode(content)}`;
117
+ const response = await fetch(svgUrl);
118
+ if (!response.ok) throw new Error("Failed to fetch PlantUml SVG");
119
+ return svgToDataUrl(await response.text());
120
+ } catch (error) {
121
+ console.error("PlantUml rendering error:", error);
122
+ throw error;
123
+ }
124
+ }
125
+ /**
126
+ * Render Graphviz diagram
127
+ * Uses viz.js to render Graphviz DOT syntax to SVG
128
+ */
129
+ async function renderGraphviz(content) {
130
+ try {
131
+ let Viz;
132
+ let Module;
133
+ let render;
134
+ try {
135
+ const vizModule = await import("viz.js");
136
+ Viz = vizModule.default || vizModule;
137
+ const fullRender = await import("viz.js/full.render.js");
138
+ Module = fullRender.Module;
139
+ render = fullRender.render;
140
+ } catch (_importError) {
141
+ const vizModule = await import("viz.js");
142
+ Viz = vizModule.default || vizModule;
143
+ const fullRender = await import("viz.js/full.render");
144
+ Module = fullRender.Module;
145
+ render = fullRender.render;
146
+ }
147
+ return svgToDataUrl(await new Viz({
148
+ Module,
149
+ render
150
+ }).renderString(content, {
151
+ format: "svg",
152
+ engine: "dot"
153
+ }));
154
+ } catch (error) {
155
+ console.error("Graphviz rendering error:", error);
156
+ throw error;
157
+ }
158
+ }
159
+ /**
160
+ * Render Flowchart diagram
161
+ * Uses flowchart.js to parse and render flowchart syntax
162
+ */
163
+ async function renderFlowchart(content) {
164
+ try {
165
+ const chart = (await import("flowchart.js")).default.parse(content);
166
+ const el = document.createElement("div");
167
+ el.style.display = "none";
168
+ document.body.appendChild(el);
169
+ chart.drawSVG(el);
170
+ const svg = el.innerHTML;
171
+ document.body.removeChild(el);
172
+ return svgToDataUrl(svg);
173
+ } catch (error) {
174
+ console.error("Flowchart rendering error:", error);
175
+ throw error;
176
+ }
177
+ }
178
+ /**
179
+ * Render Mermaid diagram
180
+ * Uses mermaid to render Mermaid syntax
181
+ */
182
+ let mermaidInitialized = false;
183
+ async function renderMermaid(content) {
184
+ try {
185
+ const mermaid = await import("mermaid");
186
+ if (!mermaidInitialized) {
187
+ mermaid.default.initialize({ startOnLoad: false });
188
+ mermaidInitialized = true;
189
+ }
190
+ const id = `mermaid-${randomString(6, "lowerCase")}`;
191
+ const { svg } = await mermaid.default.render(id, content);
192
+ if (svg) return svgToDataUrl(svg);
193
+ throw new Error("Mermaid rendering failed");
194
+ } catch (error) {
195
+ console.error("Mermaid rendering error:", error);
196
+ throw error;
197
+ }
198
+ }
199
+ /**
200
+ * Render code drawing based on type
201
+ */
202
+ async function renderCodeDrawing(type, content) {
203
+ if (!content || !content.trim()) return "";
204
+ switch (type) {
205
+ case "PlantUml": return renderPlantUml(content);
206
+ case "Graphviz": return renderGraphviz(content);
207
+ case "Flowchart": return renderFlowchart(content);
208
+ case "Mermaid": return renderMermaid(content);
209
+ default: throw new Error(`Unsupported drawing type: ${type}`);
210
+ }
211
+ }
212
+
213
+ //#endregion
214
+ export { BaseCodeDrawingPlugin, CODE_DRAWING_KEY, CODE_DRAWING_TYPE, CODE_DRAWING_TYPE_ARRAY, DEFAULT_MIN_HEIGHT, DOWNLOAD_FILENAME, RENDER_DEBOUNCE_DELAY, VIEW_MODE, VIEW_MODE_ARRAY, downloadImage, insertCodeDrawing, renderCodeDrawing, renderFlowchart, renderGraphviz, renderMermaid, renderPlantUml };
215
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","names":["CODE_DRAWING_TYPE","PlantUml","Graphviz","Flowchart","Mermaid","const","CODE_DRAWING_TYPE_ARRAY","value","label","CodeDrawingType","VIEW_MODE","Both","Code","Image","VIEW_MODE_ARRAY","ViewMode","DEFAULT_MIN_HEIGHT","RENDER_DEBOUNCE_DELAY","DOWNLOAD_FILENAME","InsertNodesOptions","NodeProps","SlateEditor","TCodeDrawingElement","CODE_DRAWING_KEY","insertCodeDrawing","editor","props","options","tf","insertNodes","children","text","type","getType","data","drawingType","drawingMode","code","nextBlock","downloadImage","imageDataUrl","filename","imageEl","Image","src","onload","canvas","document","createElement","width","height","context","getContext","drawImage","a","href","toDataURL","download","click","CodeDrawingType","randomString","length","type","chars","result","i","charAt","Math","floor","random","svgToDataUrl","svg","window","btoa","unescape","encodeURIComponent","renderPlantUml","content","Promise","plantumlEncoder","encoded","default","encode","svgUrl","response","fetch","ok","Error","text","error","console","renderGraphviz","Viz","Module","render","vizModule","fullRender","_importError","viz","renderString","format","engine","renderFlowchart","flowchart","chart","parse","el","document","createElement","style","display","body","appendChild","drawSVG","innerHTML","removeChild","mermaidInitialized","renderMermaid","mermaid","initialize","startOnLoad","id","renderCodeDrawing","trim"],"sources":["../src/lib/constants.ts","../src/lib/transforms/insertCodeDrawing.ts","../src/lib/utils/download.ts","../src/lib/utils/renderers.ts"],"sourcesContent":["export const CODE_DRAWING_TYPE = {\n PlantUml: 'PlantUml',\n Graphviz: 'Graphviz',\n Flowchart: 'Flowchart',\n Mermaid: 'Mermaid',\n} as const;\n\nexport const CODE_DRAWING_TYPE_ARRAY = [\n {\n value: CODE_DRAWING_TYPE.PlantUml,\n label: CODE_DRAWING_TYPE.PlantUml,\n },\n {\n value: CODE_DRAWING_TYPE.Graphviz,\n label: CODE_DRAWING_TYPE.Graphviz,\n },\n {\n value: CODE_DRAWING_TYPE.Flowchart,\n label: CODE_DRAWING_TYPE.Flowchart,\n },\n {\n value: CODE_DRAWING_TYPE.Mermaid,\n label: CODE_DRAWING_TYPE.Mermaid,\n },\n] as const;\n\nexport type CodeDrawingType =\n (typeof CODE_DRAWING_TYPE)[keyof typeof CODE_DRAWING_TYPE];\n\n// View mode constants\nexport const VIEW_MODE = {\n Both: 'Both',\n Code: 'Code',\n Image: 'Image',\n} as const;\n\nexport const VIEW_MODE_ARRAY = [\n {\n value: VIEW_MODE.Both,\n label: VIEW_MODE.Both,\n },\n {\n value: VIEW_MODE.Code,\n label: VIEW_MODE.Code,\n },\n {\n value: VIEW_MODE.Image,\n label: VIEW_MODE.Image,\n },\n] as const;\n\nexport type ViewMode = (typeof VIEW_MODE)[keyof typeof VIEW_MODE];\n\n// UI constants\nexport const DEFAULT_MIN_HEIGHT = 300;\nexport const RENDER_DEBOUNCE_DELAY = 500;\nexport const DOWNLOAD_FILENAME = 'code-drawing.png';\n","import type { InsertNodesOptions, NodeProps, SlateEditor } from 'platejs';\n\nimport type { TCodeDrawingElement } from '../BaseCodeDrawingPlugin';\nimport { CODE_DRAWING_KEY } from '../BaseCodeDrawingPlugin';\n\nexport const insertCodeDrawing = (\n editor: SlateEditor,\n props: NodeProps<TCodeDrawingElement> = {},\n options: InsertNodesOptions = {}\n): void => {\n editor.tf.insertNodes<TCodeDrawingElement>(\n {\n children: [{ text: '' }],\n type: editor.getType(CODE_DRAWING_KEY),\n data: {\n drawingType: 'Mermaid',\n drawingMode: 'Both',\n code: '',\n ...(typeof props.data === 'object' && props.data !== null\n ? props.data\n : {}),\n },\n ...(props && typeof props === 'object' ? props : {}),\n },\n {\n nextBlock: true,\n ...(options && typeof options === 'object' ? options : {}),\n }\n );\n};\n","/**\n * Download image from data URL\n */\nexport function downloadImage(\n imageDataUrl: string,\n filename = 'code-drawing.png'\n): void {\n const imageEl = new Image();\n imageEl.src = imageDataUrl;\n imageEl.onload = () => {\n const canvas = document.createElement('canvas');\n canvas.width = imageEl.width;\n canvas.height = imageEl.height;\n const context = canvas.getContext('2d');\n if (context) {\n context.drawImage(imageEl, 0, 0);\n const a = document.createElement('a');\n a.href = canvas.toDataURL('image/png');\n a.download = filename;\n a.click();\n }\n };\n}\n","import type { CodeDrawingType } from '../constants';\n\n/**\n * Generate a random string for unique IDs\n */\nfunction randomString(\n length: number,\n type: 'lowerCase' | 'upperCase' = 'lowerCase'\n): string {\n const chars =\n type === 'lowerCase'\n ? 'abcdefghijklmnopqrstuvwxyz'\n : 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';\n let result = '';\n for (let i = 0; i < length; i++) {\n result += chars.charAt(Math.floor(Math.random() * chars.length));\n }\n return result;\n}\n\n/**\n * Convert SVG string to data URL\n */\nfunction svgToDataUrl(svg: string): string {\n return `data:image/svg+xml;base64,${window.btoa(unescape(encodeURIComponent(svg)))}`;\n}\n\n/**\n * Render PlantUml diagram\n * Uses plantuml-encoder to encode content and fetches SVG from PlantUml server\n */\nexport async function renderPlantUml(content: string): Promise<string> {\n try {\n // Dynamic import of plantuml-encoder\n const plantumlEncoder = await import('plantuml-encoder');\n const encoded = plantumlEncoder.default.encode(content);\n const svgUrl = `https://www.plantuml.com/plantuml/svg/${encoded}`;\n\n // Fetch SVG\n const response = await fetch(svgUrl);\n if (!response.ok) {\n throw new Error('Failed to fetch PlantUml SVG');\n }\n const svg = await response.text();\n return svgToDataUrl(svg);\n } catch (error) {\n console.error('PlantUml rendering error:', error);\n throw error;\n }\n}\n\n/**\n * Render Graphviz diagram\n * Uses viz.js to render Graphviz DOT syntax to SVG\n */\nexport async function renderGraphviz(content: string): Promise<string> {\n try {\n // Dynamic import of viz.js\n // Try different import patterns for compatibility\n let Viz: any;\n let Module: any;\n let render: any;\n\n try {\n const vizModule = await import('viz.js');\n Viz = vizModule.default || vizModule;\n\n const fullRender = await import('viz.js/full.render.js');\n Module = fullRender.Module;\n render = fullRender.render;\n } catch (_importError) {\n // Fallback: try alternative import\n const vizModule = await import('viz.js');\n Viz = vizModule.default || vizModule;\n const fullRender = await import('viz.js/full.render');\n Module = fullRender.Module;\n render = fullRender.render;\n }\n\n const viz = new Viz({ Module, render });\n const svg = await viz.renderString(content, {\n format: 'svg',\n engine: 'dot',\n });\n\n return svgToDataUrl(svg);\n } catch (error) {\n console.error('Graphviz rendering error:', error);\n throw error;\n }\n}\n\n/**\n * Render Flowchart diagram\n * Uses flowchart.js to parse and render flowchart syntax\n */\nexport async function renderFlowchart(content: string): Promise<string> {\n try {\n // Dynamic import of flowchart.js\n const flowchart = (await import('flowchart.js')).default;\n\n const chart = flowchart.parse(content);\n const el = document.createElement('div');\n el.style.display = 'none';\n document.body.appendChild(el);\n\n chart.drawSVG(el);\n const svg = el.innerHTML;\n document.body.removeChild(el);\n\n return svgToDataUrl(svg);\n } catch (error) {\n console.error('Flowchart rendering error:', error);\n throw error;\n }\n}\n\n/**\n * Render Mermaid diagram\n * Uses mermaid to render Mermaid syntax\n */\nlet mermaidInitialized = false;\n\nexport async function renderMermaid(content: string): Promise<string> {\n try {\n // Dynamic import of mermaid\n const mermaid = await import('mermaid');\n\n if (!mermaidInitialized) {\n mermaid.default.initialize({ startOnLoad: false });\n mermaidInitialized = true;\n }\n\n const id = `mermaid-${randomString(6, 'lowerCase')}`;\n const { svg } = await mermaid.default.render(id, content);\n\n if (svg) {\n return svgToDataUrl(svg);\n }\n\n throw new Error('Mermaid rendering failed');\n } catch (error) {\n console.error('Mermaid rendering error:', error);\n throw error;\n }\n}\n\n/**\n * Render code drawing based on type\n */\nexport async function renderCodeDrawing(\n type: CodeDrawingType,\n content: string\n): Promise<string> {\n if (!content || !content.trim()) {\n return '';\n }\n\n switch (type) {\n case 'PlantUml':\n return renderPlantUml(content);\n case 'Graphviz':\n return renderGraphviz(content);\n case 'Flowchart':\n return renderFlowchart(content);\n case 'Mermaid':\n return renderMermaid(content);\n default:\n throw new Error(`Unsupported drawing type: ${type}`);\n }\n}\n"],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ //#region src/react/CodeDrawingPlugin.d.ts
2
+ declare const CodeDrawingPlugin: any;
3
+ //#endregion
4
+ export { CodeDrawingPlugin };
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","names":[],"sources":["../../src/react/CodeDrawingPlugin.tsx"],"sourcesContent":[],"mappings":";cAIa"}
@@ -0,0 +1,9 @@
1
+ import { t as BaseCodeDrawingPlugin } from "../BaseCodeDrawingPlugin-BTeDVejh.js";
2
+ import { toPlatePlugin } from "platejs/react";
3
+
4
+ //#region src/react/CodeDrawingPlugin.tsx
5
+ const CodeDrawingPlugin = toPlatePlugin(BaseCodeDrawingPlugin);
6
+
7
+ //#endregion
8
+ export { CodeDrawingPlugin };
9
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","names":["toPlatePlugin","BaseCodeDrawingPlugin","CodeDrawingPlugin"],"sources":["../../src/react/CodeDrawingPlugin.tsx"],"sourcesContent":["import { toPlatePlugin } from 'platejs/react';\n\nimport { BaseCodeDrawingPlugin } from '../lib';\n\nexport const CodeDrawingPlugin = toPlatePlugin(BaseCodeDrawingPlugin);\n"],"mappings":";;;;AAIA,MAAaE,oBAAoBF,cAAcC,sBAAsB"}
package/package.json ADDED
@@ -0,0 +1,75 @@
1
+ {
2
+ "name": "@lofcz/platejs-code-drawing",
3
+ "version": "52.3.0",
4
+ "description": "Code drawing plugin for Plate (PlantUml, Graphviz, Flowchart, Mermaid)",
5
+ "keywords": [
6
+ "plate",
7
+ "plugin",
8
+ "slate",
9
+ "code-drawing",
10
+ "plantuml",
11
+ "graphviz",
12
+ "flowchart",
13
+ "mermaid"
14
+ ],
15
+ "homepage": "https://platejs.org",
16
+ "bugs": {
17
+ "url": "https://github.com/udecode/plate/issues"
18
+ },
19
+ "repository": {
20
+ "type": "git",
21
+ "url": "https://github.com/lofcz/plate.git",
22
+ "directory": "packages/code-drawing"
23
+ },
24
+ "license": "MIT",
25
+ "sideEffects": false,
26
+ "exports": {
27
+ ".": "./dist/index.js",
28
+ "./react": "./dist/react/index.js",
29
+ "./package.json": "./package.json"
30
+ },
31
+ "main": "./dist/index.js",
32
+ "types": "./dist/index.d.ts",
33
+ "files": [
34
+ "dist/**/*"
35
+ ],
36
+ "dependencies": {
37
+ "@codemirror/lang-javascript": "6.2.4",
38
+ "@codemirror/theme-one-dark": "6.1.3",
39
+ "@uiw/react-codemirror": "4.25.4",
40
+ "flowchart.js": "^1.15.0",
41
+ "lodash": "^4.17.21",
42
+ "mermaid": "^11.6.1",
43
+ "plantuml-encoder": "^1.4.0",
44
+ "react-compiler-runtime": "^1.0.0",
45
+ "viz.js": "^2.1.2",
46
+ "@platejs/utils": "npm:@lofcz/platejs-utils@52.3.4"
47
+ },
48
+ "devDependencies": {
49
+ "@types/lodash": "^4.17.13",
50
+ "@types/plantuml-encoder": "^1.4.2",
51
+ "@types/viz.js": "^2.1.5",
52
+ "@plate/scripts": "1.0.0"
53
+ },
54
+ "peerDependencies": {
55
+ "platejs": ">=52.0.11",
56
+ "react": ">=18.0.0",
57
+ "react-dom": ">=18.0.0"
58
+ },
59
+ "publishConfig": {
60
+ "access": "public"
61
+ },
62
+ "type": "module",
63
+ "module": "./dist/index.js",
64
+ "scripts": {
65
+ "brl": "plate-pkg p:brl",
66
+ "build": "plate-pkg p:build",
67
+ "build:watch": "plate-pkg p:build:watch",
68
+ "clean": "plate-pkg p:clean",
69
+ "lint": "plate-pkg p:lint",
70
+ "lint:fix": "plate-pkg p:lint:fix",
71
+ "test": "plate-pkg p:test",
72
+ "test:watch": "plate-pkg p:test:watch",
73
+ "typecheck": "plate-pkg p:typecheck"
74
+ }
75
+ }