summaryrefslogtreecommitdiff
path: root/src/parse
diff options
context:
space:
mode:
authorLaurenz <laurmaedje@gmail.com>2022-04-16 22:42:49 +0200
committerLaurenz <laurmaedje@gmail.com>2022-04-16 23:06:47 +0200
commit4494b443bb34fed2208ee3fc87e9a18e7d14b2ab (patch)
tree25a655821b81d10659132fae26861a2aff2d5a95 /src/parse
parentc5b3f8ee98203191d83d3cfca39bb0f35ee6efc2 (diff)
Ellipsis
Diffstat (limited to 'src/parse')
-rw-r--r--src/parse/mod.rs1
-rw-r--r--src/parse/tokens.rs16
2 files changed, 12 insertions, 5 deletions
diff --git a/src/parse/mod.rs b/src/parse/mod.rs
index 7536b2ca..be947170 100644
--- a/src/parse/mod.rs
+++ b/src/parse/mod.rs
@@ -214,6 +214,7 @@ fn markup_node(p: &mut Parser, at_start: &mut bool) {
| NodeKind::Shy
| NodeKind::EnDash
| NodeKind::EmDash
+ | NodeKind::Ellipsis
| NodeKind::Quote(_)
| NodeKind::Linebreak(_)
| NodeKind::Raw(_)
diff --git a/src/parse/tokens.rs b/src/parse/tokens.rs
index ae3d7b9c..f6e1f296 100644
--- a/src/parse/tokens.rs
+++ b/src/parse/tokens.rs
@@ -140,6 +140,7 @@ impl<'s> Tokens<'s> {
// Markup.
'~' => NodeKind::NonBreakingSpace,
'-' => self.hyph(),
+ '.' if self.s.eat_if("..") => NodeKind::Ellipsis,
'\'' => NodeKind::Quote(false),
'"' => NodeKind::Quote(true),
'*' if !self.in_word() => NodeKind::Star,
@@ -216,7 +217,7 @@ impl<'s> Tokens<'s> {
// Comments, parentheses, code.
'/' | '[' | ']' | '{' | '}' | '#' |
// Markup
- '~' | '\'' | '"' | '*' | '_' | '`' | '$' | '-' | '\\'
+ '~' | '-' | '.' | '\'' | '"' | '*' | '_' | '`' | '$' | '\\'
};
loop {
@@ -224,12 +225,17 @@ impl<'s> Tokens<'s> {
TABLE.get(c as usize).copied().unwrap_or_else(|| c.is_whitespace())
});
+ // Allow a single space, optionally preceded by . or - if something
+ // alphanumeric follows directly. This leads to less text nodes,
+ // which is good for performance.
let mut s = self.s;
- if !(s.eat_if(' ') && s.at(char::is_alphanumeric)) {
+ s.eat_if(['.', '-']);
+ s.eat_if(' ');
+ if !s.at(char::is_alphanumeric) {
break;
}
- self.s.eat();
+ self.s = s;
}
NodeKind::Text(self.s.from(start).into())
@@ -831,7 +837,7 @@ mod tests {
fn test_tokenize_text() {
// Test basic text.
t!(Markup[" /"]: "hello" => Text("hello"));
- t!(Markup[" /"]: "hello-world" => Text("hello"), Minus, Text("world"));
+ t!(Markup[" /"]: "hello-world" => Text("hello-world"));
// Test code symbols in text.
t!(Markup[" /"]: "a():\"b" => Text("a():"), Quote(true), Text("b"));
@@ -897,7 +903,7 @@ mod tests {
t!(Markup[" "]: "." => EnumNumbering(None));
t!(Markup[" "]: "1." => EnumNumbering(Some(1)));
t!(Markup[" "]: "1.a" => EnumNumbering(Some(1)), Text("a"));
- t!(Markup[" /"]: "a1." => Text("a1."));
+ t!(Markup[" /"]: "a1." => Text("a1"), EnumNumbering(None));
}
#[test]