Farbige und gestaltete Schnüre für Terminals.
Crayons ist ein Paket, das es einfach macht, Zeichenfolgen in verschiedenen Farben und Stilen auf Terminals zu schreiben. Es unterstützt die 16 Systemfarben, sowohl die 256-Farben- als auch die 24-Bit-True-Color-Erweiterungen sowie die verschiedenen Textstile, die für Terminals verfügbar sind. Das Paket ist so konzipiert, dass es eine gute Leistung erbringt, keine Abhängigkeiten aufweist und schnell geladen wird (ca. 10 ms Ladezeit nach der Vorkompilierung).
import Pkg; Pkg . add ( " Crayons " )
Crayon
Ein Crayon
wird mit dem Schlüsselwort „Only Constructor“ erstellt:
Crayon (foreground,
background,
reset,
bold,
faint,
italics,
underline,
blink,
negative,
conceal,
strikethrough)
Es gibt drei Arten von foreground
und background
:
Symbol
das eine Farbe darstellt. Die verfügbaren Farben sind black
, red
, green
, yellow
, blue
, magenta
, cyan
, light_gray
, default
, dark_gray
, light_red
, light_green
, light_yellow
, light_blue
, light_magenta
, light_cyan
und white
. Um die Farben in Aktion zu sehen, versuchen Sie es mit Crayons.test_system_colors()
. Diese Farben werden von fast allen Endgeräten unterstützt.Integer
zwischen 0 und 255. Dabei werden die 256 farbigen ANSI-Escape-Codes verwendet. Um zu sehen, welche Zahl welcher Farbe entspricht und ob Ihr Terminal 256 Farben unterstützt, verwenden Sie Crayons.test_256_colors(codes=true)
.Tuple
aus drei Integer
-Werten, alle zwischen 0 und 255. Dies wird als (r, g, b)
24-Bit-Farbe interpretiert. Um die Unterstützung Ihrer Terminals für 24-Bit-Farben zu testen, verwenden Sie Crayons.test_24bit_colors(codes=false)
. Die Unterstützung dafür ist derzeit noch recht begrenzt, wird aber in den Terminals kontinuierlich verbessert, siehe hier.UInt32
der eine im Hexadezimalformat angegebene Farbe darstellt. Wird in das entsprechende RGB-Format konvertiert. Die anderen Schlüsselwortargumente sind alle vom Typ Bool
und bestimmen, ob der entsprechende Stil explizit aktiviert oder deaktiviert werden soll:
reset
– Alle Stile und Farben auf die Standardeinstellungen zurücksetzenbold
– fetter Text, hellt bei einigen Terminals auch die Farben auffaint
– schwacher Text, nicht allgemein unterstütztitalics
– kursiver Text, nicht allgemein unterstütztunderline
– unterstrichener Textblink
– blinkender Textnegative
– Vorder- und Hintergrund vertauschenconceal
– verbirgt den Text, wird nicht allgemein unterstütztstrikethrough
– horizontale Linie durch die Mitte des Textes, nicht allgemein unterstützt. Um Text mit den verschiedenen aktiven Stilen anzuzeigen, verwenden Sie Crayons.test_styles()
Wenn Sie für keines der Schlüsselwortargumente nothing
verwenden, ist diese Farbe oder dieser Stil inaktiv und kann daher weder aktiv aktiviert noch deaktiviert werden.
Der Einfachheit halber sind Crayon
für die Vordergrund-/Hintergrundversion der 16 Systemfarben sowie die verschiedenen Stile vorgefertigt und im Crayons.Box
-Modul zu finden. Sie haben den Namen <COLOR_NAME>_<BG/FG>
für die Vordergrund-/Hintergrundfarben und <STYLE>
für die verschiedenen Stile (beachten Sie die Großschreibung). Durch den Aufruf using
im Crayons.Box
-Modul werden all diese in den globalen Geltungsbereich gebracht.
Mit dem String-Makro crayon
lassen sich Crayon
auch prägnanter erstellen. Diese werden mit crayon"[[fg:]<col>] [bg:<col>] ([[!]<style>] ...)"
geschrieben, wobei:
<col>
ist eine Farbe, die als Hexadezimalzahl, (r,g,b)
-Tupel (ohne Leerzeichen), eine Zahl von 0-255 oder eine der 16 genannten Farben angegeben wird.<style>
ist einer der Stile.!
bedeutet, dass der Stil explizit deaktiviert ist.(<style> ...)
bedeutet eine wiederholte Anzahl von Stilen, getrennt durch Leerzeichen.Nachfolgend finden Sie einige Beispiele für die Verwendung der Zeichenfolgenmakros und des entsprechenden Konstruktors
crayon " red " # Crayon(foreground = :red)
crayon " bg:(255,0,255) " # Crayon(background = (255, 0, 255))
crayon " !bold underline 0xff00ff " # Crayon(bold = false, underline = true, foreground = 0xff00ff)
crayon " #0000ff " # Crayon(foreground = 0x0000ff)
Crayon
s Das Drucken von farbigem und gestaltetem Text mit Buntstiften ist einfach. Durch das Drucken eines Crayon
an das Terminal werden die richtigen Codesequenzen an das Terminal gesendet, sodass der nachfolgende gedruckte Text die Farbe und den Stil des gedruckten Crayon
annimmt. Versuchen Sie beispielsweise, den folgenden Code in der REPL auszuführen:
print ( Crayon (foreground = :red ), " In red. " , Crayon (bold = true ), " Red and bold " )
print ( Crayon (foreground = 208 , background = :red , bold = true ), " Orange bold on red " )
print ( Crayon (negative = true , underline = true , bold = true ), " Underlined inverse bold " )
print ( Crayon (foreground = ( 100 , 100 , 255 ), background = ( 255 , 255 , 0 )), " Bluish on yellow " )
using Crayons . Box
print (GREEN_FG, " This is in green " )
print (BOLD, GREEN_FG, BLUE_BG, " Bold green on blue " )
Es ist auch möglich , die Anrufüberladung auf erstellte Crayon
s anzuwenden. Der Crayon
kann mit Strings und anderen Crayon
aufgerufen werden und die Farben und Stile werden korrekt verschachtelt. Es werden auch korrekte Endsequenzen gedruckt, sodass die Farben und Stile außerhalb des Aufrufbereichs deaktiviert sind. Diese Funktionalität wird vielleicht anhand einiger Beispiele deutlicher:
using Crayons . Box
print ( UNDERLINE ( " This is underlined. " ), " But this is not " )
print ( RED_FG ( " Hello " , BLUE_BG ( " world " ), " !!! " ), " !!! " )
print ( GREEN_BG ( " We " ,
UNDERLINE ( " are " ,
MAGENTA_FG ( " nesting " ),
" some " ),
" colors " )
)
Hinweis: Damit die Farbsequenzen gedruckt werden können, müssen in der Julia REPL Farben aktiviert sein, entweder indem Julia automatisch die Terminalunterstützung erkennt oder indem Julia mit dem Argument --color=yes
gestartet wird. Wenn alternativ die Umgebungsvariable FORCE_COLOR
vorhanden ist oder Crayons.force_color(::Bool)
aktiviert wurde, werden Farbsequenzen auf jeden Fall gedruckt. Da relativ wenige Terminals außerdem volle 24-Bit-Farben unterstützen, ist es möglich, den 256-Farben-Modus zu aktivieren, der den 24-Bit-Stift beim Drucken in einen 256-Farben-Stift umwandelt. Dies geschieht entweder durch Definieren der Variablenumgebung FORCE_256_COLORS
oder durch Aufrufen von Crayons.force_256_colors(::Bool)
. Darüber hinaus haben einige Systeme auch bei 256 Farben Probleme. Eine Konvertierung in eine der 16 Systemfarben ist durch die Definition der Variablen FORCE_SYSTEM_COLORS
oder durch den Aufruf von Crayons.force_system_colors(::Bool)
möglich. Beachten Sie, dass 16 Farben (8 + 8 helle Versionen) ein recht kleiner Farbraum sind, sodass die Konvertierung wahrscheinlich nicht sehr gut ist.
Crayon
s Zwei oder mehr Crayon
können zusammengeführt werden, wodurch ein neuer Crayon
mit allen Eigenschaften der zusammengeführten Crayons entsteht. Dies geschieht mit der Funktion merge(crayons::Crayon...)
oder durch Multiplikation Crayon
s mit *
. Wenn zwei Crayon
s dieselbe Eigenschaft angeben, wird die Eigenschaft des letzten Crayon
in der Argumentliste verwendet:
using Crayons . Box
r_fg = Crayon (foreground = :red )
g_bg = Crayon (background = :green )
merged = merge (r_fg, g_bg)
print (merged, " Red foreground on green background! " )
print (r_fg * g_bg * Crayons . Box . BOLD, " Bold Red foreground on green background! " )
# Also with call overloading and nesting
print ( GREEN_FG (
" I am a green line " ,
BOLD * BLUE_FG * UNDERLINE (
" with a bold underlined blue substring "
),
" that becomes green again! "
))
Die Funktion inv
für einen Crayon
gibt einen Crayon
zurück, der rückgängig macht, was der Crayon
im Argument für inv
tut. Beispielsweise gibt inv(Crayon(bold = true))
einen Crayon
zurück, der die Fettschrift deaktiviert.
Wenn Sie Farben und Stile durch Funktionsaufrufe verschachteln möchten, gibt es den Typ CrayonStack
. Einfach push!
Crayon
, Text auf den Stapel drucken und dann pop!
die Crayons
ab. Der Stapel verfolgt, welcher Crayon
gerade aktiv ist. Es wird wie ein Crayon
verwendet:
stack = CrayonStack ()
print (stack, " normal text " )
print ( push! (stack, Crayon (foreground = :red )), " in red " )
print ( push! (stack, Crayon (foreground = :blue )), " in blue " )
print ( pop! (stack), " in red again " )
print ( pop! (stack), " normal text " )
Ein CrayonStack
kann auch im incremental
Modus erstellt werden, indem CrayonStack(incremental = true)
aufgerufen wird. In diesem Fall druckt CrayonStack
nur die Änderungen, die erforderlich sind, um vom vorherigen Textstatus in den neuen Status zu wechseln, was dazu führt, dass weniger Farbcodes gedruckt werden. Beachten Sie jedoch, dass dies bedeutet, dass der CrayonStack
für alle daran vorgenommenen Änderungen in den Ausgabepuffer gedruckt werden muss (dh sowohl bei Verwendung push!
als auch pop!
). Das folgende Beispiel zeigt ein funktionierendes Beispiel, bei dem alle Änderungen am Stapel gedruckt werden, und ein weiteres Beispiel, das ein falsches Ergebnis liefert, da eine Änderung nicht gedruckt wird. Beide Beispiele unten funktionieren korrekt, wenn incremental = false
.
# Does work
io = IOBuffer ()
stack = CrayonStack (incremental = true )
print (io, push! (stack, Crayon (foreground = :red )))
print (io, push! (stack, Crayon (foreground = :red )))
print (io, stack, " This will be red " )
print ( String ( take! (io)))
# Does not work
io = IOBuffer ()
stack = CrayonStack (incremental = true )
push! (stack, Crayon (foreground = :red )) # <- not printing the stack even though we modify it!
print (io, push! (stack, Crayon (foreground = :red )))
print (io, stack, " This will not be red " )
print ( String ( take! (io)))
Der Grund, warum das letzte Beispiel nicht funktioniert hat, liegt darin, dass der Stack feststellt, dass es beim zweiten Aufruf von push!
, da der Vordergrund einfach rot gehalten wurde. Der Stapel kann nach dem ersten push!
bedeutete, dass der Terminalstatus und der Stackstatus nicht mehr synchron waren.
https://github.com/Aerlinger/AnsiColor.jl
Kristoffer Carlsson – @KristofferC