Come vengono rappresentati i colorschemes in OS X Terminal.app Settings Files?

6

Sono interessato a trasferire i valori dei colori che ho creato per OS X Terminal alle applicazioni su altre piattaforme, come Linux. Ho familiarità con i soliti metodi di rappresentazione di valori di colore come RGB, HSB, L * A * B, HEX, ecc. Tuttavia, le stringhe <data> usate nei file di impostazioni di Terminale sono diverse da altri metodi usati per definire i colori. Mi piacerebbe aiutare a capire questo tipo di <data> XML in relazione ad altri valori di colore.

Ad esempio, ho usato Color Picker incorporato in OS X per modificare manualmente lo schema ANSI predefinito del terminale con i valori HSB dell'eccellente Solarizzato. Ho quindi salvato quelle impostazioni in un file .plist XML chiamato Solarized Dark xterm-256color.terminal (Il contenuto di quel file può essere trovato qui .)

Ho arbitrariamente scelto brblack da quel file come valore di un singolo colore per il confronto:

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

Questo aspetto molto diverso (e più complesso) rispetto al semplice valore HSB 193 100 21 preso da tavolo :

    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
    ...

Perché il valore semplice 193 100 21 viene convertito in una stringa di dati di 5 righe? Quali altre informazioni sono contenute in quella stringa? Infine, e soprattutto, come posso convertire tale stringa in semplici valori di colore standard che posso usare su altre piattaforme?

    
posta GrowlTiger 12.08.2013 - 00:05
fonte

2 risposte

4

bplist significa elenco di proprietà binarie, che può essere convertito in XML con plutil -convert xml1 . All'interno di ogni plist per un colore è un altro data key per i valori RGB frazionali.

/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

L'output è simile a questo:

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
    
risposta data 13.08.2013 - 20:52
fonte
3

Stai guardando i dati serializzati con codifica base64.

Base64 + originale serializzato:

 YnBsaXN0MDDUAQIDBAUGFRZYJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3AS
AAGGoKMHCA9VJG51bGzTCQoLDA0OVU5TUkdCXE5TQ29sb3JTcGFjZVYkY2xhc3NOMCAw
LjE2NDUgMC4yMQAQAoAC0hAREhNaJGNsYXNzbmFtZVgkY2xhc3Nlc1dOU0NvbG9yohIU
WE5TT2JqZWN0XxAPTlNLZXllZEFyY2hpdmVy0RcYVHJvb3SAAQgRGiMtMjc7QUhOW2Jx
c3V6hY6WmaK0t7wAAAAAAAABAQAAAAAAAAAZAAAAAAAAAAAAAAAAAAAAvg==

Usando qualcosa come link , puoi vedere la versione decodificata:

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

A questo punto, la parte interessante è: NSKeyedArchiver , che è il motore di serializzazione incorporato in Objective-C, che, ovviamente, le app OSX sono scritte in.

Per quanto riguarda la domanda alla base della tua domanda, su come convertire tra questa e altre rappresentazioni standard di colore: la risposta è sfortunatamente, non facilmente o in modo affidabile.

È chiaro che sai come prendere un valore HSB e generare i dati codificati. Se si volesse prendere il tempo di decodificare l'esecuzione dell'archiviazione, si sarà in grado di farlo. Non sei sicuro di quale sia la tua familiarità con il linguaggio obiettivo, ma potresti probabilmente creare un semplice programma che converta tra i due. In sostanza, probabilmente non vale il tuo tempo.

    
risposta data 13.08.2013 - 18:26
fonte

Leggi altre domande sui tag