mirror of
https://github.com/AppFlowy-IO/AppFlowy.git
synced 2025-04-24 22:57:12 -04:00
generic document data
This commit is contained in:
parent
27681fda07
commit
48c3436ada
6 changed files with 51 additions and 7 deletions
|
@ -43,7 +43,7 @@ class Rules {
|
||||||
const FormatLinkAtCaretPositionRule(),
|
const FormatLinkAtCaretPositionRule(),
|
||||||
const ResolveLineFormatRule(),
|
const ResolveLineFormatRule(),
|
||||||
const ResolveInlineFormatRule(),
|
const ResolveInlineFormatRule(),
|
||||||
// const InsertEmbedsRule(),
|
const InsertEmbedsRule(),
|
||||||
// const ForceNewlineForInsertsAroundEmbedRule(),
|
// const ForceNewlineForInsertsAroundEmbedRule(),
|
||||||
const AutoExitBlockRule(),
|
const AutoExitBlockRule(),
|
||||||
const PreserveBlockStyleOnInsertRule(),
|
const PreserveBlockStyleOnInsertRule(),
|
||||||
|
|
19
rust-lib/flowy-ot/src/client/document/data.rs
Normal file
19
rust-lib/flowy-ot/src/client/document/data.rs
Normal file
|
@ -0,0 +1,19 @@
|
||||||
|
use crate::{client::DocumentData, errors::OTError};
|
||||||
|
use serde::{Deserialize, Serialize};
|
||||||
|
use serde_json::Error;
|
||||||
|
|
||||||
|
impl<T: AsRef<str>> DocumentData for T {
|
||||||
|
fn into_string(self) -> Result<String, OTError> { Ok(self.as_ref().to_string()) }
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Serialize, Deserialize, Debug)]
|
||||||
|
pub struct ImageData {
|
||||||
|
image: String,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl DocumentData for ImageData {
|
||||||
|
fn into_string(self) -> Result<String, OTError> {
|
||||||
|
let s = serde_json::to_string(&self)?;
|
||||||
|
Ok(s)
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,10 +1,12 @@
|
||||||
use crate::{
|
use crate::{
|
||||||
client::{view::View, History, RevId, UndoResult},
|
client::{view::View, History, RevId, UndoResult, RECORD_THRESHOLD},
|
||||||
core::*,
|
core::*,
|
||||||
errors::{ErrorBuilder, OTError, OTErrorCode, OTErrorCode::*},
|
errors::{ErrorBuilder, OTError, OTErrorCode, OTErrorCode::*},
|
||||||
};
|
};
|
||||||
|
|
||||||
pub const RECORD_THRESHOLD: usize = 400; // in milliseconds
|
pub trait DocumentData {
|
||||||
|
fn into_string(self) -> Result<String, OTError>;
|
||||||
|
}
|
||||||
|
|
||||||
pub struct Document {
|
pub struct Document {
|
||||||
delta: Delta,
|
delta: Delta,
|
||||||
|
@ -30,10 +32,12 @@ impl Document {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn insert(&mut self, index: usize, text: &str) -> Result<Delta, OTError> {
|
pub fn insert<T: DocumentData>(&mut self, index: usize, data: T) -> Result<Delta, OTError> {
|
||||||
let interval = Interval::new(index, index);
|
let interval = Interval::new(index, index);
|
||||||
let _ = validate_interval(&self.delta, &interval)?;
|
let _ = validate_interval(&self.delta, &interval)?;
|
||||||
let delta = self.view.insert(&self.delta, text, interval)?;
|
|
||||||
|
let text = data.into_string()?;
|
||||||
|
let delta = self.view.insert(&self.delta, &text, interval)?;
|
||||||
log::debug!("👉 receive change: {}", delta);
|
log::debug!("👉 receive change: {}", delta);
|
||||||
self.add_delta(&delta)?;
|
self.add_delta(&delta)?;
|
||||||
Ok(delta)
|
Ok(delta)
|
||||||
|
@ -63,11 +67,16 @@ impl Document {
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn replace(&mut self, interval: Interval, text: &str) -> Result<Delta, OTError> {
|
pub fn replace<T: DocumentData>(
|
||||||
|
&mut self,
|
||||||
|
interval: Interval,
|
||||||
|
data: T,
|
||||||
|
) -> Result<Delta, OTError> {
|
||||||
let _ = validate_interval(&self.delta, &interval)?;
|
let _ = validate_interval(&self.delta, &interval)?;
|
||||||
let mut delta = Delta::default();
|
let mut delta = Delta::default();
|
||||||
|
let text = data.into_string()?;
|
||||||
if !text.is_empty() {
|
if !text.is_empty() {
|
||||||
delta = self.view.insert(&self.delta, text, interval)?;
|
delta = self.view.insert(&self.delta, &text, interval)?;
|
||||||
log::debug!("👉 receive change: {}", delta);
|
log::debug!("👉 receive change: {}", delta);
|
||||||
self.add_delta(&delta)?;
|
self.add_delta(&delta)?;
|
||||||
}
|
}
|
5
rust-lib/flowy-ot/src/client/document/mod.rs
Normal file
5
rust-lib/flowy-ot/src/client/document/mod.rs
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
mod data;
|
||||||
|
mod document;
|
||||||
|
|
||||||
|
pub use data::*;
|
||||||
|
pub use document::*;
|
|
@ -4,6 +4,8 @@ use crate::{
|
||||||
errors::{ErrorBuilder, OTError, OTErrorCode},
|
errors::{ErrorBuilder, OTError, OTErrorCode},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
pub const RECORD_THRESHOLD: usize = 400; // in milliseconds
|
||||||
|
|
||||||
pub struct View {
|
pub struct View {
|
||||||
insert_exts: Vec<InsertExtension>,
|
insert_exts: Vec<InsertExtension>,
|
||||||
format_exts: Vec<FormatExtension>,
|
format_exts: Vec<FormatExtension>,
|
||||||
|
|
|
@ -23,6 +23,14 @@ impl Error for OTError {
|
||||||
fn source(&self) -> Option<&(dyn Error + 'static)> { None }
|
fn source(&self) -> Option<&(dyn Error + 'static)> { None }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl std::convert::From<serde_json::Error> for OTError {
|
||||||
|
fn from(error: serde_json::Error) -> Self {
|
||||||
|
ErrorBuilder::new(OTErrorCode::SerdeError)
|
||||||
|
.error(error)
|
||||||
|
.build()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#[derive(Debug, Clone)]
|
#[derive(Debug, Clone)]
|
||||||
pub enum OTErrorCode {
|
pub enum OTErrorCode {
|
||||||
IncompatibleLength,
|
IncompatibleLength,
|
||||||
|
@ -33,6 +41,7 @@ pub enum OTErrorCode {
|
||||||
IntervalOutOfBound,
|
IntervalOutOfBound,
|
||||||
UndoFail,
|
UndoFail,
|
||||||
RedoFail,
|
RedoFail,
|
||||||
|
SerdeError,
|
||||||
}
|
}
|
||||||
|
|
||||||
pub struct ErrorBuilder {
|
pub struct ErrorBuilder {
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue