Skip to content

Apple - Come utilizzare AppleScript per creare un nuovo file Rich Text Format dal testo degli appunti?

Abbiamo la migliore soluzione che abbiamo trovato su Internet. Vogliamo che ti aiuti e se puoi parlarci di eventuali miglioramenti, fallo liberamente.

Soluzione:

Questa risposta è stata aggiornata per riflettere sfera di rubik fraintendimento tra ciò che è il Rich Text (ciò che è stato chiesto originariamente) e ciò che viene effettivamente utilizzato da Google Chrome, ovvero l'HTML. (Vedi commenti spostati in chat).

Lascio la risposta originale così com'è e inserisco questo nuovo contenuto, poiché tecnicamente risponde alla domanda originale. Contiene anche informazioni rilevanti per il processo generale di gestione del contenuto degli Appunti nel contesto della domanda originale e di quella modificata.

Il codice di seguito è un esempio codice da testare ed eseguire all'interno di (Apple) Script Editor, poiché, a parte la prima frase della domanda, non è ancora stato fornito un uso esplicito e specifico all'interno di Automator. Il codice codice potrebbe dover essere modificato per funzionare con l'uso sconosciuto in Automator. Detto questo, come scritto, se l'intero codice script di seguito è stato inserito da solo in un'azione Esegui AppleScript, da solo, in Automator... funziona così com'è. Se si utilizzano solo segmenti dello script codice, alcune modifiche al codice esistente codice potrebbe essere necessario apportare.

Il codice contiene un numero sufficiente di commenti in modo da capire complessivamente che cosa fa il codice script sta facendo.


--        # 
--        # Change the 'New RichText Filename.rtf' name to the wanted filename for the target file.
--        # Make sure you leave the double-quotes even if the filename does not contain spaces!
--        # Note that '(path to desktop as text)' can also be modified as needed, e.g. changed to,
--        # '(path to documents folder as text)' or the entire segment after 'set theRichTextFileName to'
--        # can be a fully qualified POSIX pathname, e.g.: set theRichTextFileName to "/path/to/filename.rtf"
--        #  

set theRichTextFileName to POSIX path of (path to desktop as text) & "New RichText Filename.rtf"

--    #        THE REMAINING CODE SHOULD NOT NEED TO BE MODIFIED.
--    # 
--    #     Note: This code, as is, works as written and intended when run from within (Apple) Script Editor.
--    #     Some AppleScript code when wrapped in Automator may not work the same as in (Apple) Script Editor.
--    #     In cases where is does not work from a Run AppleScript action in Automator, editing will be required.
--    # 
--    #     This AppleScript code preforms the following actions, sans errors caught during File I/O operations.
--    # 
--    # 1. See it the target file exists and prompts to be overwritten if it does. If yes is selected, it continues.
--    # 
--    # 2. If the Clipboard contains RTF content, writes it to the target file using plain AppleScript.
--    # 
--    # 3. If the Clipboard contains HTML content, writes it to the target file as RTF using a 'do shell script' command.
--    # 
--    # 4. If the Clipboard does not contain any RTF/HTML content, notify the user. 
--
--        #    Notes: The 'do shell script' makes use of the following:
--        #
--        #    'osascript' to get the HTML content from the Clipboard.
--        #    The content is a Hex stream within a data wrapper and
--        #    'awk' will be used to remove/replace the data wrapper.
--        #
--        #    'awk' to remove the data wrapper from 'osascript' output
--        #    replacing it with proper HTML opening/closing Tags to
--        #    ensure it actually gets processed by 'textutil' after 'xxd'.
--        #    Without the HTML opening/closing Tags 'textutil' does not 
--        #    properly, within limits, convert the HTML Clipboard content to RTF.
--        #
--        #    'xxd' to convert the Hex data from 'osascript/awk' to ASCII text.
--        #
--        #    'textutil' to convert the ASCII text HTML from 'xxd' to RTF
--        #    formatted data and write it to the target file.

