Kirk,
go pull a copy of my component Txtutl

there are a methods there which can parse any text.
They include the term "parse"
https://www.dropbox.com/sh/ntmvl7k6mt7czv7/AAB2bl8vu6RqFdJHCqF_2VHma?dl=0  


On Tue, 01 May 2018 20:31:26 +0000, Kirk Brooks via 4D_Tech wrote:
> Hi Julio,
> I was asking about how they are using Split string to parse a dot notation
> path into the value or containing object. Working this out was the real
> heavy lifting Canon did with his OBJ Module. It wasn't easy using the prior
> tool set.
> 
> I played with it for a couple of hours and have come up with these two
> methods. I'm sure this can be improved on.
> First is this method to split a string into a collection of property
> elements. I also split the collection indices into numbers. BTW - this can
> also be used to make JSON Pointers.
> 
> // Method: OBJ_parse_pathToCollection (text) => collection
> // $1 : dot notation path
> // $0 : collection of references
> C_TEXT($1;$path)
> C_COLLECTION($0;$myCol)
> C_LONGINT($i;$n)
> 
>  Case of
> : (Count parameters=0)
> : (Length($1)=0)
> Else
> $path:=Replace string(Replace string($1;"[";".");"]";"")
> $myCol:=Split string($path;".")
> For ($i;0;$myCol.length-1)
> If (Position($myCol[$i][[1]];"0123456789")>0)  // starts with a number
> $myCol[$i]:=Num($myCol[$i])
> End if
> End for
> End case
>   // --------------------------------------------------------
> $0:=$myCol
> 
> 
> Next is the method to extract the value or containing object of a path from
> an object or collection.
> 
>   // Method: OBJ_resolve_path (ptr; text) -> object
>   // $1 : an object or collection
>   // $2 : path to value, object or collection to return
> 
>   // $0 : {"success":(null, true or false), "value": (null, object,
> collection or value)}
> 
> 
> C_POINTER($1)
> C_TEXT($2;)
> C_OBJECT($resultObj;$0)
> C_LONGINT($i;$n)
> C_COLLECTION($dataCol;$pathCol)
> 
> $pathCol:=OBJ_parse_pathToCollection ($2)
> $resultObj:=New object("success";Null;"value";Null)
> 
> $dataCol:=New collection($1->)
> $i:=0
> 
> Repeat
> Case of
> : (Value type($dataCol[0])=Is collection)
>   // this must be a number
> Case of
> : (Value type($pathCol[$i])#Is real)  //   then this is not valid
> $resultObj.success:=False
> TRACE
> : ((($dataCol[0].length)-1)<$pathCol[$i]])
> 
>      $resultObj.success:=False
> 
> : ($i=($pathCol.length-1))  // have reached the target
> $resultObj.success:=True
> $resultObj.value:=$dataCol[0][$pathCol[$i]]
> Else   //  go on to next property
> $dataCol.unshift($dataCol[0][$pathCol[$i]])
> End case
> : (Value type($dataCol[0])=Is object)
> Case of
> : (($dataCol[0][$pathCol[$i]])=Null)
> $resultObj.success:=False
> : ($i=($pathCol.length-1))  // have reached the target
> $resultObj.success:=True
> $resultObj.value:=$dataCol[0][$pathCol[$i]]
> Else   //  go on to next property
> $dataCol.unshift($dataCol[0][$pathCol[$i]])
> End case
> End case
> $i:=$i+1
> Until ($i>($pathCol.length-1)) | ($resultObj.success#Null)
> 
> $0:=$resultObj
> 
> 
> $resultObj is an approach I'm starting to like a lot. It's the only way to
> return any kind of value, an object or a collection. The 'success' property
> is easy to test. This method currently returns 3 success values: true (the
> path evaluated), false (it doesn't), or null which means it's not valid
> either.
> 
> I decided to use a pointer because I wanted to not have to determine the
> object type prior to calling the method - plus there would be two of them.
> Like I say, this can be improved.
> 
> It is quite a lot less code than Canon's method required. Plus this deals
> with all values and objects or collections as the source.
> 
> On Tue, May 1, 2018 at 7:39 AM Julio Carneiro via 4D_Tech <
> 4d_tech@lists.4d.com> wrote:
> 
>> Here is an example I’m using:
>> 
>>        C_COLLECTION($aOrderByCols)
>>         $aOrderByCols:=Split string($orderBy;"%";sk ignore empty
>> strings+sk trim spaces)
>> 
>> $orderBy is a text string with “%” separated terms, like “foo %bar%more
>> %%data”.
>> 
>> As a result of the statement above, $aOrderByCols will become:
>> [“foo”,”bar”,”more”,”data”], as spaces and empty items are trimmed.
>> 
>> That replaces a utility method í’ve had for decades.
>> 
>> julio
>> 
>>> On May 1, 2018, at 1:14 AM, Kirk Brooks via 4D_Tech <
>> 4d_tech@lists.4d.com> wrote:
>>> 
>>> Miyako,
>>> This occurred to me too. Sadly there's no example for that in the docs.
>>> Would you happen to have a bit of code showing how it's intended to be
>> used?
>>> 
>>> On Mon, Apr 30, 2018 at 2:22 PM Keisuke Miyako via 4D_Tech <
>>> 4d_tech@lists.4d.com> wrote:
>>> 
>>>> the command "Split string", although generic,
>>>> was specifically created to help parse dot notation.
>>>> 
>>>> http://doc.4d.com/4Dv16R6/4D/16-R6/Split-string.301-3644822.en.html
>>>> 
>>> 
>>> --
>>> Kirk Brooks
>>> San Francisco, CA
>>> =======================
>>> 
>>> *We go vote - they go home*
>>> **********************************************************************
>>> 4D Internet Users Group (4D iNUG)
>>> FAQ:  http://lists.4d.com/faqnug.html
>>> Archive:  http://lists.4d.com/archives.html
>>> Options: https://lists.4d.com/mailman/options/4d_tech
>>> Unsub:  mailto:4d_tech-unsubscr...@lists.4d.com
>>> **********************************************************************
>> 
>> --
>> Julio Carneiro
>> 
>> 
>> 
>> 
>> 
>> --
>> Julio Carneiro
>> jjfo...@gmail.com
>> 
>> 
>> 
>> **********************************************************************
>> 4D Internet Users Group (4D iNUG)
>> FAQ:  http://lists.4d.com/faqnug.html
>> Archive:  http://lists.4d.com/archives.html
>> Options: https://lists.4d.com/mailman/options/4d_tech
>> Unsub:  mailto:4d_tech-unsubscr...@lists.4d.com
>> **********************************************************************
> 
> 
> 
> -- 
> Kirk Brooks
> San Francisco, CA
> =======================
> 
> *We go vote - they go home*
> **********************************************************************
> 4D Internet Users Group (4D iNUG)
> FAQ:  http://lists.4d.com/faqnug.html
> Archive:  http://lists.4d.com/archives.html
> Options: https://lists.4d.com/mailman/options/4d_tech
> Unsub:  mailto:4d_tech-unsubscr...@lists.4d.com
> **********************************************************************
---------------
Gas is for washing parts
Alcohol is for drinkin'
Nitromethane is for racing 
**********************************************************************
4D Internet Users Group (4D iNUG)
FAQ:  http://lists.4d.com/faqnug.html
Archive:  http://lists.4d.com/archives.html
Options: https://lists.4d.com/mailman/options/4d_tech
Unsub:  mailto:4d_tech-unsubscr...@lists.4d.com
**********************************************************************

Reply via email to