view.rs 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. use crate::core::extensions::*;
  2. use lib_ot::{
  3. core::{trim, Attribute, Delta, Interval},
  4. errors::{ErrorBuilder, OTError, OTErrorCode},
  5. };
  6. pub const RECORD_THRESHOLD: usize = 400; // in milliseconds
  7. pub struct View {
  8. insert_exts: Vec<InsertExtension>,
  9. format_exts: Vec<FormatExtension>,
  10. delete_exts: Vec<DeleteExtension>,
  11. }
  12. impl View {
  13. pub(crate) fn new() -> Self {
  14. Self {
  15. insert_exts: construct_insert_exts(),
  16. format_exts: construct_format_exts(),
  17. delete_exts: construct_delete_exts(),
  18. }
  19. }
  20. pub(crate) fn insert(&self, delta: &Delta, text: &str, interval: Interval) -> Result<Delta, OTError> {
  21. let mut new_delta = None;
  22. for ext in &self.insert_exts {
  23. if let Some(mut delta) = ext.apply(delta, interval.size(), text, interval.start) {
  24. trim(&mut delta);
  25. tracing::trace!("[{}]: applied, delta: {}", ext.ext_name(), delta);
  26. new_delta = Some(delta);
  27. break;
  28. }
  29. }
  30. match new_delta {
  31. None => Err(ErrorBuilder::new(OTErrorCode::ApplyInsertFail).build()),
  32. Some(new_delta) => Ok(new_delta),
  33. }
  34. }
  35. pub(crate) fn delete(&self, delta: &Delta, interval: Interval) -> Result<Delta, OTError> {
  36. let mut new_delta = None;
  37. for ext in &self.delete_exts {
  38. if let Some(mut delta) = ext.apply(delta, interval) {
  39. trim(&mut delta);
  40. tracing::trace!("[{}]: applied, delta: {}", ext.ext_name(), delta);
  41. new_delta = Some(delta);
  42. break;
  43. }
  44. }
  45. match new_delta {
  46. None => Err(ErrorBuilder::new(OTErrorCode::ApplyDeleteFail).build()),
  47. Some(new_delta) => Ok(new_delta),
  48. }
  49. }
  50. pub(crate) fn format(&self, delta: &Delta, attribute: Attribute, interval: Interval) -> Result<Delta, OTError> {
  51. let mut new_delta = None;
  52. for ext in &self.format_exts {
  53. if let Some(mut delta) = ext.apply(delta, interval, &attribute) {
  54. trim(&mut delta);
  55. tracing::trace!("[{}]: applied, delta: {}", ext.ext_name(), delta);
  56. new_delta = Some(delta);
  57. break;
  58. }
  59. }
  60. match new_delta {
  61. None => Err(ErrorBuilder::new(OTErrorCode::ApplyFormatFail).build()),
  62. Some(new_delta) => Ok(new_delta),
  63. }
  64. }
  65. }
  66. fn construct_insert_exts() -> Vec<InsertExtension> {
  67. vec![
  68. Box::new(InsertEmbedsExt {}),
  69. Box::new(ForceNewlineForInsertsAroundEmbedExt {}),
  70. Box::new(AutoExitBlock {}),
  71. Box::new(PreserveBlockFormatOnInsert {}),
  72. Box::new(PreserveLineFormatOnSplit {}),
  73. Box::new(ResetLineFormatOnNewLine {}),
  74. Box::new(AutoFormatExt {}),
  75. Box::new(PreserveInlineFormat {}),
  76. Box::new(DefaultInsertAttribute {}),
  77. ]
  78. }
  79. fn construct_format_exts() -> Vec<FormatExtension> {
  80. vec![
  81. // Box::new(FormatLinkAtCaretPositionExt {}),
  82. Box::new(ResolveBlockFormat {}),
  83. Box::new(ResolveInlineFormat {}),
  84. ]
  85. }
  86. fn construct_delete_exts() -> Vec<DeleteExtension> {
  87. vec![Box::new(PreserveLineFormatOnMerge {}), Box::new(DefaultDelete {})]
  88. }