Because LC can't do two things at once.
Michael Doub
mikedoub at gmail.com
Sat Feb 21 16:59:34 EST 2015
Here are three really good web sites that can help with regexp. I
don't consider myself an expert by any means but I feel like I am now
getting the hang of it. I give the credit to the creators of these
sites. Such a valuable asset.
-= Mike
http://www.regular-expressions.info/charclasssubtract.html -- great
tutorials and lots of examples
https://regex101.com -- my favorite testing engine, I love the way it
explains what is actually going on
http://www.regexr.com -- a whole library of interesting examples in the
community area.
On 2/21/15 2:24 PM, Peter Haworth wrote:
> I like what you said about "not speaking Regex". I think that's the
> biggest problem people have with Regex: it's a language and if you don't
> know the syntax rules of any language, it doesn't make sense. Good analogy.
>
> Here's the regex for extracting what you want from the Mac output:
>
> '(\w*)
>
> Translated into English, it means "Look for a ' character and return all
> characters after it in the range A-Z, or a-z, or 0-9 until you come across
> a character that is not in that range"
>
> Armed with that, the single statement below gets you "AC" or "Battery"
>
> matchText(tSource,"'(\w*)",tPowerSource)
>
> I'd be happy to supply the regex for the other platforms if someone
> supplies the format of the output.
>
> On Sat Feb 21 2015 at 8:03:50 AM Peter M. Brigham <pmbrig at gmail.com> wrote:
>
>> On Feb 21, 2015, at 2:59 AM, Richard Gaskin wrote:
>>
>>> Peter M. Brigham wrote:
>>>
>>>> Just out of curiosity, how *would* you do this via shell call or
>>>> the equivalent on a Windows laptop?
>>> Good question.
>>>
>>> Thanks to the beautiful simplicity of the Linux /proc directory I was
>> able to find:
>>> cat /proc/acpi/battery/BAT1/state
>>>
>>> The "charging state" field there will contain "charging" or
>> "discharging".
>>> Now if we can turn up a Win command line solution I'll write a handler
>> for this that'll make it convenient to get this info on all three platforms.
>>
>> That was my thought too. I was waiting for more info, but I started with
>> the handler(s) below. I don't speak Regex so I converted that line to use a
>> native LC function instead, getNestedItem() -- from your function posted
>> here several months ago, Richard, called nDepth(). I use this so often that
>> its now an essential part of my library. It's much more comprehensible to
>> me than Regex, though it can't do everything Regex can. So the quantity of
>> code below is really mostly utility handlers and the basic
>> getMacPowerSource() is very compact, as was the original.
>>
>> I'll leave the other platforms to you, Richard. (If you use Regex, I'll
>> translate it! :-) )
>>
>>> Martin, thanks for handling the Mac side - nice work.
>> Yes, thanks!
>>
>> -- Peter
>>
>> Peter M. Brigham
>> pmbrig at gmail.com
>> http://home.comcast.net/~pmbrig
>>
>> -------
>>
>> function getMacPowerSource
>> -- returns the current power source for a Mac
>> -- "AC" or "Battery"
>> -- requires getNestedItem() getItem(), getDelimiters()
>> put shell ("pmset -g batt") into tSource
>> -- returns something like:
>> -- Currently drawing from 'AC Power'
>> -- -InternalBattery-0 99%; finishing charge; 0:00 remaining
>> return getNestedItem(tSource,2,"'",1,space)
>> end getMacPowerSource
>>
>> function getNestedItem
>> -- allows specifying different delimiters to extract nested chunks
>> -- getNestedItem(tData,index1,delim1,index2,delim2,...)
>> -- eg, put "aaa,bbb,ccc*ddd*eee*fff,ggg,hhh" into tData
>> -- put getNestedItem(tData,3,comma,2,"*") -> "ddd"
>> -- *-delim item 2 of comma-delim item 3
>> -- specified delimiters can be strings, not just single characters,
>> -- so the following extracts the top-level domain name from a URL:
>> -- put "http://www.nytimes.com/pages/science/index.html/" into tURL
>> -- put getNestedItem(tURL,2,"://",1,"/") -> www.nytimes.com
>> -- based on a function by Richard Gaskin, use-LC list, originally named
>> nDepth()
>> -- debugged by members of the use-LC list,
>> -- expanded by Peter M. Brigham, pmbrig at gmail.com
>> -- the result is a very versatile tool for extracting strings from any
>> text
>> -- with a known structure
>> -- requires getItem(), getDelimiters()
>>
>> put paramcount() into prmCount
>> if prmCount mod 2 <> 1 or prmCount = 1 then
>> return "getNestedItem(): error in parameters."
>> end if
>> put param(1) into workingString
>> repeat with i = 2 to prmCount-1 step 2
>> if workingString = empty then return empty
>> put param(i) into pItemNbr
>> put param(i+1) into tDelim
>> put getItem(workingString,pItemNbr,tDelim) into workingString
>> end repeat
>> return workingString
>> end getNestedItem
>>
>> function getItem pList, pIndex, pDelim
>> -- returns item # pIndex of pList, given itemdelimiter = pDelim
>> -- could just "get item pIndex of pList" in the calling handler but
>> -- then have to set and restore the itemDelimiter, so this is less
>> hassle
>> -- defaults to pDelim = tab
>> -- allows pDelim to be a string of characters
>> -- so you could do this:
>> -- getItem("a//b//c//d//e//f",4,"//") -> d
>> -- also allows pIndex to be a range, eg "3-5"
>> -- in that case enclose the range in quotes
>> -- by Peter M. Brigham, pmbrig at gmail.com — freeware
>> -- requires getDelimiters()
>>
>> if pDelim = empty then put tab into pDelim
>> if len(pDelim) > 1 then
>> put getDelimiters(pList) into tempDel
>> if tempDel begins with "Error" then
>> return "Error in getDelimiters()"
>> end if
>> else
>> put pDelim into tempDel
>> end if
>> replace pDelim with tempDel in pList
>> set the itemdelimiter to tempDel
>> put offset("-",pIndex) into dashPos
>> if dashPos > 1 then
>> -- don't catch if pIndex is something like -1, -2, etc
>> put char 1 to dashPos-1 of pIndex into tStart
>> put char dashPos+1 to -1 of pIndex into tEnd
>> put item tStart to tEnd of pList into theItem
>> replace tempDel with pDelim in theItem
>> else
>> put item pIndex of pList into theItem
>> end if
>> return theItem
>> end getItem
>>
>> function getDelimiters pText, nbr
>> -- returns a cr-delimited list of <nbr> characters
>> -- not found in the variable pText
>> -- use for delimiters for, eg, parsing text files, loading arrays, etc.
>> -- usage: put getDelimiters(pText,2) into tDelims
>> -- if tDelims begins with "Error" then exit to top -- or whatever
>> -- put line 1 of tDelims into lineDivider
>> -- put line 2 of tDelims into itemDivider
>> -- etc.
>> -- by Peter M. Brigham, pmbrig at gmail.com — freeware
>>
>> if pText = empty then return "Error: no text specified."
>> if nbr = empty then put 1 into nbr -- default 1 delimiter
>> put "2,3,4,5,6,7,8,16,17,18,19,20,21,22,23,24,25,26" into baseList
>> -- low ASCII values, excluding CR, LF, tab, etc.
>> put the number of items of baseList into maxNbr
>> if nbr > maxNbr then return "Error: max" && maxNbr && "delimiters."
>> repeat with tCount = 1 to nbr
>> put true into failed
>> repeat with i = 1 to the number of items of baseList
>> put item i of baseList into testNbr
>> put numtochar(testNbr) into testChar
>> if testChar is not in pText then
>> -- found one, store and get next delim
>> put false into failed
>> put testChar into line tCount of delimList
>> exit repeat
>> end if
>> end repeat
>> if failed then
>> if tCount = 0 then
>> return "Error: cannot get any delimiters."
>> else if tCount = 1 then
>> return "Error: can only get one delimiter."
>> else
>> return "Error: can only get" && tCount && "delimiters."
>> end if
>> end if
>> delete item i of baseList
>> end repeat
>> return delimList
>> end getDelimiters
>>
>> -------
>>
>>
>> _______________________________________________
>> use-livecode mailing list
>> use-livecode at 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 at lists.runrev.com
> Please visit this url to subscribe, unsubscribe and manage your subscription preferences:
> http://lists.runrev.com/mailman/listinfo/use-livecode
More information about the use-livecode
mailing list