← back to Re Flyer Aggregator
digest: dedicated Source column (outlet name + link) + table headers so every deal notes its source (TK-10708)
56eec3bfd85f15365a7d1185f459809c01ff566f · 2026-08-19 13:52:02 -0700 · Steve Abrams
Files touched
M scripts/build-digest.mjs
Diff
commit 56eec3bfd85f15365a7d1185f459809c01ff566f
Author: Steve Abrams <steve@designerwallcoverings.com>
Date: Wed Aug 19 13:52:02 2026 -0700
digest: dedicated Source column (outlet name + link) + table headers so every deal notes its source (TK-10708)
---
scripts/build-digest.mjs | 17 ++++++++++-------
1 file changed, 10 insertions(+), 7 deletions(-)
diff --git a/scripts/build-digest.mjs b/scripts/build-digest.mjs
index cbeb008..8725d37 100644
--- a/scripts/build-digest.mjs
+++ b/scripts/build-digest.mjs
@@ -14,24 +14,27 @@ const edgar = read(`edgar-new-deals-${date}.json`);
if (!news.length && !edgar.length) { process.stdout.write(''); process.exit(0); }
const esc = s => String(s || '').replace(/[<>&]/g, c => ({ '<': '<', '>': '>', '&': '&' }[c]));
+const HEAD = `<tr style="text-align:left;color:#9aa;font-size:11px;text-transform:uppercase;letter-spacing:.4px">
+ <th style="padding:4px 10px">Price</th><th style="padding:4px 10px">Where</th>
+ <th style="padding:4px 10px">Deal</th><th style="padding:4px 10px">Source</th></tr>`;
const row = (price, where, title, src, link) =>
- `<tr><td style="padding:6px 10px;font-weight:700;color:#0E7C4A;white-space:nowrap">${esc(price)}</td>
- <td style="padding:6px 10px;color:#6B7280;white-space:nowrap">${esc(where)}</td>
- <td style="padding:6px 10px"><a href="${esc(link)}" style="color:#16357A;text-decoration:none">${esc(title)}</a>
- <span style="color:#9aa;font-size:11px"> · ${esc(src)}</span></td></tr>`;
+ `<tr><td style="padding:6px 10px;font-weight:700;color:#0E7C4A;white-space:nowrap;border-top:1px solid #eef0f6">${esc(price)}</td>
+ <td style="padding:6px 10px;color:#6B7280;white-space:nowrap;border-top:1px solid #eef0f6">${esc(where)}</td>
+ <td style="padding:6px 10px;border-top:1px solid #eef0f6"><a href="${esc(link)}" style="color:#16357A;text-decoration:none">${esc(title)}</a></td>
+ <td style="padding:6px 10px;white-space:nowrap;border-top:1px solid #eef0f6"><a href="${esc(link)}" style="color:#8A5A00;font-weight:600;font-size:12px;text-decoration:none">${esc(src)} ↗</a></td></tr>`;
const newsRows = news.map(d => row(d.label || '$?', d.location || d.feed_region, d.title, d.feed, d.link)).join('');
const edgarRows = edgar.map(d => row(d.price_label || '$? (see filing)', d.location || d.region,
`${(d.filer || '').split('(')[0].trim()} — ${d.property_type || 'acquisition'}${d.kind === 'closed_deal' ? ' (Item 2.01 closed)' : ''}`,
- 'SEC 8-K', d.filing_url)).join('');
+ 'SEC EDGAR 8-K', d.filing_url)).join('');
const html = `<div style="font-family:-apple-system,Helvetica,Arial,sans-serif;color:#222;max-width:720px">
<h2 style="margin:0 0 2px;color:#0E2350">🏙️ Closed CRE deals — ${date}</h2>
<p style="color:#6B7280;font-size:13px;margin:0 0 14px">${news.length} from CRE trade press · ${edgar.length} from SEC filings · West footprint · free/same-day</p>
${news.length ? `<h3 style="color:#16357A;margin:14px 0 4px">Trade press (private + public)</h3>
-<table style="border-collapse:collapse;width:100%;font-size:14px">${newsRows}</table>` : ''}
+<table style="border-collapse:collapse;width:100%;font-size:14px">${HEAD}${newsRows}</table>` : ''}
${edgar.length ? `<h3 style="color:#16357A;margin:18px 0 4px">SEC 8-K filings (public REITs)</h3>
-<table style="border-collapse:collapse;width:100%;font-size:14px">${edgarRows}</table>` : ''}
+<table style="border-collapse:collapse;width:100%;font-size:14px">${HEAD}${edgarRows}</table>` : ''}
<p style="color:#9aa;font-size:11px;margin-top:16px">re-flyer-aggregator · TK-10708 · deduped daily · $0 sources. Prices from headlines/filings — verify before publishing.</p>
</div>`;
process.stdout.write(html);
← 01cc8e0 morning email digest: build-digest.mjs + email-digest.sh sen
·
back to Re Flyer Aggregator
·
auto-data-snapshot: 2026-08-19T14:34:38 (1 data files) — dat 62ec7fb →