diff options
| author | Max <me@mkor.je> | 2024-08-09 07:41:01 +0000 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2024-08-09 07:41:01 +0000 |
| commit | b07607d35e697be3dd5e56945b16afa8103a491e (patch) | |
| tree | 2bd7ceac0b6797c1f156b35a8a21fe68905e00f6 /crates/typst-syntax | |
| parent | a6a8cdaa28abe22c3a40e7a96d15e5e02e8a445e (diff) | |
Split shorthands into math and markup, add tilde shorthand (#4706)
Diffstat (limited to 'crates/typst-syntax')
| -rw-r--r-- | crates/typst-syntax/src/ast.rs | 110 | ||||
| -rw-r--r-- | crates/typst-syntax/src/highlight.rs | 1 | ||||
| -rw-r--r-- | crates/typst-syntax/src/kind.rs | 3 | ||||
| -rw-r--r-- | crates/typst-syntax/src/lexer.rs | 72 | ||||
| -rw-r--r-- | crates/typst-syntax/src/parser.rs | 2 | ||||
| -rw-r--r-- | crates/typst-syntax/src/set.rs | 2 |
6 files changed, 108 insertions, 82 deletions
diff --git a/crates/typst-syntax/src/ast.rs b/crates/typst-syntax/src/ast.rs index 1cd9cd42..3d3a85ad 100644 --- a/crates/typst-syntax/src/ast.rs +++ b/crates/typst-syntax/src/ast.rs @@ -125,6 +125,8 @@ pub enum Expr<'a> { Math(Math<'a>), /// An identifier in math: `pi`. MathIdent(MathIdent<'a>), + /// A shorthand for a unicode codepoint in math: `a <= b`. + MathShorthand(MathShorthand<'a>), /// An alignment point in math: `&`. MathAlignPoint(MathAlignPoint<'a>), /// Matched delimiters in math: `[x + y]`. @@ -232,6 +234,7 @@ impl<'a> AstNode<'a> for Expr<'a> { SyntaxKind::Equation => node.cast().map(Self::Equation), SyntaxKind::Math => node.cast().map(Self::Math), SyntaxKind::MathIdent => node.cast().map(Self::MathIdent), + SyntaxKind::MathShorthand => node.cast().map(Self::MathShorthand), SyntaxKind::MathAlignPoint => node.cast().map(Self::MathAlignPoint), SyntaxKind::MathDelimited => node.cast().map(Self::MathDelimited), SyntaxKind::MathAttach => node.cast().map(Self::MathAttach), @@ -295,6 +298,7 @@ impl<'a> AstNode<'a> for Expr<'a> { Self::Equation(v) => v.to_untyped(), Self::Math(v) => v.to_untyped(), Self::MathIdent(v) => v.to_untyped(), + Self::MathShorthand(v) => v.to_untyped(), Self::MathAlignPoint(v) => v.to_untyped(), Self::MathDelimited(v) => v.to_untyped(), Self::MathAttach(v) => v.to_untyped(), @@ -450,7 +454,7 @@ node! { impl Shorthand<'_> { /// A list of all shorthands in markup mode. - pub const MARKUP_LIST: &'static [(&'static str, char)] = &[ + pub const LIST: &'static [(&'static str, char)] = &[ ("...", '…'), ("~", '\u{00A0}'), ("-", '\u{2212}'), // Only before a digit @@ -459,52 +463,11 @@ impl Shorthand<'_> { ("-?", '\u{00AD}'), ]; - /// A list of all shorthands in math mode. - pub const MATH_LIST: &'static [(&'static str, char)] = &[ - ("...", '…'), - ("-", '\u{2212}'), - ("'", '′'), - ("*", '∗'), - ("!=", '≠'), - (":=", '≔'), - ("::=", '⩴'), - ("=:", '≕'), - ("<<", '≪'), - ("<<<", '⋘'), - (">>", '≫'), - (">>>", '⋙'), - ("<=", '≤'), - (">=", '≥'), - ("->", '→'), - ("-->", '⟶'), - ("|->", '↦'), - (">->", '↣'), - ("->>", '↠'), - ("<-", '←'), - ("<--", '⟵'), - ("<-<", '↢'), - ("<<-", '↞'), - ("<->", '↔'), - ("<-->", '⟷'), - ("~>", '⇝'), - ("~~>", '⟿'), - ("<~", '⇜'), - ("<~~", '⬳'), - ("=>", '⇒'), - ("|=>", '⤇'), - ("==>", '⟹'), - ("<==", '⟸'), - ("<=>", '⇔'), - ("<==>", '⟺'), - ("[|", '⟦'), - ("|]", '⟧'), - ("||", '‖'), - ]; - /// Get the shorthanded character. pub fn get(self) -> char { let text = self.0.text(); - (Self::MARKUP_LIST.iter().chain(Self::MATH_LIST)) + Self::LIST + .iter() .find(|&&(s, _)| s == text) .map_or_else(char::default, |&(_, c)| c) } @@ -771,6 +734,65 @@ impl Deref for MathIdent<'_> { } node! { + /// A shorthand for a unicode codepoint in math: `a <= b`. + MathShorthand +} + +impl MathShorthand<'_> { + /// A list of all shorthands in math mode. + pub const LIST: &'static [(&'static str, char)] = &[ + ("...", '…'), + ("-", '−'), + ("'", '′'), + ("*", '∗'), + ("~", '∼'), + ("!=", '≠'), + (":=", '≔'), + ("::=", '⩴'), + ("=:", '≕'), + ("<<", '≪'), + ("<<<", '⋘'), + (">>", '≫'), + (">>>", '⋙'), + ("<=", '≤'), + (">=", '≥'), + ("->", '→'), + ("-->", '⟶'), + ("|->", '↦'), + (">->", '↣'), + ("->>", '↠'), + ("<-", '←'), + ("<--", '⟵'), + ("<-<", '↢'), + ("<<-", '↞'), + ("<->", '↔'), + ("<-->", '⟷'), + ("~>", '⇝'), + ("~~>", '⟿'), + ("<~", '⇜'), + ("<~~", '⬳'), + ("=>", '⇒'), + ("|=>", '⤇'), + ("==>", '⟹'), + ("<==", '⟸'), + ("<=>", '⇔'), + ("<==>", '⟺'), + ("[|", '⟦'), + ("|]", '⟧'), + ("||", '‖'), + ]; + + /// Get the shorthanded character. + pub fn get(self) -> char { + let text = self.0.text(); + Self::LIST + .iter() + .find(|&&(s, _)| s == text) + .map_or_else(char::default, |&(_, c)| c) + } +} + +node! { /// An alignment point in math: `&`. MathAlignPoint } diff --git a/crates/typst-syntax/src/highlight.rs b/crates/typst-syntax/src/highlight.rs index 0c1f3d5f..ddd29326 100644 --- a/crates/typst-syntax/src/highlight.rs +++ b/crates/typst-syntax/src/highlight.rs @@ -172,6 +172,7 @@ pub fn highlight(node: &LinkedNode) -> Option<Tag> { SyntaxKind::Math => None, SyntaxKind::MathIdent => highlight_ident(node), + SyntaxKind::MathShorthand => Some(Tag::Escape), SyntaxKind::MathAlignPoint => Some(Tag::MathOperator), SyntaxKind::MathDelimited => None, SyntaxKind::MathAttach => None, diff --git a/crates/typst-syntax/src/kind.rs b/crates/typst-syntax/src/kind.rs index 7505dbc6..a4456b9f 100644 --- a/crates/typst-syntax/src/kind.rs +++ b/crates/typst-syntax/src/kind.rs @@ -75,6 +75,8 @@ pub enum SyntaxKind { Math, /// An identifier in math: `pi`. MathIdent, + /// A shorthand for a unicode codepoint in math: `a <= b`. + MathShorthand, /// An alignment point in math: `&`. MathAlignPoint, /// Matched delimiters in math: `[x + y]`. @@ -400,6 +402,7 @@ impl SyntaxKind { Self::Equation => "equation", Self::Math => "math", Self::MathIdent => "math identifier", + Self::MathShorthand => "math shorthand", Self::MathAlignPoint => "math alignment point", Self::MathDelimited => "delimited math", Self::MathAttach => "math attachments", diff --git a/crates/typst-syntax/src/lexer.rs b/crates/typst-syntax/src/lexer.rs index 993af080..92e78b2d 100644 --- a/crates/typst-syntax/src/lexer.rs +++ b/crates/typst-syntax/src/lexer.rs @@ -514,42 +514,42 @@ impl Lexer<'_> { '\\' => self.backslash(), '"' => self.string(), - '-' if self.s.eat_if(">>") => SyntaxKind::Shorthand, - '-' if self.s.eat_if('>') => SyntaxKind::Shorthand, - '-' if self.s.eat_if("->") => SyntaxKind::Shorthand, - ':' if self.s.eat_if('=') => SyntaxKind::Shorthand, - ':' if self.s.eat_if(":=") => SyntaxKind::Shorthand, - '!' if self.s.eat_if('=') => SyntaxKind::Shorthand, - '.' if self.s.eat_if("..") => SyntaxKind::Shorthand, - '[' if self.s.eat_if('|') => SyntaxKind::Shorthand, - '<' if self.s.eat_if("==>") => SyntaxKind::Shorthand, - '<' if self.s.eat_if("-->") => SyntaxKind::Shorthand, - '<' if self.s.eat_if("--") => SyntaxKind::Shorthand, - '<' if self.s.eat_if("-<") => SyntaxKind::Shorthand, - '<' if self.s.eat_if("->") => SyntaxKind::Shorthand, - '<' if self.s.eat_if("<-") => SyntaxKind::Shorthand, - '<' if self.s.eat_if("<<") => SyntaxKind::Shorthand, - '<' if self.s.eat_if("=>") => SyntaxKind::Shorthand, - '<' if self.s.eat_if("==") => SyntaxKind::Shorthand, - '<' if self.s.eat_if("~~") => SyntaxKind::Shorthand, - '<' if self.s.eat_if('=') => SyntaxKind::Shorthand, - '<' if self.s.eat_if('<') => SyntaxKind::Shorthand, - '<' if self.s.eat_if('-') => SyntaxKind::Shorthand, - '<' if self.s.eat_if('~') => SyntaxKind::Shorthand, - '>' if self.s.eat_if("->") => SyntaxKind::Shorthand, - '>' if self.s.eat_if(">>") => SyntaxKind::Shorthand, - '=' if self.s.eat_if("=>") => SyntaxKind::Shorthand, - '=' if self.s.eat_if('>') => SyntaxKind::Shorthand, - '=' if self.s.eat_if(':') => SyntaxKind::Shorthand, - '>' if self.s.eat_if('=') => SyntaxKind::Shorthand, - '>' if self.s.eat_if('>') => SyntaxKind::Shorthand, - '|' if self.s.eat_if("->") => SyntaxKind::Shorthand, - '|' if self.s.eat_if("=>") => SyntaxKind::Shorthand, - '|' if self.s.eat_if(']') => SyntaxKind::Shorthand, - '|' if self.s.eat_if('|') => SyntaxKind::Shorthand, - '~' if self.s.eat_if("~>") => SyntaxKind::Shorthand, - '~' if self.s.eat_if('>') => SyntaxKind::Shorthand, - '*' | '-' => SyntaxKind::Shorthand, + '-' if self.s.eat_if(">>") => SyntaxKind::MathShorthand, + '-' if self.s.eat_if('>') => SyntaxKind::MathShorthand, + '-' if self.s.eat_if("->") => SyntaxKind::MathShorthand, + ':' if self.s.eat_if('=') => SyntaxKind::MathShorthand, + ':' if self.s.eat_if(":=") => SyntaxKind::MathShorthand, + '!' if self.s.eat_if('=') => SyntaxKind::MathShorthand, + '.' if self.s.eat_if("..") => SyntaxKind::MathShorthand, + '[' if self.s.eat_if('|') => SyntaxKind::MathShorthand, + '<' if self.s.eat_if("==>") => SyntaxKind::MathShorthand, + '<' if self.s.eat_if("-->") => SyntaxKind::MathShorthand, + '<' if self.s.eat_if("--") => SyntaxKind::MathShorthand, + '<' if self.s.eat_if("-<") => SyntaxKind::MathShorthand, + '<' if self.s.eat_if("->") => SyntaxKind::MathShorthand, + '<' if self.s.eat_if("<-") => SyntaxKind::MathShorthand, + '<' if self.s.eat_if("<<") => SyntaxKind::MathShorthand, + '<' if self.s.eat_if("=>") => SyntaxKind::MathShorthand, + '<' if self.s.eat_if("==") => SyntaxKind::MathShorthand, + '<' if self.s.eat_if("~~") => SyntaxKind::MathShorthand, + '<' if self.s.eat_if('=') => SyntaxKind::MathShorthand, + '<' if self.s.eat_if('<') => SyntaxKind::MathShorthand, + '<' if self.s.eat_if('-') => SyntaxKind::MathShorthand, + '<' if self.s.eat_if('~') => SyntaxKind::MathShorthand, + '>' if self.s.eat_if("->") => SyntaxKind::MathShorthand, + '>' if self.s.eat_if(">>") => SyntaxKind::MathShorthand, + '=' if self.s.eat_if("=>") => SyntaxKind::MathShorthand, + '=' if self.s.eat_if('>') => SyntaxKind::MathShorthand, + '=' if self.s.eat_if(':') => SyntaxKind::MathShorthand, + '>' if self.s.eat_if('=') => SyntaxKind::MathShorthand, + '>' if self.s.eat_if('>') => SyntaxKind::MathShorthand, + '|' if self.s.eat_if("->") => SyntaxKind::MathShorthand, + '|' if self.s.eat_if("=>") => SyntaxKind::MathShorthand, + '|' if self.s.eat_if(']') => SyntaxKind::MathShorthand, + '|' if self.s.eat_if('|') => SyntaxKind::MathShorthand, + '~' if self.s.eat_if("~>") => SyntaxKind::MathShorthand, + '~' if self.s.eat_if('>') => SyntaxKind::MathShorthand, + '*' | '-' | '~' => SyntaxKind::MathShorthand, '#' => SyntaxKind::Hash, '_' => SyntaxKind::Underscore, diff --git a/crates/typst-syntax/src/parser.rs b/crates/typst-syntax/src/parser.rs index 2cbce1d7..4ce3917e 100644 --- a/crates/typst-syntax/src/parser.rs +++ b/crates/typst-syntax/src/parser.rs @@ -319,7 +319,7 @@ fn math_expr_prec(p: &mut Parser, min_prec: usize, stop: SyntaxKind) { } } - SyntaxKind::Text | SyntaxKind::Shorthand => { + SyntaxKind::Text | SyntaxKind::MathShorthand => { continuable = matches!( math_class(p.current_text()), None | Some(MathClass::Alphabetic) diff --git a/crates/typst-syntax/src/set.rs b/crates/typst-syntax/src/set.rs index 39e64651..2297cacb 100644 --- a/crates/typst-syntax/src/set.rs +++ b/crates/typst-syntax/src/set.rs @@ -80,7 +80,7 @@ pub const MATH_EXPR: SyntaxSet = SyntaxSet::new() .add(SyntaxKind::Hash) .add(SyntaxKind::MathIdent) .add(SyntaxKind::Text) - .add(SyntaxKind::Shorthand) + .add(SyntaxKind::MathShorthand) .add(SyntaxKind::Linebreak) .add(SyntaxKind::MathAlignPoint) .add(SyntaxKind::Escape) |
