Wie werden Farbschemata in OS X Terminal.app-Einstellungsdateien dargestellt?

Ich bin daran interessiert, Farbwerte, die ich für OS X Terminal erstellt habe, in Anwendungen auf anderen Plattformen wie Linux zu verschieben. Ich bin mit den üblichen Methoden zur Darstellung von Farbwerten wie RGB, HSB, L*A*B, HEX usw. vertraut. Die <data>in Terminal-Einstellungsdateien verwendeten Zeichenfolgen unterscheiden sich jedoch von anderen Methoden zur Definition von Farben. Ich hätte gerne Hilfe beim Verständnis dieses XML <data>-Typs in Bezug auf andere Farbwerte.

Als Beispiel habe ich den integrierten Farbwähler von OS X verwendet, um das Standard-ANSI-Schema von Terminal manuell mit HSB-Werten aus Ethan Schoonovers ausgezeichnetem Solarized zu ändern. Ich habe diese Einstellungen dann in einer XML-.plist namens gespeichert Solarized Dark xterm-256color.terminal(Der Inhalt dieser Datei kann hier gefunden werden .)

Ich habe aus dieser Datei willkürlich brblackeinen einzelnen Farbwert zum Vergleich ausgewählt:

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

Dies sieht viel anders (und komplexer) aus als der einfache HSB 193 100 21-Wert aus Schoonovers Tabelle :

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

Warum wird der einfache Wert 193 100 21in einen 5 Zeilen langen Datenstring umgewandelt? Welche anderen Informationen sind in dieser Zeichenfolge enthalten? Und vor allem, wie kann ich einen solchen String in einfache Standardfarbwerte umwandeln, die ich auf anderen Plattformen verwenden kann?

Antworten (2)

bplistbedeutet binäre Eigenschaftsliste, die mit in XML konvertiert werden kann plutil -convert xml1. In jeder Plist für eine Farbe befindet sich ein weiterer Datenschlüssel für die gebrochenen RGB-Werte.

/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

Die Ausgabe sieht so aus:

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
Danke, das ist genau das, wonach ich gesucht habe. Ich war ein bisschen von der gebrochenen RGB- Terminologie geworfen, aber dann wurde mir klar, dass ich nominale RGB-Werte erhalten konnte, indem ich die gebrochenen Werte mit 255 multiplizierte und rundete (z. B. 0,4769933663 * 255 = 122). Ich mag Ihren CLI-Einzeiler wirklich: Sie würden Doug McIlroy und Ken Thompson stolz machen! Schreiben Sie Programme, die eine Sache tun, und zwar gut. Schreiben Sie Programme, um zusammenzuarbeiten. Schreiben Sie Programme zur Verarbeitung von Textströmen, da dies eine universelle Schnittstelle ist. Unix-Philosophie
Danke! Dies kann hex mit einem zusätzlichen awk ausgeben:/usr/libexec/PlistBuddy -x -c 'Print "Window Settings":"Theme Name"' ~/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 $1}'|tr -d '\t'|base64 -D| awk '{printf "#%02X%02X%02X", $1*256, $2*256, $3*256}');done

Sie betrachten base64-codierte serialisierte Daten.

Base64 + serialisiertes Original:

 YnBsaXN0MDDUAQIDBAUGFRZYJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3AS
AAGGoKMHCA9VJG51bGzTCQoLDA0OVU5TUkdCXE5TQ29sb3JTcGFjZVYkY2xhc3NOMCAw
LjE2NDUgMC4yMQAQAoAC0hAREhNaJGNsYXNzbmFtZVgkY2xhc3Nlc1dOU0NvbG9yohIU
WE5TT2JqZWN0XxAPTlNLZXllZEFyY2hpdmVy0RcYVHJvb3SAAQgRGiMtMjc7QUhOW2Jx
c3V6hY6WmaK0t7wAAAAAAAABAQAAAAAAAAAZAAAAAAAAAAAAAAAAAAAAvg==

Mit etwas wie http://www.base64decode.org/ können Sie die dekodierte Version sehen:

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

An dieser Stelle ist der interessante Teil: NSKeyedArchiverDas ist die eingebaute Serialisierungs-Engine in Objective-C, in der natürlich OSX-Apps geschrieben sind.

Was die Frage hinter Ihrer Frage betrifft, wie Sie zwischen dieser und anderen Standardfarbdarstellungen konvertieren können: Die Antwort ist leider nicht einfach oder zuverlässig.

Es ist klar, dass Sie wissen, wie man einen HSB-Wert nimmt und die codierten Daten generiert. Wenn Sie sich die Zeit nehmen wollten, um nachzuvollziehen, wie die Archivierung abläuft, könnten Sie das tun. Ich bin mir nicht sicher, wie vertraut Sie mit der objektiven c-Sprache sind, aber Sie könnten wahrscheinlich ein einfaches Programm erstellen, das zwischen den beiden konvertiert. Im Wesentlichen wahrscheinlich nicht Ihre Zeit wert.

Als Fußnote können Sie base64-Daten erkennen, indem Sie nach wirklich langen alphanumerischen Blöcken suchen (ja, es gibt ein paar Sonderzeichen, die jedoch eher selten sind) und mit einem Paar „=“ enden, das das Füllzeichen ist.
Vielen Dank für Ihre Antwort. Ich wollte den Prozess nicht wirklich zurückentwickeln (obwohl das eine interessante Übung sein könnte). Ich wollte nur eine Möglichkeit, die base64-Daten in eine gebräuchlichere Farbwertdarstellung umzuwandeln. Und Ihre Antwort hat das getan. Es ist genau dort im zweiten code block.Recht nach classN: 0 0.1645 0.21. Ich habe von @Lauri erfahren, dass dies gebrochene RGB-Werte sind, die in herkömmliches RBG umgewandelt werden können, indem sie mit 255 multipliziert werden.