Browse Source

feat(tool-moyu): 输出按内容语义 ANSI 彩色化

- 新增 colorize(): 命令=青/致命=红加粗/错误=红/警告=黄/成功=绿,启发式分流
- 自动颜色检测: 仅 TTY 或 FORCE_COLOR=1 启用, NO_COLOR 显式禁用
- 文件模式与管道(非TTY)不上色, 避免对用户任意内容误判配色
b 1 tháng trước cách đây
mục cha
commit
d55f0e079b
1 tập tin đã thay đổi với 26 bổ sung và 3 xóa
  1. 26 3
      tool-moyu.sh

+ 26 - 3
tool-moyu.sh

@@ -58,6 +58,13 @@ while [ $# -gt 0 ]; do
 	esac
 done
 
+# ---- 颜色自动检测:仅 TTY 或 FORCE_COLOR=1 才上色;NO_COLOR 显式禁用 ----
+# 文件模式不上色(见 run_once),此处仅决定随机内容是否套用 ANSI 主题色
+COLOR=0
+if [ -z "${NO_COLOR:-}" ] && { [ "${FORCE_COLOR:-0}" = "1" ] || [ -t 1 ]; }; then
+	COLOR=1
+fi
+
 # ---- 命令与对应输出(成对,命令后紧跟其输出更真实) ----
 COMMANDS=(
 	"go vet ./..."
@@ -242,18 +249,34 @@ rand_delay() {
 	else sleep "$(awk -v lo=80 -v hi=400 'BEGIN{srand(); printf "%.3f", (lo+int(rand()*(hi-lo+1)))/1000}')"; fi
 }
 
+# 按内容语义配色(优先级:命令 > 致命 > 错误 > 警告 > 成功 > 默认)
+# 命令=青 / FATAL=红加粗 / 错误=红 / 警告=黄 / 成功=绿;仅随机生成模式调用
+colorize() {
+	case "$1" in
+	'$ '*)                               printf '\033[1;36m%s\033[0m' "$1" ;;
+	*FATAL*)                             printf '\033[1;31m%s\033[0m' "$1" ;;
+	*ERROR* | *\[err\]* | *err:*)        printf '\033[31m%s\033[0m' "$1" ;;
+	*warn* | *WARNING*)                  printf '\033[33m%s\033[0m' "$1" ;;
+	*'✓'* | *PASS* | *'ok  '* | *'HTTP 200'* | *PONG* | *'no type errors'* | *'completed successfully'* | *'Build succeeded'*) printf '\033[32m%s\033[0m' "$1" ;;
+	*)                                   printf '%s' "$1" ;;
+	esac
+}
+
 run_once() {
 	local line
 	for line in "${LINES[@]}"; do
+		local out="$line"
+		# 文件模式或终端不支持颜色 → 原样输出
+		if [ "$FILE_MODE" = "0" ] && [ "$COLOR" = "1" ]; then out=$(colorize "$line"); fi
 		if [ "$TYPE_EFFECT" = "1" ]; then
 			local i
-			for ((i = 0; i < ${#line}; i++)); do
-				printf "%s" "${line:i:1}"
+			for ((i = 0; i < ${#out}; i++)); do
+				printf "%s" "${out:i:1}"
 				rand_delay
 			done
 			echo ""
 		else
-			echo "$line"
+			printf '%s\n' "$out"
 		fi
 		rand_delay
 	done