Finder integration scripts' oddities

Hi, I am a very new user here - owning a Hookmark Pro licence for over a year but never having found the time to get acquainted to it.

A couple of days ago I updated my licence and finally took the time to look into it.
I am especially interested in the applications supported by hookmark and the scripts that make it possible.
So I started my exploration with the Finder integration scripts - and started to scratch my head about the sloppy coding. I don’t intend to propose myself as overly clever, but in parts I wonder how they do work at all.

The default Get Address script:

tell application "Finder"
	set theItems to selection
	set n to count of theItems
	if n = 1 then
		try
			set ext to name extension of item 1 of theItems
			if ext = "hook" or ext = "HOOK" or ext = "hookmark" then
				set filepath to item 1 of theItems as alias
				return read POSIX path of filepath
			end if
		end try
		get URL of item 1 of theItems
	else
		set thePath to (POSIX path of (target of the front window as string))
		set filepath to "file://" & thePath
	end if
end tell

– This script has three return exits, one explicit, two implicit. I do know that this is possible in Apple Script of course and even very common in some programming languages. But how is an interested newcomer supposed to make sense of this?

– There is a seemingly useless try statment in the first half of the if statement (am I overlooking something here?) whereas in the second half one seems to be missing to properly catch cases with no folder window open on a desktop without any file selected and give meaningful (instead of cryptic) user feedback. Of course it’s dumb to make Hookmark call this script under this condition but, hey, I was dumb enough, too, which is why I know. Or simply check what happens using the default script if a Finder information window happens to be frontmost, or the window listing all drives on your system plus the network, or …

– There are completely unused or redundant variables (making the code unnecessarily complex, IMHO).

– There are two approaches to get a file URL in this code close to one another, one official and safe, the other one hand-made and grotesquely bad. I wonder how it does work at all. Maybe only because file URLs finally get wrapped up in hook://file/ URLs? I don’t know.

This code

set thePath to (POSIX path of (target of the front window as string))
set filepath to “file://” & thePath

won’t return a valid file URL in many cases, e. g. a folder window named (awkwardly for demonstration purposes as) “Is thiß a folder?” will return a file URL without any escapes

file:///Users/yourusername/Desktop/Is thiß a folder?/

whereas the code two lines above, asking the Finder for a (valid!) URL will return a properly escaped result:

file:///Users/yourusername/Desktop/Is%20thi%C3%9F%20a%20folder%3F/

Just open a terminal window and compare

open file:///Users/yourusername/Desktop/Is thiß a folder?/
or
open ‘file:///Users/peterjhartmann/Desktop/Is thiß a folder?/’
and
open file:///Users/yourusername/Desktop/Is%20thi%C3%9F%20a%20folder%3F/

(you have to make sure to provide a folder with this name on your desktop and replace ‘yourusername’ by your actual username of course.)

Michael Tsai, the developer of EagleFiler even went out of his way to provide a specially crafted ASObjC urlEncode() handler in his integration script for it, making sure to remove question marks from the final result (or at least I assume that it’s his code) - just check for yourself. Maybe it should be used in the Finder or elsewhere, too? I am not sure.

– Instead of giving the user intelligible feedback, Apple’s traditionally cryptic programmer’s errors are handed down giving him or her no clue about what is going wrong.

– And sadly, the Hookmark “Script Editor” does not provide formatted code (as Keyboard Maestro, Automator etc. does) and wraps lines, so scripts are almost impossible to read and understand. Yes, I know - I’m using Script Debugger, too. Feature request: “Please (at least) provide a button to open the script in the default script editor!” (Shouldn’t be too difficult to implement.)

My reworked version:

tell application “Finder”
set theItems to selection

if (count of theItems) = 1 then
	try -- why this try statment? what could cause an error? missing extension will return "", 
        -- not error, the existance of item 1 is guaranteed and the alias coercion 
        -- has to work as item 1 is guaranteed to be an existing file;
        -- try...end as an odd replacement for if...then...else?
        -- I am not sure what I am overlooking here, so I left it in.

		set ext to name extension of item 1 of theItems
		if ext = "hook" or ext = "HOOK" or ext = "hookmark" then
			set filepath to item 1 of theItems as alias
			return POSIX path of filepath
		end if
	end try
	
	return URL of item 1 of theItems
else
	try
		return URL of (target of the front window)
	on error
		error "There is neither a single file selection, nor an appropriate folder window in front to hook up to."
	end try
end if
end tell

I won’t go into detail but my reworked Get Name script looks like this:

tell application “Finder”
set theItems to selection

if (count of theItems) = 1 then
	return name of item 1 of theItems
else
	try -- silently ignore information windows etc.
		return (name of target of the front window) -- "target" is the official terminology; 
        -- how does "folder" work at all?
	on error
		error "There is neither a single file selection, nor an appropriate folder window in front to hook up to."
	end try
end if
end tell

Hoping that I didn’t offend anybody I do appreciate enlightening comments. Maybe I am wrong all the way? Thanks!

Thank you for your feedback, @hookmeupscotty . Much appreciated.

I guess it is there because of the read statement. Just in case Hookmark does not have the read permission, Hookmark will simply return the current file path. Though it is probably better inform the user.

In this case, Hookmark will display the error message in Hookmark window. So the user knows what happen.

Thank you for pointing this out. Currently Hookmark repairs this kind of URL. But you are right, it should return a valid URL.

Oh, yes, your are right! Which means, that my code is wrong. Wonder how I overlooked that. The code is supposed to return the contents of the file and NOT the path to the file.
I corrected my code accordingly:

tell application “Finder”
set theItems to selection

if (count of theItems) = 1 then
	try -- why this try statment? The file read may fail.

		set ext to name extension of item 1 of theItems
		if ext = "hook" or ext = "HOOK" or ext = "hookmark" then
			set filepath to item 1 of theItems as alias
			return read POSIX path of filepath
		end if
	end try
	
	return URL of item 1 of theItems
else
	try
		return URL of (target of the front window)
	on error
		error "There is neither a single file selection, nor an appropriate folder window in front to hook up to."
	end try
end if
end tell

Still, I wonder why Hookmark itself is not in charge of reading its own file. I guess Hookmark would be able to deal with permissions issues A LOT better. So shouldn’t it suffice to simply hand over the path to the Hookmark file in this case, too? OK, I see now, that if the read really fails, Hookmark receives the path to the file anyway. To read its contents, I suppose. So why bother with the code between try and end in the first place? Just my 5 cents.

Thanks!

Yes, I saw it myself. And it gave me no real clue what was happening. This is what I meant by “simply handing AppleScripts (mostly unintelligible) error message to the user”.