tell application "Finder"

    if exists theRichTextFileName as POSIX file then
        tell current application
            display dialog "The file "" & theRichTextFileName & "" already exists!" & "nn" & "Do you want to overwrite the file?" buttons {"No", "Yes"} default button 1 with title "File Already Exists..." with icon caution

            if the button returned of the result is "No" then
                return
            else
                tell application "Finder"
                    delete the file (theRichTextFileName as POSIX file)
                end tell
            end if
        end tell
    end if

    tell current application

        --    # Find out what class types are available for the Clipboard content
        --    # and use this information to determine which action will be taken.

        set cbInfo to get (clipboard info) as string

        if cbInfo contains "RTF" then

            try
                set richTextfromClipboard to get the clipboard as «class RTF »
            on error eStr number eNum
                display dialog eStr & " number " & eNum buttons {"OK"} default button 1 with icon caution
                return
            end try
            try
                set fileHandle to open for access theRichTextFileName with write permission
                write richTextfromClipboard to fileHandle
                close access fileHandle
            on error eStr number eNum
                display dialog eStr & " number " & eNum buttons {"OK"} default button 1 with title "File I/O Error..." with icon caution
                try
                    close access fileHandle
                end try
            end try

        else if cbInfo contains "HTML" then

            try
                do shell script "osascript -e 'try' -e 'get the clipboard as «class HTML»' -e 'end try' | awk '{sub(/«data HTML/, "3C68746D6C3E") sub(/»/, "3C2F68746D6C3E")} {print}' | xxd -r -p | textutil -convert rtf -stdin -stdout > " & quoted form of theRichTextFileName
            on error eStr number eNum
                display dialog eStr & " number " & eNum buttons {"OK"} default button 1 with icon caution
            end try

        else

            display dialog "The Clipboard does not containnany usable RTF/HTML content!" buttons {"OK"} default button 1 with title "No RTF/HTML Content on Clipboard..." with icon caution

        end if

    end tell

end tell

Risposta originale alla domanda originale posta:

Per ottenere Testo riccocontenuto dal contenuto Appunti in un file utilizzando AppleScript, è un po' più complesso di un semplice do shell scriptcomando.

L'esempio AppleScriptcodice sotto, se il target file non esiste già e se Testo riccocontenuto esiste nella sezione Appunti, scriverlo in un file file. Avrà tutti i file attributi come il Testo riccocontenuto sul contenuto Appunti come quando è stato copiato negli appunti . Appunti.

Aprire Editor di script e copiare e incollare il file codice qui sotto in un nuovo file Senza titolo e poi eseguirlo da Editor di script, rivedendo il file uscita in Eventi/Risposte. Eseguirlo un paio di volte, con e senza Testo riccocontenuto sul Appunti e con e senza l'esistenza dell'elemento file sul disco rigido, definito da set theRichTextFileName ... all'inizio del file script.

Si vedrà il file codice si assicura che il codice file non esista, in modo da non sovrascrivere il file file del nome e della posizione di destinazione e se il file Appunti non contiene Testo riccocontenuto visualizza un messaggio anche per questo.

Ora, se si usa questo in un elemento Servizio Automator ad esempio, dove Il servizio riceve il testo ricco selezionato, allora il servizio codice può essere modificato in modo da non far scattare la trappola per un errore se Testo riccocontenuto non è presente nell'elemento Appunti come il file servizio non apparirà sul file Servizimenu se Testo ricco non è selezionato in un documento. Inoltre, se si desidera sovrascrivere il target file nella sua posizione designata, il file codice intorno a questo può essere rimosso. Darò a questi codici codice esempi.


Esempio codice da incollare in Editor di script per testarlo e rivederlo:

set theRichTextFileName to POSIX path of (path to documents folder as text) & "New RichText Filename.rtf"

tell application "Finder"
    if exists theRichTextFileName as POSIX file then
        tell current application
            display dialog "The file "" & theRichTextFileName & "" already exists!" buttons {"OK"} default button 1 with title "File Already Exists..." with icon caution
        end tell
    else
        tell current application
            try
                set richTextfromClipboard to get the clipboard as «class RTF »
            on error eStr number eNum
                display dialog eStr & " number " & eNum buttons {"OK"} default button 1 with title "No Rich Text Content on Clipboard..." with icon caution
                return
            end try
            try
                set fileHandle to open for access theRichTextFileName with write permission
                write richTextfromClipboard to fileHandle
                close access fileHandle
            on error eStr number eNum
                display dialog eStr & " number " & eNum buttons {"OK"} default button 1 with title "File I/O Error..." with icon caution
                try
                    close access fileHandle
                end try
                return
            end try
        end tell
    end if
end tell

Esempio codice da utilizzare in un file Servizio Automator ad esempio, dove Il servizio riceve il testo ricco selezionato:

set theRichTextFileName to POSIX path of (path to documents folder as text) & "New RichText Filename.rtf"

tell application "Finder"
    if exists theRichTextFileName as POSIX file then
        tell current application
            display dialog "The file "" & theRichTextFileName & "" already exists!" buttons {"OK"} default button 1 with title "File Already Exists..." with icon caution
        end tell
    else
        tell current application
            set richTextfromClipboard to get the clipboard as «class RTF »
            set fileHandle to open for access theRichTextFileName with write permission
            write richTextfromClipboard to fileHandle
            close access fileHandle
        end tell
    end if
end tell

