push: Fix regex for word boundaries
This commit is contained in:
		
							parent
							
								
									1e220a05bf
								
							
						
					
					
						commit
						506a7bdf2e
					
				@ -13,13 +13,6 @@ mod room_member_count_is;
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
pub use room_member_count_is::{ComparisonOperator, RoomMemberCountIs};
 | 
					pub use room_member_count_is::{ComparisonOperator, RoomMemberCountIs};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/// The characters that are defined as a word boundary in the [Matrix spec].
 | 
					 | 
				
			||||||
///
 | 
					 | 
				
			||||||
/// Any character not in the sets `[A-Z]`, `[a-z]`, `[0-9]` or `_`.
 | 
					 | 
				
			||||||
///
 | 
					 | 
				
			||||||
/// [Matrix spec]: https://spec.matrix.org/v1.3/client-server-api/#conditions-1
 | 
					 | 
				
			||||||
const WORD_BOUNDARY_CHARACTERS: &str = "[^A-Za-z0-9_]";
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/// A condition that must apply for an associated push rule's action to be taken.
 | 
					/// A condition that must apply for an associated push rule's action to be taken.
 | 
				
			||||||
#[derive(Clone, Debug, Deserialize, Serialize)]
 | 
					#[derive(Clone, Debug, Deserialize, Serialize)]
 | 
				
			||||||
#[cfg_attr(not(feature = "unstable-exhaustive-types"), non_exhaustive)]
 | 
					#[cfg_attr(not(feature = "unstable-exhaustive-types"), non_exhaustive)]
 | 
				
			||||||
@ -279,10 +272,9 @@ impl StrExt for str {
 | 
				
			|||||||
                chunks.push(chunk.wildcards_to_regex());
 | 
					                chunks.push(chunk.wildcards_to_regex());
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            let regex = format!(
 | 
					            // The word characters in ASCII compatible mode (with the `-u` flag) match the
 | 
				
			||||||
                "(?:^|{WORD_BOUNDARY_CHARACTERS}){}(?:{WORD_BOUNDARY_CHARACTERS}|$)",
 | 
					            // definition in the spec: any character not in the set `[A-Za-z0-9_]`.
 | 
				
			||||||
                chunks.concat()
 | 
					            let regex = format!(r"(?-u:^|\W|\b){}(?-u:\b|\W|$)", chunks.concat());
 | 
				
			||||||
            );
 | 
					 | 
				
			||||||
            Regex::new(®ex).ok().filter(|re| re.is_match(self)).is_some()
 | 
					            Regex::new(®ex).ok().filter(|re| re.is_match(self)).is_some()
 | 
				
			||||||
        } else {
 | 
					        } else {
 | 
				
			||||||
            match self.find(pattern) {
 | 
					            match self.find(pattern) {
 | 
				
			||||||
@ -530,13 +522,33 @@ mod tests {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    #[test]
 | 
					    #[test]
 | 
				
			||||||
    fn patterns_match() {
 | 
					    fn patterns_match() {
 | 
				
			||||||
        // Word matching
 | 
					        // Word matching without glob
 | 
				
			||||||
        assert!("foo bar".matches_pattern("foo", true));
 | 
					        assert!("foo bar".matches_pattern("foo", true));
 | 
				
			||||||
        assert!("Foo bar".matches_pattern("foo", true));
 | 
					        assert!("Foo bar".matches_pattern("foo", true));
 | 
				
			||||||
        assert!(!"foobar".matches_pattern("foo", true));
 | 
					        assert!(!"foobar".matches_pattern("foo", true));
 | 
				
			||||||
        assert!("foo bar".matches_pattern("foo*", true));
 | 
					 | 
				
			||||||
        assert!("".matches_pattern("", true));
 | 
					        assert!("".matches_pattern("", true));
 | 
				
			||||||
        assert!(!"foo".matches_pattern("", true));
 | 
					        assert!(!"foo".matches_pattern("", true));
 | 
				
			||||||
 | 
					        assert!("foo bar".matches_pattern("foo bar", true));
 | 
				
			||||||
 | 
					        assert!(" foo bar ".matches_pattern("foo bar", true));
 | 
				
			||||||
 | 
					        assert!("baz foo bar baz".matches_pattern("foo bar", true));
 | 
				
			||||||
 | 
					        assert!("foo baré".matches_pattern("foo bar", true));
 | 
				
			||||||
 | 
					        assert!(!"bar foo".matches_pattern("foo bar", true));
 | 
				
			||||||
 | 
					        assert!("foo bar".matches_pattern("foo ", true));
 | 
				
			||||||
 | 
					        assert!("foo ".matches_pattern("foo ", true));
 | 
				
			||||||
 | 
					        assert!("foo  ".matches_pattern("foo ", true));
 | 
				
			||||||
 | 
					        assert!(" foo  ".matches_pattern("foo ", true));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // Word matching with glob
 | 
				
			||||||
 | 
					        assert!("foo bar".matches_pattern("foo*", true));
 | 
				
			||||||
 | 
					        assert!("foo bar".matches_pattern("foo b?r", true));
 | 
				
			||||||
 | 
					        assert!(" foo bar ".matches_pattern("foo b?r", true));
 | 
				
			||||||
 | 
					        assert!("baz foo bar baz".matches_pattern("foo b?r", true));
 | 
				
			||||||
 | 
					        assert!("foo baré".matches_pattern("foo b?r", true));
 | 
				
			||||||
 | 
					        assert!(!"bar foo".matches_pattern("foo b?r", true));
 | 
				
			||||||
 | 
					        assert!("foo bar".matches_pattern("f*o ", true));
 | 
				
			||||||
 | 
					        assert!("foo ".matches_pattern("f*o ", true));
 | 
				
			||||||
 | 
					        assert!("foo  ".matches_pattern("f*o ", true));
 | 
				
			||||||
 | 
					        assert!(" foo  ".matches_pattern("f*o ", true));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        // Glob matching
 | 
					        // Glob matching
 | 
				
			||||||
        assert!(!"foo bar".matches_pattern("foo", false));
 | 
					        assert!(!"foo bar".matches_pattern("foo", false));
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user