aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/utils
diff options
context:
space:
mode:
Diffstat (limited to 'src/utils')
-rw-r--r--src/utils/share-caption.ts37
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 ?? "";
+}