passepartout: v0.7.0 — Status bar fix, unicode width, Ctrl key bindings
This commit is contained in:
@@ -1,3 +1,41 @@
|
||||
(in-package :passepartout)
|
||||
|
||||
(defun char-width (ch)
|
||||
"Returns the terminal column width of character CH.
|
||||
ASCII < 128 = 1. CJK, fullwidth, emoji = 2. Combining marks = 0. Tab = 8."
|
||||
(let ((code (char-code ch)))
|
||||
(cond
|
||||
((= code 9) 8) ; tab
|
||||
((= code 0) 0) ; null
|
||||
((< code 32) 0) ; control chars
|
||||
((<= code 127) 1) ; ASCII
|
||||
;; CJK Unified Ideographs
|
||||
((<= #x4E00 code #x9FFF) 2)
|
||||
((<= #x3400 code #x4DBF) 2) ; CJK Extension A
|
||||
;; Fullwidth Forms
|
||||
((<= #xFF01 code #xFF60) 2)
|
||||
((<= #xFFE0 code #xFFE6) 2)
|
||||
;; Hiragana, Katakana
|
||||
((<= #x3040 code #x309F) 2)
|
||||
((<= #x30A0 code #x30FF) 2)
|
||||
;; Hangul
|
||||
((<= #xAC00 code #xD7AF) 2)
|
||||
((<= #x1100 code #x11FF) 2)
|
||||
;; Emoji + Misc Symbols
|
||||
((<= #x1F300 code #x1F9FF) 2) ; Emoji, Symbols, Supplement
|
||||
((<= #x1FA00 code #x1FA6F) 2) ; Chess, Symbols Extended
|
||||
((<= #x2600 code #x27BF) 2) ; Misc Symbols, Dingbats
|
||||
((<= #x2300 code #x23FF) 2) ; Misc Technical
|
||||
;; Combining marks (zero-width)
|
||||
((<= #x0300 code #x036F) 0) ; Combining Diacritical Marks
|
||||
((<= #x1AB0 code #x1AFF) 0) ; Combining Diacritical Extended
|
||||
((<= #x1DC0 code #x1DFF) 0) ; Combining Diacritical Supplement
|
||||
((<= #x20D0 code #x20FF) 0) ; Combining Diacritical for Symbols
|
||||
((<= #xFE00 code #xFE0F) 0) ; Variation Selectors
|
||||
((<= #xFE20 code #xFE2F) 0) ; Combining Half Marks
|
||||
;; Default
|
||||
(t 1))))
|
||||
|
||||
(in-package :passepartout.channel-tui)
|
||||
|
||||
(defun view-status (win)
|
||||
@@ -105,4 +143,45 @@ Returns list of trimmed strings. Single words wider than width are split."
|
||||
(when sd (view-status sw))
|
||||
(when cd (view-chat cw ch))
|
||||
(when id (view-input iw))
|
||||
(setf (st :dirty) (list nil nil nil))))
|
||||
(setf (st :dirty) (list nil nil nil))))
|
||||
|
||||
(eval-when (:compile-toplevel :load-toplevel :execute)
|
||||
(ql:quickload :fiveam :silent t))
|
||||
|
||||
(defpackage :passepartout-tui-view-tests
|
||||
(:use :cl :fiveam :passepartout)
|
||||
(:export #:tui-view-suite))
|
||||
|
||||
(in-package :passepartout-tui-view-tests)
|
||||
|
||||
(def-suite tui-view-suite :description "TUI view rendering helpers")
|
||||
(in-suite tui-view-suite)
|
||||
|
||||
(test test-char-width-ascii
|
||||
"Contract 5: ASCII characters (< 128) have width 1."
|
||||
(is (= 1 (passepartout::char-width #\a)))
|
||||
(is (= 1 (passepartout::char-width #\Space)))
|
||||
(is (= 1 (passepartout::char-width #\@))))
|
||||
|
||||
(test test-char-width-tab
|
||||
"Contract 5: tab character has width 8."
|
||||
(is (= 8 (passepartout::char-width #\Tab))))
|
||||
|
||||
(test test-char-width-cjk
|
||||
"Contract 5: CJK characters have width 2."
|
||||
(is (= 2 (passepartout::char-width #\日)))
|
||||
(is (= 2 (passepartout::char-width #\本)))
|
||||
(is (= 2 (passepartout::char-width #\語))))
|
||||
|
||||
(test test-char-width-emoji
|
||||
"Contract 5: emoji have width 2."
|
||||
(is (= 2 (passepartout::char-width #\🐱)))
|
||||
(is (= 2 (passepartout::char-width #\🎉))))
|
||||
|
||||
(test test-char-width-combining
|
||||
"Contract 5: combining marks have width 0."
|
||||
(is (= 0 (passepartout::char-width #\Combining_Grave_Accent))))
|
||||
|
||||
(test test-char-width-null
|
||||
"Contract 5: null character has width 0."
|
||||
(is (= 0 (passepartout::char-width #\Nul))))
|
||||
|
||||
Reference in New Issue
Block a user