@takagaki/cortex-decisions-viewer 0.12.104 → 0.12.105

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (2) hide show
  1. package/dist/render.js +60 -8
  2. package/package.json +1 -1
package/dist/render.js CHANGED
@@ -8626,11 +8626,56 @@ ${calendarAddUrl.toString()}
8626
8626
  ]);
8627
8627
  }
8628
8628
 
8629
- // 週のあらすじを新しい週から順に(build が既に新しい順に並べてある)。まだ1枚も無ければ案内の1行
8629
+ // 週・月の抜けを埋めるための日付計算(UTC 固定で計算し YYYY-MM-DD/YYYY-MM の文字列を返す。
8630
+ // これらの文字列は桁がそろっているので、そのまま辞書式に比べれば新旧が分かる)
8631
+ function storyUtcMs(day) { return Date.parse(day + "T00:00:00Z"); }
8632
+ function storyDayOfMs(ms) { return new Date(ms).toISOString().slice(0, 10); }
8633
+ function storyMondayOf(day) {
8634
+ var dow = new Date(storyUtcMs(day)).getUTCDay(); // 0=日 … 6=土
8635
+ var back = dow === 0 ? 6 : dow - 1;
8636
+ return storyDayOfMs(storyUtcMs(day) - back * 86400000);
8637
+ }
8638
+ function storyPrevWeekKey(monday) { return storyDayOfMs(storyUtcMs(monday) - 7 * 86400000); }
8639
+ function storyPrevMonthKey(month) {
8640
+ var y = parseInt(month.slice(0, 4), 10);
8641
+ var m = parseInt(month.slice(5, 7), 10) - 1;
8642
+ if (m < 1) { m = 12; y -= 1; }
8643
+ return y + "-" + (m < 10 ? "0" + m : String(m));
8644
+ }
8645
+ function storyWeekLabel(monday) {
8646
+ var md = function (d) { var p = d.split("-"); return parseInt(p[1], 10) + "/" + parseInt(p[2], 10); };
8647
+ return md(monday) + "〜" + md(storyDayOfMs(storyUtcMs(monday) + 6 * 86400000)) + " の週";
8648
+ }
8649
+ // その案件でストーリーが分かっている一番古い日付(YYYY-MM-DD)。月・週・日のどれかに載っている
8650
+ // 一番古いものを使う(無ければ null=今の区切りだけ見る)。この日より前の区切りには案内を足さない
8651
+ function storyEarliestKnownDate() {
8652
+ var dates = [];
8653
+ ((SITE.storyDigest && SITE.storyDigest.months) || []).forEach(function (m) { dates.push(m.key + "-01"); });
8654
+ ((SITE.storyDigest && SITE.storyDigest.weeks) || []).forEach(function (w) { dates.push(w.key); });
8655
+ (SITE.story || []).forEach(function (d) { dates.push(d.date); });
8656
+ if (!dates.length) return null;
8657
+ return dates.reduce(function (a, b) { return b < a ? b : a; });
8658
+ }
8659
+
8660
+ // 週のあらすじを新しい週から順に。「今週」と「週が閉じたがまだあらすじが無い週」は見出し+案内の1行で埋め、
8661
+ // 欠けなく新しい週から並べる(その案件でストーリーが始まる前の週までは埋めない)
8630
8662
  function renderStoryWeekly() {
8631
8663
  var weeks = (SITE.storyDigest && SITE.storyDigest.weeks) || [];
8632
8664
  var list = el("div", { class: "story-cards" });
8633
- if (!weeks.length) {
8665
+ var curMonday = SITE.storyToday ? storyMondayOf(SITE.storyToday) : null;
8666
+ if (curMonday) {
8667
+ var have = {};
8668
+ weeks.forEach(function (w) { have[w.key] = true; });
8669
+ var earliest = storyEarliestKnownDate();
8670
+ var earliestMonday = earliest ? storyMondayOf(earliest) : curMonday;
8671
+ for (var wk = curMonday; !have[wk] && wk >= earliestMonday; wk = storyPrevWeekKey(wk)) {
8672
+ list.appendChild(el("section", { class: "story-card" }, [
8673
+ el("h3", { class: "story-card-heading", text: storyWeekLabel(wk) }),
8674
+ el("p", { class: "story-empty", text: "週が閉じて 2 日後の夜に作ります" }),
8675
+ ]));
8676
+ }
8677
+ }
8678
+ if (!weeks.length && !list.children.length) {
8634
8679
  list.appendChild(el("p", { class: "story-empty", text: "あらすじはまだありません(週が閉じて 2 日後の夜に作ります)" }));
8635
8680
  } else {
8636
8681
  weeks.forEach(function (w) { list.appendChild(storyDigestCard(w, "この週の局面")); });
@@ -8638,16 +8683,23 @@ ${calendarAddUrl.toString()}
8638
8683
  app.appendChild(list);
8639
8684
  }
8640
8685
 
8641
- // 月のあらすじを新しい月から順に。今月はまだ閉じていないので、あらすじが無ければ案内の1行を先頭に出す
8686
+ // 月のあらすじを新しい月から順に。「今月」と「月が閉じたがまだあらすじが無い月」は見出し+案内の1行で埋め、
8687
+ // 欠けなく新しい月から並べる(その案件でストーリーが始まる前の月までは埋めない)
8642
8688
  function renderStoryMonthly() {
8643
8689
  var months = (SITE.storyDigest && SITE.storyDigest.months) || [];
8644
8690
  var list = el("div", { class: "story-cards" });
8645
8691
  var curMonth = SITE.storyToday ? SITE.storyToday.slice(0, 7) : null;
8646
- if (curMonth && !months.some(function (m) { return m.key === curMonth; })) {
8647
- list.appendChild(el("section", { class: "story-card" }, [
8648
- el("h3", { class: "story-card-heading", text: monthLabel(curMonth) }),
8649
- el("p", { class: "story-empty", text: "月が閉じて 3 日後の夜に作ります" }),
8650
- ]));
8692
+ if (curMonth) {
8693
+ var have = {};
8694
+ months.forEach(function (m) { have[m.key] = true; });
8695
+ var earliest = storyEarliestKnownDate();
8696
+ var earliestMonth = earliest ? earliest.slice(0, 7) : curMonth;
8697
+ for (var mo = curMonth; !have[mo] && mo >= earliestMonth; mo = storyPrevMonthKey(mo)) {
8698
+ list.appendChild(el("section", { class: "story-card" }, [
8699
+ el("h3", { class: "story-card-heading", text: monthLabel(mo) }),
8700
+ el("p", { class: "story-empty", text: "月が閉じて 3 日後の夜に作ります" }),
8701
+ ]));
8702
+ }
8651
8703
  }
8652
8704
  months.forEach(function (m) { list.appendChild(storyDigestCard(m, "この月の局面")); });
8653
8705
  app.appendChild(list);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@takagaki/cortex-decisions-viewer",
3
- "version": "0.12.104",
3
+ "version": "0.12.105",
4
4
  "description": "Cortexの意思決定記録(Decisions/*.md)を静的サイトにビルドして閲覧する。各レコードに「Edit on GitHub」リンクを付与する。",
5
5
  "license": "UNLICENSED",
6
6
  "private": false,