J'ai créé un fichier AppleScript (.scpt) intitulé " Tapez Presse-papiers comme texte simple sur une seule ligne "Le script est déclenché par un raccourci clavier défini par FastScripts.
Comportement désiré:
Je veux que ce script prenne le contenu du presse-papiers, supprime toute la mise en forme, puis supprime les sauts de ligne ou les tabulations de ce texte. Enfin, je veux que le script tape le nouveau texte. Je veux préserver - pas écraser - le contenu d'origine du presse-papiers.
Le problème spécifique:
L'erreur spécifique est que mon script ne parvient pas à supprimer toute la mise en forme d'un texte enrichi.
Je ne peux pas inclure le contenu en texte intégral dans une publication Stack Exchange. Par conséquent, pour être témoin de mon problème, veuillez télécharger ce fichier .rtf via Dropbox . Ouvrez ce fichier dans TextEdit.app. Mettez en surbrillance la phrase et copiez-la dans le presse-papiers. Ensuite, déclenchez mon script alors que votre curseur est sous une forme qui prend en charge et affiche le texte enrichi (pour que vous puissiez voir que le script va taper du texte enrichi).
Vous remarquerez que la phrase tapée est un contenu en texte enrichi et qu'elle contient encore des éléments de mise en forme. Ces éléments incluent la police de texte d'origine (Helvetica) et la taille de la police d'origine (12). Ces éléments auraient dû être jetés. Ainsi, soit mon code est négligent, soit j'ai trouvé un véritable bogue dans AppleScript même. Je suppose que c'est le dernier.
Le code le plus court nécessaire pour reproduire l'erreur:
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:
Premièrement, quelqu'un peut-il confirmer que le problème mentionné se produit sur son ordinateur?
Si tel est le cas, comment puis-je supprimer tout formatage de texte enrichi dans AppleScript, en tenant compte de ce bogue que j'ai découvert?
la source
Réponses:
Parce que
the clipboard
commande ajouter automatiquement d'autres types, testez ce script:Pour éviter les styles, utilisez le NSPasteboard méthodes de:
la source
Tester avec votre code puis avec mon propre AppleScript simple code , Je peux reproduire le comportement (non désiré) à un point tel que je conviendrais que ce comportement n’est pas ce qu’on souhaite et peut être considéré comme un bogue, mais la solution de contournement est un peu un kludge.
Dans cette méthode, au lieu de définir
theClipboardTextWithoutAnyLineBreaksOrFormatting
directement dans le presse-papier, parce que c'est là le problème , il va être écrit dans un fichier temporaire, puis placé dans le Presse-papiers en utilisantpbcopy
dans undo shell script
commander puis le fichier temporaire est supprimé. Ensuite, il peut être collé au point d'insertion cible.Pour tester la solution de contournement code ci-dessous, commentez le
set the clipboard to theClipboardTextWithoutAnyLineBreaksOrFormatting
ligne et puis placez la solution de contournement code directement après et avant latell application "System Events" to keystroke "v" using {command down}
ligne.la source
as text
, une police de texte riche et sa taille ne doivent pas être conservées?