114 lines
3.1 KiB
Rust
Raw Normal View History

2021-08-11 11:42:46 +08:00
use crate::{
2021-08-11 23:34:35 +08:00
client::view::{DeleteExt, FormatExt, InsertExt, *},
core::{Attribute, Delta, Interval},
errors::{ErrorBuilder, OTError, OTErrorCode},
2021-08-11 11:42:46 +08:00
};
type InsertExtension = Box<dyn InsertExt>;
2021-08-11 23:34:35 +08:00
type FormatExtension = Box<dyn FormatExt>;
type DeleteExtension = Box<dyn DeleteExt>;
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 {
let insert_exts = construct_insert_exts();
2021-08-11 23:34:35 +08:00
let format_exts = construct_format_exts();
let delete_exts = construct_delete_exts();
Self {
insert_exts,
format_exts,
delete_exts,
}
2021-08-11 11:42:46 +08:00
}
2021-08-14 16:44:39 +08:00
pub(crate) fn insert(
&self,
delta: &Delta,
text: &str,
index: usize,
replace_len: usize,
) -> Result<Delta, OTError> {
2021-08-11 23:34:35 +08:00
let mut new_delta = None;
for ext in &self.insert_exts {
2021-08-14 16:44:39 +08:00
if let Some(delta) = ext.apply(delta, replace_len, text, index) {
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) {
new_delta = Some(delta);
break;
}
}
match new_delta {
None => Err(ErrorBuilder::new(OTErrorCode::ApplyInsertFail).build()),
Some(new_delta) => Ok(new_delta),
}
2021-08-11 23:34:35 +08:00
}
pub(crate) fn format(
&self,
delta: &Delta,
attribute: Attribute,
interval: Interval,
) -> Result<Delta, OTError> {
let mut new_delta = None;
for ext in &self.format_exts {
if let Some(delta) = ext.apply(delta, interval, &attribute) {
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 {}),
Box::new(AutoExitBlockExt {}),
Box::new(PreserveBlockStyleOnInsertExt {}),
Box::new(PreserveLineStyleOnSplitExt {}),
Box::new(ResetLineFormatOnNewLineExt {}),
Box::new(AutoFormatLinksExt {}),
Box::new(PreserveInlineStylesExt {}),
Box::new(DefaultInsertExt {}),
2021-08-11 23:34:35 +08:00
]
}
fn construct_format_exts() -> Vec<FormatExtension> {
vec![
Box::new(FormatLinkAtCaretPositionExt {}),
Box::new(ResolveLineFormatExt {}),
Box::new(ResolveInlineFormatExt {}),
]
}
fn construct_delete_exts() -> Vec<DeleteExtension> {
vec![
//
2021-08-14 16:44:39 +08:00
Box::new(DefaultDeleteExt {}),
2021-08-11 11:42:46 +08:00
]
}