Wie erhält man in einem Service eine URL aus Rich Text?

1

Ich möchte einen Dienst (wenn möglich mit Automator) erstellen, mit dem ich eine Aktion für eine URL ausführen kann.

Wenn die URL als einfacher Text existiert, funktioniert dies einwandfrei.

Wenn es sich bei der URL jedoch um einen Rich-Text-Link handelt, erhält mein Dienst den Titel des Links und nicht die URL.

Wie kann ich die URL erhalten, wenn ich einen Dienst über einen Rich-Text-Link aktiviere?

smokris
quelle
Können wir davon ausgehen, dass außer der URL kein Text ausgewählt ist?
Timothy Mueller-Harder
1
Ja, nur der Link ist ausgewählt. Wenn ich zum Beispiel in Mail.app eine Nachricht anzeige und mit der rechten Maustaste auf einen Link klicke, wird der gesamte Link (und nur der Link) ausgewählt und im Kontextmenü werden Dienste angezeigt, die Text als Eingabe akzeptieren.
smokris
Der Gedanke kam mir gerade: Könnte es sein, dass es als "Zeichenkette" und nicht als "Text" empfangen wird? Dies ist wahrscheinlich nicht das, was passiert, aber ich denke, es ist eine Möglichkeit.
Timothy Mueller-Harder
@ TimothyMueller-Harder: Ich verstehe nicht - wie unterscheiden sich "Zeichenfolge" und "Text"? Was soll ich ändern?
smokris
Macht nichts - ich dachte an Applescript. Nach weiteren Automator-Recherchen gibt es anscheinend keinen Unterschied für das, was Sie tun. :)
Timothy Mueller-Harder

Antworten:

2

Sie können es mit der App tun TextSoap . Die Bereinigungsprogramme "URLs durch Ersetzen extrahieren" und "URLs durch Anhängen extrahieren" funktionieren im Rich-Text-Format.

Sie können auch das folgende AppleScript verwenden:

tell application "textsoap7"
    cleanClipboard with "Extract URLs by Replacing"
end tell
johnsidi
quelle
0

Ich hatte genau das gleiche Problem, als ich in der Lage sein wollte, bestimmte Links in meinem nicht standardmäßigen Browser zu starten, und Lösungen wie LinCastor funktionierten bei mir nicht. Folgendes habe ich getan (nach einer TONNE Googeln und stundenlangem Anstoßen an Backsteinmauern):

Service erstellen

Ich habe eine Service in Automator, der empfängt rich text im any application. Dann habe ich eine Reihe von Aktionen erstellt (alle sind Run AppleScript ), um die ausgewählten Daten nach und nach in die gewünschte URL umzuwandeln. Die folgenden Abschnitte veranschaulichen die Schritte.

Konkret sind dies alle Schritte innerhalb eines einzelnen Workflows und alle in der hier aufgeführten Reihenfolge (jeder Schritt verbraucht das Ergebnis des vorhergehenden Schritts).

Bearbeiten : Wenn Sie mit der Verwendung dieses Dienstes nicht vertraut sind, können Sie in einer beliebigen Anwendung auf einen beliebigen Link klicken (ich habe in Mail Links verwendet, die Rich-Text-Inhalte enthielten, dh, der angezeigte Text war nicht die URL) und nach dem Unterpunkt Dienste suchen. Menü im Popup. Wählen Sie Ihren Service aus dieser Liste, et voila!

Holen Sie sich die Daten

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

Extrahieren Sie den Link 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

Laden Sie den HTML-Code und extrahieren Sie die 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

Zu diesem Zeitpunkt haben Sie Ihre URL (stellen Sie sicher, dass Sie diese explizit in Text konvertieren, damit Sie keine mysteriösen AppleScript-Fehler bekommen. Ab hier habe ich sie verwendet, um den Link automatisch in Safari zu laden.

Verwenden Sie Ihre 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

Viel Spaß und ich hoffe das hilft!

Brian
quelle