One small point on this: it doesn't matter since we're dealing with HC files here, but in LC there can be backgrounds that don't appear on any card. So it would be necessary to add:
repeat with j = 1 to the number of backgrounds in stack i repeat with k= 1 to the number of controls of background j of stack i Note that this *doesn't* guarantee a single loop through all the controls. The code would need to handle controls in groups that appear on multiple cards. In Navigator I needed something like this. I created this, some of which I wrote years ago, and no warranty is expressed or implied: function allIDsOfStack stackID local tReturnIDList put empty into tReturnIDList repeat for each line bgID in backgroundIDsOf(stackID) put allControlIDsOf(bgID) after tReturnIDList end repeat repeat for each line cdID in cardIDsOf(stackID) put nonGroupChildControlIDsOf(cdID) after tReturnIDList end repeat return (the long id of stackID) & cr & tReturnIDList end allIDsOfStack function allControlIDsOf pContainerID local cIDend, cIDendString, controlIDList, controlList if not exists(pContainerID) then return empty put the long id of pContainerID into pContainerID --breakpoint switch word 1 of the name of pContainerID case "stack" return allIDsOfMainstack(pContainerID) case "card" put the controlIDs of pContainerID into controlList if controlList is empty then return pContainerID & cr repeat for each line cID in controlList put (the long id of control id cID of pContainerID) & cr after controlIDList end repeat return pContainerID & cr & controlIDList case "group" if word -6 of pContainerID is "card" then put -7 into cIDend else put -10 into cIDend put (word cIDend + 5 to -1 of pContainerID) & cr into cIDendString put the controlIDs of pContainerID into controlList if controlList is empty then return pContainerID & cr repeat for each line cID in controlList put "control" && (word 2 to cIDend of the long id of control id cID of pContainerID) && cIDendString after controlIDList end repeat return pContainerID & cr & controlIDList default --return "control" && word 2 to -1 of pContainerID return pContainerID end switch end allControlIDsOf function allUniqueIDsOf pControlList,includeBehaviors local tReturn, tWorking, X -- returns all the controls within put format("group,1\ncard,2\nstack,3") into X split X using cr and comma put canonicalIDsOf(pControlList) into pControlList sort lines of pControlList descending by X[word 1 of each] --answer pControlList repeat for each line cID in pControlList --put the long id of cID into cID if tReturn[cID] is not empty then next repeat --put true into tReturn[cID] if includeBehaviors then put canonicalIDsOf(allControlIDsOf(cID),false) into tWorking put addBehaviorChains(tWorking) into tBehaviors if tBehaviors is not empty then put cr & tBehaviors after tWorking split tWorking by cr as set else put canonicalIDsOf(allControlIDsOf(cID),true) into tWorking end if --answer tWorking --split tWorking by cr as set union tReturn with tWorking end repeat --answer the number of lines of the keys of tReturn return the keys of tReturn end allUniqueIDsOf function nonGroupChildControlIDsOf pContainerID local controlIDList, tReturnIDList put empty into tReturnIDList put the long id of pContainerID into pContainerID put the childControlIDs of pContainerID into controlIDList if controlIDList is empty then return pContainerID & cr put "control id " before controlIDList replace cr with " of" && pContainerID & cr & "control id " in controlIDList repeat for each line controlID in (controlIDList && "of" && pContainerID) if word 1 of the name of controlID is not "group" then put controlID & cr after tReturnIDList end repeat return pContainerID & cr & tReturnIDList end nonGroupChildControlIDsOf function canonicalIDsOf cIDList, returnArray local cID, cIDend, R repeat for each line cIDx in cIDList put the long id of cIDx into cID if word 5 of cID is "group" then if word -6 of cID is "card" then put -7 into cIDend else put -10 into cIDend put 1 into R[word 1 to cIDend of cID && word cIDend + 5 to -1 of cID] else put 1 into R[cID] end if end repeat if returnArray is true then return R else return (the keys of R) & cr end canonicalIDsOf function backgroundIDsOf stackID local backgroundIDList, bgID put empty into backgroundIDList repeat with i = 1 to 999999999 if not (there is a background i of stackID) then return backgroundIDList put (the long id of background i of stackID) into bgID if word 5 of bgID is not "group" then put bgID & cr after backgroundIDList end repeat end backgroundIDsOf function backgroundsOf stackID,bFilter,returnType,typeModifier if returnType = "short name" and bFilter = "backgroundNames" then return the backgroundNames of stackID put empty into R repeat with i = 1 to 999999999 if not (there is a background i of stackID) then return char 1 to -2 of R if not (bFilter = "all" \ or bFilter = "backgroundNames" and the backgroundBehavior of background i of stackID \ or bFilter = "base" and word 5 of the long id of background i of stackID is not "group") then next repeat switch case word 1 of returnType = "name" switch typeModifier case empty; put "background" && Q(the short name of background i of stackID) after R; break case "short"; put (the short name of background i of stackID) after R; break case "long"; put "background" && (word 2 to -1 of the long name of background i of stackID) after R; break end switch if returnType = "name" then break put tab after R case word 1 of returnType = "id" switch typeModifier case empty; put (the id of background i of stackID) after R; break case "short"; put (the short id of background i of stackID) after R; break case "long"; put (the long id of background i of stackID) after R; break end switch end switch put cr after R end repeat end backgroundsOf function cardsOf stackID repeat with i = 1 to 999999 if not (there is a card i of stackID) then return char 1 to -2 of R put (the short name of card i of stackID) & tab & (the short id of card i of stackID) & cr after R end repeat end cardsOf function backgroundIDsOf stackID local backgroundIDList, bgID try repeat with i = 1 to 999999999 put (the long id of background i of stackID) into bgID if word 5 of bgID is not "group" then put bgID & cr after backgroundIDList end repeat catch someErr end try return backgroundIDList end backgroundIDsOf function cardIDsOf stackID local cardIDList put "card id" && the cardIDs of stackID into cardIDList replace cr with " of" && the name of stackID & cr & "card id " in cardIDList return cardIDList && "of" && the name of stackID & cr end cardIDsOf On Mon, Nov 21, 2022 at 1:44 PM Paul Dupuis via use-livecode < use-livecode@lists.runrev.com> wrote: > I was also going to suggest just brute forcing it. Something like: (code > not complete or syntax checked) > > repeat with i=1 to the number of stacks > repeat with j = 1 to the number of cards in stack i > repeat with k= 1 to the number of controls of card j of stack i > put the script of control k of card j of stack i into tScript > -- look through the lines of tScript for "lock screen", note the > line number A, then search from there onward for "unlock screen" and > note the line number B > -- if line B begins with (after trimming spaces) "unlock screen > with" then > -- replace line B with "unlock screen with visual effect" > -- and replace line A with "lock screen for visual effect" > end repeat > end repeat > end repeat > > > On 11/21/2022 4:30 PM, Craig Newman via use-livecode wrote: > > Jacque. > > > > Why aren’t you on the forum? > > > > Cant you just loop through each line in your handlers, and find the ones > that contain “lock screen”, both with and without the visual effect thing. > Search downstream until you find the “unlock” line, That gives you the > start and finish lines for each handler. Then you can just replace the > start and finish lines with the new ones. > > > > Am I missing this? > > > > Craig > > > >> On Nov 21, 2022, at 4:24 PM, J. Landman Gay via use-livecode < > use-livecode@lists.runrev.com> wrote: > >> > >> I'm updating a very old set of stacks that use old HC syntax for "lock > screen". A search with LC's Find utility says there are 723 instances that > may need to be changed. Right now they look like this: > >> > >> lock screen > >> -- do any number of things > >> unlock screen with <effect> > >> > >> These all need to be changed to: > >> > >> lock screen for visual effect > >> -- do any number of things > >> unlock screen with visual effect <effect> > >> > >> The challenge is that not all "lock screen" commands use a visual > effect, some are simple lock/unlock pairs. I need to automate this. The > visual effects are not all the same. Some handlers have multiple instances > of locking the screen with or without a visual effect. > >> > >> I'd use a regex if I could, but back references aren't supported (or > are they now?) I really don't want to do this manually. > >> > >> -- > >> Jacqueline Landman Gay | jac...@hyperactivesw.com > >> HyperActive Software | http://www.hyperactivesw.com > >> > >> _______________________________________________ > >> use-livecode mailing list > >> use-livecode@lists.runrev.com > >> Please visit this url to subscribe, unsubscribe and manage your > subscription preferences: > >> http://lists.runrev.com/mailman/listinfo/use-livecode > > > > _______________________________________________ > > use-livecode mailing list > > use-livecode@lists.runrev.com > > Please visit this url to subscribe, unsubscribe and manage your > subscription preferences: > > http://lists.runrev.com/mailman/listinfo/use-livecode > > > _______________________________________________ > use-livecode mailing list > use-livecode@lists.runrev.com > Please visit this url to subscribe, unsubscribe and manage your > subscription preferences: > http://lists.runrev.com/mailman/listinfo/use-livecode > _______________________________________________ use-livecode mailing list use-livecode@lists.runrev.com Please visit this url to subscribe, unsubscribe and manage your subscription preferences: http://lists.runrev.com/mailman/listinfo/use-livecode