import re# 追記したいセクション(マージ)と、上書きしたいセクション(置換)を分けるAPPEND_SECTIONS = {"禁止語", "禁止事項", "用語集", "注意点"}def parse_sections(text: str) -> dict[str, str]: sections, cur, buf = {}, None, [] for line in text.splitlines(): m = re.match(r"^#{1,3}\s+(.*)", line) if m: if cur is not None: sections[cur] = "\n".join(buf).strip() cur, buf = m.group(1).strip(), [] else: buf.append(line) if cur is not None: sections[cur] = "\n".join(buf).strip() return sectionsdef merge(files: list[Path]) -> dict[str, str]: merged: dict[str, str] = {} for f in files: # 弱い順に処理 for name, body in parse_sections(f.read_text(encoding="utf-8")).items(): if name in APPEND_SECTIONS and name in merged: merged[name] += "\n" + body # 足し合わせる else: merged[name] = body # 近いものが上書きする return merged
この寄せ方には理由があります。ルートのルールは全プロジェクトに効くぶん、間違えたときの影響が広いものです。たとえば App Store 向けの素材命名規則を「共通だろう」とルートに書くと、AdMob のレポートを扱うだけの別プロジェクトにまで無関係な制約が降りかかります。共通に上げるのは、二度目の必要が確かめられてからで遅くありません。