From 95e6130d930d710f7099a70591a6c405d79668c1 Mon Sep 17 00:00:00 2001 From: Zixuan Chen Date: Wed, 1 Nov 2023 20:02:05 +0800 Subject: [PATCH] Fix: richtext event (#138) Support rich text event. Now it will emit the delta event correctly in the Quill Delta format. --- .vscode/settings.json | 1 + crates/loro-internal/benches/text_r.rs | 4 +- crates/loro-internal/deno.lock | 3 + .../loro-internal/src/container/richtext.rs | 73 ++- .../src/container/richtext/richtext_state.rs | 514 ++++++++---------- .../src/container/richtext/style_range_map.rs | 113 ++-- crates/loro-internal/src/delta.rs | 2 +- crates/loro-internal/src/delta/seq.rs | 3 + crates/loro-internal/src/delta/text.rs | 145 ++++- crates/loro-internal/src/event.rs | 2 +- .../src/fuzz/recursive_refactored.rs | 2 +- crates/loro-internal/src/fuzz/tree.rs | 2 +- crates/loro-internal/src/handler.rs | 29 +- crates/loro-internal/src/loro.rs | 27 +- crates/loro-internal/src/obs.rs | 6 +- .../loro-internal/src/state/richtext_state.rs | 130 +++-- crates/loro-internal/src/txn.rs | 124 +++-- crates/loro-internal/src/value.rs | 153 ++++-- crates/loro-internal/tests/richtext.rs | 56 +- crates/loro-internal/tests/test.rs | 158 +++++- crates/loro-wasm/src/lib.rs | 2 +- 21 files changed, 1004 insertions(+), 545 deletions(-) diff --git a/.vscode/settings.json b/.vscode/settings.json index 70fb0235..70811cda 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -20,6 +20,7 @@ "tinyvec", "txns", "unbold", + "unmark", "yspan" ], "rust-analyzer.runnableEnv": { diff --git a/crates/loro-internal/benches/text_r.rs b/crates/loro-internal/benches/text_r.rs index 7684525e..24920305 100644 --- a/crates/loro-internal/benches/text_r.rs +++ b/crates/loro-internal/benches/text_r.rs @@ -63,7 +63,7 @@ mod run { b.iter(|| { let loro = LoroDoc::default(); let text = loro.get_text("text"); - loro.subscribe_deep(Arc::new(move |event| { + loro.subscribe_root(Arc::new(move |event| { black_box(event); })); let mut txn = loro.txn().unwrap(); @@ -220,7 +220,7 @@ mod run { b.iter(|| { let loro = LoroDoc::default(); let text = loro.get_text("text"); - loro.subscribe_deep(Arc::new(move |event| { + loro.subscribe_root(Arc::new(move |event| { black_box(event); })); { diff --git a/crates/loro-internal/deno.lock b/crates/loro-internal/deno.lock index 138ebc45..9aa6158e 100644 --- a/crates/loro-internal/deno.lock +++ b/crates/loro-internal/deno.lock @@ -1,6 +1,9 @@ { "version": "3", "redirects": { + "https://deno.land/std/fmt/printf.ts": "https://deno.land/std@0.105.0/fmt/printf.ts", + "https://deno.land/std/path/mod.ts": "https://deno.land/std@0.105.0/path/mod.ts", + "https://deno.land/std/testing/asserts.ts": "https://deno.land/std@0.105.0/testing/asserts.ts", "https://x.nest.land/std@0.73.0/path/mod.ts": "https://lra6z45nakk5lnu3yjchp7tftsdnwwikwr65ocha5eojfnlgu4sa.arweave.net/XEHs860CldW2m8JEd_5lnIbbWQq0fdcI4OkckrVmpyQ/path/mod.ts" }, "remote": { diff --git a/crates/loro-internal/src/container/richtext.rs b/crates/loro-internal/src/container/richtext.rs index fba10a3f..b8181ef7 100644 --- a/crates/loro-internal/src/container/richtext.rs +++ b/crates/loro-internal/src/container/richtext.rs @@ -16,13 +16,15 @@ pub(crate) mod richtext_state; mod style_range_map; mod tracker; -use crate::{change::Lamport, utils::string_slice::StringSlice, InternalString}; +use crate::{change::Lamport, delta::StyleMeta, utils::string_slice::StringSlice, InternalString}; use fugue_span::*; -use loro_common::{Counter, LoroValue, PeerID}; +use loro_common::{Counter, LoroValue, PeerID, ID}; +use serde::{Deserialize, Serialize}; use std::fmt::Debug; pub(crate) use fugue_span::{RichtextChunk, RichtextChunkValue}; pub(crate) use richtext_state::RichtextState; +pub(crate) use style_range_map::Styles; pub(crate) use tracker::{CrdtRopeDelta, Tracker as RichtextTracker}; /// This is the data structure that represents a span of rich text. @@ -30,7 +32,7 @@ pub(crate) use tracker::{CrdtRopeDelta, Tracker as RichtextTracker}; #[derive(Debug, Clone, PartialEq, Eq, serde::Serialize, serde::Deserialize)] pub struct RichtextSpan { pub text: StringSlice, - pub styles: Vec