سلاسل ملونة ومصممة للمحطات.
Crayons عبارة عن حزمة تجعل من السهل كتابة سلاسل بألوان وأنماط مختلفة على الأجهزة الطرفية. وهو يدعم 16 لونًا للنظام، كلاً من امتدادات الألوان الحقيقية 256 لونًا و24 بت، وأنماط النص المختلفة المتاحة للمحطات الطرفية. تم تصميم الحزمة لأداء جيد، وليس لها أي تبعيات وتحميل سريع (حوالي 10 مللي ثانية من وقت التحميل بعد الترجمة المسبقة).
import Pkg; Pkg . add ( " Crayons " )
Crayon
يتم إنشاء Crayon
باستخدام الكلمة الأساسية المُنشئ فقط:
Crayon (foreground,
background,
reset,
bold,
faint,
italics,
underline,
blink,
negative,
conceal,
strikethrough)
يمكن أن تكون وسيطة foreground
background
من ثلاثة أنواع:
Symbol
يمثل اللون. الألوان المتاحة هي black
، red
، green
، yellow
، blue
، magenta
، cyan
، و light_gray
، default
، و dark_gray
، و light_red
، و light_green
، light_yellow
، light_blue
، و light_magenta
، light_cyan
، white
. لرؤية الألوان أثناء العمل، جرب Crayons.test_system_colors()
. يتم دعم هذه الألوان بواسطة جميع المحطات الطرفية تقريبًا.Integer
بين 0 و255. سيستخدم هذا رموز الهروب ANSI المكونة من 256 لونًا. لمعرفة الرقم الذي يتوافق مع اللون وما إذا كان جهازك الطرفي يدعم 256 لونًا، استخدم Crayons.test_256_colors(codes=true)
.Tuple
من ثلاثة Integer
، كلها بين 0 و255. سيتم تفسير ذلك على أنه لون (r, g, b)
24 بت. لاختبار دعم أجهزتك الطرفية للألوان 24 بت، استخدم Crayons.test_24bit_colors(codes=false)
. الدعم لهذا حاليًا محدود جدًا ولكن يتم تحسينه في المحطات الطرفية بشكل مستمر، انظر هنا.UInt32
لونًا محددًا بتنسيق سداسي عشري. سيتم تحويله إلى تنسيق RGB المقابل. وسيطات الكلمات الرئيسية الأخرى كلها من نوع Bool
وتحدد ما إذا كان النمط المقابل يجب تمكينه أو تعطيله بشكل صريح:
reset
- إعادة تعيين جميع الأنماط والألوان إلى الوضع الافتراضيbold
- نص غامق، كما أنه يزيد من سطوع الألوان على بعض المحطات الطرفيةfaint
- نص باهت، غير مدعوم على نطاق واسعitalics
- نص مائل، غير معتمد على نطاق واسعunderline
- نص تحته خطblink
- نص وامضnegative
- تبديل المقدمة والخلفيةconceal
— يخفي النص، وهو غير مدعوم على نطاق واسعstrikethrough
- خط أفقي يمر عبر منتصف النص، غير مدعوم على نطاق واسع. لرؤية النص بأنماط مختلفة نشطة، استخدم Crayons.test_styles()
من خلال nothing
استخدام أي شيء لأي من وسيطات الكلمات الرئيسية، يكون هذا اللون أو النمط غير نشط وبالتالي لا يتم تمكينه أو تعطيله بشكل فعال.
من أجل الراحة، تم إنشاء Crayon
لإصدار المقدمة/الخلفية لألوان النظام الستة عشر بالإضافة إلى الأنماط المختلفة مسبقًا ويمكن العثور عليها في وحدة Crayons.Box
. لديهم الاسم <COLOR_NAME>_<BG/FG>
لألوان المقدمة/الخلفية و <STYLE>
للأنماط المختلفة (لاحظ الأحرف الكبيرة). سيؤدي الاتصال using
وحدة Crayons.Box
إلى جلب كل هذه الأمور إلى النطاق العالمي.
يمكن أيضًا إنشاء Crayon
بطريقة مختصرة باستخدام crayon
تلوين الماكرو. تتم كتابتها باستخدام crayon"[[fg:]<col>] [bg:<col>] ([[!]<style>] ...)"
حيث:
<col>
هو لون يُعطى كرقم سداسي عشري، (r,g,b)
صفصاف (بدون مسافات)، رقم 0-255، أو أحد الألوان الستة عشر المسماة.<style>
هو أحد الأنماط.!
يعني أن النمط معطل بشكل صريح.(<style> ...)
تعني عددًا متكررًا من الأنماط، مفصولة بمسافات.يتم عرض بعض الأمثلة على استخدام وحدات ماكرو السلسلة والمنشئ المكافئ أدناه
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
تعد عملية طباعة النص الملون والمصمم باستخدام أقلام التلوين عملية بسيطة. من خلال طباعة Crayon
على الجهاز، يتم إرسال تسلسلات التعليمات البرمجية الصحيحة إلى الجهاز بحيث يأخذ النص المطبوع اللاحق لون ونمط Crayon
المطبوع. على سبيل المثال، حاول تشغيل الكود أدناه في REPL:
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 " )
من الممكن أيضًا استخدام التحميل الزائد للمكالمات على أجهزة Crayon
التي تم إنشاؤها. يمكن استدعاء Crayon
باستخدام السلاسل وألوان Crayon
الأخرى وسوف تتداخل الألوان والأنماط بشكل صحيح. ستتم أيضًا طباعة تسلسلات النهاية الصحيحة بحيث يتم تعطيل الألوان والأنماط خارج نطاق الاتصال. ربما تظهر هذه الوظيفة بشكل أكثر وضوحًا مع بعض الأمثلة:
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 " )
)
ملاحظة: لكي تتم طباعة تسلسلات الألوان، يحتاج Julia REPL إلى تنشيط الألوان، إما عن طريق اكتشاف Julia تلقائيًا لدعم المحطة الطرفية أو عن طريق تشغيل Julia بالوسيطة --color=yes
. وبدلاً من ذلك، إذا كان متغير البيئة FORCE_COLOR
موجودًا، أو تم تمكين Crayons.force_color(::Bool)
، فسيتم طباعة تسلسلات الألوان بغض النظر عن الأمر. أيضًا، نظرًا لأن عدد قليل نسبيًا من المحطات الطرفية تدعم ألوان 24 بت كاملة، فمن الممكن تنشيط وضع 256 لونًا والذي يحول قلم التلوين 24 بت إلى قلم تلوين 256 لونًا عند الطباعة. يتم ذلك إما عن طريق تعريف البيئة المتغيرة FORCE_256_COLORS
أو عن طريق استدعاء Crayons.force_256_colors(::Bool)
. بالإضافة إلى ذلك، تواجه بعض الأنظمة مشاكل حتى مع وجود 256 لونًا، فمن الممكن التحويل إلى أحد ألوان النظام الستة عشر عن طريق تعريف المتغير FORCE_SYSTEM_COLORS
أو عن طريق استدعاء Crayons.force_system_colors(::Bool)
. لاحظ أن 16 لونًا (8 + 8 إصدارات فاتحة) عبارة عن مساحة ألوان صغيرة جدًا لذا من غير المرجح أن يكون التحويل جيدًا جدًا.
Crayon
يمكن دمج اثنين أو أكثر من Crayon
مما يؤدي إلى ظهور Crayon
جديد بكل خصائص الألوان المدمجة. يتم ذلك باستخدام الدالة merge(crayons::Crayon...)
أو عن طريق ضرب Crayon
s باستخدام *
. إذا قام اثنان من Crayon
بتحديد نفس الخاصية، فسيتم استخدام خاصية آخر Crayon
في قائمة الوسيطات:
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! "
))
تقوم الدالة inv
الموجودة على Crayon
بإرجاع Crayon
الذي يلغي ما يفعله Crayon
في الوسيطة الخاصة بـ inv
. على سبيل المثال، يقوم inv(Crayon(bold = true))
بإرجاع Crayon
الذي يقوم بتعطيل الخط الغامق.
إذا كنت تريد دمج الألوان والأنماط من خلال استدعاءات الوظائف، فهناك نوع CrayonStack
. ببساطة push!
Crayon
على المكدس، قم بطباعة النص على المكدس، ثم pop!
Crayons
قبالة. سوف تقوم المكدس بتتبع ما هو Crayon
نشط حاليًا. يتم استخدامه تمامًا مثل Crayon
:
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 " )
يمكن أيضًا إنشاء CrayonStack
في الوضع incremental
عن طريق استدعاء CrayonStack(incremental = true)
. في هذه الحالة، سيقوم CrayonStack
فقط بطباعة التغييرات المطلوبة للانتقال من حالة النص السابقة إلى الحالة الجديدة، مما يؤدي إلى طباعة رموز ألوان أقل. ومع ذلك، لاحظ أن هذا يعني أنه يجب طباعة CrayonStack
على المخزن المؤقت للإخراج لجميع التغييرات التي يتم إجراؤها عليه (أي عند استخدام كل من push!
و pop!
). يوضح المثال أدناه مثالًا عمليًا حيث تمت طباعة كافة التغييرات التي تم إجراؤها على المكدس ومثالًا آخر، مما يعطي نتيجة خاطئة، حيث لم تتم طباعة تغيير واحد. كلا المثالين أدناه يعملان بشكل صحيح إذا كان 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)))
السبب وراء عدم نجاح المثال الأخير هو أن المكدس لاحظ عدم وجود تغيير في حالة النص في الاستدعاء الثاني push!
، حيث تم الاحتفاظ بالمقدمة باللون الأحمر فقط. فشل في طباعة المكدس بعد push!
يعني أن الحالة الطرفية وحالة المكدس خرجتا عن المزامنة.
https://github.com/Aerlinger/AnsiColor.jl
كريستوفر كارلسون - @ كريستوفر سي