Sorcerer's IsleCode QueryParam Scanner / files

  1<!--- jre-utils v0.6 | (c) Peter Boughton | License: LGPL --->
  2<!--- NOTE: This library is obsolete; use cfRegex instead: cfregex.net --->
  3<cfcomponent output="false">
  4
  5
  6	<cffunction name="init" output="false" access="public">
  7		<cfargument name="DefaultFlags"        type="String"  default="MULTILINE"/>
  8		<cfargument name="IgnoreInvalidFlags"  type="Boolean" default="false"/>
  9		<cfargument name="BackslashReferences" type="Boolean" default="false"/>
 10
 11		<cfset var CurrentFlag = ""/>
 12
 13		<cfset This.Flags = Struct
 14			( UNIX_LINES       : 1
 15			, CASE_INSENSITIVE : 2
 16			, COMMENTS         : 4
 17			, MULTILINE        : 8
 18			, DOTALL           : 32
 19			, UNICODE_CASE     : 64
 20			, CANON_EQ         : 128
 21			)/>
 22
 23		<cfset This.DefaultFlags = This.parseFlags( Arguments.DefaultFlags , Arguments.IgnoreInvalidFlags )/>
 24
 25		<cfset This.BackslashReferences = Arguments.BackslashReferences/>
 26
 27		<!--- In CFMX we cannot define a "Replace" function directly. --->
 28		<cfset This.replace   = _replace/>
 29		<cfset StructDelete(This,'_replace')/>
 30
 31		<cfreturn This/>
 32	</cffunction>
 33
 34
 35
 36	<cffunction name="Struct" returntype="Struct" access="private"><cfreturn Arguments/></cffunction>
 37
 38
 39
 40
 41	<cffunction name="parseFlags" returntype="Numeric" output="false" access="public">
 42		<cfargument name="FlagList"           type="String"/>
 43		<cfargument name="IgnoreInvalidFlags" type="Boolean" default="false"/>
 44		<cfset var CurrentFlag = ""/>
 45		<cfset var ResultFlag = 0/>
 46
 47		<cfloop index="CurrentFlag" list="#Arguments.FlagList#">
 48
 49			<cfif isNumeric(CurrentFlag)>
 50				<cfset ResultFlag = BitOr( ResultFlag , CurrentFlag )/>
 51
 52			<cfelseif StructKeyExists( This.Flags , CurrentFlag )>
 53				<cfset ResultFlag = BitOr( ResultFlag , This.Flags[CurrentFlag] )/>
 54
 55			<cfelseif NOT Arguments.IgnoreInvalidFlags>
 56				<cfthrow message="Invalid Flag!" detail="[#CurrentFlag#] is not supported."/>
 57
 58			</cfif>
 59
 60		</cfloop>
 61
 62		<cfreturn ResultFlag/>
 63	</cffunction>
 64
 65
 66
 67	<cffunction name="matches" returntype="Boolean" output="false" access="public">
 68		<cfargument name="Text"    type="String"/>
 69		<cfargument name="Regex"   type="String"/>
 70		<cfargument name="Flags"   default="#This.DefaultFlags#"/>
 71
 72		<cfset var Pattern = createObject("java","java.util.regex.Pattern")
 73			.compile( Arguments.Regex , parseFlags(Arguments.Flags) )/>
 74		<cfset var Matcher = Pattern.Matcher(Arguments.Text)/>
 75
 76		<cfloop condition="Matcher.find()">
 77			<cfreturn True/>
 78		</cfloop>
 79
 80		<cfreturn False/>
 81	</cffunction>
 82
 83
 84
 85	<cffunction name="get" returntype="Array" output="false" access="public">
 86		<cfargument name="Text"    type="String"/>
 87		<cfargument name="Regex"   type="String"/>
 88		<cfargument name="Flags"   default="#This.DefaultFlags#"/>
 89
 90		<cfset var Pattern = CreateObject("java","java.util.regex.Pattern")
 91			.compile( Arguments.Regex , parseFlags(Arguments.Flags) )/>
 92		<cfset var Matcher = Pattern.Matcher(Arguments.Text)/>
 93		<cfset var Matches = ArrayNew(1)/>
 94
 95		<cfloop condition="Matcher.find()">
 96			<cfset ArrayAppend(Matches,Matcher.Group())/>
 97		</cfloop>
 98
 99		<cfreturn Matches/>
