Skip to content

Commit e913793

Browse files
authored
Merge pull request #161 from PSDTools/loro
Use Loro
2 parents 901dee1 + cd7ce08 commit e913793

File tree

8 files changed

+293
-38
lines changed

8 files changed

+293
-38
lines changed

apps/petal-notes/package.json

+6-1
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,12 @@
3434
"@lezer/markdown": "catalog:",
3535
"codemirror": "catalog:",
3636
"hypermd": "catalog:",
37-
"svelte-codemirror-editor": "catalog:"
37+
"loro-codemirror": "catalog:",
38+
"loro-crdt": "catalog:",
39+
"svelte-codemirror-editor": "catalog:",
40+
"uint8array-extras": "catalog:",
41+
"vite-plugin-top-level-await": "catalog:",
42+
"vite-plugin-wasm": "catalog:"
3843
},
3944
"devDependencies": {
4045
"@chromatic-com/storybook": "catalog:",

apps/petal-notes/src/lib/hypermd.svelte

+41-6
Original file line numberDiff line numberDiff line change
@@ -5,39 +5,54 @@
55
closeBracketsKeymap,
66
completionKeymap,
77
} from "@codemirror/autocomplete";
8-
import { indentWithTab } from "@codemirror/commands";
8+
import { defaultKeymap, indentWithTab } from "@codemirror/commands";
99
import { markdown } from "@codemirror/lang-markdown";
1010
import {
1111
bracketMatching,
12+
defaultHighlightStyle,
1213
foldKeymap,
1314
indentOnInput,
15+
syntaxHighlighting,
1416
syntaxTree,
1517
} from "@codemirror/language";
1618
import { languages } from "@codemirror/language-data";
1719
import { highlightSelectionMatches, searchKeymap } from "@codemirror/search";
1820
import { EditorState } from "@codemirror/state";
1921
import {
2022
crosshairCursor,
23+
drawSelection,
2124
dropCursor,
2225
EditorView,
2326
highlightActiveLine,
27+
highlightSpecialChars,
2428
keymap,
2529
rectangularSelection,
2630
} from "@codemirror/view";
2731
import { printTree } from "@lezer-unofficial/printer";
2832
import { GFM } from "@lezer/markdown";
29-
import { minimalSetup } from "codemirror";
3033
import { hypermdExtensions, hypermdMarkdownExtensions } from "hypermd";
34+
import { LoroExtensions } from "loro-codemirror";
35+
import { Awareness, type LoroDoc, UndoManager } from "loro-crdt";
3136
import CodeMirror from "svelte-codemirror-editor";
37+
import { uint8ArrayToBase64 } from "uint8array-extras";
3238
3339
export interface Props {
34-
value: string;
40+
doc: LoroDoc;
3541
}
3642
37-
let { value = $bindable() }: Props = $props();
43+
let { doc }: Props = $props();
44+
45+
const awareness: Awareness = new Awareness(doc.peerIdStr);
46+
const undoManager = new UndoManager(doc, {});
3847
3948
const extensions = [
40-
minimalSetup,
49+
// minimalSetup,
50+
51+
highlightSpecialChars(),
52+
drawSelection(),
53+
syntaxHighlighting(defaultHighlightStyle, { fallback: true }),
54+
keymap.of([...defaultKeymap]),
55+
4156
dropCursor(),
4257
EditorState.allowMultipleSelections.of(true),
4358
indentOnInput(),
@@ -49,6 +64,15 @@
4964
highlightActiveLine(),
5065
highlightSelectionMatches(),
5166
67+
LoroExtensions(
68+
doc,
69+
{
70+
awareness,
71+
user: { colorClassName: "user1", name: "User 1" },
72+
},
73+
undoManager,
74+
),
75+
5276
EditorView.lineWrapping,
5377
hypermdExtensions,
5478
keymap.of([
@@ -69,6 +93,16 @@
6993
printTree(syntaxTree(view.state), view.state.doc.toString()),
7094
);
7195
96+
return true;
97+
},
98+
},
99+
{
100+
key: "Cmd-Shift-s",
101+
run: () => {
102+
if (import.meta.env.PROD) return true;
103+
104+
console.debug(uint8ArrayToBase64(doc.export({ mode: "snapshot" })));
105+
72106
return true;
73107
},
74108
},
@@ -83,5 +117,6 @@
83117
codeLanguages: languages,
84118
extensions: [GFM, hypermdMarkdownExtensions],
85119
})}
86-
bind:value
120+
value={/* This sets it initially, but Loro handles further updates. */
121+
doc.getText("codemirror").toString()}
87122
/>
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,19 @@
11
<script lang="ts">
22
import HyperMDC from "$lib/hypermd.svelte";
3+
import { LoroDoc } from "loro-crdt";
4+
import { base64ToUint8Array } from "uint8array-extras";
35
46
let { data } = $props();
7+
8+
const doc = new LoroDoc();
9+
doc.import(
10+
base64ToUint8Array(
11+
// eslint-disable-next-line @typescript-eslint/no-unsafe-member-access
12+
data.note,
13+
),
14+
);
515
</script>
616

717
<div class="overflow-hidden">
8-
<!-- eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -->
9-
<HyperMDC value={data.note} />
18+
<HyperMDC {doc} />
1019
</div>

apps/petal-notes/src/routes/(wrapper)/notes/[...path]/+page.ts

+1-28
Original file line numberDiff line numberDiff line change
@@ -9,34 +9,7 @@ interface Data {
99
const notes = new Map<string, string>([
1010
[
1111
"1",
12-
`---
13-
title: Hello, HyperMD!
14-
---
15-
# Your ~~HyperMD editor~~ Logo is here :gift:
16-
17-
Can’t figure out how to make it smaller, but it's here!
18-
19-
![Logo](/PetalNotes-logo.svg)
20-
21-
-------------------
22-
23-
All ~~builtin~~ features are ready to go 🤘
24-
Try out these methods!
25-
26-
1. \`HyperMD.switchToNormal(cm)\`
27-
2. \`HyperMD.switchToHyperMD(cm)\`
28-
3. \`cm.getValue()\` returns the Markdown source text
29-
30-
**Note**: This demo uses these powerpacks:
31-
32-
1. **fold-math-with-katex** uses _$K^{a}T_{e}X$_, the math typesetting library.
33-
2. **hover-with-marked** uses _marked_ to render footnotes[^1].
34-
35-
[^1]: Like this one!
36-
37-
[hypermd-doc]: <https://laobubu.net/HyperMD/docs/> HyperMD documentation
38-
[cm-manual]: <https://codemirror.net/doc/manual.html> CodeMirror User manual
39-
`,
12+
"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",
4013
],
4114
]);
4215

apps/petal-notes/vite.config.ts

+3-1
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@ import browserslistToEsbuild from "browserslist-to-esbuild";
66
import { browserslistToTargets } from "lightningcss";
77
import * as path from "node:path";
88
import process from "node:process";
9+
import topLevelAwait from "vite-plugin-top-level-await";
10+
import wasm from "vite-plugin-wasm";
911
import {
1012
coverageConfigDefaults,
1113
defaultExclude,
@@ -16,7 +18,7 @@ const browsersList = browserslist();
1618

1719
// https://vitejs.dev/config/
1820
export default defineConfig({
19-
plugins: [sveltekit(), tailwindcss()],
21+
plugins: [sveltekit(), tailwindcss(), wasm(), topLevelAwait()],
2022

2123
build: {
2224
cssMinify: "lightningcss",

0 commit comments

Comments
 (0)