J'ai eu exactement le même problème lorsque j'ai voulu être en mesure de lancer certains liens dans mon navigateur non par défaut, et les solutions comme LinCastor ne fonctionnaient pas pour moi. Voici ce que j'ai fait (après une tonne de recherches sur Google et des heures passées à me heurter à des murs de briques) :
Créer un service
J'ai créé un Service
dans Automator qui reçoit rich text
sur any application
. Ensuite, j'ai créé une série d'actions (qui sont toutes Run AppleScript
) pour transformer les données sélectionnées, petit à petit, en l'URL souhaitée. Les sections suivantes illustrent les étapes.
Pour être précis, il s'agit de toutes les étapes d'un même flux de travail, et toutes sont dans l'ordre indiqué ici (chaque étape consomme le résultat de l'étape qui la précède).
Modifier : Pour les personnes qui ne savent pas comment utiliser ce service, vous pouvez cliquer sur n'importe quel lien dans n'importe quelle application (j'utilisais des liens dans Mail qui étaient en texte enrichi, c'est-à-dire que le texte affiché n'était pas l'URL), et chercher le sous-menu Services dans la popup. Choisissez votre service dans cette liste, et voilà !
Obtenir les données
on run {input}
-- Save off the old clipboard data and capture the current selection in its entirety
set oldClipboard to the clipboard as record
tell application "System Events" to keystroke "c" using command down
set plistData to ""
set retries to 50
-- Try to get the pList data from the clipboard (may take a little while to appear)
repeat while plistData = ""
set clipboardRecord to the clipboard as record
try
set plistData to «class weba» of clipboardRecord
-- In case you want to use RTF instead...
--set clipRTF to «class RTF » of clipboardRecord
on error msg
set retries to retries - 1
-- If we're out of retries then bail
if retries < 0 then
set the clipboard to oldClipboard
display dialog ("Failed to get the web data: " & msg) buttons {"OK"} default button 1
error number -1
end if
-- ...else ignore the error and retry after a small delay
delay 0.1
end try
end repeat
-- Restore the old clipboard data
set the clipboard to oldClipboard
-- Set up our intermediate plist file
set plistFileName to (path to temporary items as text) & "safarilink.plist"
set plistFRef to (open for access file plistFileName with write permission)
try
set eof plistFRef to 0
write plistData to plistFRef
close access plistFRef
--display dialog plistFileName
on error msg
display dialog ("PList write error: " & msg) buttons {"OK"} default button 1
close access plistFRef
error number -1
end try
-- Pass the pList file name to the next step
return plistFileName
end run
Extraire le lien HTML
on run {input, parameters}
set plistFileName to (input as text)
-- Set up our intermediate HTML link file
set linkHtmlFileName to (path to temporary items as text) & "safarilink.html"
set linkHtmlFRef to (open for access file linkHtmlFileName with write permission)
try
tell application "System Events"
set plist to property list file plistFileName
set entry to contents of plist
--display dialog "Name: " & (name of entry)
--display dialog "Kind: " & (kind of entry)
--display dialog "Text: " & (text of entry)
set valueRec to (value of entry as record)
set webMainResource to webMainResource of valueRec
set webResourceData to webResourceData of webMainResource
--display dialog "Resourced"
set eof linkHtmlFRef to 0
write webResourceData to linkHtmlFRef
close access linkHtmlFRef
end tell
on error msg
display dialog ("Link HTML generation error: " & msg) buttons {"OK"} default button 1
close access linkHtmlFRef
error number -1
end try
-- Pass the HTML link file name to the next step
return linkHtmlFileName
end run
Chargez le HTML et extrayez l'URL
on run {input, parameters}
set linkHtmlFileName to (input as text)
--set fileSize to 0
--tell application "Finder" to set fileSize to size of file linkHtmlFileName
try
set htmlContentParts to read file linkHtmlFileName using delimiter "="
on error msg
display dialog ("Link HTML load error: " & msg) buttons {"OK"} default button 1
close access htmlFRef
error number -1
end try
set hrefIndex to -1
repeat with index from 1 to count of htmlContentParts
if item index of htmlContentParts ends with "href" then
set hrefIndex to index
end if
end repeat
if hrefIndex = -1 then
display dialog "Selection does not contain a link!" buttons {"OK"} default button 1
error number -1
end if
set linkPart to item (hrefIndex + 1) of htmlContentParts
set splitParts to split(linkPart, "\"")
return item 2 of splitParts --index is base-1
end run
on split(theString, theDelimiter)
-- Save delimiters to restore old settings
set oldDelimiters to AppleScript's text item delimiters
-- Set delimiters to delimiter to be used
set AppleScript's text item delimiters to theDelimiter
-- Create the array
set theArray to every text item of theString
-- Restore the old setting
set AppleScript's text item delimiters to oldDelimiters
-- Return the result
return theArray
end split
À ce stade, vous avez votre URL (veillez à la convertir explicitement en texte, de peur de vous retrouver avec de mystérieuses erreurs AppleScript. À partir de là, je l'ai utilisé pour charger automatiquement le lien dans Safari.
Utilisez votre URL
on run {input, parameters}
set linkURL to (input as text)
try
tell application "Safari"
if not (exists first window) then
make new window
set URL of last tab of first window to linkURL
set visible of first window to true
else
tell first window
set newTab to make new tab with properties {URL:linkURL}
set visible to true
set current tab to newTab
end tell
end if
activate
end tell
on error msg
display dialog ("Failed to load URL (" & linkURL & ") in Safari: " & msg) buttons {"OK"} default button 1
error number -1
end try
end run
Profitez-en, et j'espère que cela vous aidera !
0 votes
Peut-on supposer qu'aucun texte n'est sélectionné en dehors de l'URL ?
1 votes
Oui, seul le lien est sélectionné. Par exemple, lorsque je consulte un message dans Mail.app, si je clique avec le bouton droit de la souris sur un lien, le lien entier (et seulement le lien) est sélectionné, et le menu du bouton droit de la souris affiche les services qui acceptent le texte comme entrée.
0 votes
Une idée m'est venue à l'esprit : se pourrait-il qu'il le reçoive comme une "chaîne" plutôt que comme un "texte" ? Ce n'est probablement pas ce qui se passe, mais je pense que c'est une possibilité.
0 votes
@TimothyMueller-Harder : Je ne comprends pas - quelle est la différence entre "string" et "text" ? Que dois-je changer ?
0 votes
C'est pas grave, je pensais à Applescript. Après une recherche plus approfondie sur Automator, il n'y a apparemment aucune différence pour ce que vous faites :)
0 votes
Dans quelle mesure êtes-vous à l'aise avec Objective - C. Cela m'a pris un peu de temps mais je pense avoir trouvé un moyen d'obtenir les URL.
0 votes
@markhunte : Confortable. Merci, mais j'ai fini par résoudre ce problème différemment - j'utilise maintenant Multi-navigateur pour sélectionner et lancer une application lorsque je clique sur un lien.
0 votes
Cool. C'est drôle, j'étais en train de créer un NSService pour obtenir les URLs. J'ai fait des progrès avec les courriels, mais l'édition de texte était une douleur. Mais je suis content que le problème soit résolu...