typstyle_core/pretty/
context.rs

1#[derive(Default, Clone, Copy)]
2pub struct Context {
3    pub mode: Mode,
4    pub break_suppressed: bool,
5    pub align_mode: AlignMode,
6}
7
8impl Context {
9    pub fn with_mode(self, mode: Mode) -> Self {
10        // We should never enter CodeCont mode when in math.
11        if matches!((self.mode, mode), (Mode::Math, Mode::CodeCont)) {
12            self
13        } else {
14            Self { mode, ..self }
15        }
16    }
17
18    pub fn with_mode_if(self, mode: Mode, cond: bool) -> Self {
19        Self {
20            mode: if cond { mode } else { self.mode },
21            ..self
22        }
23    }
24
25    pub fn suppress_breaks(self) -> Self {
26        Self {
27            break_suppressed: true,
28            ..self
29        }
30    }
31
32    pub fn aligned(self, mode: AlignMode) -> Self {
33        Self {
34            align_mode: match (self.align_mode, mode) {
35                (_, AlignMode::Never) | (AlignMode::Never, _) => AlignMode::Never,
36                (AlignMode::Inner, _) => AlignMode::Inner,
37                (AlignMode::Outer, _) => mode,
38                (AlignMode::Auto, _) => mode,
39            },
40            ..self
41        }
42    }
43}
44
45#[derive(Debug, Default, Clone, Copy, PartialEq, Eq)]
46pub enum Mode {
47    #[default]
48    Markup,
49    Code,
50    /// A continued code mode, where the code can freely span multiple lines.
51    /// Corresponds to [`typst_syntax::parser::NewlineMode::Continue`].
52    CodeCont,
53    Math,
54}
55
56impl Mode {
57    pub fn is_markup(self) -> bool {
58        self == Self::Markup
59    }
60
61    /// Returns `true` if the current mode is either `Code` or `CodeCont`.
62    pub fn is_code(self) -> bool {
63        self == Self::Code || self == Self::CodeCont
64    }
65
66    pub fn is_code_continued(self) -> bool {
67        self == Self::CodeCont
68    }
69
70    pub fn is_math(self) -> bool {
71        self == Self::Math
72    }
73}
74
75#[derive(Debug, Default, Clone, Copy, PartialEq, Eq)]
76pub enum AlignMode {
77    #[default]
78    Auto,
79    Outer,
80    Inner,
81    Never,
82}