From 9942cf2506a02749af11cfce5ae3cb7a7ec2bedf Mon Sep 17 00:00:00 2001 From: Jeffery Date: Wed, 2 Sep 2026 17:22:24 +0800 Subject: [PATCH] =?UTF-8?q?fix(migrate-wiki):=20=E5=80=99=E9=81=B8?= =?UTF-8?q?=E9=8D=B5=E5=85=BC=E6=94=B6=E6=A2=9D=E5=88=97=E8=88=87=E8=A1=A8?= =?UTF-8?q?=E6=A0=BC=E5=85=A9=E7=A8=AE=E7=9B=AE=E9=8C=84=E9=A0=81=E5=BD=A2?= =?UTF-8?q?=E7=8B=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 搬頁時蒐集候選鍵的那一段,原本只讀目錄頁表格的存取庫、主機、帳號、工具、 期間五欄。現在改成 H2 區塊底下的「- {欄位名}:{值}」也照樣讀,表格的欄位 維持原樣收下,兩種形狀都認得。 目錄頁已經改成條列,還沒轉檔的線上舊頁卻仍是表格,同一輪搬頁會同時遇到 兩種。只讀表格的話,條列頁一個候選鍵都收不到,那些頁的舊頁名就對不到新 頁名,搬頁會把它們當成沒有對應而漏掉。 讀取改成逐行判斷:碰到「## 」就把上一個區塊收掉並開新的一筆,區塊內的 條列按欄位名對照收值。欄位值各自算一個候選鍵,再依固定欄位順序串一個組合 鍵,跟表格那一路的產出規則完全一致。條列的冒號正本寫全形,半形也一併收, 舊頁手寫的那幾條才不會整條漏掉。 功能範圍:目錄頁版面改版的搬頁相容。 --- tools/migrate-wiki.sh | 56 +++++++++++++++++++++++++++++++++++++------ 1 file changed, 49 insertions(+), 7 deletions(-) diff --git a/tools/migrate-wiki.sh b/tools/migrate-wiki.sh index 7f19f49..db45b08 100755 --- a/tools/migrate-wiki.sh +++ b/tools/migrate-wiki.sh @@ -14,7 +14,9 @@ # --key 可重複,補充自動蒐集不到的候選鍵。 # # 候選鍵來源: -# 目錄頁表格的存取庫、主機、帳號、工具、期間欄,以及這幾欄依序串成的組合鍵。 +# 目錄頁每一筆的存取庫、主機、帳號、工具、期間,以及這幾項依序串成的組合鍵。 +# 目錄頁是 H2 區塊加條列的形狀,所以讀「- {欄位名}:{值}」那幾條;還沒轉檔的舊頁 +# 仍是 markdown 表格,所以表格的欄位也照樣讀,兩種形狀都收。 # 內容頁的 H1 標題(CHECK 頁的 H1 直接就是 {主機}/{帳號})。 # --key 補充的候選。 # @@ -136,7 +138,7 @@ for ty in $TYPES; do done # ---- 第二輪:蒐集候選鍵 ---- -# 目錄頁表格的欄位值,以及依序串成的組合鍵 +# 目錄頁每一筆的欄位值,以及依序串成的組合鍵 while IFS="$TAB" read -r orepo opage nrepo npage <&3; do [ -n "$opage" ] || continue case "$opage" in *_CONTENTS) ;; *) continue ;; esac @@ -174,9 +176,49 @@ def plain(v): idx = {} seen_sep = False out = [] +block = None + + +def take(found): + """一筆紀錄收到的欄位值,各自算一個候選鍵,依 WANT 順序再串一個組合鍵。""" + if not found: + return + parts = [] + for w in WANT: + v = found.get(w) + if not v: + continue + out.append(v) + parts.append(v) + if len(parts) > 1: + out.append('/'.join(parts)) + + for line in lines: + # 目錄頁一筆一個 H2 區塊,欄位在標題底下一條一條列。 + if line.startswith('## '): + take(block) + block = {} + idx, seen_sep = {}, False + continue cs = cells(line) if cs is None: + if block is not None: + s = line.strip() + if s.startswith('- '): + body = s[2:] + # 正本寫全形冒號;半形也收,舊頁手寫的那幾條才不會整條漏掉。 + for mark in (':', ':'): + if mark in body: + label, value = body.split(mark, 1) + label = plain(label) + for w in WANT: + if w in label: + v = plain(value) + if v: + block[w] = v + break + break idx, seen_sep = {}, False continue if is_sep(cs): @@ -193,7 +235,7 @@ for line in lines: continue if not idx: continue - parts = [] + found = {} for w in WANT: i = idx.get(w) if i is None or i >= len(cs): @@ -201,10 +243,10 @@ for line in lines: v = plain(cs[i]) if not v: continue - out.append(v) - parts.append(v) - if len(parts) > 1: - out.append('/'.join(parts)) + found[w] = v + take(found) + +take(block) for v in out: print(v)