98 lines
3.1 KiB
Rust
Raw Normal View History

2021-08-16 15:02:57 +08:00
use super::extensions::*;
use flowy_ot::{
2021-08-15 22:08:03 +08:00
core::{Attribute, Delta, Interval},
2021-08-11 23:34:35 +08:00
errors::{ErrorBuilder, OTError, OTErrorCode},
2021-08-11 11:42:46 +08:00
};
2021-08-18 16:04:22 +08:00
pub const RECORD_THRESHOLD: usize = 400; // in milliseconds
2021-08-11 11:42:46 +08:00
pub struct View {
insert_exts: Vec<InsertExtension>,
2021-08-11 23:34:35 +08:00
format_exts: Vec<FormatExtension>,
delete_exts: Vec<DeleteExtension>,
2021-08-11 11:42:46 +08:00
}
impl View {
pub(crate) fn new() -> Self {
2021-08-11 23:34:35 +08:00
Self {
2021-08-15 00:05:18 +08:00
insert_exts: construct_insert_exts(),
format_exts: construct_format_exts(),
delete_exts: construct_delete_exts(),
2021-08-11 23:34:35 +08:00
}
2021-08-11 11:42:46 +08:00
}
2021-09-13 15:51:13 +08:00
pub(crate) fn insert(&self, delta: &Delta, text: &str, interval: Interval) -> Result<Delta, OTError> {
2021-08-11 23:34:35 +08:00
let mut new_delta = None;
for ext in &self.insert_exts {
2021-08-15 00:05:18 +08:00
if let Some(delta) = ext.apply(delta, interval.size(), text, interval.start) {
2021-09-15 16:35:40 +08:00
log::trace!("[{}]: applied, delta: {}", ext.ext_name(), delta);
2021-08-11 23:34:35 +08:00
new_delta = Some(delta);
break;
}
}
match new_delta {
None => Err(ErrorBuilder::new(OTErrorCode::ApplyInsertFail).build()),
Some(new_delta) => Ok(new_delta),
}
}
2021-08-14 16:44:39 +08:00
pub(crate) fn delete(&self, delta: &Delta, interval: Interval) -> Result<Delta, OTError> {
let mut new_delta = None;
for ext in &self.delete_exts {
if let Some(delta) = ext.apply(delta, interval) {
2021-09-15 16:35:40 +08:00
log::trace!("[{}]: applied, delta: {}", ext.ext_name(), delta);
2021-08-14 16:44:39 +08:00
new_delta = Some(delta);
break;
}
}
match new_delta {
2021-08-15 00:05:18 +08:00
None => Err(ErrorBuilder::new(OTErrorCode::ApplyDeleteFail).build()),
2021-08-14 16:44:39 +08:00
Some(new_delta) => Ok(new_delta),
}
2021-08-11 23:34:35 +08:00
}
2021-09-13 15:51:13 +08:00
pub(crate) fn format(&self, delta: &Delta, attribute: Attribute, interval: Interval) -> Result<Delta, OTError> {
2021-08-11 23:34:35 +08:00
let mut new_delta = None;
for ext in &self.format_exts {
if let Some(delta) = ext.apply(delta, interval, &attribute) {
2021-09-15 16:35:40 +08:00
log::trace!("[{}]: applied, delta: {}", ext.ext_name(), delta);
2021-08-11 23:34:35 +08:00
new_delta = Some(delta);
break;
}
}
match new_delta {
None => Err(ErrorBuilder::new(OTErrorCode::ApplyFormatFail).build()),
Some(new_delta) => Ok(new_delta),
}
2021-08-11 11:42:46 +08:00
}
}
fn construct_insert_exts() -> Vec<InsertExtension> {
vec![
2021-08-13 14:13:31 +08:00
Box::new(InsertEmbedsExt {}),
Box::new(ForceNewlineForInsertsAroundEmbedExt {}),
2021-08-17 22:04:39 +08:00
Box::new(AutoExitBlock {}),
Box::new(PreserveBlockFormatOnInsert {}),
Box::new(PreserveLineFormatOnSplit {}),
Box::new(ResetLineFormatOnNewLine {}),
2021-08-16 15:02:57 +08:00
Box::new(AutoFormatExt {}),
2021-08-17 22:04:39 +08:00
Box::new(PreserveInlineFormat {}),
Box::new(DefaultInsertAttribute {}),
2021-08-11 23:34:35 +08:00
]
}
fn construct_format_exts() -> Vec<FormatExtension> {
vec![
2021-08-18 13:12:45 +08:00
// Box::new(FormatLinkAtCaretPositionExt {}),
2021-08-17 22:04:39 +08:00
Box::new(ResolveBlockFormat {}),
Box::new(ResolveInlineFormat {}),
2021-08-11 23:34:35 +08:00
]
}
fn construct_delete_exts() -> Vec<DeleteExtension> {
vec![Box::new(PreserveLineFormatOnMerge {}), Box::new(DefaultDelete {})]
}