#!/usr/bin/env sh # page-name.sh — wiki 頁名樣式的唯一正本。 # # 為什麼要有這支腳本:頁名樣式散在多支腳本與技能裡各寫一份,改一次規則就得 # 到處找。集中成一支,比對的人與比對的程式讀的是同一條式子。 # # 用法: # page-name.sh regex # 印出合法頁名的 ERE # page-name.sh check # 驗證單一頁名 # # 規則: # 合法頁名是 {前綴}_{尾段}。前綴取十四種內容型別之一。 # 尾段四選一:CONTENTS 是目錄頁;40 碼大寫十六進位是內容頁; # 8 碼大寫十六進位,以及 H 加 7 碼大寫十六進位,留給還沒搬過來的舊頁。 # # 為什麼舊頁收兩種樣式:舊演算法算出前 8 碼後,首碼落在 0-9ABC 就改寫成 H 加前 7 碼。 # 十六個首碼裡有十三個會命中,既有舊頁名絕大多數長成 H 開頭那一種。只收純 8 碼, # 等於把八成的舊頁判成不合法,先驗頁名的技能就再也讀不到它們。 # # 為什麼 CONTENTS 不能當前綴:CONTENTS 只用來解目錄頁的存取庫,它自己沒有頁。 # 放行 CONTENTS_CONTENTS 或 CONTENTS_{HASH},會建出一個規格上不存在的頁。 # 結束碼: 0=合法 1=不合法 2=用法錯誤 set -eu PREFIXES='QUESTION|PLAN|ANALYZE|DELIVER|MAINTAIN|REPO|LOG|LEARN|ERROR|CHECK|REPORT|SKILLSET|TOOLING|MONITOR' RE="^($PREFIXES)_(CONTENTS|[0-9A-F]{8}|H[0-9A-F]{7}|[0-9A-F]{40})\$" cmd="${1-}" case "$cmd" in regex) [ "$#" -eq 1 ] || { echo 'usage: page-name.sh regex' >&2; exit 2; } printf '%s\n' "$RE" ;; check) page="${2-}" [ "$#" -eq 2 ] && [ -n "$page" ] || { echo 'usage: page-name.sh check ' >&2; exit 2; } if printf '%s\n' "$page" | grep -Eq "$RE"; then exit 0 fi echo "[jsc][gitea][ERR]:頁名不合規則:$page" >&2 exit 1 ;; *) echo 'usage: page-name.sh regex | page-name.sh check ' >&2 exit 2 ;; esac