Explorar o código

feat(tool-moyu): 彩色改概率门控降密度, 加 -c/--color-ratio 开关

- colorize() 重构: 先判语义取色码, 命中后再按 COLOR_RATIO 概率决定上彩或保持默认
- 新增 -c/--color-ratio PCT(0-100, 默认 35), 0=全无色 100=全彩(等价旧行为)
- 实测: 8轮彩色行 100->59, 默认35->15, 0->0; 非法值/越界正确拦截
- 自动检测(NO_COLOR/FORCE_COLOR/TTY)与文件模式不上色语义不变
b hai 1 mes
pai
achega
00259fcb49
Modificáronse 1 ficheiros con 30 adicións e 8 borrados
  1. 30 8
      tool-moyu.sh

+ 30 - 8
tool-moyu.sh

@@ -17,6 +17,7 @@
 #   -d MS     每行间隔毫秒(默认随机 80-400)
 #   -t        逐个字符「打字」效果
 #   -s        静默模式:不打印假状态行,只循环内容
+#   -c PCT   命中行的实际上色概率(0-100, 默认 35)
 # =============================================================
 
 set -euo pipefail
@@ -25,9 +26,10 @@ LOOP_TIMES=0 # 0 = 无限
 DELAY_MS=0   # 0 = 随机 80-400
 TYPE_EFFECT=0
 SILENT=0
+COLOR_RATIO=35 # 0-100, 命中语义的行的实际上色概率(降彩色密度)
 
 show_usage() {
-	sed -n '1,20p' "$0"
+	sed -n '1,24p' "$0"
 	exit 0
 }
 
@@ -49,6 +51,16 @@ while [ $# -gt 0 ]; do
 		SILENT=1
 		shift
 		;;
+	-c | --color-ratio)
+		COLOR_RATIO="${2:?}"
+		case "$COLOR_RATIO" in *[!0-9]*)
+			echo "Invalid color ratio: $COLOR_RATIO (expect 0-100)" >&2
+			exit 1
+			;;
+		esac
+		[ "$COLOR_RATIO" -gt 100 ] && { echo "color ratio must be 0-100" >&2; exit 1; }
+		shift 2
+		;;
 	--help | -h) show_usage ;;
 	-*)
 		echo "Unknown option: $1" >&2
@@ -365,14 +377,24 @@ rand_delay() {
 # 按内容语义配色(优先级:命令 > 致命 > 错误 > 警告 > 成功 > 默认)
 # 命令=青 / FATAL=红加粗 / 错误=红 / 警告=黄 / 成功=绿;仅随机生成模式调用
 colorize() {
-	case "$1" in
-	'$ '*)                               printf '\033[1;36m%s\033[0m' "$1" ;;
-	*[Ff][Aa][Tt][Aa][Ll]*)                     printf '\033[1;31m%s\033[0m' "$1" ;;
-	*ERROR* | *ERR:* | *\[err\]* | *err:*)  printf '\033[31m%s\033[0m' "$1" ;;
-	*warn* | *WARN*)                     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" ;;
+	local line="$1" code=""
+	case "$line" in
+	'$ '*)                                code='\033[1;36m' ;;
+	*[Ff][Aa][Tt][Aa][Ll]*)              code='\033[1;31m' ;;
+	*ERROR* | *ERR:* | *\[err\]* | *err:*) code='\033[31m' ;;
+	*warn* | *WARN*)                     code='\033[33m' ;;
+	*'✓'* | *PASS* | *'ok  '* | *'HTTP 200'* | *PONG* | *'no type errors'* | *'completed successfully'* | *'Build succeeded'*) code='\033[32m' ;;
 	esac
+	if [ -n "$code" ]; then
+		# 概率门控: 仅约 COLOR_RATIO% 的命中行真正上彩(降彩色密度); 100=全彩 0=全无色
+		if [ "$COLOR_RATIO" -ge 100 ] || [ $((RANDOM % 100)) -lt "$COLOR_RATIO" ]; then
+			printf '%s%s\033[0m' "$code" "$line"
+		else
+			printf '%s' "$line"
+		fi
+	else
+		printf '%s' "$line"
+	fi
 }
 
 run_once() {