Esempio codice da utilizzare in un file Servizio Automator ad esempio, dove Il servizio riceve il testo ricco selezionato e sovrascrive il target esistente file:

set theRichTextFileName to POSIX path of (path to documents folder as text) & "New RichText Filename.rtf"

tell current application
    set richTextfromClipboard to get the clipboard as «class RTF »
    set fileHandle to open for access theRichTextFileName with write permission
    write richTextfromClipboard to fileHandle
    close access fileHandle
end tell

L'immagine sottostante è un esempio Servizio Automator che crea il servizio Nuovo nome file RichText.rtffile da selezionato Testo ricco dal file Creare un file di testo ricco dagli Appuntiservizio su Menu contestuale Servizi (facendo clic con il tasto destro del mouse) o Nome_applicazione Servizi menu, quando Testo ricco è selezionato in un documento.

Servizio automobilistico: crea un file di testo ricco dagli appunti


Questi sono solo esempi e la logica aggiuntiva può essere codificata per adattarla alle proprie esigenze. A titolo di esempio, codice per incrementare automaticamente il nome di un file esistente in modo da non sovrascriverlo, oppure per richiedere un nuovo nome di file e completare l'operazione invece di interromperla con un messaggio che indica che il file esiste già, ecc.


Aggiornamento da utilizzare con un file do shell scriptcomando:

Se si vuole davvero farlo usando un comando do shell scriptcomando, allora usate il seguente codice mentre sostituisce /path/to/new rich text file.rtf con un codice valido nome del file del percorso in una posizione per la quale si dispone dei permessi di scrittura. Si noti di non rimuovere l'opzione " prima e dopo /path/to/new rich text file.rtf nel file comando poiché questo gestisce il comando percorso nome file se contiene spazi. Se il percorso nome del file del percorso non contiene spazi, l'opzione " prima e dopo /path/to/new rich text file.rtf non deve essere utilizzato.

do shell script "osascript -e 'try' -e 'get the clipboard as «class RTF »' -e 'end try' | awk '{print substr($0, 12, length($0)-13)}' | xxd -r -p > "/path/to/new rich text file.rtf""

Ecco il comando che viene mostrato come testo avvolto, per una più facile visualizzazione:

do shell script "osascript -e 'try' -e 'get the clipboard as «class RTF »' -e 'end try' | awk '{print substr($0, 12, length($0)-13)}' | xxd -r -p > "/path/to/new rich text file.rtf""

  • Mentre si può copiare e incollare (si consiglia) il comando codice, tuttavia ecco come digitare le virgolette a doppio angolo, che sono disponibili anche sotto Parentesi in Caratteri (speciali), ad es. opzionecomandoT in TextEdit.

    Nota: Tenete presente la spaziatura in «class RTF » è intesa come sfalsamento in questo caso d'uso.

    • Digitare le virgolette a doppio angolo

      • " Virgolette doppie angolari a sinistra, premere: opzione
      • " Virgolette doppie angolari a destra, premere: spostamentoopzione

Si noti che, come scritto, questo do shell scriptcomando sovrascrive il file di output se esiste già, senza chiedere nulla! Sarà un file di lunghezza zero se gli Appunti non contengono alcun contenuto di testo ricco, altrimenti il file sarà della lunghezza necessaria per contenere il contenuto di testo ricco degli Appunti. Ovviamente, una logica aggiuntiva potrebbe essere codificata nel file osascriptcomando Tuttavia, se si desidera una maggiore complessità, è meglio utilizzare il metodo presentato per primo in questa risposta. Oppure utilizzando uno script esterno richiamato da do shell scriptcomando che gestisce tutte le operazioni necessarie logica e gestione degli errori in base alla complessità delle condizioni generali in cui verrà applicato.

  • Perché tale complessità rispetto a do shell script "pbpaste > /path/to/clipboard-file.rtf"?

Questa è una buona domanda e mentre pbpaste ha le caratteristiche di -Prefer {txt | rtf | ps} tuttavia pbpaste -Prefer rtf potrebbe non produrre testo ricco anche se esiste negli Appunti. Oppure quello che produce, se non è testo ASCII, non sarà una forma di testo ricco comprensibile, ad esempio, da TextEdit, oppure non conterrà tutto il testo ricco. attributi se presenti, che il contenuto degli Appunti contiene.

Questo rende necessario ottenere il contenuto del Rich Text negli Appunti in un modo diverso e perché get the clipboard as «class RTF » viene utilizzato al suo posto. Quando si utilizza un elemento do shell scriptcomando con questo, richiede un'elaborazione aggiuntiva per utilizzare il comando dati restituiti, poiché si trovano in un file wrapper di dati quando viene restituito e non è immediatamente utilizzabile, quindi richiede un'ulteriore elaborazione.

