diff options
| author | Yasutake Yohei <61961825+yasutakeyohei@users.noreply.github.com> | 2026-09-21 08:25:26 +0900 |
|---|---|---|
| committer | Yasutake Yohei <61961825+yasutakeyohei@users.noreply.github.com> | 2026-09-21 08:25:26 +0900 |
| commit | b3ad7c9e7d516082733930ef86b550dcdd8c66e2 (patch) | |
| tree | 39776523d81ef9d95295e9487403ff570408b03f | |
| parent | f11d15bdf9839db30a9c61fc8f7ce39279ed673c (diff) | |
ホーム: git履歴から生成する更新情報を追加し、サイドバーの実績を集約
| -rw-r--r-- | astro.config.mjs | 41 | ||||
| -rw-r--r-- | src/components/Updates.astro | 53 | ||||
| -rw-r--r-- | src/content/docs/index.mdx | 8 | ||||
| -rw-r--r-- | src/data/updates.json | 242 | ||||
| -rw-r--r-- | src/plugins/updates.ts | 76 |
5 files changed, 382 insertions, 38 deletions
diff --git a/astro.config.mjs b/astro.config.mjs index afac81c..a16161e 100644 --- a/astro.config.mjs +++ b/astro.config.mjs @@ -3,6 +3,7 @@ import starlight from "@astrojs/starlight"; import sitemap from "@astrojs/sitemap"; import remarkMermaid from "remark-mermaidjs"; import ogImagePlugin from "./src/plugins/og-image"; +import updatesIntegration from "./src/plugins/updates"; export default defineConfig({ site: "https://yasutakeyohei.com", @@ -13,6 +14,7 @@ export default defineConfig({ }, integrations: [ sitemap(), + updatesIntegration(), ogImagePlugin(), starlight({ title: "小平市議 安竹洋平 公式サイト", @@ -39,44 +41,7 @@ export default defineConfig({ ], sidebar: [ { label: "ホーム", link: "/" }, - { - label: "実績", - collapsed: true, - items: [ - { label: "概要", link: "/jisseki/" }, - { - label: "公文書管理の不正追及の軌跡", - link: "/koubunsyo-kanri/", - }, - { - label: "いじめ重大事態への対応の軌跡", - link: "/ijime-judai-jitai/", - }, - { - label: "障害者福祉施設における虐待通報対応の軌跡", - link: "/fukushi-shisetsu-gyakutai/", - }, - { label: "合気公園の軌跡", link: "/aiki-kouen/" }, - { label: "情緒固定級の軌跡", link: "/joutyo-koteikyu/" }, - { label: "過剰な制限緩和の軌跡", link: "/kajo-seigen-kanwa/" }, - { - label: "東京サレジオ学園北側開発問題の軌跡", - link: "/saresio-kaihatu/", - }, - { - label: "ワクチン副反応救済制度の適正化の軌跡", - link: "/vaccine-kyuusai-tekiseika/", - }, - { - label: "ディスレクシア(読み書き障害)対応の軌跡", - link: "/dislexia-taiou/", - }, - { - label: "湖南衛生組合の議員報酬・給与見直しの軌跡", - link: "/konan-eisei-kumiai/", - }, - ], - }, + { label: "実績", link: "/jisseki/" }, { label: "私の方針", link: "/policy/" }, { label: "メディア掲載", link: "/media/" }, { diff --git a/src/components/Updates.astro b/src/components/Updates.astro new file mode 100644 index 0000000..8fbe795 --- /dev/null +++ b/src/components/Updates.astro @@ -0,0 +1,53 @@ +--- +import updates from "../data/updates.json"; + +const limit = Number(Astro.props.limit ?? 5); +const items = (updates as { date: string; title: string; url: string; group: string }[]).slice(0, limit); +--- + +<ul class="updates"> + {items.map((u) => ( + <li> + <time datetime={u.date}>{u.date.replace(/-/g, ".")}</time> + {u.group && <span class="updates-group">{u.group}</span>} + <a href={u.url}>{u.title}</a> + </li> + ))} +</ul> + +<style> + .updates { + list-style: none; + padding: 0; + margin: 0; + font-size: 0.9rem; + border-top: 1px solid var(--sl-color-gray-5); + } + .updates li { + display: flex; + flex-wrap: wrap; + align-items: baseline; + gap: 0.5rem; + padding: 0.5rem 0; + border-bottom: 1px solid var(--sl-color-gray-5); + } + .updates time { + color: var(--sl-color-gray-3); + font-variant-numeric: tabular-nums; + flex-shrink: 0; + } + .updates-group { + font-size: 0.75rem; + color: var(--sl-color-gray-2); + background: var(--sl-color-gray-6); + border-radius: 3px; + padding: 0.05rem 0.35rem; + flex-shrink: 0; + } + .updates a { + text-decoration: none; + } + .updates a:hover { + text-decoration: underline; + } +</style> diff --git a/src/content/docs/index.mdx b/src/content/docs/index.mdx index e8919c2..b9140b4 100644 --- a/src/content/docs/index.mdx +++ b/src/content/docs/index.mdx @@ -199,6 +199,14 @@ tableOfContents: true <a href="/policy/" class="guide-btn">詳しく見る</a> </div> +import Updates from '@/components/Updates.astro'; + +## <span style="text-align:center;display:block">更新情報</span> + +直近の更新です。 + +<Updates limit={5} /> + ## <span style="text-align:center;display:block">活動</span> <p>公園整備、発達障害支援、いじめ対策、子どもの健やかな成長のための環境づくりなど、地域の皆さんとともにさまざまな課題に取り組んでいます。</p> diff --git a/src/data/updates.json b/src/data/updates.json new file mode 100644 index 0000000..145c24f --- /dev/null +++ b/src/data/updates.json @@ -0,0 +1,242 @@ +[ + { + "date": "2026-09-20", + "title": "湖南衛生組合の議員報酬・給与見直しの軌跡", + "url": "/konan-eisei-kumiai/", + "group": "" + }, + { + "date": "2026-09-19", + "title": "メディア掲載", + "url": "/media/", + "group": "" + }, + { + "date": "2026-09-18", + "title": "請願第19号の審査(令和8年8月26日 厚生委員会)", + "url": "/iinkai/r8d/1-seigan19/", + "group": "" + }, + { + "date": "2026-09-15", + "title": "(1)管理不全ごみ集積所の現状と、善意の清掃支援について", + "url": "/ippan-situmon/r8d/9gatu/1-gomi-syusekisyo-kanri-furyo/", + "group": "令和8年9月定例会" + }, + { + "date": "2026-09-15", + "title": "(2)従業員に未払い賃金の計算をさせる社会福祉法人を許す小平市", + "url": "/ippan-situmon/r8d/9gatu/2-mibarai-chingin-keisan-marunage/", + "group": "令和8年9月定例会" + }, + { + "date": "2026-09-15", + "title": "(3)いじめ対策委員会記録がほぼ皆無だった件に絡む矛盾について", + "url": "/ippan-situmon/r8d/9gatu/3-ijime-taisaku-kiroku-mujun/", + "group": "令和8年9月定例会" + }, + { + "date": "2026-09-15", + "title": "(4)スクールカウンセラー出勤簿の廃棄と守秘義務等について", + "url": "/ippan-situmon/r8d/9gatu/4-school-counselor-shukkinbo-haiki/", + "group": "令和8年9月定例会" + }, + { + "date": "2026-07-02", + "title": "(1)公文書改ざん疑いに関する新事実と、様々な問題について", + "url": "/ippan-situmon/r8d/6gatu/1-koubunsyo-kaizan-utagai/", + "group": "令和8年6月定例会" + }, + { + "date": "2026-07-02", + "title": "(2)学校いじめ対策委員会の記録がほぼ皆無だった件について", + "url": "/ippan-situmon/r8d/6gatu/2-ijime-taisaku-iinkai-kiroku-kaimu/", + "group": "令和8年6月定例会" + }, + { + "date": "2026-07-02", + "title": "(3)開示文書に見られる差異と新たな改ざん疑いについて", + "url": "/ippan-situmon/r8d/6gatu/3-kaiji-bunsyo-sai-kaizan-utagai/", + "group": "令和8年6月定例会" + }, + { + "date": "2026-07-02", + "title": "(4)いじめ重大事態の対応遅れと再調査について", + "url": "/ippan-situmon/r8d/6gatu/4-ijime-judai-jitai-taiou-okure/", + "group": "令和8年6月定例会" + }, + { + "date": "2026-06-30", + "title": "textlintで文章校正する方法", + "url": "/textlint-guide/", + "group": "" + }, + { + "date": "2026-06-19", + "title": "誰も見過ごさないためのアセスメント", + "url": "/about-dyslexia/assessment/", + "group": "" + }, + { + "date": "2026-06-19", + "title": "ディスレクシアの著名人", + "url": "/about-dyslexia/celebrities/", + "group": "" + }, + { + "date": "2026-06-19", + "title": "デイジー教科書と音声教材", + "url": "/about-dyslexia/daisy-and-onsei/", + "group": "" + }, + { + "date": "2026-06-19", + "title": "自閉症・情緒障害特別支援学級(情緒固定級)とは", + "url": "/about-dyslexia/emotional-support-class/", + "group": "" + }, + { + "date": "2026-06-19", + "title": "チャレンジスクール・エンカレッジスクール", + "url": "/about-dyslexia/high-school-options/", + "group": "" + }, + { + "date": "2026-06-19", + "title": "小平市の状況", + "url": "/about-dyslexia/kodaira/", + "group": "" + }, + { + "date": "2026-06-19", + "title": "潜在的人数と文部科学省調査", + "url": "/about-dyslexia/potential-number/", + "group": "" + }, + { + "date": "2026-06-19", + "title": "合理的配慮と関連法律", + "url": "/about-dyslexia/reasonable-accommodation/", + "group": "" + }, + { + "date": "2026-06-19", + "title": "就学相談・通級指導について", + "url": "/about-dyslexia/school-consultation/", + "group": "" + }, + { + "date": "2026-06-19", + "title": "支援リソース・参考情報", + "url": "/about-dyslexia/support-resources/", + "group": "" + }, + { + "date": "2026-06-19", + "title": "長期欠席児童・生徒支援シート", + "url": "/about-dyslexia/support-sheet/", + "group": "" + }, + { + "date": "2026-06-19", + "title": "本人や保護者の声", + "url": "/about-dyslexia/voices/", + "group": "" + }, + { + "date": "2026-06-19", + "title": "ディスレクシアとは", + "url": "/about-dyslexia/what-is-dyslexia/", + "group": "" + }, + { + "date": "2026-06-19", + "title": "合気公園(旧佐川邸公園)の軌跡", + "url": "/aiki-kouen/", + "group": "" + }, + { + "date": "2026-06-19", + "title": "ディスレクシア(読み書き障害)対応の軌跡", + "url": "/dislexia-taiou/", + "group": "" + }, + { + "date": "2026-06-19", + "title": "障害者福祉施設における虐待通報対応の軌跡", + "url": "/fukushi-shisetsu-gyakutai/", + "group": "" + }, + { + "date": "2026-06-19", + "title": "いじめ重大事態への対応の軌跡", + "url": "/ijime-judai-jitai/", + "group": "" + }, + { + "date": "2026-06-19", + "title": "(1)ふるさと納税の健全な活用と、指定寄附制度の拡充で市民参加の推進を", + "url": "/ippan-situmon/r1d/12gatu/1-furusato-nouzei-kakuju/", + "group": "令和元年12月定例会" + }, + { + "date": "2026-06-19", + "title": "(2)巨費を投じるごみ処理施設の、より丁寧な情報提供等を", + "url": "/ippan-situmon/r1d/12gatu/2-gomi-sisetu-jouhou/", + "group": "令和元年12月定例会" + }, + { + "date": "2026-06-19", + "title": "(1)ディスレクシアの子どもをひとりも見過ごさず成長できる環境整備を、いますぐに", + "url": "/ippan-situmon/r1d/3gatu/1-dyslexia-kankyo/", + "group": "令和元年3月定例会" + }, + { + "date": "2026-06-19", + "title": "(2)人口推計のひとり歩きを防ぐため、より科学的な提示を", + "url": "/ippan-situmon/r1d/3gatu/2-jinkou-suikei-kagaku/", + "group": "令和元年3月定例会" + }, + { + "date": "2026-06-19", + "title": "(1)市議会議員選挙の投票率向上に向けて", + "url": "/ippan-situmon/r1d/6gatu/1-touhyouritu-koujou/", + "group": "令和元年6月定例会" + }, + { + "date": "2026-06-19", + "title": "(2)小平市の顔ともいえるホームページで市民参加・協働の推進を", + "url": "/ippan-situmon/r1d/6gatu/2-homepage-siminsanka/", + "group": "令和元年6月定例会" + }, + { + "date": "2026-06-19", + "title": "土地取引、土地利用における条例軽視は、まちづくりの根幹を揺るがす大問題", + "url": "/ippan-situmon/r1d/9gatu/1-tochi-jourei-keisi/", + "group": "令和元年9月定例会" + }, + { + "date": "2026-06-19", + "title": "(1)小平市内の事業者でできることを第一に考えよ", + "url": "/ippan-situmon/r2d/12gatu/1-kodaira-first/", + "group": "令和2年12月定例会" + }, + { + "date": "2026-06-19", + "title": "(2)公共施設予約システム改修の内容は", + "url": "/ippan-situmon/r2d/12gatu/2-koukyou-sisetu-naiyou/", + "group": "令和2年12月定例会" + }, + { + "date": "2026-06-19", + "title": "(3)市内の歴史的人物を発掘し、まちに物語を持たせよう", + "url": "/ippan-situmon/r2d/12gatu/3-machi-story/", + "group": "令和2年12月定例会" + }, + { + "date": "2026-06-19", + "title": "(1)カーボンニュートラルの虚実を、まず科学的に捉えよ", + "url": "/ippan-situmon/r2d/3gatu/1-carbon-neutral-giman/", + "group": "令和2年3月定例会" + } +] diff --git a/src/plugins/updates.ts b/src/plugins/updates.ts new file mode 100644 index 0000000..cd6dd54 --- /dev/null +++ b/src/plugins/updates.ts @@ -0,0 +1,76 @@ +import { execSync } from "node:child_process"; +import { readFileSync, writeFileSync, mkdirSync } from "node:fs"; + +/** + * ホームページの「更新情報」をビルド時に生成する。 + * + * git の履歴から「新しく公開したページ」だけを拾い(--diff-filter=A)、 + * そのページのフロントマターの title と URL を組みにして src/data/updates.json に書き出す。 + * 加筆や内部の修正は拾わないので、一覧が作業ログで埋まらない。 + * + * 生成結果はコミットしておく(git の履歴がない環境でもビルドできるように)。 + */ +export default function updatesIntegration() { + return { + name: "build-updates", + hooks: { + "astro:config:setup": () => { + const items: { date: string; title: string; url: string; group: string }[] = []; + try { + const out = execSync( + 'git log --diff-filter=A --name-only --date=short --format="%x01%ad" -- src/content/docs', + { encoding: "utf-8", maxBuffer: 64 * 1024 * 1024 }, + ); + // 新しく追加されたファイル → そのコミットの日付(git log は新しい順なので最初の出現が追加時) + const added = new Map<string, string>(); + let date = ""; + for (const line of out.split("\n")) { + if (line.startsWith("\u0001")) { + date = line.slice(1).trim(); + continue; + } + const file = line.trim(); + if (!file.endsWith(".mdx") || file.endsWith("/index.mdx")) continue; + if (!added.has(file)) added.set(file, date); + } + + const reiwa = (dir: string) => { + const n = Number(dir.replace(/^r(\d+)d$/, "$1")); + return n === 1 ? "令和元年" : `令和${n}年`; + }; + + for (const [file, d] of added) { + try { + const src = readFileSync(file, "utf-8"); + const m = src.match(/^title:\s*"?(.+?)"?\s*$/m); + if (!m) continue; + const slug = file + .replace(/^src\/content\/docs\//, "") + .replace(/\.mdx$/, ""); + const url = `/${slug}/`; + let group = ""; + const mm = slug.match(/^ippan-situmon\/(r\d+d)\/(\d+)gatu\//); + if (mm) group = `${reiwa(mm[1])}${mm[2]}月定例会`; + items.push({ date: d, title: m[1], url, group }); + } catch { + // 追加後に改名・削除されたファイルは飛ばす + } + } + items.sort((a, b) => b.date.localeCompare(a.date)); + } catch (e) { + console.warn("[updates] git から取得できませんでした:", (e as Error).message); + } + try { + mkdirSync("src/data", { recursive: true }); + writeFileSync( + "src/data/updates.json", + JSON.stringify(items.slice(0, 40), null, 2) + "\n", + ); + console.log(`[updates] ${items.length}件のうち直近${Math.min(items.length, 40)}件を書き出しました`); + } catch (e) { + console.warn("[updates] 書き出しに失敗しました:", (e as Error).message); + } + }, + }, + }; +} |
