rme 0.1.0 → 0.1.1

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/dist/index.d.ts CHANGED
@@ -99,6 +99,7 @@ type CreateCodemirrorOptions = {
99
99
  */
100
100
  useProsemirrorHistoryKey?: boolean;
101
101
  codemirrorEditorViewConfig?: EditorViewConfig;
102
+ onValueChange?: (value: string) => void;
102
103
  };
103
104
  declare class MfCodemirrorView {
104
105
  private readonly view;
@@ -323,12 +324,14 @@ declare const ThemeProvider: React.FC<Props>;
323
324
  interface PreviewProps {
324
325
  doc: Node | string;
325
326
  delegateOptions?: EditorProps['delegateOptions'];
327
+ onError?: (e: Error) => void;
326
328
  }
327
329
  type HTMLAstNode = {
328
330
  attrs: Record<string, any>;
329
331
  name: string;
330
332
  type: string;
331
333
  children?: HTMLAstNode[];
334
+ content?: string;
332
335
  };
333
336
  declare const Preview: React.FC<PreviewProps>;
334
337
 
package/dist/index.mjs CHANGED
@@ -4576,7 +4576,8 @@ var rule2 = (state) => {
4576
4576
  const newToken = new Token2("inline", "", 0);
4577
4577
  newToken.children = [...childs];
4578
4578
  newTokens.push(newToken);
4579
- childs.length = 0;
4579
+ newToken.content = childs.map((child2) => child2.content).join("");
4580
+ childs = [];
4580
4581
  }
4581
4582
  newTokens.push(child);
4582
4583
  } else {
@@ -4615,6 +4616,28 @@ function MarkdownItHtmlInline(md) {
4615
4616
  }
4616
4617
  var markdown_it_html_inline_default = MarkdownItHtmlInline;
4617
4618
 
4619
+ // src/editor/transform/markdown-it-mermaid.ts
4620
+ import Token3 from "markdown-it/lib/token.mjs";
4621
+ var rule3 = (state) => {
4622
+ let edited = false;
4623
+ const tokens = state.tokens;
4624
+ const tokensLength = tokens.length;
4625
+ for (let i = 0; i <= tokensLength - 1; i++) {
4626
+ const curToken = tokens[i];
4627
+ if (curToken.type === "fence" && curToken.info === "mermaid") {
4628
+ const code = curToken.content;
4629
+ const mermaidToken = new Token3("mermaid_node", "", 0);
4630
+ mermaidToken.content = code;
4631
+ tokens[i] = mermaidToken;
4632
+ }
4633
+ }
4634
+ return edited;
4635
+ };
4636
+ function MarkdownItMermaid(md) {
4637
+ md.core.ruler.push("markdown-it-mermaid", rule3);
4638
+ }
4639
+ var markdown_it_mermaid_default = MarkdownItMermaid;
4640
+
4618
4641
  // src/editor/transform/parser.ts
4619
4642
  var UnknowMarkdownItTokenError = class extends Error {
4620
4643
  constructor(tokenType, supportedTokenTypes) {
@@ -4787,15 +4810,7 @@ function buildTokenHandlers(schema, parserRules) {
4787
4810
  var MarkdownParser = class {
4788
4811
  constructor(schema, parserRules) {
4789
4812
  this.schema = schema;
4790
- this.tokenizer = MarkdownIt("commonmark", { html: true }).disable([
4791
- "emphasis",
4792
- "autolink",
4793
- "backticks",
4794
- "entity",
4795
- "reference",
4796
- "image",
4797
- "link"
4798
- ]).enable(["table"]).use(markdown_it_html_inline_default).use(markdown_it_list_checkbox_default);
4813
+ this.tokenizer = MarkdownIt("commonmark", { html: true }).disable(["emphasis", "autolink", "backticks", "entity", "reference", "image", "link"]).enable(["table"]).use(markdown_it_html_inline_default).use(markdown_it_list_checkbox_default).use(markdown_it_mermaid_default);
4799
4814
  this.tokenHandlers = buildTokenHandlers(schema, parserRules);
4800
4815
  }
4801
4816
  parse(text) {
@@ -6966,7 +6981,7 @@ var styledLightTheme = {
6966
6981
  blockquoteFontColor: "#57606a",
6967
6982
  tableTdBorderColor: "#d0d7de",
6968
6983
  tableTrBgColor: "#ffffff",
6969
- tableTrDeepBgColor: "#f6f8fa",
6984
+ tableTrDeepBgColor: "#f6f6f6",
6970
6985
  tableTrBorderColor: "#d8dee4",
6971
6986
  tableSelectorBgColor: "#e5e5e5",
6972
6987
  tableSelectorBgHoverColor: "#c6c6c6",
@@ -6977,7 +6992,7 @@ var styledLightTheme = {
6977
6992
  tableSelectorCellBgColor: "#d7ecf9",
6978
6993
  tableSelectorCellBorderColor: "#1c7ed6",
6979
6994
  codeBgColor: "#afb8c133",
6980
- preBgColor: "#f6f8fa",
6995
+ preBgColor: "#f6f6f6",
6981
6996
  // components
6982
6997
  contextMenuBgColor: "#f6f7f9",
6983
6998
  contextMenuBgColorHover: "#1552B3",
@@ -7730,6 +7745,21 @@ var WysiwygThemeWrapper = styled.div.attrs((p) => ({
7730
7745
  outline: none;
7731
7746
  }
7732
7747
 
7748
+ .mermaid-node {
7749
+ position: relative;
7750
+ min-height: 40px;
7751
+ transition: all 0.3s;
7752
+
7753
+ &:hover {
7754
+ background-color: ${({ theme }) => theme.tipsBgColor};
7755
+ }
7756
+ }
7757
+
7758
+ .mermaid-src {
7759
+ outline: none;
7760
+ }
7761
+
7762
+
7733
7763
  & .ProseMirror-focused {
7734
7764
  outline: none;
7735
7765
  }
@@ -7740,12 +7770,18 @@ var WysiwygThemeWrapper = styled.div.attrs((p) => ({
7740
7770
 
7741
7771
  .html-node-label {
7742
7772
  position: absolute;
7743
- right: 0;
7773
+ top: 6px;
7774
+ right: 6px;
7775
+ padding: 4px 8px;
7744
7776
  opacity: 0;
7745
7777
  transition: all 0.3s;
7746
7778
  font-size: small;
7747
7779
  cursor: pointer;
7748
7780
  color: ${(props) => props.theme.labelFontColor};
7781
+
7782
+ &:hover {
7783
+ background-color: ${(props) => props.theme.hoverColor};
7784
+ }
7749
7785
  }
7750
7786
 
7751
7787
  .node-enter {
@@ -7755,7 +7791,6 @@ var WysiwygThemeWrapper = styled.div.attrs((p) => ({
7755
7791
 
7756
7792
  & .html-node-label {
7757
7793
  opacity: 1;
7758
- background-color: ${({ theme }) => theme.tipsBgColor};
7759
7794
  }
7760
7795
  }
7761
7796
 
@@ -9582,7 +9617,9 @@ import { EditorView as CodeMirrorEditorView, keymap } from "@codemirror/view";
9582
9617
  import { assertGet, isPromise, replaceNodeAtPosition } from "@remirror/core";
9583
9618
  import { exitCode as exitCode2 } from "@remirror/pm/commands";
9584
9619
  import { Selection, TextSelection as TextSelection3 } from "@remirror/pm/state";
9585
- import { ensureSyntaxTree } from "@codemirror/language";
9620
+ import {
9621
+ ensureSyntaxTree
9622
+ } from "@codemirror/language";
9586
9623
  import { languages } from "@codemirror/language-data";
9587
9624
  import { nanoid as nanoid3 } from "nanoid";
9588
9625
 
@@ -9738,6 +9775,7 @@ var MfCodemirrorView = class {
9738
9775
  change.text ? this.schema.text(change.text) : []
9739
9776
  );
9740
9777
  this.view.dispatch(transaction);
9778
+ this.options?.onValueChange?.(tr.state.doc.toString());
9741
9779
  }
9742
9780
  }
9743
9781
  asProseMirrorSelection(doc) {
@@ -16345,7 +16383,6 @@ var HtmlNodeView = class {
16345
16383
  this._htmlSrcElt.classList.add("html-src", "node-hide");
16346
16384
  this.languageConf = new Compartment2();
16347
16385
  this.dom.appendChild(this._htmlSrcElt);
16348
- this.dom.addEventListener("click", () => this.ensureFocus());
16349
16386
  label.addEventListener("click", () => this.ensureFocus());
16350
16387
  this.dom.addEventListener("mouseenter", this.handleMouseEnter);
16351
16388
  this.dom.addEventListener("mouseleave", this.handleMouseLeave);
@@ -16498,7 +16535,7 @@ function arrowHandler(dir) {
16498
16535
  const side = dir === "left" || dir === "up" ? -1 : 1;
16499
16536
  const $head = tr.selection.$head;
16500
16537
  const nextPos = Selection2.near(tr.doc.resolve(side > 0 ? $head.after() : $head.before()), side);
16501
- if (nextPos.$head && (nextPos.$head.parent.type.name === "codeMirror" || nextPos.$head.parent.type.name === "html_block")) {
16538
+ if (nextPos.$head && (nextPos.$head.parent.type.name === "codeMirror" || nextPos.$head.parent.type.name === "html_block" || nextPos.$head.parent.type.name === "mermaid_node")) {
16502
16539
  dispatch?.(tr.setSelection(nextPos));
16503
16540
  return true;
16504
16541
  }
@@ -17717,7 +17754,7 @@ function createDecorationSet(props) {
17717
17754
 
17718
17755
  // src/editor/extensions/Clipboard/clipboard-extension.ts
17719
17756
  import { PlainExtension as PlainExtension7 } from "@remirror/core";
17720
- import { DOMSerializer, DOMParser as DOMParser2 } from "@remirror/pm/model";
17757
+ import { DOMParser as DOMParser2 } from "@remirror/pm/model";
17721
17758
  function isPureText(content) {
17722
17759
  if (!content) return false;
17723
17760
  if (Array.isArray(content)) {
@@ -17759,10 +17796,11 @@ var ClipboardExtension = class extends PlainExtension7 {
17759
17796
  if (html2.length === 0 && text.length === 0) return false;
17760
17797
  const domParser = DOMParser2.fromSchema(schema);
17761
17798
  let dom;
17762
- if (html2.length === 0) {
17799
+ if (text) {
17763
17800
  const slice2 = parser4?.(text);
17764
17801
  if (!slice2 || typeof slice2 === "string") return false;
17765
- dom = DOMSerializer.fromSchema(schema).serializeFragment(slice2.content);
17802
+ view.dispatch(view.state.tr.replaceSelectionWith(slice2, true));
17803
+ return true;
17766
17804
  } else {
17767
17805
  const template = document.createElement("template");
17768
17806
  template.innerHTML = html2;
@@ -18206,6 +18244,258 @@ HtmlInlineNodeExtension = __decorateClass([
18206
18244
  })
18207
18245
  ], HtmlInlineNodeExtension);
18208
18246
 
18247
+ // src/editor/extensions/Mermaid/mermaid-extension.ts
18248
+ import { NodeExtension as NodeExtension6, isElementDomNode as isElementDomNode4, nodeInputRule as nodeInputRule6 } from "@remirror/core";
18249
+
18250
+ // src/editor/extensions/Mermaid/mermaid-view.ts
18251
+ import { Compartment as Compartment3 } from "@codemirror/state";
18252
+ import mermaid from "mermaid";
18253
+
18254
+ // src/editor/utils/eventbus.ts
18255
+ import EventBus from "js-event-bus";
18256
+ var eventBus = new EventBus();
18257
+
18258
+ // src/editor/extensions/Mermaid/mermaid-view.ts
18259
+ var renderCount = { count: 0 };
18260
+ var MermaidNodeView = class {
18261
+ constructor(node, view, getPos) {
18262
+ this._htmlSrcElt = null;
18263
+ this.destroying = false;
18264
+ this.renderViewId = null;
18265
+ this.ignoreMutation = () => true;
18266
+ this.handleMouseEnter = () => {
18267
+ this.dom.classList.add("node-enter");
18268
+ };
18269
+ this.handleMouseLeave = () => {
18270
+ this.dom.classList.remove("node-enter");
18271
+ };
18272
+ // == Rendering ===================================== //
18273
+ this.changeTheme = () => {
18274
+ console.log("change theme");
18275
+ this.renderHtml();
18276
+ };
18277
+ this._node = node;
18278
+ this._outerView = view;
18279
+ this._getPos = getPos;
18280
+ this.schema = node.type.schema;
18281
+ this.dom = document.createElement("div");
18282
+ this.dom.classList.add("mermaid-node");
18283
+ this._htmlRenderElt = document.createElement("p");
18284
+ this._htmlRenderElt.textContent = "";
18285
+ this._htmlRenderElt.classList.add("html-node-render");
18286
+ const label = document.createElement("span");
18287
+ label.innerHTML = `<i class="ri-expand-left-right-line"></i> mermaid`;
18288
+ label.classList.add("html-node-label");
18289
+ this.dom.appendChild(label);
18290
+ this.dom.appendChild(this._htmlRenderElt);
18291
+ this._htmlSrcElt = document.createElement("span");
18292
+ this._htmlSrcElt.classList.add("mermaid-src", "node-hide");
18293
+ this.languageConf = new Compartment3();
18294
+ this.dom.appendChild(this._htmlSrcElt);
18295
+ label.addEventListener("click", () => this.ensureFocus());
18296
+ label.addEventListener("click", () => this.ensureFocus());
18297
+ this.dom.addEventListener("mouseenter", this.handleMouseEnter);
18298
+ this.dom.addEventListener("mouseleave", this.handleMouseLeave);
18299
+ this.renderHtml();
18300
+ eventBus.on("change-theme", this.changeTheme);
18301
+ }
18302
+ ensureFocus() {
18303
+ if (this._outerView.hasFocus()) {
18304
+ if (this._innerView) {
18305
+ this._innerView.focus();
18306
+ } else {
18307
+ this.openEditor();
18308
+ }
18309
+ }
18310
+ }
18311
+ update(node) {
18312
+ this._node = node;
18313
+ return !!this.mfCodemirrorView?.update(node);
18314
+ }
18315
+ // == Events ===================================== //
18316
+ selectNode() {
18317
+ if (!this.mfCodemirrorView?.updating) {
18318
+ this.openEditor();
18319
+ }
18320
+ }
18321
+ deselectNode() {
18322
+ if (this.mfCodemirrorView?.updating) {
18323
+ this.closeEditor();
18324
+ }
18325
+ }
18326
+ stopEvent() {
18327
+ return true;
18328
+ }
18329
+ renderHtml() {
18330
+ console.log("render", this._node);
18331
+ if (!this._htmlRenderElt) {
18332
+ return;
18333
+ }
18334
+ const content = this.mfCodemirrorView?.content || this._node.textContent;
18335
+ try {
18336
+ this._htmlRenderElt.innerHTML = "";
18337
+ this._htmlRenderElt.classList.remove("node-hide");
18338
+ this._htmlRenderElt.classList.add("node-show");
18339
+ renderCount.count++;
18340
+ const id2 = `mermaid-${renderCount.count}`;
18341
+ mermaid.render(id2, content).then(({ svg, bindFunctions }) => {
18342
+ if (!this._htmlRenderElt) {
18343
+ return;
18344
+ }
18345
+ this._htmlRenderElt.innerHTML = svg;
18346
+ bindFunctions?.(this._htmlRenderElt);
18347
+ }).catch((err) => {
18348
+ document.getElementById("d" + id2)?.remove();
18349
+ console.error("\u6E32\u67D3\u5931\u8D25:", id2, err);
18350
+ });
18351
+ } catch (err) {
18352
+ }
18353
+ }
18354
+ // == Inner Editor ================================== /
18355
+ setSelection(anchor, head) {
18356
+ if (!this._innerView) {
18357
+ this.openEditor();
18358
+ this.mfCodemirrorView.setSelection(anchor, head);
18359
+ } else {
18360
+ this.mfCodemirrorView?.setSelection(anchor, head);
18361
+ }
18362
+ }
18363
+ openEditor() {
18364
+ if (this._innerView) {
18365
+ throw Error("inner view should not exist!");
18366
+ }
18367
+ this.mfCodemirrorView = new MfCodemirrorView({
18368
+ view: this._outerView,
18369
+ node: this._node,
18370
+ getPos: this._getPos,
18371
+ languageName: "mermaid",
18372
+ extensions: [minimalSetup],
18373
+ options: {
18374
+ useProsemirrorHistoryKey: true,
18375
+ codemirrorEditorViewConfig: {
18376
+ parent: this._htmlSrcElt
18377
+ }
18378
+ }
18379
+ });
18380
+ this._htmlSrcElt.classList.remove("node-hide");
18381
+ this._innerView = this.mfCodemirrorView.cm;
18382
+ this._htmlRenderElt?.classList.add("node-hide");
18383
+ const prevCursorPos = this._node.textContent.length || 0;
18384
+ this.setSelection(prevCursorPos, prevCursorPos);
18385
+ this._innerView.focus();
18386
+ this._innerView.contentDOM.addEventListener("blur", () => {
18387
+ if (this.destroying) return;
18388
+ this.closeEditor(true);
18389
+ });
18390
+ this.mfCodemirrorView.forwardSelection();
18391
+ }
18392
+ destroy() {
18393
+ this.destroying = true;
18394
+ this.closeEditor(false);
18395
+ if (this._htmlRenderElt) {
18396
+ this._htmlRenderElt.remove();
18397
+ delete this._htmlRenderElt;
18398
+ }
18399
+ if (this._htmlSrcElt) {
18400
+ this._htmlSrcElt.remove();
18401
+ this._htmlSrcElt = null;
18402
+ }
18403
+ this.dom.removeEventListener("mouseenter", this.handleMouseEnter);
18404
+ this.dom.removeEventListener("mouseleave", this.handleMouseLeave);
18405
+ this.dom.remove();
18406
+ eventBus.detach("change-theme", this.changeTheme);
18407
+ }
18408
+ closeEditor(render = true) {
18409
+ if (this._innerView) {
18410
+ this._innerView.destroy();
18411
+ this._innerView = void 0;
18412
+ }
18413
+ if (this.mfCodemirrorView) {
18414
+ this.mfCodemirrorView.destroy();
18415
+ this.mfCodemirrorView = void 0;
18416
+ }
18417
+ if (render) {
18418
+ this.renderHtml();
18419
+ }
18420
+ }
18421
+ };
18422
+
18423
+ // src/editor/extensions/Mermaid/mermaid-extension.ts
18424
+ import { TextSelection as TextSelection6 } from "@remirror/pm/state";
18425
+ var MermaidBlockExtension = class extends NodeExtension6 {
18426
+ get name() {
18427
+ return "mermaid_node";
18428
+ }
18429
+ createNodeSpec(extra, override) {
18430
+ return {
18431
+ group: "block",
18432
+ content: "text*",
18433
+ defining: true,
18434
+ ...override,
18435
+ code: true,
18436
+ marks: "",
18437
+ attrs: {
18438
+ ...extra.defaults()
18439
+ },
18440
+ parseDOM: [
18441
+ {
18442
+ tag: "pre",
18443
+ getAttrs: (node) => isElementDomNode4(node) ? extra.parse(node) : false
18444
+ },
18445
+ ...override.parseDOM ?? []
18446
+ ],
18447
+ toDOM() {
18448
+ return ["pre", { "data-type": "mermaid" }, 0];
18449
+ },
18450
+ isolating: true
18451
+ };
18452
+ }
18453
+ createNodeViews() {
18454
+ return (node, view, getPos) => {
18455
+ return new MermaidNodeView(node, view, getPos);
18456
+ };
18457
+ }
18458
+ createInputRules() {
18459
+ const rules = [
18460
+ nodeInputRule6({
18461
+ regexp: /^```mermaid$/,
18462
+ type: this.type,
18463
+ beforeDispatch: ({ tr, start, match }) => {
18464
+ const $pos = tr.doc.resolve(start);
18465
+ tr.setSelection(TextSelection6.near($pos));
18466
+ }
18467
+ })
18468
+ ];
18469
+ return rules;
18470
+ }
18471
+ createKeymap() {
18472
+ return {
18473
+ ArrowLeft: arrowHandler("left"),
18474
+ ArrowRight: arrowHandler("right"),
18475
+ ArrowUp: arrowHandler("up"),
18476
+ ArrowDown: arrowHandler("down")
18477
+ };
18478
+ }
18479
+ fromMarkdown() {
18480
+ return [
18481
+ {
18482
+ type: 2 /* block */,
18483
+ token: "mermaid_node",
18484
+ node: this.name,
18485
+ hasOpenClose: false
18486
+ }
18487
+ ];
18488
+ }
18489
+ toMarkdown({ state, node }) {
18490
+ state.write("```mermaid\n");
18491
+ state.text(node.textContent, false);
18492
+ state.text("\n");
18493
+ state.write("```");
18494
+ state.closeBlock(node);
18495
+ state.ensureNewLine();
18496
+ }
18497
+ };
18498
+
18209
18499
  // src/editor/extensions/index.ts
18210
18500
  function extensions({ handleViewImgSrcUrl }) {
18211
18501
  return [
@@ -18253,7 +18543,8 @@ function extensions({ handleViewImgSrcUrl }) {
18253
18543
  new DropCursorExtension({}),
18254
18544
  new SlashMenuExtension(),
18255
18545
  new LineInlineMarkExtension(),
18256
- new LineInlineDecorationExtension()
18546
+ new LineInlineDecorationExtension(),
18547
+ new MermaidBlockExtension({})
18257
18548
  ];
18258
18549
  }
18259
18550
  var extensions_default = extensions;
@@ -19242,15 +19533,15 @@ import {
19242
19533
  command as command4,
19243
19534
  extension as extension9,
19244
19535
  findParentNodeOfType as findParentNodeOfType5,
19245
- isElementDomNode as isElementDomNode4,
19536
+ isElementDomNode as isElementDomNode5,
19246
19537
  isEqual,
19247
19538
  isTextSelection as isTextSelection3,
19248
19539
  keyBinding as keyBinding2,
19249
- NodeExtension as NodeExtension6,
19250
- nodeInputRule as nodeInputRule6,
19540
+ NodeExtension as NodeExtension7,
19541
+ nodeInputRule as nodeInputRule7,
19251
19542
  setBlockType as setBlockType2
19252
19543
  } from "@remirror/core";
19253
- import { TextSelection as TextSelection6 } from "@remirror/pm/state";
19544
+ import { TextSelection as TextSelection7 } from "@remirror/pm/state";
19254
19545
 
19255
19546
  // src/editor/extensions/CodeMirror/codemirror-node-view.ts
19256
19547
  var CodeMirror6NodeView = class {
@@ -19308,7 +19599,7 @@ var CodeMirror6NodeView = class {
19308
19599
  // src/editor/extensions/CodeMirror/codemirror-extension.ts
19309
19600
  import { languages as languages3 } from "@codemirror/language-data";
19310
19601
  var fakeIndentedLanguage = "indent-code";
19311
- var LineCodeMirrorExtension = class extends NodeExtension6 {
19602
+ var LineCodeMirrorExtension = class extends NodeExtension7 {
19312
19603
  get name() {
19313
19604
  return "codeMirror";
19314
19605
  }
@@ -19328,7 +19619,7 @@ var LineCodeMirrorExtension = class extends NodeExtension6 {
19328
19619
  parseDOM: [
19329
19620
  {
19330
19621
  tag: "pre",
19331
- getAttrs: (node) => isElementDomNode4(node) ? extra.parse(node) : false
19622
+ getAttrs: (node) => isElementDomNode5(node) ? extra.parse(node) : false
19332
19623
  },
19333
19624
  ...override.parseDOM ?? []
19334
19625
  ],
@@ -19367,18 +19658,18 @@ var LineCodeMirrorExtension = class extends NodeExtension6 {
19367
19658
  * when typing triple back tick followed by a space.
19368
19659
  */
19369
19660
  createInputRules() {
19370
- const regexp = /^```(\S+) $/;
19661
+ const regexp = /^```(?!mermaid)(\S*) $/;
19371
19662
  const getAttributes = (match) => {
19372
19663
  const language = match[1] ?? "";
19373
19664
  return { language };
19374
19665
  };
19375
19666
  return [
19376
- nodeInputRule6({
19667
+ nodeInputRule7({
19377
19668
  regexp,
19378
19669
  type: this.type,
19379
19670
  beforeDispatch: ({ tr, start }) => {
19380
19671
  const $pos = tr.doc.resolve(start);
19381
- tr.setSelection(TextSelection6.near($pos));
19672
+ tr.setSelection(TextSelection7.near($pos));
19382
19673
  },
19383
19674
  getAttributes
19384
19675
  })
@@ -19407,7 +19698,7 @@ var LineCodeMirrorExtension = class extends NodeExtension6 {
19407
19698
  const pos = tr.selection.$from.before();
19408
19699
  const end = pos + nodeSize2 + 1;
19409
19700
  tr.replaceWith(pos, end, this.type.create({ language }));
19410
- tr.setSelection(TextSelection6.near(tr.doc.resolve(pos + 1)));
19701
+ tr.setSelection(TextSelection7.near(tr.doc.resolve(pos + 1)));
19411
19702
  if (dispatch) {
19412
19703
  dispatch(tr);
19413
19704
  }
@@ -19626,7 +19917,7 @@ import { useHelpers, useKeymap, useRemirrorContext as useRemirrorContext4, useCo
19626
19917
 
19627
19918
  // src/editor/components/ThemeProvider.tsx
19628
19919
  import { ThemeProvider as ScThemeProvider } from "styled-components";
19629
- import { useEffect as useEffect7 } from "react";
19920
+ import { memo as memo8, useEffect as useEffect7 } from "react";
19630
19921
 
19631
19922
  // src/editor/i18n/index.ts
19632
19923
  import i18next from "i18next";
@@ -19669,8 +19960,9 @@ function changeLng(lng) {
19669
19960
  }
19670
19961
 
19671
19962
  // src/editor/components/ThemeProvider.tsx
19963
+ import mermaid2 from "mermaid";
19672
19964
  import { jsx as jsx20 } from "react/jsx-runtime";
19673
- var ThemeProvider = ({ theme, i18n, children }) => {
19965
+ var ThemeProvider = memo8(({ theme, i18n, children }) => {
19674
19966
  const mode = theme?.mode || "light";
19675
19967
  const defaultThemeToken = mode === "dark" ? darkTheme.styledConstants : lightTheme.styledConstants;
19676
19968
  const themeToken = theme?.token ? { ...defaultThemeToken, ...theme.token } : defaultThemeToken;
@@ -19686,16 +19978,95 @@ var ThemeProvider = ({ theme, i18n, children }) => {
19686
19978
  useEffect7(() => {
19687
19979
  const codemirrorTheme = theme?.codemirrorTheme || mode === "dark" ? darkTheme.codemirrorTheme : lightTheme.codemirrorTheme;
19688
19980
  changeTheme(codemirrorTheme);
19981
+ mermaid2.initialize({
19982
+ theme: mode === "dark" ? "dark" : "default"
19983
+ });
19984
+ eventBus.emit("change-theme");
19689
19985
  }, [mode, theme?.codemirrorTheme, changeTheme]);
19690
19986
  return /* @__PURE__ */ jsx20(ScThemeProvider, { theme: themeToken, children });
19691
- };
19987
+ });
19692
19988
 
19693
19989
  // src/editor/components/Preview/preview.tsx
19694
- import { prosemirrorNodeToHtml as prosemirrorNodeToHtml2 } from "remirror";
19695
- import HTML3 from "html-parse-stringify";
19696
19990
  import { useEffect as useEffect8, useState as useState9 } from "react";
19697
- import { nanoid as nanoid4 } from "nanoid";
19698
19991
  import { Icon } from "zens";
19992
+
19993
+ // src/editor/utils/prosemirrorNodeToHtml.ts
19994
+ import HTML3 from "html-parse-stringify";
19995
+ import { prosemirrorNodeToHtml as prosemirrorNodeToHtml2 } from "remirror";
19996
+ import { nanoid as nanoid4 } from "nanoid";
19997
+ import mermaid3 from "mermaid";
19998
+ var handlerByAdditions = {
19999
+ img: [
20000
+ {
20001
+ checker: (node, delegateOptions) => {
20002
+ return node.name === "img" && node.attrs?.src && delegateOptions?.handleViewImgSrcUrl;
20003
+ },
20004
+ handler: async (node, delegateOptions) => {
20005
+ node.attrs.src = await delegateOptions?.handleViewImgSrcUrl?.(node.attrs.src);
20006
+ node.attrs.key = nanoid4();
20007
+ }
20008
+ }
20009
+ ],
20010
+ pre: [
20011
+ {
20012
+ checker: (node) => {
20013
+ return node.attrs["data-type"] === "mermaid";
20014
+ },
20015
+ handler: async (node, delegateOptions) => {
20016
+ let textContent = node.children?.[0]?.content || "";
20017
+ const dom = document.createElement("div");
20018
+ dom.innerHTML = textContent;
20019
+ textContent = dom.textContent || "";
20020
+ const res = await mermaid3.render(
20021
+ `mermaid_${previewMermaidRenderCount.count++}`,
20022
+ textContent
20023
+ );
20024
+ const svgAst = HTML3.parse(res.svg);
20025
+ node.name = "div";
20026
+ node.attrs = {
20027
+ key: nanoid4()
20028
+ };
20029
+ node.children = svgAst;
20030
+ }
20031
+ }
20032
+ ]
20033
+ };
20034
+ var previewMermaidRenderCount = { count: 0 };
20035
+ var rmeProsemirrorNodeToHtml = async (doc, delegateOptions) => {
20036
+ const html2 = prosemirrorNodeToHtml2(doc);
20037
+ const fullAst = HTML3.parse(html2);
20038
+ const imageLoadTasks = [];
20039
+ const handleHtmlText = (ast) => {
20040
+ const handleNode = (node) => {
20041
+ if (!node) {
20042
+ return;
20043
+ }
20044
+ const handlerByAddition = handlerByAdditions[node.name];
20045
+ if (handlerByAddition) {
20046
+ for (const handler of handlerByAddition) {
20047
+ if (handler.checker(node, delegateOptions)) {
20048
+ imageLoadTasks.push(handler.handler(node, delegateOptions));
20049
+ }
20050
+ }
20051
+ }
20052
+ if (node.children) {
20053
+ handleHtmlText(node.children);
20054
+ }
20055
+ };
20056
+ for (let i = 0; i < ast.length; i++) {
20057
+ handleNode(ast[i]);
20058
+ }
20059
+ };
20060
+ handleHtmlText(fullAst);
20061
+ try {
20062
+ await Promise.all(imageLoadTasks);
20063
+ return HTML3.stringify(fullAst);
20064
+ } catch (error) {
20065
+ return html2;
20066
+ }
20067
+ };
20068
+
20069
+ // src/editor/components/Preview/preview.tsx
19699
20070
  import { jsx as jsx21 } from "react/jsx-runtime";
19700
20071
  var Preview = (props) => {
19701
20072
  const { doc, delegateOptions } = props;
@@ -19704,38 +20075,14 @@ var Preview = (props) => {
19704
20075
  if (typeof targetDoc === "string") {
19705
20076
  targetDoc = createWysiwygDelegate(delegateOptions).stringToDoc(targetDoc);
19706
20077
  }
19707
- const html2 = prosemirrorNodeToHtml2(targetDoc);
19708
20078
  useEffect8(() => {
19709
- const fullAst = HTML3.parse(html2);
19710
- const imageLoadTasks = [];
19711
- const handleHtmlText = async (ast) => {
19712
- const handleNode = (node) => {
19713
- if (!node) {
19714
- return;
19715
- }
19716
- if (node.name === "img" && node.attrs?.src && delegateOptions?.handleViewImgSrcUrl) {
19717
- imageLoadTasks.push(
19718
- (async () => {
19719
- node.attrs.src = await delegateOptions?.handleViewImgSrcUrl?.(node.attrs.src);
19720
- node.attrs.key = nanoid4();
19721
- })()
19722
- );
19723
- }
19724
- if (node.children) {
19725
- handleHtmlText(node.children);
19726
- }
19727
- };
19728
- for (let i = 0; i < ast.length; i++) {
19729
- handleNode(ast[i]);
19730
- }
19731
- };
19732
- handleHtmlText(fullAst);
19733
- Promise.all(imageLoadTasks).then((res) => {
19734
- setProcessedHtml(HTML3.stringify(fullAst));
19735
- }).catch(() => {
20079
+ rmeProsemirrorNodeToHtml(targetDoc, delegateOptions).then((html2) => {
19736
20080
  setProcessedHtml(html2);
20081
+ }).catch((e) => {
20082
+ props.onError?.(e);
20083
+ console.error(e);
19737
20084
  });
19738
- }, [html2]);
20085
+ }, [props.onError]);
19739
20086
  if (!processedHtml) {
19740
20087
  return /* @__PURE__ */ jsx21(
19741
20088
  "div",