view.rs 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. use super::extensions::*;
  2. use crate::{
  3. core::{Attribute, Delta, Interval},
  4. errors::{ErrorBuilder, OTError, OTErrorCode},
  5. };
  6. pub struct View {
  7. insert_exts: Vec<InsertExtension>,
  8. format_exts: Vec<FormatExtension>,
  9. delete_exts: Vec<DeleteExtension>,
  10. }
  11. impl View {
  12. pub(crate) fn new() -> Self {
  13. Self {
  14. insert_exts: construct_insert_exts(),
  15. format_exts: construct_format_exts(),
  16. delete_exts: construct_delete_exts(),
  17. }
  18. }
  19. pub(crate) fn insert(
  20. &self,
  21. delta: &Delta,
  22. text: &str,
  23. interval: Interval,
  24. ) -> Result<Delta, OTError> {
  25. let mut new_delta = None;
  26. for ext in &self.insert_exts {
  27. if let Some(delta) = ext.apply(delta, interval.size(), text, interval.start) {
  28. log::debug!("[{}]: applied, delta: {}", ext.ext_name(), delta);
  29. new_delta = Some(delta);
  30. break;
  31. }
  32. }
  33. match new_delta {
  34. None => Err(ErrorBuilder::new(OTErrorCode::ApplyInsertFail).build()),
  35. Some(new_delta) => Ok(new_delta),
  36. }
  37. }
  38. pub(crate) fn delete(&self, delta: &Delta, interval: Interval) -> Result<Delta, OTError> {
  39. let mut new_delta = None;
  40. for ext in &self.delete_exts {
  41. if let Some(delta) = ext.apply(delta, interval) {
  42. log::debug!("[{}]: 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: &Delta,
  55. attribute: Attribute,
  56. interval: Interval,
  57. ) -> Result<Delta, OTError> {
  58. let mut new_delta = None;
  59. for ext in &self.format_exts {
  60. if let Some(delta) = ext.apply(delta, interval, &attribute) {
  61. log::debug!("[{}]: applied, delta: {}", ext.ext_name(), delta);
  62. new_delta = Some(delta);
  63. break;
  64. }
  65. }
  66. match new_delta {
  67. None => Err(ErrorBuilder::new(OTErrorCode::ApplyFormatFail).build()),
  68. Some(new_delta) => Ok(new_delta),
  69. }
  70. }
  71. }
  72. fn construct_insert_exts() -> Vec<InsertExtension> {
  73. vec![
  74. Box::new(InsertEmbedsExt {}),
  75. Box::new(ForceNewlineForInsertsAroundEmbedExt {}),
  76. Box::new(AutoExitBlock {}),
  77. Box::new(PreserveBlockFormatOnInsert {}),
  78. Box::new(PreserveLineFormatOnSplit {}),
  79. Box::new(ResetLineFormatOnNewLine {}),
  80. Box::new(AutoFormatExt {}),
  81. Box::new(PreserveInlineFormat {}),
  82. Box::new(DefaultInsertAttribute {}),
  83. ]
  84. }
  85. fn construct_format_exts() -> Vec<FormatExtension> {
  86. vec![
  87. Box::new(FormatLinkAtCaretPositionExt {}),
  88. Box::new(ResolveBlockFormat {}),
  89. Box::new(ResolveInlineFormat {}),
  90. ]
  91. }
  92. fn construct_delete_exts() -> Vec<DeleteExtension> {
  93. vec![
  94. //
  95. Box::new(DefaultDeleteExt {}),
  96. ]
  97. }