สายสีและสไตล์สำหรับขั้วต่อ
Crayons เป็นแพ็คเกจที่ทำให้ง่ายต่อการเขียนสตริงที่มีสีและสไตล์ที่แตกต่างกันไปยังเทอร์มินัล รองรับสีของระบบ 16 สี ทั้งสี 256 สีและส่วนขยายสีจริง 24 บิต และรูปแบบข้อความที่แตกต่างกันสำหรับเทอร์มินัล แพ็คเกจได้รับการออกแบบมาให้ทำงานได้ดี ไม่มีการพึ่งพา และโหลดได้เร็ว (เวลาในการโหลดประมาณ 10 ms หลังจากการคอมไพล์ล่วงหน้า)
import Pkg; Pkg . add ( " Crayons " )
Crayon
s Crayon
ถูกสร้างขึ้นด้วยตัวสร้างคำหลักเท่านั้น:
Crayon (foreground,
background,
reset,
bold,
faint,
italics,
underline,
blink,
negative,
conceal,
strikethrough)
อาร์กิวเมนต์ foreground
และ background
สามารถมีได้สามประเภท:
Symbol
ที่แสดงถึงสี สีที่มีจำหน่าย ได้แก่ black
red
green
yellow
magenta
blue
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 ซึ่งจะใช้รหัส Escape ANSI 256 สี หากต้องการดูว่าตัวเลขใดตรงกับสีใด และหากเทอร์มินัลของคุณรองรับ 256 สี ให้ใช้ Crayons.test_256_colors(codes=true)
Tuple
ของ Integer
สาม s ทั้งหมดอยู่ระหว่าง 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
สำหรับเวอร์ชันพื้นหน้า/พื้นหลังของระบบสีทั้ง 16 สีและสไตล์ต่างๆ ได้มีการจัดทำไว้ล่วงหน้าแล้ว และสามารถพบได้ในโมดูล Crayons.Box
มีชื่อ <COLOR_NAME>_<BG/FG>
สำหรับสีพื้นหน้า/พื้นหลัง และ <STYLE>
สำหรับสไตล์ต่างๆ (โปรดสังเกตตัวพิมพ์ใหญ่) การโทร using
โมดูล Crayons.Box
จะนำสิ่งเหล่านี้มาสู่ขอบเขตระดับโลก
นอกจากนี้ Crayon
ยังสามารถสร้างขึ้นในลักษณะ terser โดยใช้มาโครสตริง crayon
สิ่งเหล่านี้เขียนโดยใช้ crayon"[[fg:]<col>] [bg:<col>] ([[!]<style>] ...)"
โดยที่:
<col>
คือสีที่กำหนดให้เป็นเลขฐานสิบหก, (r,g,b)
tuple (ไม่มีการเว้นวรรค), ตัวเลข 0-255 หรือหนึ่งใน 16 สีที่มีชื่อ<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
ไปยัง Terminal ลำดับรหัสที่ถูกต้องจะถูกส่งไปยัง Terminal เพื่อให้ข้อความที่พิมพ์ตามมาใช้สีและรูปแบบของ 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 สี แต่ก็เป็นไปได้ที่จะแปลงเป็นหนึ่งใน 16 สีของระบบโดยการกำหนดตัวแปร FORCE_SYSTEM_COLORS
หรือโดยการเรียก Crayons.force_system_colors(::Bool)
โปรดทราบว่า 16 สี (เวอร์ชันสว่าง 8 + 8) เป็นพื้นที่สีที่ค่อนข้างเล็ก ดังนั้นการแปลงจึงไม่น่าจะดีมาก
Crayon
s สามารถรวม Crayon
ตั้งแต่ 2 ชิ้นขึ้นไปเข้าด้วยกันได้ ส่งผลให้ได้ 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
ในอาร์กิวเมนต์ to 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
คริสตอฟเฟอร์ คาร์ลสสัน — @KristofferC