From f26526ba75582f24d2bae18a43de3f6622c588ec Mon Sep 17 00:00:00 2001 From: Laurenz Date: Mon, 7 Jun 2021 18:06:27 +0200 Subject: [PATCH] Switch back to hashtags for headings --- src/parse/mod.rs | 6 +++--- src/parse/tokens.rs | 13 ++++++++----- src/pretty.rs | 4 ++-- src/syntax/token.rs | 7 +++++-- tests/ref/code/call-invalid.png | Bin 2897 -> 2834 bytes tests/ref/markup/heading.png | Bin 5162 -> 5301 bytes tests/typ/code/call-invalid.typ | 4 ---- tests/typ/code/importable/chap1.typ | 2 +- tests/typ/code/importable/chap2.typ | 2 +- tests/typ/code/include.typ | 2 +- tests/typ/full/coma.typ | 2 +- tests/typ/markup/heading.typ | 26 +++++++++++++------------- tools/support/typst.tmLanguage.json | 6 +++--- 13 files changed, 38 insertions(+), 36 deletions(-) diff --git a/src/parse/mod.rs b/src/parse/mod.rs index 5bda818fd..4c935579f 100644 --- a/src/parse/mod.rs +++ b/src/parse/mod.rs @@ -61,7 +61,7 @@ fn node(p: &mut Parser, at_start: &mut bool) -> Option { // Markup. Token::Star => Node::Strong(span), Token::Underscore => Node::Emph(span), - Token::Eq => { + Token::Hashtag => { if *at_start { return Some(heading(p)); } else { @@ -128,11 +128,11 @@ fn node(p: &mut Parser, at_start: &mut bool) -> Option { /// Parse a heading. fn heading(p: &mut Parser) -> Node { let start = p.start(); - p.assert(Token::Eq); + p.assert(Token::Hashtag); // Count depth. let mut level: usize = 1; - while p.eat_if(Token::Eq) { + while p.eat_if(Token::Hashtag) { level += 1; } diff --git a/src/parse/tokens.rs b/src/parse/tokens.rs index 62d2e68e4..fa86d2f19 100644 --- a/src/parse/tokens.rs +++ b/src/parse/tokens.rs @@ -73,7 +73,7 @@ impl<'s> Iterator for Tokens<'s> { '{' => Token::LeftBrace, '}' => Token::RightBrace, - // Keywords, variables, functions, colors. + // Headings, keywords, identifiers, colors. '#' => self.hash(start), // Whitespace. @@ -93,7 +93,6 @@ impl<'s> Iterator for Tokens<'s> { // Markup. '*' => Token::Star, '_' => Token::Underscore, - '=' => Token::Eq, '~' => Token::Tilde, '`' => self.raw(), '$' => self.math(), @@ -157,6 +156,10 @@ impl<'s> Tokens<'s> { match self.mode { TokenMode::Markup => { + if read.is_empty() { + return Token::Hashtag; + } + if let Some(token) = keyword(read) { return token; } @@ -607,8 +610,8 @@ mod tests { // Test markup tokens. t!(Markup[" a1"]: "*" => Star); t!(Markup: "_" => Underscore); - t!(Markup[""]: "===" => Eq, Eq, Eq); - t!(Markup["a1/"]: "= " => Eq, Space(0)); + t!(Markup[""]: "###" => Hashtag, Hashtag, Hashtag); + t!(Markup["a1/"]: "# " => Hashtag, Space(0)); t!(Markup: "~" => Tilde); t!(Markup[" "]: r"\" => Backslash); } @@ -666,7 +669,7 @@ mod tests { for &(s, t) in &keywords { t!(Markup[" "]: format!("#{}", s) => t); t!(Markup[" "]: format!("#{0}#{0}", s) => t, t); - t!(Markup[" /"]: format!("# {}", s) => Token::Invalid("#"), Space(0), Text(s)); + t!(Markup[" /"]: format!("# {}", s) => Token::Hashtag, Space(0), Text(s)); } for &(s, t) in &keywords { diff --git a/src/pretty.rs b/src/pretty.rs index 397bbc38c..49f6fd825 100644 --- a/src/pretty.rs +++ b/src/pretty.rs @@ -141,7 +141,7 @@ impl PrettyWithMap for Node { impl PrettyWithMap for HeadingNode { fn pretty_with_map(&self, p: &mut Printer, map: Option<&NodeMap>) { for _ in 0 .. self.level { - p.push('='); + p.push('#'); } self.contents.pretty_with_map(p, map); } @@ -666,7 +666,7 @@ mod tests { roundtrip("hi"); // Heading. - roundtrip("= *Ok*"); + roundtrip("# *Ok*"); // Raw. roundtrip("``"); diff --git a/src/syntax/token.rs b/src/syntax/token.rs index 3484536d6..538d81b7f 100644 --- a/src/syntax/token.rs +++ b/src/syntax/token.rs @@ -20,8 +20,8 @@ pub enum Token<'s> { Star, /// An underscore: `_`. Underscore, - /// A single equals sign: `=`. - Eq, + /// A single hashtag: `#`. + Hashtag, /// A tilde: `~`. Tilde, /// A backslash followed by nothing or whitespace: `\`. @@ -38,6 +38,8 @@ pub enum Token<'s> { Hyph, /// A slash: `/`. Slash, + /// A single equals sign: `=`. + Eq, /// Two equals signs: `==`. EqEq, /// An exclamation mark followed by an equals sign: `!=`. @@ -200,6 +202,7 @@ impl<'s> Token<'s> { Self::RightParen => "closing paren", Self::Star => "star", Self::Underscore => "underscore", + Self::Hashtag => "hashtag", Self::Tilde => "tilde", Self::Backslash => "backslash", Self::Comma => "comma", diff --git a/tests/ref/code/call-invalid.png b/tests/ref/code/call-invalid.png index f2f90f095b961360c1979133e308227528a5a87a..e024e6ced404e19081016ded0d7ba21f5c139096 100644 GIT binary patch literal 2834 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 L)>17--NXGClD7F4 diff --git a/tests/ref/markup/heading.png b/tests/ref/markup/heading.png index 46b5b637b57edbb455f2c195a48c7c4e29d177ed..825b40076bfd47deea779c3eb7b5d020326949f4 100644 GIT binary patch literal 5301 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 D*xjK4 literal 5162 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 jbw5fVs{ev++;5hR;lo