Come esempio, Hello World! in testo ricco negli Appunti può apparire come questo in testo ASCII:

{rtf1ansiansicpg1252cocoartf1187cocoasubrtf400
{fonttblf0fnilfcharset0 ComicSansMS;}
{colortbl;red255green255blue255;}
pardtx720tx1440tx2160tx2880tx3600tx4320tx5040tx5760tx6480tx7200tx7920tx8640pardirnatural

f0bfs36 cf0 Hello World!}

Il formato di cui sopra, purtroppo, non è facilmente utilizzabile, se non in minima parte, in AppleScript e credo che sia questo il motivo per il quale viene acquisito come codifica Hex dati è necessario.

  • Mi baso sul fatto che anche se l'opzione get clipboard infocomando per il contenuto degli Appunti in questo esempio restituisce {«class RTF », 265} tra le informazioni restituite, tuttavia mentre il testo ASCII di questo contenuto Rich Text è lungo 265 byte, viene restituito in formato esadecimale a più del doppio dei byte con il comando con il wrapper dei dati. Il fatto che venga restituito in formato esadecimale da get the clipboard as «class RTF » sia nell'editor di script sia usando osascript supporta questa supposizione.

Ecco lo stesso Hello World! in Rich Text on the Clipboard in Hex:

7B5C727466315C616E73695C616E7369637067313235325C636F636F61727466313138375C636F636F617375627274663430300A7B5C666F6E7474626C5C66305C666E696C5C66636861727365743020436F6D696353616E734D533B7D0A7B5C636F6C6F7274626C3B5C7265643235355C677265656E3235355C626C75653235353B7D0A5C706172645C74783732305C7478313434305C7478323136305C7478323838305C7478333630305C7478343332305C7478353034305C7478353736305C7478363438305C7478373230305C7478373932305C7478383634305C7061726469726E61747572616C0A0A5C66305C625C66733336205C6366302048656C6C6F20576F726C64217D

Tuttavia, ciò che viene restituito da get the clipboard as «class RTF » per il valore Hello World! dell'esempio precedente è:

«data RTF 7B5C727466315C616E73695C616E7369637067313235325C636F636F61727466313138375C636F636F617375627274663430300A7B5C666F6E7474626C5C66305C666E696C5C66636861727365743020436F6D696353616E734D533B7D0A7B5C636F6C6F7274626C3B5C7265643235355C677265656E3235355C626C75653235353B7D0A5C706172645C74783732305C7478313434305C7478323136305C7478323838305C7478333630305C7478343332305C7478353034305C7478353736305C7478363438305C7478373230305C7478373932305C7478383634305C7061726469726E61747572616C0A0A5C66305C625C66733336205C6366302048656C6C6F20576F726C64217D»

La stringa codificata in esadecimale è in un formato «data RTF »wrapper che deve essere rimosso prima di convertire il contenuto codificato in esadecimale in testo ASCII da scrivere in un file su disco mediante l'uso di I/O Redirection, ad es.>, nel file do shell scriptcomando esempio precedente.

Quindi, l'output di osascript -e 'try' -e ' get the clipboard as «class RTF »' -e 'end try' viene convogliato (|) a awk dove crea una sottostringa, stampando solo il contenuto codificato in esadecimale, non l'elemento dei dati perché non verrebbe elaborata correttamente da xxd nella fase successiva del processo.

Deve quindi essere convogliato (|) a xxd per la conversione in ASCII Text per essere scritto in un file su disco utilizzando la redirezione I/O, ad es.>, alla destinazione percorso nome file.

L'immagine seguente mostra il visualizzatore di appunti che passa dalla visualizzazione del testo ASCII a quella della codifica esadecimale, mostrando Hello World! copiato da un documento di testo ricco, quello usato in questo esempio.

Appunti visualizzatore


Spero che questo fornisca una migliore comprensione di come AppleScript lavora con il contenuto Rich Text negli Appunti, poiché in entrambi i casi deve avvenire la conversione da una stringa codificata in esadecimale a un testo ASCII e questo viene fatto in modo trasparente nell'esempio originale codice mentre richiede un'elaborazione aggiuntiva al di fuori di AppleScript codice che viene elaborato da osascript quando si utilizza l'opzione do shell scriptcomando in questo contesto.

Qui puoi vedere i commenti e le valutazioni dei lettori

Apprezziamo che tu voglia aggiungere valore ai nostri contenuti informativi aggiungendo la tua esperienza nelle recensioni.



Utilizzate il nostro motore di ricerca

Ricerca
Generic filters

Lascia un commento

Il tuo indirizzo email non sarà pubblicato.