201 intermediate commit for state navigation

This commit is contained in:
2026-01-24 12:07:12 +03:00
parent d843620292
commit ee9331e6cd
11 changed files with 222 additions and 22 deletions
+40 -10
View File
@@ -35,6 +35,14 @@
<cfset var args=[]/>
<cfset parse(args, tokenize(arguments.expression),0)/>
<cfreturn computeExpression(args[1].function, args[1].args, arguments.context)/>
</cffunction>
<cffunction name="extractParams" returntype="any" access="public">
<cfargument name="expression" type="string"/>
<cfset var params=[]/>
<cfset parseForParams(params, tokenize(arguments.expression),0)/>
<cfreturn params/>
</cffunction>
<!---
@@ -115,6 +123,38 @@ expression parse-evaluate
</cfloop>
</cffunction>
<cffunction name="parseForParams" returntype="numeric" access="private"><!--- returns last token position --->
<cfargument name="args" type="array"/><!--- puts here parsed params --->
<cfargument name="tokens" type="array"/>
<cfargument name="positionBefore" type="numeric"/><!--- before first processed token, initially 0 --->
<cfset var i = arguments.positionBefore/>
<cfloop condition="++i LE arrayLen(arguments.tokens)">
<cfswitch expression=#tokenType(arguments.tokens[i])#>
<cfcase value="string">
<!--- skip ---><!--- <cfset arrayAppend(arguments.args,mid(arguments.tokens[i],2,len(arguments.tokens[i])-2))/>--->
</cfcase>
<cfcase value="variable">
<cfset arrayAppend( arguments.args, tokens[i] )/>
</cfcase>
<cfcase value="function">
<cfset var f = {"function"=arguments.tokens[i],"args"=[]}/>
<cfif i GE arrayLen(arguments.tokens)>
<cfthrow message="unexpected end of expression"/>
</cfif>
<cfif #tokenType(arguments.tokens[++i])# NEQ "("><!--- skip opening parenthesis ---><!--- *** possible out of range --->
<cfthrow message="function syntax incorrect" detail="function #arguments.tokens[i-1]#, token='#arguments.tokens[i]#' (#arrayToList(tokens,' ')#"/>
</cfif>
<cfset i = parseForParams(f.args, arguments.tokens, i)/>
<!--- <cfset arrayAppend(arguments.args,f)/> --->
</cfcase>
<cfcase value=")">
<cfreturn i/><!--- returns last token position --->
</cfcase>
</cfswitch>
</cfloop>
</cffunction>
<cffunction name="computeExpression" returntype="any" access="private"><!--- вычисление выражения снаружи внутрь --->
<cfargument name="function" type="string"/>
@@ -138,16 +178,6 @@ expression parse-evaluate
<cfargument name="functionName"/><!--- а ссылку на функцию передать не получится? (замыкание даже наверно не нужно) --->
<cfargument name="args" type="array"/>
<cfargument name="context" type="any"/>
<!--- <cfoutput>#arguments.functionName#</cfoutput> args<cfdump var=#arguments.args#/> --->
<!--- <cfswitch expression=#arguments.functionName#>
<cfcase value="concat"><cfreturn concat(argumentCollection=arguments.args)/></cfcase>
<cfcase value="getResourceRealmConfig"><cfreturn getResourceRealmConfig(argumentCollection=arguments.args)/></cfcase>
<cfcase value="getKeyListFromStruct"><cfreturn getKeyListFromStruct(argumentCollection=arguments.args)/></cfcase>
<cfcase value="getValue"><cfreturn getValue(argumentCollection=arguments.args)/></cfcase>
<cfdefaultcase>
<cfthrow message="Undefined Function" detail="#arguments.functionName#"/>
</cfdefaultcase>
</cfswitch> --->
<!--- <cfdump var=#arguments#/> --->
<cfset var obj = createObject("component", arguments.context.component).init(arguments.context.keys, arguments.context.params)/>
<!--- <cfdump var=#obj# abort=true/> --->