Compare commits

...

3 Commits

Author SHA1 Message Date
Tau
66d95f682c
Merge ce169026b329a35e57f45b0c57b32e706fa4b9e2 into e9f1b5825a9d37ca0c173a7b2830ba36a27ca9e0 2025-07-25 00:37:51 +08:00
Laurenz
e9f1b5825a
Lint for iterations over hash types (#6652) 2025-07-24 11:34:08 +00:00
Alice Carroll
ce169026b3
feat: non-breaking hyphen shorthand
Closes #6355
2025-07-18 12:03:07 +03:00
9 changed files with 12 additions and 3 deletions

View File

@ -159,6 +159,7 @@ strip = true
[workspace.lints.clippy] [workspace.lints.clippy]
blocks_in_conditions = "allow" blocks_in_conditions = "allow"
comparison_chain = "allow" comparison_chain = "allow"
iter_over_hash_type = "warn"
manual_range_contains = "allow" manual_range_contains = "allow"
mutable_key_type = "allow" mutable_key_type = "allow"
uninlined_format_args = "warn" uninlined_format_args = "warn"

View File

@ -139,6 +139,7 @@ impl Watcher {
fn update(&mut self, iter: impl IntoIterator<Item = PathBuf>) -> StrResult<()> { fn update(&mut self, iter: impl IntoIterator<Item = PathBuf>) -> StrResult<()> {
// Mark all files as not "seen" so that we may unwatch them if they // Mark all files as not "seen" so that we may unwatch them if they
// aren't in the dependency list. // aren't in the dependency list.
#[allow(clippy::iter_over_hash_type, reason = "order does not matter")]
for seen in self.watched.values_mut() { for seen in self.watched.values_mut() {
*seen = false; *seen = false;
} }

View File

@ -173,6 +173,7 @@ impl SystemWorld {
/// Reset the compilation state in preparation of a new compilation. /// Reset the compilation state in preparation of a new compilation.
pub fn reset(&mut self) { pub fn reset(&mut self) {
#[allow(clippy::iter_over_hash_type, reason = "order does not matter")]
for slot in self.slots.get_mut().values_mut() { for slot in self.slots.get_mut().values_mut() {
slot.reset(); slot.reset();
} }

View File

@ -595,6 +595,7 @@ impl Shorthand<'_> {
("--", '\u{2013}'), ("--", '\u{2013}'),
("---", '\u{2014}'), ("---", '\u{2014}'),
("-?", '\u{00AD}'), ("-?", '\u{00AD}'),
("-!", '\u{2011}'),
]; ];
/// Get the shorthanded character. /// Get the shorthanded character.

View File

@ -191,6 +191,7 @@ impl Lexer<'_> {
'-' 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.at(char::is_numeric) => SyntaxKind::Shorthand, '-' if self.s.at(char::is_numeric) => SyntaxKind::Shorthand,
'*' if !self.in_word() => SyntaxKind::Star, '*' if !self.in_word() => SyntaxKind::Star,
'_' if !self.in_word() => SyntaxKind::Underscore, '_' if !self.in_word() => SyntaxKind::Underscore,
@ -524,7 +525,7 @@ impl Lexer<'_> {
match s.eat() { match s.eat() {
Some(' ') if s.at(char::is_alphanumeric) => {} Some(' ') if s.at(char::is_alphanumeric) => {}
Some('/') if !s.at(['/', '*']) => {} Some('/') if !s.at(['/', '*']) => {}
Some('-') if !s.at(['-', '?']) => {} Some('-') if !s.at(['-', '?', '!']) => {}
Some('.') if !s.at("..") => {} Some('.') if !s.at("..") => {}
Some('h') if !s.at("ttp://") && !s.at("ttps://") => {} Some('h') if !s.at("ttp://") && !s.at("ttps://") => {}
Some('@') if !s.at(is_valid_in_label_literal) => {} Some('@') if !s.at(is_valid_in_label_literal) => {}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.3 KiB

After

Width:  |  Height:  |  Size: 2.0 KiB

View File

@ -10,7 +10,7 @@ Supercalifragilisticexpialidocious Expialigoricmetrioxidation.
--- linebreak-hyphen-nbsp --- --- linebreak-hyphen-nbsp ---
// Test for non-breaking space and hyphen. // Test for non-breaking space and hyphen.
There are non\u{2011}breaking~characters. There are non-!breaking~characters.
--- linebreak-narrow-nbsp --- --- linebreak-narrow-nbsp ---
// Test for narrow non-breaking space. // Test for narrow non-breaking space.

View File

@ -1,7 +1,7 @@
// Test shorthands for unicode codepoints. // Test shorthands for unicode codepoints.
--- shorthand-nbsp-and-shy-hyphen --- --- shorthand-nbsp-and-shy-hyphen ---
The non-breaking space~does work, soft-?hyphen also does. The non-breaking space~does work, soft-?hyphen does, and non-!breaking hyphen also does.
--- shorthand-nbsp-width --- --- shorthand-nbsp-width ---
// Make sure non-breaking and normal space always // Make sure non-breaking and normal space always

View File

@ -42,6 +42,10 @@
"name": "punctuation.definition.nonbreaking-space.typst", "name": "punctuation.definition.nonbreaking-space.typst",
"match": "~" "match": "~"
}, },
{
"name": "punctuation.definition.nonbreaking-hyphen.typst",
"match": "-!"
},
{ {
"name": "punctuation.definition.shy.typst", "name": "punctuation.definition.shy.typst",
"match": "-\\?" "match": "-\\?"