|
Useful AppleScript Handler Code-bits
Here are some useful bits of AppleScript Handler code I've whipped up. I avoided using the line-continue character, since that makes copy-and-paste fail, so you'll see a variable set, and then added to on separate lines when it could have all been done on one line. (URLAS = URL Access Scripting)- simpleFTPupload - replace URLAS FTP upload.
- curlSimpleDownload - replace URLAS download.
- dateAsCustomString - format a date.
- Multiple Messages - send multiple messages using Eudora.
simpleFTPupload
The is a simple curl replacement for the URL Access Scripting FTP upload capability.-- SAMPLE USAGE 1 - upload file to the default ftp directory on the server simpleFtpUpload("ftp://ftp.SOMEWHERE.com/", "DriveX:Users:YOU:Desktop:TEMP:some'dir:person's ploy", "testme", "testing12") -- SAMPLE USAGE 2 - upload file to a specific directory on the server simpleFtpUpload("ftp://ftp.SOMEWHERE.com/files/july/", "DriveX:Users:YOU:Desktop:TEMP:some'dir:person's ploy", "testme", "testing12") on simpleFtpUpload(remoteURL, macFilePath, userName, userPasswd) -- version 1.2, Dan Shockley (http://www.danshockley.com) -- uses curl to do the upload -- remoteURL is the complete ftp url to the remote destination directory try if userName is "" then set userName to "anonymous" set userPasswd to "devnull@devnull.null" -- no email address, change if desired end if -- get parentFolder if (macFilePath as string) ends with ":" then -- it is a folder itself set {od, AppleScript's text item delimiters} to {AppleScript's text item delimiters, ":"} set parentFolder to (text items 1 thru -3 of (macFilePath as string)) as string set AppleScript's text item delimiters to od else -- it is just a file set {od, AppleScript's text item delimiters} to {AppleScript's text item delimiters, ":"} set parentFolder to (text items 1 thru -2 of (macFilePath as string)) as string set AppleScript's text item delimiters to od end if set localPosixPath to quoted form of POSIX path of alias macFilePath set uploadFileName to do shell script "basename " & localPosixPath set uploadDirectory to quoted form of POSIX path of parentFolder -- curl --upload-file SOMEFILE ftp://SERVER.com --user MYUSER:THEPASSWD -- must be IN the directory of the file you want to upload set myCommand to "cd " & uploadDirectory & ";" & "curl --upload-file " set myCommand to myCommand & quoted form of uploadFileName set myCommand to myCommand & " " & remoteURL set myCommand to myCommand & " --user " & userName & ":" & userPasswd set myCommand to myCommand & " " & "--write-out " & "%{size_upload}" set myCommand to myCommand & " --quote -quit" -- output is the 'size_upload' result from curl set uploadResult to do shell script myCommand return uploadResult -- size uploaded in kilobytes on error errMsg number errNum error "simpleFtpUpload FAILED: " & errMsg number errNum end try end simpleFtpUpload
curlSimpleDownload
This is a simple replacement for the URL Access Scripting download capability. One of the many nice things about curl is that you can get the result directly into a string, rather than having to save a file. Set destExpected to "" to get a string back.-- SAMPLE USAGE set actionURL to "http://www.macslash.org" set testFormInfo to "" set saveFilePath to "" curlSimpleDownload(actionURL, saveFilePath, testFormInfo) on curlSimpleDownload(downloadURL, destExpected, theFormInfo) -- version 1.2, Daniel A. Shockley - public domain -- downloadURL is STRING -- saves to destExpected (Mac path as STRING, FILE SPEC, or ALIAS), if given -- if destExpected is "", returns source result directly as string -- optional form data for POST - use "" for no form data try -- basic download to standard output set curlCode to "curl '" & downloadURL & "'" if (length of theFormInfo) > 0 then set curlCode to curlCode & " -d \"" & theFormInfo & "\"" end if -- now, add on the desired file location, if there is one given if destExpected is not "" then set unixDestExpected to quoted form of POSIX path of (destExpected as string) set curlCode to curlCode & " --output " & unixDestExpected & " --write-out \"%{http_code}\"" else -- result as string set curlCode to curlCode & " | vis" -- pipe into vis to strip nonprintable characters end if set curlResponse to do shell script curlCode return curlResponse (* curlResponse will be the http success code ("200"), or an error code. If no destination was given, curlResponse will be the source returned, and no file will be saved *) on error errMsg number errNum error "curlSimpleDownload FAILED: " & errMsg number errNum end try end curlSimpleDownload
dateAsCustomString
This handler allows you to format a date in almost any desired form.--SAMPLE USAGE dateAsCustomString("12/25/2002 1:30 PM", "YYYY MM DD hh mm ss ap") --> "2002 12 25 01 30 00 pm" dateAsCustomString("1/6/2003 9:23:21 AM", "YYYY-MM-DD hh-mm-ss AP") --> "2003-01-06 09-23-21 AM" on dateAsCustomString(incomingDate, stringFormat) -- version 1.2, Daniel A. Shockley http://www.danshockley.com -- 1.2 added am/pm option, and date class checking, with a nod to Arthur J. Knapp -- NEEDS simpleReplace() handler -- takes any form of MM, DD, YYYY, YY -- AND any form of hh, mm, ss -- (optional ap or AP, which gives am/pm or AM/PM) -- leaving off am/pm option coerces to military time -- MUST USE LOWER-CASE for TIME!!!! (avoids month/minute conflict) -- use single letters to allow single digits, where applicable -- textVars are each always 2 digits, whereas month and day -- may be 1 digit, and year will normally be 4 digit if class of incomingDate is not date then try set incomingDate to date incomingDate on error set incomingDate to (current date) end try end if set numHours to (time of incomingDate) div hours set textHours to text -2 through -1 of ("0" & (numHours as string)) set numMinutes to (time of incomingDate) mod hours div minutes set textMinutes to text -2 through -1 of ("0" & (numMinutes as string)) set numSeconds to (time of incomingDate) mod minutes set textSeconds to text -2 through -1 of ("0" & (numSeconds as string)) set numDay to day of incomingDate as number set textDay to text -2 through -1 of ("0" & (numDay as string)) set numYear to year of incomingDate as number set textYear to text -2 through -1 of (numYear as string) -- Emmanuel Levy's Plain Vanilla get month number function copy incomingDate to b set the month of b to January set numMonth to (1 + (incomingDate - b + 1314864) div 2629728) set textMonth to text -2 through -1 of ("0" & (numMonth as string)) set customDateString to stringFormat if numHours > 12 and (customDateString contains "ap" or customDateString contains "AP") then -- (afternoon) and requested am/pm set numHours to numHours - 12 -- pull off the military 12 hours for pm hours set textHours to text -2 through -1 of ("0" & (numHours as string)) end if set customDateString to simpleReplace(customDateString, "MM", textMonth) set customDateString to simpleReplace(customDateString, "DD", textDay) set customDateString to simpleReplace(customDateString, "YYYY", numYear as string) set customDateString to simpleReplace(customDateString, "hh", textHours) set customDateString to simpleReplace(customDateString, "mm", textMinutes) set customDateString to simpleReplace(customDateString, "ss", textSeconds) -- shorter options set customDateString to simpleReplace(customDateString, "M", numMonth) set customDateString to simpleReplace(customDateString, "D", numDay) set customDateString to simpleReplace(customDateString, "YY", textYear) set customDateString to simpleReplace(customDateString, "h", numHours) set customDateString to simpleReplace(customDateString, "m", numMinutes) set customDateString to simpleReplace(customDateString, "s", numSeconds) -- AM/PM MUST be after Minutes/Month done, since it adds an M if (time of incomingDate) > (12 * hours) then -- afternoon set customDateString to simpleReplace(customDateString, "ap", "pm") set customDateString to simpleReplace(customDateString, "AP", "PM") else set customDateString to simpleReplace(customDateString, "ap", "am") set customDateString to simpleReplace(customDateString, "AP", "AM") end if return customDateString end dateAsCustomString on simpleReplace(thisText, oldChars, newChars) -- version 1.1 -- 1.1 coerces the newChars to a STRING, since other data types do not always coerce -- (example, replacing "nine" with 9 as number replaces with "") set oldDelims to AppleScript's text item delimiters set AppleScript's text item delimiters to the oldChars set the parsedList to every text item of thisText set AppleScript's text item delimiters to the {(newChars as string)} set the newText to the parsedList as string set AppleScript's text item delimiters to oldDelims return newText end simpleReplace
Multiple Messages (in Eudora)
This script will take your front-most message in Eudora and send it separately to everyone selected in your Mac OS X Address book (who has an email address), using the personality/From address marked for that message.(* Multiple Messages version 2.0, Dan Shockley (http://www.danshockley.com) This script will take your front-most message in Eudora and send it separately to everyone selected in your Mac OS X Address book (who has an email address), using the personality/From address marked for that message. *) on run tell application "Eudora" activate set frontWin to a reference to window 1 set frontID to id of frontWin set {msgText, msgBody, msgSubject, msgPersonality, msgFrom, msgSig} to ¬ {whole text, body, subject, personality, field "FROM", signature} of message frontID set sendDialog to (display dialog "This script will take your front-most message (subject: " & msgSubject & ") " & ¬ "and send it separately to everyone selected in your Mac OS X Address book (who has an email address), " & ¬ "using the personality/From address marked for that message. Send immediately, or Queue outgoing " & ¬ "messages?" buttons {"Cancel", "Send", "Queue"} default button "Queue") end tell set fromAddress to my replaceSimple(msgFrom, "From: ", "") tell application "Address Book" set selectedContacts to selection set toList to {} repeat with oneSelected in selectedContacts if (count of emails of oneSelected) is greater than 0 then set oneEmail to get value of first email of oneSelected set oneFirst to get first name of oneSelected set oneMid to get middle name of oneSelected set oneLast to get last name of oneSelected set fullName to "" if oneFirst is not missing value then set fullName to my addWithDelim(fullName, space, oneFirst) if oneMid is not missing value then set fullName to my addWithDelim(fullName, space, oneMid) if oneLast is not missing value then set fullName to my addWithDelim(fullName, space, oneLast) if length of fullName is not 0 then set emailLine to "\"" & fullName & "\" <" & oneEmail & ">" else set emailLine to "<" & oneEmail & ">" end if copy emailLine to end of toList end if end repeat end tell repeat with oneAddress in toList tell application "Eudora" make message at end of mailbox "out" -- 0 is the current message set field "from" of message 0 to "dan@danshockley.com" set field "to" of message 0 to oneAddress set field "subject" of message 0 to msgSubject set body of message 0 to msgBody set personality of message 0 to msgPersonality set signature of message 0 to msgSig queue message 0 if button returned of sendDialog is "Send" then connect with sending without checking end if end tell end repeat end run on addWithDelim(oldString, delim, newPart) if length of oldString is 0 then return newPart else return oldString & delim & newPart end if end addWithDelim on parseChars(thisText, parseString) -- version 1.2, Daniel A. Shockley, http://www.danshockley.com set oldDelims to AppleScript's text item delimiters try set AppleScript's text item delimiters to the {parseString as string} set the parsedList to every text item of thisText set AppleScript's text item delimiters to oldDelims return parsedList on error errMsg number errNum try set AppleScript's text item delimiters to oldDelims end try error "ERROR: parseChars() handler: " & errMsg number errNum end try end parseChars on replaceSimple(thisText, oldChars, newChars) -- version 1.1, Daniel A. Shockley http://www.danshockley.com -- 1.1 coerces the newChars to a STRING, since other data types do not always coerce -- (example, replacing "nine" with 9 as number replaces with "") set oldDelims to AppleScript's text item delimiters set AppleScript's text item delimiters to the oldChars set the parsedList to every text item of thisText set AppleScript's text item delimiters to the {(newChars as string)} set the newText to the parsedList as string set AppleScript's text item delimiters to oldDelims return newText end replaceSimple
For more information, please