diff options
Diffstat (limited to 'src/utils/share-caption.ts')
| -rw-r--r-- | src/utils/share-caption.ts | 37 |
1 files changed, 37 insertions, 0 deletions
diff --git a/src/utils/share-caption.ts b/src/utils/share-caption.ts new file mode 100644 index 0000000..73315cc --- /dev/null +++ b/src/utils/share-caption.ts @@ -0,0 +1,37 @@ +/** + * ページのスラッグとタイトルから、X などで共有するときのキャプションを組み立てる。 + * + * 一般質問ページは、どの年度・月定例会のものかがキャプションだけで分かるよう、 + * スラッグ(例: ippan-situmon/r8d/9gatu)から文言を自動生成する。 + * それ以外のページはフロントマターの title をそのまま使う。 + */ +const REIWA_RE = /^r(\d+)d$/; +const MONTH_RE = /^(\d+)gatu$/; + +function reiwaYear(n: string): string { + return `令和${n === "1" ? "元" : n}年`; +} + +export function shareCaption(slug: string, title?: string): string { + const parts = slug.split("/").filter(Boolean); + + // トップページは「小平市議 安竹洋平」のみにする + if (parts.length === 0) return ""; + + if (parts[0] === "ippan-situmon") { + if (parts.length === 1) return "安竹洋平の一般質問一覧"; + + const year = parts[1]?.match(REIWA_RE); + if (!year) return title ?? ""; + if (parts.length === 2) return `${reiwaYear(year[1])}度の一般質問一覧`; + + const month = parts[2]?.match(MONTH_RE); + if (!month) return title ?? ""; + const session = `${reiwaYear(year[1])}${month[1]}月定例会`; + + if (parts.length === 3) return `${session}一般質問一覧`; + return title ? `${session}一般質問${title}` : `${session}一般質問`; + } + + return title ?? ""; +} |