100	</cffunction>
101
102
103
104	<cffunction name="getNoCase" returntype="Array" output="false" access="public">
105		<cfargument name="Text"    type="String"/>
106		<cfargument name="Regex"   type="String"/>
107		<cfargument name="Flags"   default="#This.DefaultFlags#"/>
108
109		<cfreturn This.get
110			( Text  : Arguments.Text
111			, Regex : Arguments.Regex
112			, Flags : BitOr( Arguments.Flags , This.Flags.CASE_INSENSITIVE )
113			)/>
114	</cffunction>
115
116
117
118
119	<cffunction name="_replace" returntype="String" output="false" access="public">
120		<cfargument name="Text"        type="String"/>
121		<cfargument name="Regex"       type="String"/>
122		<cfargument name="Replacement" type="Any"    hint="String or UDF"/>
123		<cfargument name="Scope"       type="String" default="ONE" hint="ONE,ALL"/>
124
125		<cfset var String     = ""/>
126		<cfset var Pattern    = ""/>
127		<cfset var Matcher    = ""/>
128		<cfset var Results    = ""/>
129		<cfset var Groups     = ""/>
130		<cfset var GroupIndex = ""/>
131
132		<cfif isSimpleValue(Arguments.Replacement)>
133
134			<cfif This.BackslashReferences AND REfind('[\\$]',Arguments.Replacement)>
135				<cfset Arguments.Replacement = replace(Arguments.Replacement,'$',Chr(65536),'all')/>
136				<cfset Arguments.Replacement = REreplace(Arguments.Replacement,'\\(?=[0-9])','$','all')/>
137				<cfset Arguments.Replacement = replace(Arguments.Replacement,Chr(65536),'\$','all')/>
138			</cfif>
139
140			<cfset String = createObject("java","java.lang.String").init(Arguments.Text)/>
141			<cfif Arguments.Scope EQ "ALL">
142				<cfreturn String.replaceAll(Arguments.Regex,Arguments.Replacement)/>
143			<cfelse>
144				<cfreturn String.replaceFirst(Arguments.Regex,Arguments.Replacement)/>
145			</cfif>
146
147		<cfelse>
148
149			<cfset Pattern = createObject("java","java.util.regex.Pattern").compile(Arguments.Regex)/>
150			<cfset Matcher = Pattern.Matcher( Arguments.Text )/>
151			<cfset Results = createObject("java","java.lang.StringBuffer").init()/>
152
153			<cfloop condition="Matcher.find()">
154
155				<cfset Groups = ArrayNew(1)/>
156
157				<cfloop index="GroupIndex" from="1" to="#Matcher.GroupCount()#">
158					<cfset ArrayAppend( Groups , Matcher.Group( JavaCast("int",GroupIndex) ) )/>
159				</cfloop>
160
161				<cfset Matcher.appendReplacement
162					( Results , Arguments.Replacement( Matcher.Group() , Groups ) )/>
163
164				<cfif Arguments.Scope NEQ "ALL">
165					<cfbreak/>
166				</cfif>
167
168			</cfloop>
169
170			<cfset Matcher.appendTail(Results)/>
171
172			<cfreturn Results.toString()/>
173		</cfif>
174	</cffunction>
175
176
177
178	<cffunction name="escape" returntype="String" output="false" access="public">
179		<cfargument name="Text" type="String"/>
180		<cfset var Result = Arguments.Text/>
181		<cfset var Symbol = ""/>
182		<cfset var EscapeChars = "\,.,[,],(,),^,$,|,?,*,+,{,}"/>
183
184		<cfloop index="Symbol" list="#EscapeChars#">
185			<cfset Result = replace( Result , Symbol , '\'&Symbol , 'all')/>
186		</cfloop>
187
188		<cfreturn Result />
189	</cffunction>
190
191
192
193
194</cfcomponent>