@@ -26,8 +26,6 @@ use std::fs::File;
26
26
use std:: io:: prelude:: * ;
27
27
use std:: path:: Path ;
28
28
29
- use regex:: Regex ;
30
-
31
29
const COLS : usize = 100 ;
32
30
const LICENSE : & ' static str = "\
33
31
Copyright <year> The Rust Project Developers. See the COPYRIGHT
@@ -40,26 +38,54 @@ http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
40
38
option. This file may not be copied, modified, or distributed
41
39
except according to those terms." ;
42
40
43
- /// True if LINE is allowed to be longer than the normal limit.
44
- ///
45
- /// Currently there is only one exception: if the line is within a
46
- /// comment, and its entire text is one URL (possibly with a Markdown
47
- /// link label in front), then it's allowed to be overlength. This is
48
- /// because Markdown offers no way to split a line in the middle of a
49
- /// URL, and the length of URLs for external references is beyond our
50
- /// control.
51
- fn long_line_is_ok ( line : & str ) -> bool {
52
- lazy_static ! {
53
- static ref URL_RE : Regex = Regex :: new(
54
- // This regexp uses the CommonMark definition of link
55
- // label. It thinks any sequence of nonwhitespace
56
- // characters beginning with "http://" or "https://" is a
57
- // URL. Add more schemas as necessary.
58
- r"^\s*//[!/]?\s+(?:\[(?:[^\]\\]|\\.){1,999}\]:\s+)?https?://\S+$"
59
- ) . unwrap( ) ;
41
+ /// Parser states for line_is_url.
42
+ #[ derive( PartialEq ) ]
43
+ #[ allow( non_camel_case_types) ]
44
+ enum LIUState { EXP_COMMENT_START ,
45
+ EXP_LINK_LABEL_OR_URL ,
46
+ EXP_URL ,
47
+ EXP_END }
48
+
49
+ /// True if LINE appears to be a line comment containing an URL,
50
+ /// possibly with a Markdown link label in front, and nothing else.
51
+ /// The Markdown link label, if present, may not contain whitespace.
52
+ /// Lines of this form are allowed to be overlength, because Markdown
53
+ /// offers no way to split a line in the middle of a URL, and the lengths
54
+ /// of URLs to external references are beyond our control.
55
+ fn line_is_url ( line : & str ) -> bool {
56
+ use self :: LIUState :: * ;
57
+ let mut state: LIUState = EXP_COMMENT_START ;
58
+
59
+ for tok in line. split_whitespace ( ) {
60
+ match ( state, tok) {
61
+ ( EXP_COMMENT_START , "//" ) => state = EXP_LINK_LABEL_OR_URL ,
62
+ ( EXP_COMMENT_START , "///" ) => state = EXP_LINK_LABEL_OR_URL ,
63
+ ( EXP_COMMENT_START , "//!" ) => state = EXP_LINK_LABEL_OR_URL ,
64
+
65
+ ( EXP_LINK_LABEL_OR_URL , w)
66
+ if w. len ( ) >= 4 && w. starts_with ( "[" ) && w. ends_with ( "]:" )
67
+ => state = EXP_URL ,
68
+
69
+ ( EXP_LINK_LABEL_OR_URL , w)
70
+ if w. starts_with ( "http://" ) || w. starts_with ( "https://" )
71
+ => state = EXP_END ,
72
+
73
+ ( EXP_URL , w)
74
+ if w. starts_with ( "http://" ) || w. starts_with ( "https://" )
75
+ => state = EXP_END ,
76
+
77
+ ( _, _) => return false ,
78
+ }
60
79
}
61
80
62
- if URL_RE . is_match ( line) {
81
+ state == EXP_END
82
+ }
83
+
84
+ /// True if LINE is allowed to be longer than the normal limit.
85
+ /// Currently there is only one exception, for long URLs, but more
86
+ /// may be added in the future.
87
+ fn long_line_is_ok ( line : & str ) -> bool {
88
+ if line_is_url ( line) {
63
89
return true ;
64
90
}
65
91
0 commit comments