Làm cách nào để tạo tệp RTF trống trong AppleScript?


3

Tôi muốn có thể tạo một tài liệu TextEdit mới bằng tệp AppleScript. Sau đó, tệp AppleScript sẽ được kích hoạt bằng phím tắt trên toàn hệ thống thông qua FastScripts. Cụ thể, tôi muốn AppleScript:

  1. Nhắc người dùng nhập tên tệp.
  2. Tạo một tệp TextEdit trống với tên tệp đó và lưu nó vào một vị trí được xác định trước. Tôi muốn tệp là một tài liệu văn bản phong phú (là loại tài liệu mặc định được tạo trong TextEdit khi một lần nhấp vào "Tệp" → "Mới").
  3. Đặt kích thước phông chữ đặt trước của tệp đó là 18.
  4. Mở tệp trong TextEdit, với giới hạn cửa sổ {160, 10, 883, 639}. (Lưu ý rằng TextEdit rất có thể sẽ không được mở khi tệp AppleScript được chạy.)
  5. Đảm bảo rằng con trỏ nhấp nháy nằm trên dòng thứ hai của tài liệu, để người dùng có thể bắt đầu nhập ngay lập tức. (Tôi ghét việc nhập vào dòng đầu tiên trong TextEdit, từ quan điểm trực quan và phải nhấn lần đầu tiên entermỗi khi tôi tạo một tệp mới trước khi tôi có thể bắt đầu nhập.)

Đây là những gì tôi có:

-- 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

Đó là nơi tôi đang ở, tại thời điểm này.

Tôi không chắc chính xác làm thế nào để tiếp cận phần còn lại. Tôi có thể tạo một tài liệu TextEdit mới trong chính TextEdit và sau đó lưu tệp với tên tệp tùy chỉnh. Hoặc tôi có thể tạo tệp RTF bên ngoài TextEdit, sau đó mở tệp bằng TextEdit.

Tương tự, AppleScript có thể chèn dòng trống bằng tổ hợp phím sau khi tệp được mở hoặc AppleScript thực sự có thể ghi dòng vào tệp khi tệp được tạo.

Và tôi không biết làm cách nào để đặt kích thước phông chữ đặt sẵn cho một tài liệu cụ thể trong AppleScript (mà không thay đổi kích thước phông chữ mặc định trên toàn ứng dụng) hoặc nếu có thể.

Câu trả lời:


1

Đọc xong câu hỏi của bạn, đây là một ví dụ về cách tôi sẽ viết mã.


--  # 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ách tạo Mẫu Tài liệu RTF tùy chỉnh customRTFDocumentTemplate, được sử dụng trong on createCustomRTFDocument() trình xử lý :

Trong TextEdit, tạo một tài liệu Rich Text mới và đặt phông chữ và kích thước theo ý muốn, sau đó thêm bất kỳ nội dung mặc định nào, trong trường hợp này là một dòng mới. Khi đã xong, nhấn ⌘A để chọn tất cả, sau đó C để sao chép thông tin này vào Clipboard .

Bây giờ trong Script Editor sử dụng lệnh sau để lấy dữ liệu lớp RTF từ Clipboard .

get the clipboard as «class RTF »

Những gì được trả về sẽ được sử dụng làm Mẫu Tài liệu RTF tùy chỉnh bằng cách gán nó cho một biến trong tập lệnh thực tế , ví dụ:

set customRTFDocumentTemplate to «data RTF 7B5C727466315C616E73695C616E7369637067313235325C636F636F61727466313530345C636F636F617375627274663736300A7B5C666F6E7474626C5C66305C6673776973735C6663686172736574302048656C7665746963613B7D0A7B5C636F6C6F7274626C3B5C7265643235355C677265656E3235355C626C75653235353B7D0A7B5C2A5C657870616E646564636F6C6F7274626C3B3B7D0A5C706172645C74783732305C7478313434305C7478323136305C7478323838305C7478333630305C7478343332305C7478353034305C7478353736305C7478363438305C7478373230305C7478373932305C7478383634305C7061726469726E61747572616C5C7061727469676874656E666163746F72300A0A5C66305C66733336205C636630205C0A7D»

Lưu ý rằng mẫu ở trên có phông chữ mặc định, Helvetica, với kích thước được đặt thành 18 và một dòng trống làm nội dung của nó. Nếu bạn muốn có một phông chữ khác thì Helvetica, hãy đặt cả phông chữ và kích thước trước khi thêm nội dung, một dòng trống trong trường hợp này, sau đó sử dụng thông tin ở trên để lấy là dữ liệu lớp RTF từ Clipboard .

