view.rs 3.4 KB

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