@@ -94,16 +94,20 @@ func isEncoded(_ str: String) -> Bool {
9494 return false
9595}
9696
97+ // parser REs - force try b/c pattern is known to be valid regex
98+ let re0 = try ! NSRegularExpression ( pattern: #"(?:(\/\/ ==UserScript==[ \t]*?\r?\n([\S\s]*?)\r?\n\/\/ ==\/UserScript==)([\S\s]*)|(\/\* ==UserStyle==[ \t]*?\r?\n([\S\s]*?)\r?\n==\/UserStyle== \*\/)([\S\s]*))"# , options: [ ] )
99+ // RE for meta line
100+ let re1 = try ! NSRegularExpression ( pattern: #"^(?:[ \t]*(?:\/\/)?[ \t]*@)([\w-]+)[ \t]+([^\s]+[^\r\n\t\v\f]*)"# , options: [ ] )
101+ // this pattern checks for specific keys that won't have values
102+ let re2 = try ! NSRegularExpression ( pattern: #"^(?:[ \t]*(?:\/\/)?[ \t]*@)(noframes)[ \t]*$"# , options: [ ] )
103+
97104// parser
98105func parse( _ content: String ) -> [ String : Any ] ? {
99106 // returns structured data from content of file
100107 // will fail to parse if metablock or required @name key missing
101- let pattern = #"(?:(\/\/ ==UserScript==[ \t]*?\r?\n([\S\s]*?)\r?\n\/\/ ==\/UserScript==)([\S\s]*)|(\/\* ==UserStyle==[ \t]*?\r?\n([\S\s]*?)\r?\n==\/UserStyle== \*\/)([\S\s]*))"#
102- // force try b/c pattern is known to be valid regex
103- let regex = try ! NSRegularExpression ( pattern: pattern, options: [ ] )
104108 let range = NSRange ( location: 0 , length: content. utf16. count)
105109 // return nil/fail if metablock missing
106- guard let match = regex . firstMatch ( in: content, options: [ ] , range: range) else {
110+ guard let match = re0 . firstMatch ( in: content, options: [ ] , range: range) else {
107111 logger? . debug ( " \( #function, privacy: . public) - Non matched content: \( content, privacy: . public) " )
108112 return nil
109113 }
@@ -134,12 +138,6 @@ func parse(_ content: String) -> [String: Any]? {
134138 var metadata = [ : ] as [ String : [ String ] ]
135139 // iterate through the possible metadata keys in file
136140 if let metas = Range ( match. range ( at: g2) , in: content) {
137- let p = #"^(?:[ \t]*(?:\/\/)?[ \t]*@)([\w-]+)[ \t]+([^\s]+[^\r\n\t\v\f]*)"#
138- // this pattern checks for specific keys that won't have values
139- let p2 = #"^(?:[ \t]*(?:\/\/)?[ \t]*@)(noframes)[ \t]*$"#
140- // force try b/c pattern is known to be valid regex
141- let re = try ! NSRegularExpression ( pattern: p, options: [ ] )
142- let re2 = try ! NSRegularExpression ( pattern: p2, options: [ ] )
143141 // split metadatas by new line
144142 let metaArray = content [ metas] . split ( whereSeparator: \. isNewline)
145143 // loop through metadata lines and populate metadata dictionary
@@ -148,7 +146,7 @@ func parse(_ content: String) -> [String: Any]? {
148146 let metaString = String ( meta) . trimmingCharacters ( in: . whitespaces)
149147 let range = NSRange ( location: 0 , length: metaString. utf16. count)
150148 // key lines not properly prefixed & without values will be skipped
151- if let m = re . firstMatch ( in: metaString, options: [ ] , range: range) {
149+ if let m = re1 . firstMatch ( in: metaString, options: [ ] , range: range) {
152150 // force unwrap key & value since matches regex above
153151 let key = metaString [ Range ( m. range ( at: 1 ) , in: metaString) !]
154152 let value = metaString [ Range ( m. range ( at: 2 ) , in: metaString) !]
@@ -1003,6 +1001,9 @@ func stringToRegex(_ stringPattern: String) -> NSRegularExpression? {
10031001 return regex
10041002}
10051003
1004+ // RE for parse matchPattern
1005+ let re3 = try ! NSRegularExpression ( pattern: #"^(http:|https:|\*:)\/\/((?:\*\.)?(?:[a-z0-9-]+\.)+(?:[a-z0-9]+)|\*\.[a-z]+|\*|[a-z0-9]+)(\/[^\s]*)$"# , options: . caseInsensitive)
1006+
10061007func match( _ url: String , _ matchPattern: String ) -> Bool {
10071008 guard
10081009 let parts = jsLikeURL ( url) ,
@@ -1028,10 +1029,8 @@ func match(_ url: String, _ matchPattern: String) -> Bool {
10281029 if ( ptcl != " http: " && ptcl != " https: " ) {
10291030 return false
10301031 }
1031- let partsPattern = #"^(http:|https:|\*:)\/\/((?:\*\.)?(?:[a-z0-9-]+\.)+(?:[a-z0-9]+)|\*\.[a-z]+|\*|[a-z0-9]+)(\/[^\s]*)$"#
1032- let partsPatternReg = try ! NSRegularExpression ( pattern: partsPattern, options: . caseInsensitive)
10331032 let range = NSMakeRange ( 0 , matchPattern. utf16. count)
1034- guard let parts = partsPatternReg . firstMatch ( in: matchPattern, options: [ ] , range: range) else {
1033+ guard let parts = re3 . firstMatch ( in: matchPattern, options: [ ] , range: range) else {
10351034 logger? . error ( " \( #function, privacy: . public) - malformed regex match pattern - \( matchPattern, privacy: . public) " )
10361035 return false
10371036 }
0 commit comments