view.rs 3.3 KB

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