¿Cómo hacer que Automator trate el texto como RTF?

Estoy escribiendo un libro y tratando de agregar un servicio para proporcionar resaltado de sintaxis al texto seleccionado en Pages con Automator. Tengo un servicio que acepta el texto seleccionado y lo ejecuta a través de un comando de shell ( pygmentize ) que lo convierte en RTF resaltado en sintaxis.

El problema es que cuando se devuelve el texto, Automator lo trata como texto sin formato y me devuelve un galimatías. He intentado cambiar las aceptaciones de ida y vuelta entre rico y simple y no hace ninguna diferencia. Intenté canalizar la salida a través de textutil sin éxito.

Mi única solución por ahora es hacer que el comando de shell se copie en el portapapeles con pbcopy y luego usar un Automator para tomar el contenido del portapapeles. Prefiero encontrar una manera de hacer esto sin tener que borrar el portapapeles, ¿alguna sugerencia para que Automator trate la salida de mis comandos de shell como texto enriquecido?

¿Hay alguna forma de hacer que esto funcione con AppleScript?

Respuestas (2)

Usualmente uso scripts como este en lugar de los servicios de Automator:

try
    set old to the clipboard as record
end try
tell application "System Events" to keystroke "c" using command down
do shell script "export LC_CTYPE=UTF-8; pbpaste | /usr/local/bin/pygmentize -g -f rtf | pbcopy"
tell application "System Events" to keystroke "v" using command down
delay 0.05
try
    set the clipboard to old
end try
  • Si el portapapeles está vacío, al intentar obtenerlo se produce un error.
  • pbpaste y pbcopy usan ASCII si las variables locales no están configuradas. Sin embargo , no pude pygmentize -f rtftrabajar con caracteres que no fueran ASCII.
  • Sin la demora set the clipboard to old, a veces se ejecutaría antes de que se pegara el texto.
¿Cómo se usa este script?
Aquí hay instrucciones paso a paso: gist.github.com/lrytz/d82c1adf7337a4cecace

Posible condición de carrera

Estoy aprendiendo mucho de la respuesta de @Lauri Ranta, pero creo que la respuesta aún se puede mejorar.

Creo que su guión tiene lo que se llama una "condición de carrera". Una condición de carrera puede ser un problema porque es una "carrera" para ver qué proceso terminará primero. Está el proceso de pbcopy que puede tomar diferentes cantidades de tiempo, dependiendo de cuánto texto se esté copiando, y luego está el proceso de retraso en AppleScript que se detiene por la misma cantidad de tiempo, pero puede que no sea suficiente. Tal vez una condición de carrera es la razón por la cual se necesitaba la demora para evitar que ocurriera un error, no estoy seguro, pero podría ser un problema.

Para las condiciones de carrera, no desea hacer una pausa demasiado larga y ralentizar todo, y no desea pausar demasiado y causar una posible pérdida de datos, como la restauración del portapapeles anterior cuando pbcopy todavía se está copiando.

Creo que sería bueno llamar al comando de Unix llamado "esperar" como parte del script de shell para esperar a que finalice el pbcopy y luego eliminar la llamada a "retrasar" en la parte de AppleScript. Eso se siente mejor para mí.

El problema es que el comando de pulsación de teclas solo simula presionar una combinación de teclas: no espera a que finalicen las acciones desencadenadas por la combinación de teclas. Cuando intenté eliminar el retraso, set the clipboard to oldse ejecutó antes de que el texto se pegara.