summaryrefslogtreecommitdiff
path: root/crates/typst-syntax
diff options
context:
space:
mode:
authorMax <me@mkor.je>2024-08-09 07:41:01 +0000
committerGitHub <noreply@github.com>2024-08-09 07:41:01 +0000
commitb07607d35e697be3dd5e56945b16afa8103a491e (patch)
tree2bd7ceac0b6797c1f156b35a8a21fe68905e00f6 /crates/typst-syntax
parenta6a8cdaa28abe22c3a40e7a96d15e5e02e8a445e (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.rs110
-rw-r--r--crates/typst-syntax/src/highlight.rs1
-rw-r--r--crates/typst-syntax/src/kind.rs3
-rw-r--r--crates/typst-syntax/src/lexer.rs72
-rw-r--r--crates/typst-syntax/src/parser.rs2
-rw-r--r--crates/typst-syntax/src/set.rs2
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)