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)