aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/utils/share-caption.ts
blob: 73315cc1f36411b5a4b66cdabd981d66f26a31bd (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
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 ?? "";
}