Hello.
The script displays differences of two AppleScript Files which is selected in Finder in TextWrangler (free), and gives you a nice display of the differences, though colorless.
I think the script only works in SL, or with Leopard if that was when osadecompile was introduced. I will come back and add support for Tiger, through Satimage.
So this is isn’t quite finished, but it is still in such a state that it should prove useful for many. You have to have TextWrangler (which is free) installed in order to use this. -And the command line tools! TextWrangler can be downloaded from here
Edit You don’t really need this if you have Smile in the first place since you can compare two windows in it.
-- The Idea and implementation and any faults is totally mine. © McUsr 2010 and put in the Public Domain.
-- The usually guarrantees about nothing what so ever applies, use it at your own risk.
-- Read the documentation.
-- You are not allowed to post this code elsewhere, but may of course refer to the post at macscripter.net.
-- macscripter.net/viewtopic.php?id=33758
(*
TERMS OF USE.
This applies only to posting code, as long as you don't post it on other websites, or displays it (the code) on your own, you are welcome to do
whatever you want to do with it without any further permission.
Except for the following: Selling the code as is, or removing copyright statmentents and the embedded link in the code (without the http:// part) from the code.
I don't require you to keep this whole novel, but you must keep the link which refers to where it was originally posted. And my copyright.
You must also state what you eventually have done with the original source. This obviously doesn't matter if you distribute AppleScript as read only. I do not require you to embed any properties helding copyright notice for the code when you distribute as read only.
Credit for having contributed to your product would in all cases be nice!
If you use this code as part of script of yours you are of course welcome to post that code with my code in it here at macscripter.net. If you then wish to post your code elsewhere after having uploaded it to MacScripter.net please email me and ask for permission.
The ideal situation is however that you then refer to your code by a link to MacScripter.net
The sole reason for this, is that it is so much better for all of us to have a centralized codebase which are updated, than having to roam the net to find any usable snippets. Which some of us probabaly originated in the first hand.
I'm picky about this. If I find you to have published parts of my code on any other site without previous permission, I'll do what I can to have the site remove the code, ban you, and sue you under the jurisdiction of AGDER LAGMANNSRETT of Norway. Those are the terms you silently agree too by using this code.
The above paragraphs are also valid if you violate any of my terms.
If you use this or have advantage of this code in a professional setting, where professional setting means that you use this code to earn money by keeping yourself more productive. Or if you as an employee share the resulting script with other coworkers, enhancing the productivity of your company, then a modest donation to MacScripter.net would be appreciated.
*)
-- © McUsr 2010 and put in Public Domain see: macscripter.net/viewtopic.php?id=33758 for reference and terms of use.
on run
-- check if text wrangler of bbedit is installed.
-- Dette er blokka for at finder er oppe.
tell application "Finder"
activate
set theSel to (get selection)
set selCount to count theSel
-- if selCount is 0 then my errMsg() det er alltid et finder window og det er desktop
if selCount is 2 then
set {fileA, fileB} to {item 1 of theSel, item 2 of theSel}
else
if selCount is greater than 3 then my errMsg()
if (count its windows) is 1 or selCount is 0 then my errMsg()
-- only the desktop window or no items in the selection, -we don't handle folders - yet?
set fileA to item 1 of theSel
if class of fileA is not document file then my errMsg()
set fw1 to id of its Finder window 1
tell its Finder window 2 to activate
set theSel to (get selection) -- of Finder window 1
set selCount to count theSel
if selCount ≠1 then my errMsg()
set fileB to item 1 of theSel
if class of fileB is not document file then my errMsg()
tell Finder window id fw1 to activate
if contents of fileB is equal to contents of fileA then my errMsg()
end if
set {mustDecompileFileA, mustDecompileFileB} to {my classifyASfile(fileA), my classifyASfile(fileB)}
-- there were something applescript a like so we will commence
set shortNm to name of fileA
set {tids, AppleScript's text item delimiters} to {AppleScript's text item delimiters, "."}
set shortNm to text item 1 of shortNm
set AppleScript's text item delimiters to ""
set shortNm to shortNm as text
set theDir to do shell script "/usr/bin/mktemp -d -t " & quoted form of shortNm
set tempFn1 to quoted form of (theDir & "/" & my createPathDenotingFileNameWitoutExt((fileA as alias as text)))
set tempFn2 to quoted form of (theDir & "/" & my createPathDenotingFileNameWitoutExt((fileB as alias as text)))
if mustDecompileFileA then
my decompileAppleScriptTextForDiff((fileA as alias), tempFn1)
else
try
do shell script "cp " & quoted form of POSIX path of (fileA as alias) & " " & tempFn1
end try
end if
if mustDecompileFileB then
my decompileAppleScriptTextForDiff((fileB as alias), tempFn2)
else
try
do shell script "cp " & quoted form of POSIX path of (fileB as alias) & " " & tempFn2
end try
end if
end tell
-- make the differences show up in text wrangler!
try
set myres to (do shell script "/usr/bin/twdiff --ignore-spaces " & tempFn1 & " " & tempFn2)
tell me
activate
display alert "AppleScript Diff: The files are alike!"
end tell
on error e number n
tell application "TextWrangler"
activate
end tell
end try
end run
on classifyASfile(aFileRef)
tell application "Finder"
if file type of aFileRef is "osas" then return true
end tell
set aFileRef to aFileRef as alias
tell application "System Events"
set ftype to type identifier of (get properties of item (aFileRef as text))
if ftype is not "com.apple.traditional-mac-plain-text" then
my errMsg()
else
return false
end if
end tell
end classifyASfile
on errMsg()
beep
tell me
activate
display dialog "You need to select two and only two two different Apple Script files in the frontmost Finder Window or one file in each of the two frontmost Finder windows in order to run this script.
" with title "AppleScriptDiff" buttons {"Ok"} default button 1 with icon file ((path to library folder from system domain as text) & "CoreServices:CoreTypes.bundle:Contents:Resources:Unsupported.icns")
error number -128
end tell
end errMsg
on decompileAppleScriptTextForDiff(fileAlias, qpxTempFileName) -- Thanks to oldmanegan
local theSourceText, qfPoxPath
set qfPoxPath to quoted form of POSIX path of (fileAlias)
try
fileAlias as alias
on error e number n
set bad to true
end try
try
do shell script "/usr/bin/osadecompile " & qfPoxPath & "| /usr/bin/tr -d '\\000' >" & qpxTempFileName
on error e number n
tell me
activate
display alert "AppleScriptDiff: decompileAppleScriptTextForDiff()" & e & " : " & n
end tell
error number -128
end try
end decompileAppleScriptTextForDiff
on createPathDenotingFileNameWitoutExt(hfSfileNameAsText)
set {tids, AppleScript's text item delimiters} to {AppleScript's text item delimiters, ":"}
-- set hfsFilenameAsText to {""} & text items 2 thru -1 of hfsFilenameAsText
-- Uses the line above instead of line under if you want to convert to unix alike filename.
set hfSfileNameAsText to text items of hfSfileNameAsText
set AppleScript's text item delimiters to "_"
set hfSfileNameAsText to hfSfileNameAsText as text
set AppleScript's text item delimiters to "."
set hfSfileNameAsText to text item 1 of hfSfileNameAsText as text
set AppleScript's text item delimiters to tids
return hfSfileNameAsText
end createPathDenotingFileNameWitoutExt