腳本標頭沒把每個結束碼代表什麼、該怎麼處理寫清楚,呼叫端只能用猜的。階梯表又同時抄在說明檔與技能內文,改規則時兩邊容易不同步。 - 推導基底的腳本標頭逐碼說明狀況與處置,並標明該碼屬於哪一種模式。 - 產生分支名的腳本標頭補上參數不足的結束碼。 - 說明檔刪掉重複的階梯表,改指向指引的階梯章節。 - 說明檔補上型別優先序腳本的說明,並更新兩支技能的摘要。
37 lines
1.5 KiB
Bash
Executable File
37 lines
1.5 KiB
Bash
Executable File
#!/usr/bin/env sh
|
||
# slugify.sh — 把分支類型與描述轉成 ASCII 分支名 slug。
|
||
# 用法: slugify.sh {type} {phrase}
|
||
# 規則: 全部轉小寫,非 a-z0-9 的字元換成連字號,
|
||
# 連續連字號合併成一個,並去除開頭與結尾的連字號。
|
||
# 輸出: {type}/{slug}(例如: slugify.sh feat "export report" → feat/export-report)
|
||
# 結束碼: 0=stdout 印出 {type}/{slug},直接拿去當分支名。
|
||
# 1=參數少於兩個。補上 type 與 phrase 再重跑。
|
||
# 2=type 或 phrase 含非 ASCII 字元。先把描述翻成英文短語再重跑,
|
||
# 不要自己動手拼分支名。
|
||
# 3=phrase slug 化之後是空字串(裡面一個 a-z0-9 都沒有)。換一句英文短語再重跑。
|
||
# 錯誤訊息都印到 stderr,其中 2 與 3 印繁體中文。
|
||
set -u
|
||
|
||
if [ "$#" -lt 2 ]; then
|
||
echo "用法: slugify.sh {type} {phrase}" >&2
|
||
exit 1
|
||
fi
|
||
|
||
TYPE="$1"
|
||
shift
|
||
PHRASE="$*"
|
||
|
||
slug=$(printf '%s' "$PHRASE" | tr '[:upper:]' '[:lower:]' | sed -e 's/[^a-z0-9]/-/g' -e 's/-\{2,\}/-/g' -e 's/^-//' -e 's/-$//')
|
||
|
||
if printf '%s%s' "$TYPE" "$PHRASE" | LC_ALL=C grep -q '[^ -~]'; then
|
||
echo "錯誤: 分支名只允許 ASCII。請先把標題翻譯成英文短語,再交給 slugify.sh。" >&2
|
||
exit 2
|
||
fi
|
||
|
||
if [ -z "$slug" ]; then
|
||
echo "錯誤: 標題 slug 化後是空字串,組不出分支名。請先把標題翻譯成英文短語,再交給 slugify.sh。" >&2
|
||
exit 3
|
||
fi
|
||
|
||
printf '%s/%s\n' "$TYPE" "$slug"
|