feat(link): 連結一律寫成 [文字](絕對網址),寫入前先驗證連得到
取消 [[頁名]] 與 [[顯示文字|頁名]] 兩種同 wiki 寫法,不再分「同存取庫」與 「跨存取庫」兩條規則。那種寫法只在自己那個 wiki 內解析,寫錯不報錯,畫面上 看起來像普通文字或死連結,巡不到也修不了。 連結寫進頁面前先過 jsc-gitea 的 link-check.sh,結束碼 0 才寫。驗證一律走 API, 不看網頁狀態碼:私有存取庫的網頁網址對未登入請求一律回 404,拿狀態碼判會把 好連結判成壞的。認證失敗回 7,與死連結的 1 分開,免得金鑰一過期就把還在的頁 整批判死。
This commit is contained in:
Executable
+67
@@ -0,0 +1,67 @@
|
||||
#!/usr/bin/env sh
|
||||
# check-link-format.sh — 檢查一個 domain 存取庫的 markdown 連結寫法。
|
||||
#
|
||||
# 用法: check-link-format.sh <domain-path>
|
||||
#
|
||||
# 檢查一項(掃 {domain-path} 底下全部 *.md,跳過 .git):
|
||||
# 連結一律 [{文字}]({連結})。雙括號那種同 wiki 連結一個都不留。
|
||||
#
|
||||
# 為什麼要有這支: 雙括號只在目前這個 wiki 內解析。指到別的存取庫時不會報錯,
|
||||
# 畫面上看起來像正常文字或死連結,巡不到也修不了。人工比對每輪都會漏,交給程式判。
|
||||
#
|
||||
# 判定範圍與其極限: 只看**渲染得出來的正文**。行內程式碼(單引號反引號夾起來的那段)
|
||||
# 與圍籬程式碼區塊都先剝掉再比,理由有二:
|
||||
# 1. 文件解釋「不要用雙括號」時,本來就要把那個寫法原樣寫出來,那是說明不是連結。
|
||||
# 2. shell 腳本的條件測試語法長得一模一樣,範例貼進 markdown 就會被誤判。
|
||||
# 代價講白: 有人把真正的連結寫進程式碼區塊,這支抓不到;那種寫法本來也不會被渲染成連結。
|
||||
#
|
||||
# 輸出: 一行一個不合格項目,格式 {檔案}:{行號}:{命中內容}(stdout);統計摘要走 stderr。
|
||||
# 結束碼: 0=掃到 markdown 且全部通過
|
||||
# 1=有不合格項目(清單在 stdout)
|
||||
# 2=用法錯誤(本腳本只吃一個參數)
|
||||
# 3=domain 路徑不存在,或底下一個 *.md 都沒有——**什麼都沒掃**,不等於通過
|
||||
set -u
|
||||
|
||||
usage() {
|
||||
echo 'usage: check-link-format.sh <domain-path>' >&2
|
||||
exit 2
|
||||
}
|
||||
|
||||
[ "$#" -eq 1 ] || usage
|
||||
DOMAIN=${1%/}
|
||||
[ -n "$DOMAIN" ] || usage
|
||||
[ -d "$DOMAIN" ] || { echo "找不到 domain 路徑:$DOMAIN" >&2; exit 3; }
|
||||
|
||||
TMP=$(mktemp) || { echo "無法建立暫存檔" >&2; exit 3; }
|
||||
trap 'rm -f "$TMP"' EXIT
|
||||
|
||||
find "$DOMAIN" -name .git -prune -o -type f -name '*.md' -print 2>/dev/null | sort > "$TMP"
|
||||
[ -s "$TMP" ] || { echo "底下沒有 *.md,無文件可掃:$DOMAIN" >&2; exit 3; }
|
||||
|
||||
total=$(wc -l < "$TMP" | tr -d ' ')
|
||||
|
||||
hits=$(
|
||||
# shellcheck disable=SC2046
|
||||
awk '
|
||||
FNR == 1 { fence = 0 }
|
||||
# 圍籬起訖各自成行,起與訖用同一個判準,所以一個旗標開關就夠。
|
||||
/^[[:space:]]*(```|~~~)/ { fence = !fence; next }
|
||||
fence { next }
|
||||
{
|
||||
line = $0
|
||||
gsub(/`[^`]*`/, "", line)
|
||||
if (match(line, /\[\[[^]]*\]\]/)) {
|
||||
printf "%s:%d:%s\n", FILENAME, FNR, substr(line, RSTART, RLENGTH)
|
||||
}
|
||||
}
|
||||
' $(cat "$TMP")
|
||||
)
|
||||
|
||||
if [ -n "$hits" ]; then
|
||||
printf '%s\n' "$hits"
|
||||
echo "連結寫法檢查有不合格項目:共掃 $total 份文件,清單見 stdout" >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo "連結寫法檢查通過:$total 份文件,連結全部為 [{文字}]({連結})" >&2
|
||||
exit 0
|
||||
Reference in New Issue
Block a user