forked from getzola/zola
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathanchors.rs
56 lines (44 loc) · 1.45 KB
/
anchors.rs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
use libs::regex::Regex;
use libs::regex::escape;
pub fn has_anchor_id(content: &str, anchor: &str) -> bool {
let checks = anchor_id_checks(anchor);
checks.is_match(content)
}
fn anchor_id_checks(anchor: &str) -> Regex {
Regex::new(&format!(r#"\s(?i)(id|name) *= *("|')*{}("|'| |>)+"#,
escape(anchor))).unwrap()
}
#[cfg(test)]
mod tests {
use super::anchor_id_checks;
fn check(anchor: &str, content: &str) -> bool {
anchor_id_checks(anchor).is_match(content)
}
#[test]
fn matchers() {
let m = |content| check("fred", content);
// Canonical match/non match
assert!(m(r#"<a name="fred">"#));
assert!(m(r#"<a id="fred">"#));
assert!(!m(r#"<a name="george">"#));
// Whitespace variants
assert!(m(r#"<a id ="fred">"#));
assert!(m(r#"<a id = "fred">"#));
assert!(m(r#"<a id="fred" >"#));
assert!(m(r#"<a id="fred" >"#));
// Quote variants
assert!(m(r#"<a id='fred'>"#));
assert!(m(r#"<a id=fred>"#));
// Case variants
assert!(m(r#"<a ID="fred">"#));
assert!(m(r#"<a iD="fred">"#));
// Newline variants
assert!(m(r#"<a
id="fred">"#));
// Escaped Anchors
assert!(check("fred?george", r#"<a id="fred?george">"#));
assert!(check("fred.george", r#"<a id="fred.george">"#));
// Non matchers
assert!(!m(r#"<a notid="fred">"#));
}
}