Я створив файл AppleScript (.scpt) під назвою " Введіть буфер обміну як однорядний звичайний текст ". Сценарій запускається комбінацією клавіш, встановленою FastScripts.
Бажана поведінка:
Я хочу, щоб цей скрипт взяв вміст буфера обміну, видалив усе форматування, а потім видалити будь-які розриви рядків або вкладки з цього тексту. Нарешті, я хочу, щоб сценарій набрав новий текст. Я хочу зберегти - не перезаписати - оригінальний вміст буфера обміну.
Конкретна проблема:
Конкретна помилка полягає в тому, що мій сценарій не видаляє все форматування з якогось багатого тексту.
Я не можу включати повноцінний текстовий вміст у публікацію Stack Exchange. Тому, щоб засвідчити мою точну проблему, завантажте цей .rtf-файл через Dropbox . Відкрийте цей файл в TextEdit.app. Виділіть речення та скопіюйте його до буфера обміну. Потім запустіть мій сценарій, коли ваш курсор знаходиться у формі, яка підтримує та показує розширений текст (так що ви можете бачити, що сценарій буде вводити розширений текст).
Ви помітите, що набране речення має багатий текстовий вміст і все ще містить елементи форматування. Ці елементи включають оригінальний шрифт тексту (Helvetica) та оригінальний розмір шрифту (12). Ці елементи мали бути відкинуті. Таким чином, або мій код є недбалим, або я знайшов справжню помилку в самому AppleScript. Я припускаю, що саме остання.
Найкоротший код, необхідний для відтворення помилки:
use AppleScript version "2.4"
use scripting additions
use framework "Foundation"
use framework "AppKit"
-- Back up clipboard contents:
set savedClipboard to my fetchStorableClipboard()
(*
Converting the clipboard text to plain text to remove any formatting:
From: http://lifehacker.com/127683/clear-text-formatting-on-os-x
*)
set theClipboardTextWithoutAnyFormatting to (the clipboard as text)
(*
Removing line breaks and indentations in clipboard text:
From: http://stackoverflow.com/a/12546965
*)
set AppleScript's text item delimiters to {return & linefeed, return, linefeed, character id 8233, character id 8232}
set theClipboardTextWithoutAnyFormatting to text items of (theClipboardTextWithoutAnyFormatting as text)
set AppleScript's text item delimiters to {" "}
set theClipboardTextWithoutAnyLineBreaksOrFormatting to theClipboardTextWithoutAnyFormatting as text
set the clipboard to theClipboardTextWithoutAnyLineBreaksOrFormatting
tell application "System Events" to keystroke "v" using {command down}
delay 0.1 -- Without this delay, may restore clipboard before pasting.
-- Restore the original clipboard:
my putOnClipboard:savedClipboard
on fetchStorableClipboard()
set aMutableArray to current application's NSMutableArray's array() -- used to store contents
-- get the pasteboard and then its pasteboard items
set thePasteboard to current application's NSPasteboard's generalPasteboard()
-- loop through pasteboard items
repeat with anItem in thePasteboard's pasteboardItems()
-- make a new pasteboard item to store existing item's stuff
set newPBItem to current application's NSPasteboardItem's alloc()'s init()
-- get the types of data stored on the pasteboard item
set theTypes to anItem's types()
-- for each type, get the corresponding data and store it all in the new pasteboard item
repeat with aType in theTypes
set theData to (anItem's dataForType:aType)'s mutableCopy()
if theData is not missing value then
(newPBItem's setData:theData forType:aType)
end if
end repeat
-- add new pasteboard item to array
(aMutableArray's addObject:newPBItem)
end repeat
return aMutableArray
end fetchStorableClipboard
on putOnClipboard:theArray
-- get pasteboard
set thePasteboard to current application's NSPasteboard's generalPasteboard()
-- clear it, then write new contents
thePasteboard's clearContents()
thePasteboard's writeObjects:theArray
end putOnClipboard:
По-перше, чи може хтось підтвердити, що зазначена проблема виникає на їхньому комп’ютері?
Якщо так, то як я можу видалити все форматування насиченого тексту в AppleScript, враховуючи цю помилку, яку я виявив?