xmlparser/
xmlchar.rs

1/// Extension methods for XML-subset only operations.
2pub trait XmlCharExt {
3    /// Checks if the value is within the
4    /// [NameStartChar](https://www.w3.org/TR/xml/#NT-NameStartChar) range.
5    fn is_xml_name_start(&self) -> bool;
6
7    /// Checks if the value is within the
8    /// [NameChar](https://www.w3.org/TR/xml/#NT-NameChar) range.
9    fn is_xml_name(&self) -> bool;
10
11    /// Checks if the value is within the
12    /// [Char](https://www.w3.org/TR/xml/#NT-Char) range.
13    fn is_xml_char(&self) -> bool;
14}
15
16impl XmlCharExt for char {
17    #[inline]
18    fn is_xml_name_start(&self) -> bool {
19        // Check for ASCII first.
20        if *self as u32 <= 128 {
21            return match *self as u8 {
22                  b'A'...b'Z'
23                | b'a'...b'z'
24                | b':'
25                | b'_' => true,
26                _ => false,
27            };
28        }
29
30        match *self as u32 {
31              0x0000C0...0x0000D6
32            | 0x0000D8...0x0000F6
33            | 0x0000F8...0x0002FF
34            | 0x000370...0x00037D
35            | 0x00037F...0x001FFF
36            | 0x00200C...0x00200D
37            | 0x002070...0x00218F
38            | 0x002C00...0x002FEF
39            | 0x003001...0x00D7FF
40            | 0x00F900...0x00FDCF
41            | 0x00FDF0...0x00FFFD
42            | 0x010000...0x0EFFFF => true,
43            _ => false,
44        }
45    }
46
47    #[inline]
48    fn is_xml_name(&self) -> bool {
49        // Check for ASCII first.
50        if *self as u32 <= 128 {
51            return (*self as u8).is_xml_name();
52        }
53
54        match *self as u32 {
55              0x0000B7
56            | 0x0000C0...0x0000D6
57            | 0x0000D8...0x0000F6
58            | 0x0000F8...0x0002FF
59            | 0x000300...0x00036F
60            | 0x000370...0x00037D
61            | 0x00037F...0x001FFF
62            | 0x00200C...0x00200D
63            | 0x00203F...0x002040
64            | 0x002070...0x00218F
65            | 0x002C00...0x002FEF
66            | 0x003001...0x00D7FF
67            | 0x00F900...0x00FDCF
68            | 0x00FDF0...0x00FFFD
69            | 0x010000...0x0EFFFF => true,
70            _ => false,
71        }
72    }
73
74    #[inline]
75    fn is_xml_char(&self) -> bool {
76        match *self as u32 {
77              0x000009
78            | 0x00000A
79            | 0x00000D
80            | 0x000020...0x00D7FF
81            | 0x00E000...0x00FFFD
82            | 0x010000...0x10FFFF => true,
83            _ => false,
84        }
85    }
86}
87
88
89/// Extension methods for XML-subset only operations.
90pub trait XmlByteExt {
91    /// Checks if byte is a digit.
92    ///
93    /// `[0-9]`
94    fn is_xml_digit(&self) -> bool;
95
96    /// Checks if byte is a hex digit.
97    ///
98    /// `[0-9A-Fa-f]`
99    fn is_xml_hex_digit(&self) -> bool;
100
101    /// Checks if byte is a space.
102    ///
103    /// `[ \r\n\t]`
104    fn is_xml_space(&self) -> bool;
105
106    /// Checks if byte is an ASCII char.
107    ///
108    /// `[A-Za-z]`
109    fn is_xml_letter(&self) -> bool;
110
111    /// Checks if byte is within the ASCII
112    /// [Char](https://www.w3.org/TR/xml/#NT-Char) range.
113    fn is_xml_name(&self) -> bool;
114}
115
116impl XmlByteExt for u8 {
117    #[inline]
118    fn is_xml_digit(&self) -> bool {
119        matches!(*self, b'0'...b'9')
120    }
121
122    #[inline]
123    fn is_xml_hex_digit(&self) -> bool {
124        matches!(*self, b'0'...b'9' | b'A'...b'F' | b'a'...b'f')
125    }
126
127    #[inline]
128    fn is_xml_space(&self) -> bool {
129        matches!(*self, b' ' | b'\t' | b'\n' | b'\r')
130    }
131
132    #[inline]
133    fn is_xml_letter(&self) -> bool {
134        matches!(*self, b'A'...b'Z' | b'a'...b'z')
135    }
136
137    #[inline]
138    fn is_xml_name(&self) -> bool {
139        matches!(*self, b'A'...b'Z' | b'a'...b'z'| b'0'...b'9'| b':' | b'_' | b'-' | b'.')
140    }
141}