diff options
| author | Laurenz <laurmaedje@gmail.com> | 2021-06-11 14:00:06 +0200 |
|---|---|---|
| committer | Laurenz <laurmaedje@gmail.com> | 2021-06-11 14:00:06 +0200 |
| commit | 4dbd9285c91d59d527f4324df4aaf239ecb007ca (patch) | |
| tree | 561a9a18a1eea6a2e598157f305667c4ea8e3e08 /src/parse/tokens.rs | |
| parent | 3330767c20e14a05176902a93dcefb08cb509173 (diff) | |
Basic enums
Diffstat (limited to 'src/parse/tokens.rs')
| -rw-r--r-- | src/parse/tokens.rs | 38 |
1 files changed, 31 insertions, 7 deletions
diff --git a/src/parse/tokens.rs b/src/parse/tokens.rs index f3ca25d9..a496010e 100644 --- a/src/parse/tokens.rs +++ b/src/parse/tokens.rs @@ -102,6 +102,7 @@ impl<'s> Tokens<'s> { '`' => self.raw(), '$' => self.math(), '-' => self.hyph(start), + c if c == '.' || c.is_ascii_digit() => self.numbering(start, c), // Plain text. _ => self.text(start), @@ -185,11 +186,11 @@ impl<'s> Tokens<'s> { // Whitespace. c if c.is_whitespace() => true, // Comments. - '/' if self.s.check(|c| c == '/' || c == '*') => true, + '/' => true, // Parentheses. '[' | ']' | '{' | '}' => true, // Markup. - '#' | '~' | '*' | '_' | '-' | '`' | '$' => true, + '#' | '~' | '*' | '_' | '`' | '$' | '-' => true, // Escaping. '\\' => true, // Just text. @@ -274,6 +275,25 @@ impl<'s> Tokens<'s> { } } + fn numbering(&mut self, start: usize, c: char) -> Token<'s> { + let number = if c != '.' { + self.s.eat_while(|c| c.is_ascii_digit()); + let read = self.s.eaten_from(start); + if !self.s.eat_if('.') { + return Token::Text(read); + } + read.parse().ok() + } else { + None + }; + + if self.s.check(|c| !c.is_whitespace()) { + return Token::Text(self.s.eaten_from(start)); + } + + Token::Numbering(number) + } + fn raw(&mut self) -> Token<'s> { let mut backticks = 1; while self.s.eat_if('`') { @@ -357,12 +377,12 @@ impl<'s> Tokens<'s> { } } - fn number(&mut self, start: usize, first: char) -> Token<'s> { + fn number(&mut self, start: usize, c: char) -> Token<'s> { // Read the first part (integer or fractional depending on `first`). self.s.eat_while(|c| c.is_ascii_digit()); - // Read the fractional part if not already done and present. - if first != '.' && self.s.eat_if('.') { + // Read the fractional part if not already done. + if c != '.' && self.s.eat_if('.') { self.s.eat_while(|c| c.is_ascii_digit()); } @@ -654,7 +674,7 @@ mod tests { // Test code symbols in text. t!(Markup[" /"]: "a():\"b" => Text("a():\"b")); - t!(Markup[" /"]: ";:,|/+" => Text(";:,|/+")); + t!(Markup[" /"]: ";:,|/+" => Text(";:,|"), Text("/+")); t!(Markup[" /"]: "#-a" => Text("#"), Text("-"), Text("a")); t!(Markup[" "]: "#123" => Text("#"), Text("123")); @@ -707,10 +727,14 @@ mod tests { t!(Markup: "_" => Underscore); t!(Markup[""]: "###" => Hashtag, Hashtag, Hashtag); t!(Markup["a1/"]: "# " => Hashtag, Space(0)); - t!(Markup["a1/"]: "- " => Hyph, Space(0)); t!(Markup: "~" => Tilde); t!(Markup[" "]: r"\" => Backslash); t!(Markup["a "]: r"a--" => Text("a"), HyphHyph); + t!(Markup["a1/"]: "- " => Hyph, Space(0)); + t!(Markup[" "]: "." => Numbering(None)); + t!(Markup[" "]: "1." => Numbering(Some(1))); + t!(Markup[" "]: "1.a" => Text("1."), Text("a")); + t!(Markup[" /"]: "a1." => Text("a1.")); } #[test] |
