J'ai essayé de faire fonctionner ce script simple, il est censé rechercher une chaîne, la remplacer tout en appliquant un style, par exemple. mettre le texte en gras et en rouge.

Voici ce que j'ai jusqu'à présent:

tell application "Finder"
    set fl to files of folder POSIX file "/Users/Sc/Desktop/app/" as alias list
end tell
repeat with f in fl
    tell application "TextEdit"

        open f


        set text of front document to replace_chars(text of front document, "a", "0000") of me
    end tell
end repeat

on replace_chars(this_text, search_string, replacement_string)
    set AppleScript's text item delimiters to the search_string
    set the item_list to every text item of this_text
    set the size of replacement_string to 14
    set AppleScript's text item delimiters to the replacement_string

    set this_text to the item_list as string
    set AppleScript's text item delimiters to ""
    return this_text
end replace_chars

Cependant, cela produit une erreur, je comprends pourquoi, mais je ne sais pas comment le coiffer avant le remplacement, toute aide serait appréciée.

1
Saulius Antanavicius 5 janv. 2016 à 19:49

3 réponses

Meilleure réponse

TextEdit utilise l'implémentation standard de Text Suite de Cocoa Scripting, ce qui est plutôt nul dans le meilleur des cas. Si vous effectuez un remplacement de mot entier , ce qui suit devrait fonctionner:

tell application "TextEdit"
    set aRef to a reference to (every word of document 1 where it is "OLDWORD")
    set aRef's color to {65535, 0, 0}
    set aRef's contents to "NEWWORD"
end tell

La même approche devrait également fonctionner pour le remplacement d'un caractère unique ou d'un paragraphe entier ; modifiez simplement la requête every word of... de manière appropriée. Dans chaque cas cependant, vous devez faire correspondre exactement un mot / caractère / paragraphe et le remplacer par exactement un mot / caractère / paragraphe, sinon vous deviendrez hilarant. -N erreurs tout au long des correspondances suivantes [1] en raison du fait que Cocoa Scripting est fait de stupide et incompétent [2] (par exemple, essayez de changer un mot récurrent en deux nouveaux mots, par exemple "foo" - & gt; "boo boo" pour voir ce que je veux dire).

De plus, contrairement aux implémentations de Text Suite trouvées dans des applications mieux écrites, Text Suite de Cocoa Scripting ne fournit aucun moyen de décrire des plages de texte (par exemple text (character i) thru (character j) of... / text i thru j of...), il est donc impossible de dites à TextEdit de faire correspondre, disons, "oo" dans "baboon", "fool", "spitoon", etc. Si vous avez besoin de faire correspondre des plages de caractères arbitraires, vous devrez obtenir le texte dans AppleScript et calculer le début et la fin de chaque match vous-même.


[1] Lors de plusieurs remplacements, la suite de textes de CS calcule d'abord les positions de toutes les plages de texte qui doivent être modifiées, puis effectue chaque substitution en commençant à la première correspondance et en terminant à la dernière. Ainsi, toute différence de longueur entre le nouveau et l'ancien texte signifie que tous les index de correspondance restants déjà calculés ne sont plus corrects car les caractères précédemment à cette position se sont maintenant déplacés vers la gauche ou la droite. Pour bien faire le travail, CS aurait dû calculer toutes les positions du premier au dernier, puis les remplacer en commençant par le dernier et en travaillant en arrière au premier.

[2] (CocoaScripting.framework a été conçu à l'origine par des développeurs Cocoa qui ne comprenaient pas comment fonctionne AppleScript, et depuis lors, il a été maintenu par des développeurs AppleScript qui ne comprennent pas non plus.

2
foo 5 janv. 2016 à 21:41

TextEdit n'est pas le meilleur outil pour rechercher et remplacer du texte stylé, par exemple le TextWrangler gratuit a des compétences plus puissantes pour le faire.

Quoi qu'il en soit, essayez ceci, cela n'affecte qu'un seul document ouvert dans TextEdit

L '«algorithme» consiste à calculer le décalage de la chaîne de recherche, à le remplacer par la chaîne de remplacement et à conserver l'emplacement dans une boucle de répétition. À la fin, réaffectez le texte modifié à l'objet texte de TextEdit et changez le style des emplacements stockés en {font: Helvetica Bold, size: 24 and color: red}.

property searchString : "a"
property replaceString : "0000"

tell application "TextEdit"
    set completed to false
    set ranges to {}
    set theText to text of front document
    set theSize to size of text of front document
    repeat while completed is false
        tell current application to set o to offset of searchString in theText
        if o is 0 then
            set completed to true
        else
            tell theText to set newText to text 1 thru (o - 1) & replaceString & text (o + (length of searchString)) thru -1
            set end of ranges to o
            copy newText to theText
        end if
    end repeat
    set text of front document to theText
    set size of text of front document to theSize
    repeat with aRange in ranges
        tell characters aRange thru (aRange + (length of replaceString) - 1) of front document
            set size to 24
            set its color to {65535, 0, 0}
            set font to "Helvetica Bold"
        end tell
    end repeat
end tell
1
vadian 5 janv. 2016 à 17:56

Étant donné que les autres affiches ont noté à quel point TextEdit est mal adapté à cette tâche, permettez-moi de faire une suggestion «prête à l'emploi»: Utilisez MS Word

L'outil Rechercher et remplacer dans Word peut facilement gérer cette tâche et des remplacements beaucoup plus compliqués.

Si vous avez beaucoup de documents source au format RTF, vous pouvez les ouvrir dans Word, apporter les modifications et les enregistrer dans le même fichier RTF (ou différent). Il serait très facile de créer une macro Word VBA pour ce faire.

Vous pouvez alors soit écrire un AppleScript pour ouvrir chaque fichier RTF dans Word et exécuter la macro, soit effectuer tout le traitement à l'aide d'un VBA Word maître. Vous pouvez le faire de l'une ou l'autre manière, mais je choisirais la route tout VBA puisque, IMO, c'est un langage bien meilleur pour traiter les documents MS qu'AppleScript.

Bien entendu, cela nécessite l'installation de MS Word. J'exécute toujours MS Office 2011 sur tous mes Mac et je ne prévois pas de passer à Office 2016 pendant un certain temps. Word 2011 fonctionne très bien.

Bonne chance.

0
JMichaelTX 6 janv. 2016 à 23:10