¿Cómo se representan los colores en los archivos de configuración de OS X Terminal.app?

5

Me interesa mover los valores de color que he creado para OS X Terminal a aplicaciones en otras plataformas, como Linux. Estoy familiarizado con los métodos habituales para representar valores de color como RGB, HSB, L * A * B, HEX, etc. Sin embargo, las cadenas <data> usadas en los archivos de configuración de Terminal Server son diferentes a otros métodos utilizados para definir colores. Me gustaría obtener ayuda para entender este tipo de XML <data> en relación con otros valores de color.

Como ejemplo, usé el Selector de color incorporado de OS X para cambiar manualmente el esquema ANSI predeterminado de la Terminal con valores HSB de la excelente Solarized. Luego guardé esas configuraciones en una lista XML llamada Solarized Dark xterm-256color.terminal (el contenido de ese archivo puede encontrarse here .)

Elegí arbitrariamente brblack de ese archivo como un solo valor de color para la comparación:

    <key>ANSIBrightBlackColor</key>
    <data>
    YnBsaXN0MDDUAQIDBAUGFRZYJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3AS
    AAGGoKMHCA9VJG51bGzTCQoLDA0OVU5TUkdCXE5TQ29sb3JTcGFjZVYkY2xhc3NOMCAw
    LjE2NDUgMC4yMQAQAoAC0hAREhNaJGNsYXNzbmFtZVgkY2xhc3Nlc1dOU0NvbG9yohIU
    WE5TT2JqZWN0XxAPTlNLZXllZEFyY2hpdmVy0RcYVHJvb3SAAQgRGiMtMjc7QUhOW2Jx
    c3V6hY6WmaK0t7wAAAAAAAABAQAAAAAAAAAZAAAAAAAAAAAAAAAAAAAAvg==
    </data>

Esto se ve mucho diferente (y más complejo) que el simple valor HSB 193 100 21 tomado de tabla :

    SOLARIZED HEX     16/8 TERMCOL  XTERM/HEX   L*A*B      RGB         HSB
    --------- ------- ---- -------  ----------- ---------- ----------- -----------
    base03    #002b36  8/4 brblack  234 #1c1c1c 15 -12 -12   0  43  54 193 100  21
    ...

¿Por qué el valor simple 193 100 21 se convierte en una cadena de datos de 5 líneas de longitud? ¿Qué otra información está contenida en esa cadena? Finalmente, y lo más importante, ¿cómo puedo convertir una cadena de este tipo en valores de color estándar simples que pueda usar en otras plataformas?

    
pregunta GrowlTiger 12.08.2013 - 00:05

2 respuestas

4

bplist significa lista de propiedades binarias, que se puede convertir a XML con plutil -convert xml1 . Dentro de cada lista para un color hay otra clave de datos para los valores RGB fraccionarios.

/usr/libexec/PlistBuddy -x -c 'Print "Window Settings":"My Theme"' ~/Library/Preferences/com.apple.Terminal.plist|tr -d '\n\t'|grep -o '[^>]*</key><data>[^<]*'|while read l;do echo ${l%%<*} $(base64 -D<<<${l##*>}|plutil -convert xml1 - -o -|awk '/<data>/{getline;print}'|tr -d '\t'|base64 -D);done

La salida se ve así:

ANSIBlueColor 0.4769933663 0.4769933663 0.9314516129
ANSICyanColor 0.2666655827 0.8165705831 0.8588709677
ANSIGreenColor 0.428833897 0.8508064516 0.490967087
ANSIMagentaColor 0.9072580645 0.4499707336 0.9072580645
ANSIRedColor 0.9072580645 0.508503512 0.508503512
ANSIYellowColor 0.9072580645 0.9072580645 0.3914379553
CursorColor 0.9998760223 0.999984026 0.999786377
SelectionColor 0.3899414837 0.4639441073 0.5917825699
TextBoldColor 0.9441435337 0.4102420509 0.427282244
TextColor 1 0.99997437 0.9999912977
    
respondido por el user495470 13.08.2013 - 20:52
2

Estás viendo datos serializados codificados en base64.

Base64 + original serializado:

 YnBsaXN0MDDUAQIDBAUGFRZYJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3AS
AAGGoKMHCA9VJG51bGzTCQoLDA0OVU5TUkdCXE5TQ29sb3JTcGFjZVYkY2xhc3NOMCAw
LjE2NDUgMC4yMQAQAoAC0hAREhNaJGNsYXNzbmFtZVgkY2xhc3Nlc1dOU0NvbG9yohIU
WE5TT2JqZWN0XxAPTlNLZXllZEFyY2hpdmVy0RcYVHJvb3SAAQgRGiMtMjc7QUhOW2Jx
c3V6hY6WmaK0t7wAAAAAAAABAQAAAAAAAAAZAAAAAAAAAAAAAAAAAAAAvg==

Al usar algo como enlace , puedes ver la versión descodificada:

bplist00X$versionX$objectsY$archiverT$topU$null    
UNSRGB\NSColorSpaceV$classN0 0.1645 0.21Z$classnameX$classesWNSColorXNSObject_NSKeyedArchiverTroot#-27;AHN[bqsuz

En este punto, la parte interesante es: NSKeyedArchiver , que es el motor de serialización integrado en Objective-C, que por supuesto, las aplicaciones OSX están escritas.

En cuanto a la pregunta detrás de su pregunta, sobre cómo convertir entre esta y otras representaciones estándar de color: la respuesta es, por desgracia, no fácil o confiable.

Está claro que sabe cómo tomar un valor HSB y generar los datos codificados. Si quisiera dedicar tiempo a la ingeniería inversa sobre cómo se realiza el archivo, podrá hacerlo. No está seguro de cuál es su familiaridad con el lenguaje objetivo c, pero probablemente podría hacer un programa simple que convierta entre los dos. Esencialmente, probablemente no valga la pena su tiempo.

    
respondido por el Liyan Chang 13.08.2013 - 18:26

Lea otras preguntas en las etiquetas