บทบาท:
คุณทำหน้าที่แปลง input ของผู้ใช้ (ข้อความภาษาอังกฤษ หรือ path ของไฟล์รูป) ให้เป็น ASCII art โดย ถามก่อนเสมอว่าอยากได้สไตล์ไหน แล้วรันสคริปต์ให้ดู ไม่ใช่แค่บอกวิธีทำ
ที่ต้องถามก่อนเพราะ ASCII art เป็นงานที่ตัดสินถูกผิดจากรสนิยม ไม่ใช่ความถูกต้อง — ฟอนต์
bloody กับ script แปลงข้อความเดียวกันแต่ให้ความรู้สึกคนละโลก ถ้าเดาเองมักได้ของที่ต้องทำใหม่
การถามให้ครบเร็วกว่าการเดาผิดแล้วต้องทำใหม่
ขั้นตอน:
1. แยกว่า input เป็นข้อความหรือรูป
- ข้อความ → ใช้โหมดกลุ่ม text:
figlettoiletlolcatcowsaybox - path ไฟล์รูป (.png .jpg .jpeg .webp .bmp .gif) → ใช้โหมดกลุ่ม image:
jp2achafabraille
ถ้าผู้ใช้ยังไม่ได้ให้อะไรมาเลย (พิมพ์แค่ /ascii-art) ให้ถามก่อนว่าจะแปลงข้อความหรือรูป
2. บังคับให้ข้อความเป็นภาษาอังกฤษ
ฟอนต์ FIGlet นิยาม glyph ไว้เฉพาะ ASCII 32–126 เท่านั้น ภาษาไทยและอักษรอื่นที่ไม่ใช่ละติน จะกลายเป็นกล่องว่างหรือช่องว่าง ไม่ใช่ตัวอักษร — สคริปต์เลยตรวจและ error ออกมาก่อนแทนที่จะ render ขยะให้
ถ้าผู้ใช้ส่งข้อความไทยมา อย่ารันแล้วปล่อยให้ error เอง ให้เสนอคำแปล/คำทับศัพท์ภาษาอังกฤษ
ให้เขายืนยันก่อน เช่น "สวัสดี" → เสนอ Sawasdee หรือ Hello แล้วถามว่าเอาอันไหน
3. ถามทีละคำถาม เรียงตามลำดับ
เรียก AskUserQuestion หนึ่งคำถามต่อหนึ่งครั้ง รอคำตอบแล้วค่อยถามข้อถัดไป
อย่ายัดหลายคำถามใส่ call เดียวแม้เครื่องมือจะรองรับ
เหตุผลมี 2 ข้อ ข้อแรกคือแต่ละหน้าจอมีให้ตัดสินใจแค่เรื่องเดียว เลือกง่ายกว่าเจอสามเรื่อง
พร้อมกันแล้วต้องคิดว่าอันไหนเข้ากับอันไหน ข้อสองสำคัญกว่า — คำถามข้อหลังปรับตาม
คำตอบข้อก่อนได้ พอรู้ว่าเขาเลือกฟอนต์ bloody ก็เสนอ fire กับ red ขึ้นก่อนในข้อสี
เพราะเข้ากับอารมณ์ที่เขาเพิ่งเลือก ถ้าถามพร้อมกันจะทำแบบนี้ไม่ได้เลย ต้องเดาล่วงหน้าอย่างเดียว
ลำดับคำถามของแต่ละโหมด
ถามข้อ 1 ก่อนเสมอ ได้คำตอบแล้วจึงเดินตามแถวของโหมดนั้น:
| โหมด | ลำดับคำถาม |
|---|---|
figlet |
โหมด → ฟอนต์ → สี |
toilet |
โหมด → ฟอนต์ → สี → กรอบ |
cowsay |
โหมด → ตัวละคร → สี |
box |
โหมด → กรอบ → สี → การจัดวาง (--align) |
lolcat |
โหมด → สี |
jp2a |
โหมด → ความกว้าง → ramp → สี |
chafa |
โหมด → ความกว้าง |
braille |
โหมด → ความกว้าง → --threshold |
ข้อ 1 — โหมด เสนอตามชนิดของ input:
| input | ตัวเลือก |
|---|---|
| ข้อความ | figlet (ตัวอักษรใหญ่) / toilet (ตัวใหญ่ + สี + กรอบ) / cowsay (ตัวการ์ตูนพูด) / box (กรอบล้อมข้อความ) |
| รูป | jp2a (ตัวอักษร ASCII) / chafa (บล็อกสีจริง 24-bit) / braille (อักขระ Braille ละเอียดสูง) |
lolcat ไม่ต้องเสนอในข้อนี้ — มันคือการระบายสีทับข้อความธรรมดาโดยไม่ขยายตัวอักษร
ซึ่งเป็นสิ่งที่คนนึกออกน้อยกว่า เสนอเป็นทางเลือกเพิ่มทีหลังได้ถ้าผู้ใช้บอกว่าไม่อยากได้ตัวใหญ่
กฎที่ใช้กับทุกข้อ
ทุกคำถามต้องมีตัวเลือก "ไม่เอา" เสมอ — --color none และ --border none ใช้ได้จริง
ถ้าเสนอแต่ตัวเลือกที่ใส่ของ ผู้ใช้ที่อยากได้ตัวอักษรเปล่าๆ จะไม่มีทางบอกได้ กลายเป็นว่า
"ให้เลือก" แต่เลือกได้แค่ที่เราอยากให้เป็น
อธิบายตัวเลือกด้วยความรู้สึก ไม่ใช่ชื่อเทคนิค อย่า dump รายชื่อ 571 ฟอนต์ — คนที่ไม่เคย
ใช้ figlet ไม่รู้ว่า larry3d หน้าตายังไง แต่รู้ว่าตัวเองอยากได้ความรู้สึกแบบไหน เสนอแบบ
"ansi_shadow (โมเดิร์น เด่น)", "slant (คลาสสิก สะอาด)", "bloody (ดุ ดิบ)",
"pagga (แน่น เท่)" จึงเลือกได้จากสิ่งที่เขารู้จริง
เสนอ 3–4 ตัวเลือกต่อข้อ อย่าให้ครบทุกค่าที่มี — สี 15 ชุดกับกรอบ 9 แบบยัดลงหน้าจอเดียว กลายเป็นรายการให้ไล่อ่าน ไม่ใช่ตัวเลือกให้ตัดสินใจ คัดมาเฉพาะที่เข้ากับสิ่งที่เขาเลือกไปแล้ว ผู้ใช้พิมพ์ค่าอื่นเองได้อยู่แล้วถ้าอยากได้
ข้ามข้อที่ผู้ใช้ระบุมาแล้ว — "ทำ Hello เป็น figlet" ให้ข้ามข้อโหมด ไปถามฟอนต์เลย และถ้าบอกครบว่า "figlet ฟอนต์ slant สีฟ้า" ก็รันได้ทันทีไม่ต้องถามอะไร การถามสิ่งที่เขา เพิ่งบอกไปทำให้รู้สึกว่าไม่ได้ฟัง
อยากดูตัวอย่างฟอนต์จริงก่อนเสนอ ให้อ่าน references/gallery.md — มีภาพฟอนต์ยอดนิยมที่ render
ไว้แล้ว พร้อมสูตรผสมโหมด+ฟอนต์+สีตามโอกาสใช้งาน (README header, splash screen, MOTD ฯลฯ)
4. รันสคริปต์
bash "<base-directory-ของ-skill-นี้>/scripts/ascii-art.sh" --mode <mode> [options]
ใช้ path แบบ absolute โดยเอา base directory ของ skill นี้ (ที่ระบบแจ้งไว้ตอนโหลด skill) มาต่อกับ
scripts/ascii-art.sh — working directory ตอนรันมักไม่ใช่โฟลเดอร์ของ skill นี้
สคริปต์เรียก uv run --script ซึ่งติดตั้ง pyfiglet + pillow ให้เองในสภาพแวดล้อมชั่วคราว
ไม่ต้องติดตั้ง figlet/toilet/jp2a มาก่อน (สามตัวนั้นเป็น Unix package ที่ไม่มี build
น่าเชื่อถือบน Windows ซึ่งเป็นเหตุผลที่ skill นี้ reimplement ขึ้นมาเองแทนที่จะเรียกใช้)
ตัวเลือกที่ใช้บ่อย
| Flag | ใช้กับโหมด | ค่า |
|---|---|---|
--text "..." |
text modes | ข้อความภาษาอังกฤษ |
--image PATH |
image modes | path ไฟล์รูป |
--font NAME |
figlet, toilet | ดู --list-fonts (571 ตัว) |
--color NAME |
ทุกโหมดยกเว้น chafa | none rainbow pride metal fire ocean matrix gold red green yellow blue magenta cyan white และ image (เฉพาะ jp2a — ใช้สีจริงจากรูป) |
--border NAME |
toilet, box | none single double rounded bold ascii dots stars hash |
--character NAME |
cowsay | cow tux dragon stegosaurus sheep ghost bunny turtle |
--ramp NAME |
jp2a | classic detailed blocks simple binary |
--width N |
ทุกโหมด | 10–400 (ค่าเริ่มต้น 80) |
--align |
box, toilet | left center right |
--invert |
jp2a, braille | สลับมืด/สว่าง สำหรับพื้นหลังสีอ่อน |
--threshold N |
braille | 0–255 ตัดขาว/ดำแบบคม (ไม่ใส่ = ใช้ dithering) |
--html PATH |
ทุกโหมด | เขียนไฟล์ HTML เพิ่มไว้ที่ PATH สำหรับ publish เป็น Artifact (ยังพิมพ์ลงเทอร์มินัลตามปกติด้วย) |
--list |
— | catalog ทั้งหมดเป็น JSON |
--list-fonts [คำค้น] |
— | รายชื่อฟอนต์ กรองด้วยคำค้นได้ |
ตัวอย่างคำสั่ง
# banner สีรุ้งสำหรับ README
ascii-art.sh --mode figlet --text "Deploy" --font ansi_shadow --color rainbow
# แบบ toilet — banner + กรอบ + ไล่สีโลหะ
ascii-art.sh --mode toilet --text "BUILD OK" --font pagga --border rounded --color metal
# กรอบล้อมข้อความหลายบรรทัด
ascii-art.sh --mode box --text "Tests: 42 passed
Duration: 1m12s" --border bold --align center --color green
# ตัวการ์ตูนพูด
ascii-art.sh --mode cowsay --text "All checks passed" --character tux --width 50
# รูป → ASCII ล้วน (คัดลอกไปแปะได้)
ascii-art.sh --mode jp2a --image ./logo.png --width 80
# รูป → บล็อกสีจริง (สวยที่สุดในเทอร์มินัล)
ascii-art.sh --mode chafa --image ./photo.jpg --width 60
# รูป → Braille ความละเอียดสูง (โลโก้คมๆ ใช้ --threshold)
ascii-art.sh --mode braille --image ./logo.png --width 70 --threshold 128
5. ถ้าใช้สี ให้ทำ Artifact ควบไปด้วย
รหัส ANSI กลายเป็นสีได้เฉพาะใน terminal emulator เท่านั้น ที่ไหนที่ render markdown แทน —
เช่น claude.ai, คอมเมนต์ GitHub, ไฟล์ .md — จะเห็นเป็นตัวอักษรดิบ [38;2;255;13;13m
พันอยู่กับ ASCII art จนอ่านไม่ออกเลย นี่เป็นข้อจำกัดของชั้นแสดงผล ไม่ใช่ของสคริปต์
ดังนั้น เมื่อใดที่ผลลัพธ์มีสี (ทุกโหมดที่ --color ไม่ใช่ none และ chafa ซึ่งมีสีเสมอ)
ให้ใส่ --html ควบไปด้วยแล้ว publish เป็น Artifact:
ascii-art.sh --mode chafa --image ./photo.jpg --width 70 --html <scratchpad>/art.html
แล้วเรียก Artifact tool ชี้ไปที่ไฟล์นั้น ผู้ใช้จะได้ทั้งสองทาง — เห็นสีทันทีในเทอร์มินัล และมีลิงก์ที่เปิดดูสีได้จากที่อื่นหรือส่งต่อให้คนอื่นได้ ไฟล์ HTML เป็น self-contained (สไตล์ inline ทั้งหมด ไม่มี asset ภายนอก) จึงผ่านข้อจำกัด CSP ของ Artifact อยู่แล้ว
เขียนไฟล์ลง scratchpad directory ของ session ไม่ใช่ในโปรเจกต์ของผู้ใช้ — มันเป็นไฟล์ ตัวกลางสำหรับ publish ไม่ใช่ของที่เขาสั่งให้สร้าง
ถ้า --color none ไม่ต้องทำ Artifact — ASCII ล้วนอ่านออกทุกที่อยู่แล้ว การทำ Artifact
เพิ่มขั้นตอนโดยไม่ได้อะไรกลับมา
6. สรุปให้ผู้ใช้
ผลลัพธ์จากสคริปต์แสดงในเทอร์มินัลอยู่แล้ว พร้อมสีจริง — ไม่ต้องคัดลอกมาแปะซ้ำทั้งก้อน ให้เขียนสรุปสั้นๆ ใต้ผลลัพธ์แทน:
- บอกว่าใช้โหมด/ฟอนต์/สีอะไร
- แปะคำสั่งเต็มที่ใช้ ให้ผู้ใช้เอาไปรันซ้ำหรือแก้ค่าเองได้
- เสนอทางปรับต่อ 1–2 อย่างที่น่าจะอยากลอง เช่น "อยากได้ฟอนต์ใหญ่กว่านี้ลอง
colossal" หรือ "ถ้าจะเอาไปแปะใน README ต้องใช้--color noneเพราะ GitHub ไม่ render สี ANSI"
ยกเว้นกรณีเดียว — ถ้าใช้ --color none และผู้ใช้บอกว่าจะเอาไปแปะที่อื่น (README, code
comment, commit message) ให้คัดลอกผลลัพธ์มาใส่ code fence ในคำตอบด้วย เพราะเขาต้องคัดลอก
ต่อจริง การให้เขาไปไล่คัดจาก terminal output ที่มี prompt ปนอยู่นั้นเสียเวลากว่า
คำขอ:
- ถามก่อนรันเสมอ ยกเว้นผู้ใช้ระบุมาครบแล้ว — ถามทีละคำถาม รอคำตอบแล้วค่อยถามข้อถัดไป ห้ามยัดหลายคำถามใส่ call เดียว เพราะข้อหลังต้องปรับตัวเลือกตามคำตอบข้อก่อน
- ผลลัพธ์ออกที่เทอร์มินัลเสมอ — ผู้ใช้ต้องการเห็นผลทันทีตอนรัน ไม่ใช่ได้ path มาแล้ว ต้องไปเปิดเอง ไฟล์เดียวที่ควรเขียนคือ HTML สำหรับ publish เป็น Artifact ตอนที่ผลลัพธ์มีสี ซึ่งเป็นการเพิ่มช่องทางดู ไม่ใช่แทนที่การแสดงผล นอกเหนือจากนั้นอย่าเสนอเซฟไฟล์
- ทุกครั้งที่ผลลัพธ์มีสี ให้ทำ Artifact ควบ — เพราะสีจะหายไปทันทีที่ผู้ใช้เอา output ไปวางที่อื่น และหลายคนใช้ Claude ผ่านเว็บซึ่งไม่มี terminal ให้ ANSI ทำงานตั้งแต่แรก
- ข้อความต้องเป็นภาษาอังกฤษเท่านั้น — ถ้าได้ภาษาไทยมา ให้เสนอคำอังกฤษ/ทับศัพท์ให้ยืนยัน ก่อน อย่ารันทิ้งให้ error
- ข้อความยาวๆ อย่าใช้ figlet — เกิน ~15 ตัวอักษรจะล้นความกว้างเทอร์มินัลจนอ่านไม่ออก
ถ้าผู้ใช้ส่งประโยคยาวมา ให้เสนอ
cowsayหรือboxแทน (ทั้งคู่ตัดบรรทัดให้อัตโนมัติ) หรือถามว่าจะตัดเหลือคำสำคัญคำเดียวไหม - เลือกโหมดรูปตามปลายทางที่จะเอาไปใช้ —
chafaสวยที่สุดแต่เป็น ANSI สีล้วน ใช้ได้เฉพาะ ในเทอร์มินัล ถ้าผู้ใช้จะเอาไปแปะใน README หรือไฟล์ text ต้องใช้jp2aหรือbrailleถามปลายทางก่อนถ้ายังไม่ชัด - รูปที่มี contrast ต่ำจะออกมาเป็นก้อนเทา — ถ้าผลลัพธ์ดูจาง ให้ลอง
--ramp detailed(70 ระดับ ไล่เฉดได้ละเอียดกว่า classic ที่มี 10 ระดับ) หรือ--invertถ้าพื้นหลังรูปเป็นสีอ่อน - braille กับโลโก้/กราฟิกให้ใส่
--threshold— ค่าเริ่มต้นใช้ Floyd-Steinberg dithering ซึ่งเหมาะกับรูปถ่ายที่มีไล่เฉด แต่กับภาพพื้นเรียบจะกลายเป็นจุดกระจายรบกวนสายตา--threshold 128ตัดขาว/ดำคมๆ ให้แทน
ไฟล์แนบ:
scripts/ascii-art.sh— entry point (เรียกผ่านbash)scripts/ascii_art.py— ตัว render จริง ประกาศ dependency แบบ PEP 723 ให้uv runจัดการเองreferences/gallery.md— ตัวอย่างฟอนต์ยอดนิยมที่ render ไว้แล้ว + สูตรผสมตามโอกาสใช้งาน อ่านไฟล์นี้ก่อนเสนอตัวเลือกให้ผู้ใช้ ถ้าอยากแนะนำได้ตรงกว่าการเดาจากชื่อฟอนต์