editor_core_sublime/
processor.rs1use crate::sublime_syntax::{
2 SublimeHighlightResult, SublimeScopeMapper, SublimeSyntax, SublimeSyntaxError,
3 SublimeSyntaxSet, highlight_document,
4};
5use editor_core::EditorStateManager;
6use editor_core::intervals::StyleLayerId;
7use editor_core::processing::{DocumentProcessor, ProcessingEdit};
8use std::sync::Arc;
9
10#[derive(Debug)]
14pub struct SublimeProcessor {
15 syntax: Arc<SublimeSyntax>,
16 syntax_set: SublimeSyntaxSet,
17 pub scope_mapper: SublimeScopeMapper,
19 preserve_collapsed_folds: bool,
20}
21
22impl SublimeProcessor {
23 pub fn new(syntax: Arc<SublimeSyntax>, syntax_set: SublimeSyntaxSet) -> Self {
25 Self {
26 syntax,
27 syntax_set,
28 scope_mapper: SublimeScopeMapper::new(),
29 preserve_collapsed_folds: true,
30 }
31 }
32
33 pub fn syntax(&self) -> &Arc<SublimeSyntax> {
35 &self.syntax
36 }
37
38 pub fn syntax_set(&self) -> &SublimeSyntaxSet {
40 &self.syntax_set
41 }
42
43 pub fn syntax_set_mut(&mut self) -> &mut SublimeSyntaxSet {
45 &mut self.syntax_set
46 }
47
48 pub fn preserve_collapsed_folds(&self) -> bool {
50 self.preserve_collapsed_folds
51 }
52
53 pub fn set_preserve_collapsed_folds(&mut self, preserve: bool) {
55 self.preserve_collapsed_folds = preserve;
56 }
57
58 fn highlight(
59 &mut self,
60 state: &EditorStateManager,
61 ) -> Result<SublimeHighlightResult, SublimeSyntaxError> {
62 let line_index = &state.editor().line_index;
63 highlight_document(
64 self.syntax.clone(),
65 line_index,
66 Some(&mut self.syntax_set),
67 &mut self.scope_mapper,
68 )
69 }
70}
71
72impl DocumentProcessor for SublimeProcessor {
73 type Error = SublimeSyntaxError;
74
75 fn process(&mut self, state: &EditorStateManager) -> Result<Vec<ProcessingEdit>, Self::Error> {
76 let result = self.highlight(state)?;
77 Ok(vec![
78 ProcessingEdit::ReplaceStyleLayer {
79 layer: StyleLayerId::SUBLIME_SYNTAX,
80 intervals: result.intervals,
81 },
82 ProcessingEdit::ReplaceFoldingRegions {
83 regions: result.fold_regions,
84 preserve_collapsed: self.preserve_collapsed_folds,
85 },
86 ])
87 }
88}