Cũng lưu ý rằng trong on openDocument() trình xử lý , bounds danh sách được đặt thành {160, 22, 883, 639}không phải {160, 10, 883, 639}mục thứ hai trong bounds danh sách không được nhỏ hơn chiều cao của thanh menu.


người dùng3439894 để giải cứu! Hoàn hảo!
quả cầu rubik

Hình cầu của @ rubik, tôi sẽ không nói nó hoàn hảo nhưng cảm ơn, tuy nhiên tôi đã sửa đổi on openDocument() trình xử lý trong AppleScript để xử lý xem phần mở rộng có bị ẩn hay không. Các tập tin nên được tạo với nó không bị ẩn tuy nhiên nếu nó bị ẩn thì mod tôi đã tạo cho các tài khoản xử lý cho nó. Lưu ý rằng tôi có thể vừa nói set bounds of front window to {...}nhưng tôi đã viết nó theo cách này để nó chỉ hoạt động trên cửa sổ được đặt tên nên nếu có thể xảy ra lỗi, nó sẽ không di chuyển và thay đổi kích thước một cửa sổ TextEdit khác có thể mở cùng lúc.
dùng3439894

Về điểm đầu tiên, tư duy tuyệt vời. Về điểm thứ hai, tôi đồng tình, cách mới là vượt trội; Tôi đã thực sự có một số vấn đề với giới hạn không phải lúc nào cũng hoạt động đúng cách cũ.
quả cầu rubik

@ rubik's sphere, tôi đã thiếu một return tuyên bố trong on createCustomRTFDocument() trình xử lý , vì vậy bạn nên cập nhật làm việc của mình . Ngoài ra, phần «data RTF ... »được gán customRTFDocumentTemplatechỉ là một ví dụ hoạt động và bạn nên thay thế nó bằng phần «data RTF ... »được tạo từ hệ thống của bạn và lý do tại sao tôi đưa ra hướng dẫn về cách lấy thông tin đó.
dùng3439894

Tôi biết rằng điều này không liên quan, nhưng bạn có biết làm thế nào tôi có thể sử dụng một biến trong set customRTFDocumentTemplate to «data RTF 7B5C72»câu lệnh (tôi đã phải cắt bớt câu lệnh trong bình luận này vì giới hạn ký tự)? Tôi đã thử: set myVariable to "7B5C72"theo sau set customRTFDocumentTemplate to «data RTF myVariable». Nhưng nó không hoạt động.
quả cầu rubik

0

Tôi đã thực hiện một cách tiếp cận khác ngoài kiểm tra tập tin. Tôi mất khá nhiều thời gian để tìm ra cách tạo tệp rtf chính xác:

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)

Chúc bạn viết vui vẻ!


Nó hoạt động rất tốt. Tôi tìm thấy một vấn đề nhỏ, mặc dù. Nếu người dùng cung cấp một tên có chứa một khoảng trắng, AppleScript sẽ báo lỗi. Vì vậy, bạn phải thêm set filepath to quoted form of filepathvào mã của bạn để sửa lỗi này. Ngoài ra, nếu TextEdit không có chấm đen bên dưới logo của nó trong Dock, cứ khoảng 10 lần tôi chạy tập lệnh của bạn thì con trỏ sẽ không được chuyển sang dòng thứ hai. Thay vào đó, khi tập tin mở ra, tôi nghe thấy tiếng bíp và con trỏ vẫn ở dòng đầu tiên. Bạn có nghĩ rằng mã nên chứa một delaydòng trên dòng cuối cùng, để ngăn chặn vấn đề này?
quả cầu rubik

Ngoài ra, bạn có thể sửa đổi mã của mình để cửa sổ TextEdit được mở có giới hạn {160, 10, 883, 639} không? Là tell application "TextEdit" to set bounds of front window to {160, 10, 883, 639}dòng cuối cùng là cách tốt nhất để làm điều này? Cảm ơn bạn.
quả cầu rubik

@ oa-, Bên cạnh thực tế là nó không đúng định dạng, chính xác thì điều gì được do shell script "head -n 9 r" & filename & ".rtf" & " >> " & filename & ".rtf" & filepath & " | cut -d ' ' -f 1"cho là đang làm!? Tại sao nó thậm chí cần phải là một phần của kịch bản?
dùng3439894

@ rubik'ssphere Cảm ơn bạn đã gợi ý về tên tệp. Có, thay đổi độ trễ thành 2 hoặc 3 giây sẽ khắc phục nó.
oa-

@ rubik'ssphere Có, thiết lập giới hạn với mã của bạn có vẻ ổn đối với tôi.
oa-
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.