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 +3 -0
- package/dist/index.mjs +413 -66
- package/dist/index.mjs.map +4 -4
- package/package.json +3 -1
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
|
-
|
|
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: "#
|
|
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: "#
|
|
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
|
-
|
|
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 {
|
|
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 {
|
|
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 (
|
|
17799
|
+
if (text) {
|
|
17763
17800
|
const slice2 = parser4?.(text);
|
|
17764
17801
|
if (!slice2 || typeof slice2 === "string") return false;
|
|
17765
|
-
|
|
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
|
|
19536
|
+
isElementDomNode as isElementDomNode5,
|
|
19246
19537
|
isEqual,
|
|
19247
19538
|
isTextSelection as isTextSelection3,
|
|
19248
19539
|
keyBinding as keyBinding2,
|
|
19249
|
-
NodeExtension as
|
|
19250
|
-
nodeInputRule as
|
|
19540
|
+
NodeExtension as NodeExtension7,
|
|
19541
|
+
nodeInputRule as nodeInputRule7,
|
|
19251
19542
|
setBlockType as setBlockType2
|
|
19252
19543
|
} from "@remirror/core";
|
|
19253
|
-
import { TextSelection as
|
|
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
|
|
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) =>
|
|
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
|
-
|
|
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(
|
|
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(
|
|
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
|
-
|
|
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
|
-
}, [
|
|
20085
|
+
}, [props.onError]);
|
|
19739
20086
|
if (!processedHtml) {
|
|
19740
20087
|
return /* @__PURE__ */ jsx21(
|
|
19741
20088
|
"div",
|