diff --git a/tools/check-wiki-rules.sh b/tools/check-wiki-rules.sh index f11074c..2e7bf0f 100755 --- a/tools/check-wiki-rules.sh +++ b/tools/check-wiki-rules.sh @@ -2,13 +2,16 @@ # check-wiki-rules — 驗證 wiki repo 解析與 hash-id 規則。 # 涵蓋 TYPES 列的每一種頁面類型,每種三項:專用變數優先、退回共用變數、不得跨類型代用。 # 全部通過印 OK 並 exit 0;任一項不符印出差異並 exit 1。 +# 結束碼: 0=全部通過,stdout 印 OK +# 1=有一項不符,stderr 印出 {項目}: want=… got=… 之後立刻停住,不續跑其餘項目。 +# 只有 0 與 1 兩種;這支不吃參數,也沒有用法錯誤那條路。 set -eu dir=$(CDPATH= cd -- "$(dirname -- "$0")" && pwd) gitea="$dir/gitea.sh" hash_id="$dir/hash-id" -TYPES='QUESTION PLAN ANALYZE DELIVER MAINTAIN REPO LOG LEARN ERROR CHECK REPORT SKILLSET' +TYPES='QUESTION PLAN ANALYZE DELIVER MAINTAIN REPO LOG LEARN ERROR CHECK REPORT SKILLSET TOOLING' fail() { printf '%s\n' "$1" >&2 diff --git a/tools/html-style.sh b/tools/html-style.sh index af20e74..7fb12b4 100755 --- a/tools/html-style.sh +++ b/tools/html-style.sh @@ -16,12 +16,20 @@ # html-style.sh list 印出合併後的所有設定:種類版型風格來源 # html-style.sh layouts 列出可用版型:名稱繁中說明 # html-style.sh styles 列出可用風格:名稱繁中說明 +# html-style.sh key wiki <頁名> 推導 wiki 頁的種類:取第一個底線前的字首 +# html-style.sh key issue / <編號> [--labels <名稱>[,<名稱>]] +# 推導議題的種類:依序試每個標籤,第一個讓 get 回 project 或 global 的標籤勝出; +# 都對不到就回 ISSUE:DEFAULT。已經有標籤名單時用 --labels 帶進來,省掉一次 API 呼叫。 +# key 的輸出固定一行:{種類}{依據} +# 依據 = prefix:{字首}、label:{標籤名}、fallback:no-labels、fallback:no-configured-label # -# 結束碼: 0=成功 2=用法錯誤 4=版型或風格沒有對應範本檔 +# 結束碼: 0=成功 1=取不到議題標籤,或設定檔的目錄建不出來 2=用法錯誤 4=版型或風格沒有對應範本檔 # # 陷阱: # - get 永遠印得出一組值:對不到就退 DEFAULT,再對不到就退內建預設。呼叫端不必自己準備退路, # 但要看第三欄,才知道這組值是使用者設的還是撿來的。 +# - key 的推導規則放在腳本裡,不放技能內文:字首怎麼切、標籤怎麼試,是固定的輸入輸出, +# 每次由模型重推就會有人切錯底線或跳過標籤順序。 # - set 會先確認範本檔真的存在,擋掉打錯字的版型或風格;設定寫得進去、出圖卻失敗最難查。 set -u @@ -41,8 +49,10 @@ usage() { html-style.sh set <種類> <版型> <風格> [--project|--global] html-style.sh unset <種類> [--project|--global] html-style.sh list | layouts | styles + html-style.sh key wiki <頁名> + html-style.sh key issue / <編號> [--labels <名稱>[,<名稱>]] 種類: WIKI:{頁名前綴}、ISSUE:{標籤名}、DEFAULT -結束碼: 0=成功 2=用法錯誤 4=版型或風格沒有對應範本檔 +結束碼: 0=成功 1=取不到議題標籤或建不出目錄 2=用法錯誤 4=版型或風格沒有對應範本檔 EOF exit 2 } @@ -135,6 +145,54 @@ case "$cmd" in key="${1:-}"; [ -n "$key" ] || usage resolve "$key" exit 0 ;; + key) + kind="${1:-}"; [ -n "$kind" ] || usage + shift + case "$kind" in + wiki) + page="${1:-}"; [ -n "$page" ] || usage + # 頁名前綴 = 第一個底線之前那一段;沒有底線就是整個頁名。 + prefix=${page%%_*} + printf 'WIKI:%s\tprefix:%s\n' "$prefix" "$prefix" + exit 0 ;; + issue) + repo="${1:-}"; idx="${2:-}" + [ -n "$repo" ] && [ -n "$idx" ] || usage + shift 2 + labels='' + have_labels=0 + case "${1:-}" in + --labels) [ "$#" -ge 2 ] || usage; labels="$2"; have_labels=1 ;; + '') ;; + *) usage ;; + esac + if [ "$have_labels" = 0 ]; then + raw=$("$script_dir/issue.sh" labels-of "$repo" "$idx") || { + echo "[jsc][HTML 設定][ERR]:取不到議題 $repo#$idx 的標籤。" >&2; exit 1; } + labels=$(printf '%s' "$raw" | tr '\n' ',') + fi + matched='' + old_ifs=$IFS + IFS=',' + for l in $labels; do + [ -n "$l" ] || continue + # 標籤順序就是優先序:第一個使用者真的設過的標籤勝出, + # 撿來的 DEFAULT 不算數,否則第一個標籤永遠贏,後面的設定形同虛設。 + case "$(resolve "ISSUE:$l" | cut -f3)" in + project|global) matched="$l"; break ;; + esac + done + IFS=$old_ifs + if [ -n "$matched" ]; then + printf 'ISSUE:%s\tlabel:%s\n' "$matched" "$matched" + elif [ -z "$(printf '%s' "$labels" | tr -d ',')" ]; then + printf 'ISSUE:DEFAULT\tfallback:no-labels\n' + else + printf 'ISSUE:DEFAULT\tfallback:no-configured-label\n' + fi + exit 0 ;; + *) usage ;; + esac ;; set) key="${1:-}"; layout="${2:-}"; style="${3:-}" [ -n "$key" ] && [ -n "$layout" ] && [ -n "$style" ] || usage