I did some research how to get selected text in Safari, but that’s long time ago.
As far as I know similar scripts didn’t ever work, because Safari has poor scriptability and do Javascript commands aren’t my thing.
Maybe somebody knows a better solution than mine.The script below should work, but it doesn’t. :rolleyes:
set javaSel to "getSelectionHTML = function () {\n var userSelection;\n if (window.getSelection) {\n // W3C Ranges\n userSelection = window.getSelection ();\n // Get the range:\n if (userSelection.getRangeAt)\n var range = userSelection.getRangeAt (0);\n else {\n var range = document.createRange ();\n range.setStart (userSelection.anchorNode, userSelection.anchorOffset);\n range.setEnd (userSelection.focusNode, userSelection.focusOffset);\n }\n // And the HTML:\n var clonedSelection = range.cloneContents ();\n var div = document.createElement ('div');\n div.appendChild (clonedSelection);\n return div.innerHTML;\n } else if (document.selection) {\n // Explorer selection, return the HTML\n userSelection = document.selection.createRange ();\n return userSelection.htmlText;\n } else {\n return '';\n }\n };"
tell window 1 of application "Safari"
tell current tab
set res to do JavaScript javaSel
end tell
end tell
return res
To get URLs too, your script should copy the selection to the clipboard. Then you can grab URLs from the clipboard using regex expression.
So, select in the Safari some text, including links too. Run this:
use AppleScript version "2.4" -- Yosemite (10.10) or later
use framework "Foundation"
use scripting additions
tell application "Safari"
(do JavaScript "document.execCommand('copy')" in document 1) -- copy selection
set theText to (do JavaScript "getSelection().toString()" in document 1)
end tell
# Get a reference to the Clipboard object.
set pb to current application's NSPasteboard's generalPasteboard()
# Read HTML from the Clipboard object.
set theHtmlText to (pb's stringForType:"public.html") as text
# Find HREF URLs.
set foundUrlList to its regexFindWithCapture:"(?i)(?:href\\h*=\\h*[\"'])(http[^\"']+)" fromString:theHtmlText resultTemplate:"$1"
return {|URLs|:foundUrlList, |Text|:theText}
------------------------------------------------------------
on regexFindWithCapture:thePattern fromString:theString resultTemplate:templateStr
set theString to current application's NSString's stringWithString:theString
set theRegEx to current application's NSRegularExpression's regularExpressionWithPattern:thePattern options:0 |error|:(missing value)
set theFinds to theRegEx's matchesInString:theString options:0 range:{0, theString's |length|()}
set theResult to current application's NSMutableArray's array()
repeat with aFind in theFinds
set foundString to (theRegEx's replacementStringForResult:aFind inString:theString |offset|:0 template:templateStr)
(theResult's addObject:foundString)
end repeat
return theResult as list
end regexFindWithCapture:fromString:resultTemplate: