3 votos

¿Cómo crear un archivo RTF en blanco en AppleScript?

Quiero poder crear un nuevo documento de TextEdit con un archivo AppleScript. El archivo AppleScript se activará mediante un atajo de teclado en todo el sistema a través de FastScripts. En concreto, quiero que el AppleScript:

  1. Pide al usuario que introduzca un nombre de archivo.
  2. Cree un archivo de TextEdit en blanco con ese nombre y guárdelo en una ubicación predeterminada. Me gustaría que el archivo fuera un documento de texto enriquecido (que es el tipo de documento que se crea por defecto en TextEdit cuando uno hace clic en "Archivo" "Nuevo").
  3. Establezca que el tamaño de la fuente preestablecida de ese archivo sea 18.
  4. Abra el archivo en TextEdit, con límites de ventana de {160, 10, 883, 639}. (Tenga en cuenta que lo más probable es que TextEdit no esté ya abierto cuando se ejecute el archivo AppleScript).
  5. Asegúrese de que el cursor parpadeante está en el segundo línea del documento, para que el usuario pueda empezar a escribir inmediatamente. (Odio escribir en la primera línea en TextEdit, desde un punto de vista visual, y tener que pulsar primero enter cada vez que creo un nuevo archivo antes de poder empezar a escribir).

Esto es lo que tengo:

-- Getting file name from user:  
repeat
    set customFilename to the text returned of (display dialog "Save as:" with title "Do you want to create a new, blank TextEdit RTF document?" default answer "")

-- Ensuring that the user provides a name:  
    if customFilename is "" then
        beep
        display alert "The filename cannot be empty." message "Please enter a name to continue."
    else
        exit repeat
    end if
end repeat

-- Creating the desired file path:
set filePath to "/Users/Me/Desktop/"
set fullFilepath to filePath & customFilename & ".rtf"

-- Checking if the file already exists:
tell application "Finder"

    set formattedFullFilepath to POSIX path of fullFilepath 
    if exists formattedFullFilepath as POSIX file then
        tell current application
            display dialog "The file \"" & formattedFullFilepath & "\" already exists!" & "

" & "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
            end if
        end tell
    end if
end tell

Ahí es donde estoy, en este momento.

No estoy seguro de cómo enfocar exactamente el resto. Podría crear un nuevo documento TextEdit dentro de TextEdit sí mismo, y luego guardar el archivo con el nombre de archivo personalizado. O podría crear el archivo RTF fuera de TextEdit, y luego abrir el archivo con TextEdit.

Del mismo modo, el AppleScript puede insertar la línea en blanco mediante la pulsación de teclas después de abrir el archivo, o el AppleScript puede escribir realmente la línea en el archivo cuando éste se crea.

Y no tengo ni idea de cómo establecer el tamaño de fuente preestablecido para un documento específico en AppleScript (sin cambiar el tamaño de fuente predeterminado para toda la aplicación), o si es siquiera posible.

1voto

user3439894 Puntos 5883

Tras leer tu pregunta, aquí tienes un ejemplo de cómo lo codificaría yo.


--  # The variables for the target file's fully qualified pathname and custom filename needs to be global as they are called from both the handlers and other code.

global theCustomRichTextFilePathname
global customFilename

--  # The createCustomRTFDocument handler contains a custom template for the target RTF document.

on createCustomRTFDocument()
    tell current application
        set customRTFDocumentTemplate to «data RTF 7B5C727466315C616E73695C616E7369637067313235325C636F636F61727466313530345C636F636F617375627274663736300A7B5C666F6E7474626C5C66305C6673776973735C6663686172736574302048656C7665746963613B7D0A7B5C636F6C6F7274626C3B5C7265643235355C677265656E3235355C626C75653235353B7D0A7B5C2A5C657870616E646564636F6C6F7274626C3B3B7D0A5C706172645C74783732305C7478313434305C7478323136305C7478323838305C7478333630305C7478343332305C7478353034305C7478353736305C7478363438305C7478373230305C7478373932305C7478383634305C7061726469726E61747572616C5C7061727469676874656E666163746F72300A0A5C66305C66733336205C636630205C0A7D»
        try
            set referenceNumber to open for access theCustomRichTextFilePathname with write permission
            write customRTFDocumentTemplate to referenceNumber
            close access referenceNumber
        on error eStr number eNum
            activate
            display dialog eStr & " number " & eNum buttons {"OK"} default button 1 with title "File I/O Error..." with icon caution
            try
                close access referenceNumber
            end try
            return
        end try
    end tell
end createCustomRTFDocument

--  # The openDocument handler opens and set the bounds of the theCustomRichTextFilePathname document while placing the cursor on the second line.

on openDocument()
    try
        tell application "TextEdit"
            open file theCustomRichTextFilePathname
            activate
            tell application "System Events"
                set displayedName to get displayed name of file theCustomRichTextFilePathname
                if displayedName contains ".rtf" then
                    tell application "TextEdit"
                        set bounds of window (customFilename & ".rtf") to {160, 22, 883, 639}
                    end tell
                    key code 125
                else
                    tell application "TextEdit"
                        set bounds of window customFilename to {160, 22, 883, 639}
                    end tell
                    key code 125
                end if
            end tell
        end tell
    on error eStr number eNum
        activate
        display dialog eStr & " number " & eNum buttons {"OK"} default button 1 with icon caution
        return
    end try
end openDocument

--  # Get the name for the RTF document, ensuring it is not blank.

repeat
    set customFilename to the text returned of (display dialog "Save as:" with title "Do you want to create a new, blank TextEdit RTF document?" default answer "")
    if customFilename is "" then
        beep
        display alert "The filename cannot be empty!" message "Please enter a name to continue..."
    else
        exit repeat
    end if
end repeat

--  # Concatenate the default location (the User's Desktop) with the chosen filename while adding the proper file extension.

set theCustomRichTextFilePathname to ((path to desktop) & customFilename & ".rtf") as string

--  # Check to see if the target file already exists. If it does not exist, create and open it. If it does exist, either open it or overwrite it and open it, based on decision made.

tell application "Finder"
    try
        if exists file theCustomRichTextFilePathname then
            tell current application
                display dialog "The file \"" & POSIX path of theCustomRichTextFilePathname & "\" already exists!" & return & return & "Do you want to overwrite the file?" & return & return & "If yes, the file will be placed in the Trash." buttons {"No", "Yes"} default button 1 with title "File Already Exists..." with icon caution
                if the button returned of result is "No" then
                    --  # The file already exists, chose not to overwrite it, just open the document.
                    my openDocument()
                else
                    --  # The file already exists, chose to overwrite it, then open the document.
                    tell application "Finder"
                        delete the file theCustomRichTextFilePathname
                    end tell
                    my createCustomRTFDocument()
                    my openDocument()
                end if
            end tell
        else
            --  # The file does not already exist. Create and open the document.
            tell current application
                my createCustomRTFDocument()
                my openDocument()
            end tell
        end if
    on error eStr number eNum
        activate
        display dialog eStr & " number " & eNum buttons {"OK"} default button 1 with icon caution
        return
    end try
end tell

Cómo crear la plantilla de documento RTF personalizada, customRTFDocumentTemplate utilizado en el on createCustomRTFDocument() manipulador :

En TextEdit cree un nuevo documento de texto enriquecido y configure la fuente y el tamaño que desee, luego añada cualquier contenido por defecto, en este caso una nueva línea. Una vez hecho esto, pulse A para seleccionar todo, y luego C para copiar esta información en el Portapapeles .

Ahora en el editor script utilice lo siguiente comando para obtener el Datos de la clase RTF de la Portapapeles .

get the clipboard as «class RTF »

Lo que se devuelva se utilizará como plantilla de documento RTF personalizada asignándola a un variable en el actual script Por ejemplo:

set customRTFDocumentTemplate to «data RTF 7B5C727466315C616E73695C616E7369637067313235325C636F636F61727466313530345C636F636F617375627274663736300A7B5C666F6E7474626C5C66305C6673776973735C6663686172736574302048656C7665746963613B7D0A7B5C636F6C6F7274626C3B5C7265643235355C677265656E3235355C626C75653235353B7D0A7B5C2A5C657870616E646564636F6C6F7274626C3B3B7D0A5C706172645C74783732305C7478313434305C7478323136305C7478323838305C7478333630305C7478343332305C7478353034305C7478353736305C7478363438305C7478373230305C7478373932305C7478383634305C7061726469726E61747572616C5C7061727469676874656E666163746F72300A0A5C66305C66733336205C636630205C0A7D»

Tenga en cuenta que la plantilla anterior tiene el tipo de letra por defecto, Helvetica, con un tamaño de 18 y una línea en blanco como contenido. Si desea una fuente diferente a la Helvética, establezca tanto la fuente como el tamaño antes de añadir el contenido, una línea en blanco en este caso, y luego utilice la información anterior para obtener es como Datos de la clase RTF de la Portapapeles .

También hay que tener en cuenta que en el on openDocument() manipulador El bounds lista se ajusta a {160, 22, 883, 639} no {160, 10, 883, 639} como el segundo artículo en el bounds lista no debe ser menor que la altura de la barra de menú.

0 votos

¡usuario3439894 al rescate! ¡Sin defectos!

0 votos

La esfera de @rubik, no diría que es impecable pero gracias, sin embargo he modificado la on openDocument() manipulador en AppleScript código para manejar si la extensión está o no oculta. El archivo debería crearse sin ocultarlo, pero si se oculta, el mod Hice a la manipulador cuentas para ello. Tenga en cuenta que podría haber dicho simplemente set bounds of front window to {...} pero lo escribí así para que sólo actúe sobre la ventana nombrada, así que si por casualidad hay algún error, no va a mover y redimensionar otra ventana de TextEdit que pueda estar abierta al mismo tiempo.

0 votos

Sobre el primer punto, excelente reflexión. En el segundo punto, estoy de acuerdo, la nueva forma es superior; en realidad estaba teniendo algunos problemas con los límites no siempre funciona correctamente la vieja manera.

0voto

oa- Puntos 164

He adoptado un enfoque diferente, aparte de la comprobación de los archivos. Me llevó bastante tiempo averiguar cómo crear el archivo rtf correctamente:

repeat
    set filename to (display dialog "Here goes your file name." default answer ("") as string)'s text returned
    if filename is "" then
        beep
        display alert "The filename cannot be empty." message "Please enter a name to continue."
    else
        exit repeat
    end if
end repeat

set filepath to POSIX path of ((path to home folder)) & "Desktop/" & filename & ".rtf"

tell application "Finder"
    if exists filepath as POSIX file then
        tell current application
            display dialog "The file \"" & filepath & "\" already exists!" & "

" & "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
            end if
        end tell
    end if
end tell

do shell script "cat <<EOF >> " & filepath & "
{\\rtf1\\ansi\\ansicpg1252\\cocoartf1504\\cocoasubrtf820
{\\fonttbl\\f0\\fswiss\\fcharset0 Helvetica;}
{\\colortbl;\\red255\\green255\\blue255;}
{\\*\\expandedcolortbl;;}
\\paperw11900\\paperh16840\\margl1440\\margr1440\\vieww12600\\viewh7800\\viewkind0
\\pard\\tx566\\tx1133\\tx1700\\tx2267\\tx2834\\tx3401\\tx3968\\tx4535\\tx5102\\tx5669\\tx6236\\tx6803\\pardirnatural\\partightenfactor0

\\f0\\fs36 \\cf0 \\\\
}
EOF"

do shell script "head -n 9 r" & filename & ".rtf" & " >> " & filename & ".rtf" & filepath & " | cut -d ' ' -f 1"
do shell script "open " & filepath
tell application "TextEdit" to activate
tell application "System Events" to keystroke (key code 125)

¡Feliz escritura!

0 votos

Funciona muy bien. Sin embargo, he encontrado un pequeño problema. Si el usuario proporciona un nombre que contiene un espacio, el AppleScript dará un error. Así que hay que añadir set filepath to quoted form of filepath en su código para solucionar esto. Además, si TextEdit no tiene el punto negro debajo de su logo en el Dock, aproximadamente 1 de cada 10 veces que ejecuto tu script, el cursor no se mueve a la segunda línea. En cambio, al abrirse el archivo, oigo un pitido y el cursor permanece en la primera línea. ¿Cree usted que el código debe contener un delay por encima de la línea final, para evitar este problema?

0 votos

Además, ¿puede modificar su código para que la ventana TextEdit que se abre tenga límites de {160, 10, 883, 639}? Es tell application "TextEdit" to set bounds of front window to {160, 10, 883, 639} como la línea final la mejor manera de hacerlo? Gracias.

0 votos

@oa-, Aparte del hecho de que está mal formado, ¿qué es exactamente do shell script "head -n 9 r" & filename & ".rtf" & " >> " & filename & ".rtf" & filepath & " | cut -d ' ' -f 1" ¿¡Se supone que está haciendo!? ¿Por qué tiene que formar parte del script?

AppleAyuda.com

AppleAyuda es una comunidad de usuarios de los productos de Apple en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X