43 lines
1.3 KiB
JavaScript
43 lines
1.3 KiB
JavaScript
// @flow
|
|
import { Node, Fragment } from "prosemirror-model";
|
|
import { parser, schema } from "rich-markdown-editor";
|
|
import { prosemirrorToYDoc } from "y-prosemirror";
|
|
import * as Y from "yjs";
|
|
import embeds from "../../../shared/embeds";
|
|
|
|
export default function markdownToYDoc(
|
|
markdown: string,
|
|
fieldName?: string = "default"
|
|
): Y.Doc {
|
|
let node = parser.parse(markdown);
|
|
|
|
// in rich-markdown-editor embeds were created at runtime by converting links
|
|
// into embeds where they match. Because we're converting to a CRDT structure
|
|
// on the server we need to mimic this behavior.
|
|
function urlsToEmbeds(node: Node): Node {
|
|
if (node.type.name === "paragraph") {
|
|
for (const textNode of node.content.content) {
|
|
for (const embed of embeds) {
|
|
if (textNode.text && embed.matcher(textNode.text)) {
|
|
return schema.nodes.embed.createAndFill({
|
|
href: textNode.text,
|
|
});
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
if (node.content) {
|
|
const contentAsArray =
|
|
node.content instanceof Fragment ? node.content.content : node.content;
|
|
node.content = Fragment.fromArray(contentAsArray.map(urlsToEmbeds));
|
|
}
|
|
|
|
return node;
|
|
}
|
|
|
|
node = urlsToEmbeds(node);
|
|
|
|
return prosemirrorToYDoc(node, fieldName);
|
|
}
|