Calion
Calion

Reputation: 293

Using Applescript to open filenames with escaped characters

Once upon a time, it was possible to put file:// urls into webpages, and if that URL matched a file on your desktop, why, the file would open on your computer when you clicked on the link.

This functionality has been disabled for security reasons, but I'm trying to recreate it for my own personal use. I'm trying to use a custom URL protocol and an Applescript application as described at http://www.macosxautomation.com/applescript/linktrigger/. I've almost got it working, with one difficulty: A URL can't have spaces in it, so they get escaped, as do other special characters like "&". How can I convince Applescript to open a file with a path with escaped characters in it, such as "/Users/jim/Dropbox/Getting%20Started.pdf"?

tell application "Finder"
open "/Users/jim/Dropbox/Getting Started.pdf" as POSIX file

works fine, whereas

tell application "Finder"
open "/Users/jim/Dropbox/Getting%20Started.pdf" as POSIX file

fails.

Is there an easy (i.e. non-regex) way to make this work?

Upvotes: 2

Views: 623

Answers (2)

jackjr300
jackjr300

Reputation: 7191

You can use the open command in do shell script.

Like this:

set tUrl to "/Users/jim/Dropbox/Getting%20Started.pdf"
do shell script "open 'file://" & tUrl & "'"

Upvotes: 3

mklement0
mklement0

Reputation: 439367

Try the following:

tell application "Finder"
   open my decodeFromUri("/Users/jim/Dropbox/Getting%20Started.pdf") as POSIX file
end tell

after declaring the following handler:

(*
     Decodes a string previously encoded for inclusion in a URI (URL).

     Note: Uses Perl and its URI::Escape module (preinstalled as of at least OSX 10.8).

     Adapted, with gratitude, from http://applescript.bratis-lover.net/library/url/

     Example:
          my decodeFromUri("me%2Fyou%20%26%20Mot%C3%B6rhead") # -> "me/you & Motörhead"

*)
on decodeFromUri(str)
    if str is missing value or str = "" then return str
    try
        # !! We MUST use `-ne` with `print` rather than just `-pe`; the latter returns the input unmodified.
        return do shell script "printf '%s' " & quoted form of str & " | perl -MURI::Escape -ne 'print uri_unescape($_)'"
    on error eMsg number eNum
        error "Decoding from URI failed: " & eMsg number eNum
    end try
end decodeFromUri

Upvotes: 1

Related Questions