Compare commits
6 commits
2e8eb21a03
...
0e0c30116e
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
0e0c30116e | ||
|
|
987ba81a31 | ||
|
|
45b7df37be | ||
|
|
6bff93d5d5 | ||
|
|
9401c0d519 | ||
|
|
8d373a1d20 |
10 changed files with 171 additions and 85 deletions
13
Makefile
13
Makefile
|
|
@ -0,0 +1,13 @@
|
|||
.PHONY: publication build serve publish
|
||||
|
||||
publication: ## scaffold next edition (refuses if a draft exists)
|
||||
@bash scripts/new-edition.sh
|
||||
|
||||
build: ## eleventy build -> dist/
|
||||
npx @11ty/eleventy
|
||||
|
||||
serve: ## local preview
|
||||
npx @11ty/eleventy --serve
|
||||
|
||||
publish: ## flip current draft -> published (terminal)
|
||||
@bash scripts/publish.sh
|
||||
|
|
@ -15,7 +15,7 @@ layout: base
|
|||
<hr class="thin">
|
||||
|
||||
<div class="masthead">
|
||||
<div class="nameplate left">DAILY</div>
|
||||
<div class="nameplate left">LE DAILY</div>
|
||||
<svg class="emblem" viewBox="0 0 100 100" xmlns="http://www.w3.org/2000/svg" aria-label="Globe with squirrel">
|
||||
<circle cx="50" cy="50" r="46" fill="none" stroke="#1a1a1a" stroke-width="2"/>
|
||||
<ellipse cx="50" cy="50" rx="22" ry="46" fill="none" stroke="#1a1a1a" stroke-width="1.2"/>
|
||||
|
|
@ -24,13 +24,13 @@ layout: base
|
|||
<path d="M4 68 Q50 80 96 68" fill="none" stroke="#1a1a1a" stroke-width="1"/>
|
||||
<path d="M50 38 q-7 0 -9 7 q-1 4 1 8 q-6 2 -7 9 q5 1 9 -2 q1 4 5 5 q6 1 9 -3 q4 1 7 -2 q-2 -4 -6 -4 q3 -5 1 -10 q4 -2 3 -7 q-4 1 -5 4 q-2 -6 -8 -5 z" fill="#1a1a1a"/>
|
||||
</svg>
|
||||
<div class="nameplate right">SQUIRREL</div>
|
||||
<div class="nameplate right">Squirrel</div>
|
||||
</div>
|
||||
<hr class="rule">
|
||||
|
||||
<div class="dateline">
|
||||
<span class="vol">Volume {{ volume_number }}, Edition No. {{ edition_number }}</span>
|
||||
<span class="place">Opelousas, Louisiana, {{ date.toDateString() }}</span>
|
||||
<span class="place">Opelousas, Louisiana, {{ date | newsDate }}</span>
|
||||
<span class="price">Price 3 Acorns</span>
|
||||
</div>
|
||||
<hr class="rule">
|
||||
|
|
|
|||
70
content/editions/2026-07-03/index.md
Normal file
70
content/editions/2026-07-03/index.md
Normal file
|
|
@ -0,0 +1,70 @@
|
|||
---
|
||||
layout: edition
|
||||
volume_number: I
|
||||
edition_number: 1
|
||||
date: 2026-07-03
|
||||
status: published
|
||||
title: "ACORN HOARD AT RECORD HIGH AS WINTER LOOMS"
|
||||
---
|
||||
|
||||
<div class="col">
|
||||
<div class="hed-lg center">Beloved Oak-Voiced Hazel Bushtail Retires</div>
|
||||
<hr class="hair" style="margin:4px 0 8px;">
|
||||
<img class="photo" src="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='320' height='240'%3E%3Crect width='320' height='240' fill='%23bdb39a'/%3E%3Crect x='0' y='0' width='320' height='240' fill='none' stroke='%23000' stroke-width='1'/%3E%3Cellipse cx='160' cy='130' rx='70' ry='80' fill='%23968a6e'/%3E%3Ccircle cx='160' cy='80' r='34' fill='%23a89b7c'/%3E%3Cpath d='M120 70 q-14 -34 4 -44 q10 16 8 34z' fill='%23877b60'/%3E%3Cpath d='M200 70 q14 -34 -4 -44 q-10 16 -8 34z' fill='%23877b60'/%3E%3Cpath d='M210 150 q60 -10 70 -90 q14 60 -34 110z' fill='%23877b60'/%3E%3Ccircle cx='150' cy='78' r='4' fill='%23222'/%3E%3Ccircle cx='172' cy='78' r='4' fill='%23222'/%3E%3Cpath d='M156 90 q5 5 10 0' fill='none' stroke='%23222' stroke-width='2'/%3E%3C/svg%3E" alt="Hazel Bushtail">
|
||||
<p class="caption">The forest community paused this week to honor Hazel Bushtail, whose famous chattering calls guided three generations of saplings to safety. Above, she is shown beside the Grand Oak where she nested for nineteen seasons.</p>
|
||||
<p class="lede">With her trademark flick of the tail, Hazel Bushtail announced her retirement to a crowd of well-wishers gathered beneath the old hickory. For nearly two decades she served as lookout for the eastern grove, sounding the alarm at the first sign of hawk or hound.</p>
|
||||
<p>Neighbors recalled her tireless winters and the countless caches she helped recover when the snow buried every familiar landmark. "She never lost a single nut she meant to find," said one tearful admirer.</p>
|
||||
|
||||
<hr class="rule" style="margin:10px 0 8px;">
|
||||
<div class="hed-md">'Tall Fences Will Not Keep Us From The Feeders' Mayor Tells Grove</div>
|
||||
<p>OAK HOLLOW, Oct. 9 — In a rousing address delivered from the top rail of the garden gate, the mayor pledged that no barrier would stand between the colony and its rightful share of the sunflower seed.</p>
|
||||
<p>The speech drew chittering approval from rooftops across the district, though several elders urged caution against the resident terrier.</p>
|
||||
|
||||
<hr class="rule" style="margin:10px 0 8px;">
|
||||
<div class="hed-md">PRESIDENT OF THE BIRD FEEDER FLEES HIS POST</div>
|
||||
<p>BACKYARD CITY, Oct. 9 — The cardinal long thought to rule the hanging feeder abandoned his perch at dawn, leaving the bounty unguarded for the first time in memory.</p>
|
||||
</div>
|
||||
|
||||
<div class="col">
|
||||
<div class="hed-xl">Bold Raiders Only 12 Feet From Pantry; Feast Near</div>
|
||||
<hr class="hair" style="margin:6px 0 8px;">
|
||||
|
||||
<div class="hed-lg">Elder Nutkin Counsels 29 Young Foragers</div>
|
||||
<p class="kicker">Large, Well-Whiskered Group<br>Sets Out For The Pecan Grove</p>
|
||||
<hr class="hair" style="margin:6px 0 8px;">
|
||||
<p>With the venerable Elder Nutkin presiding, twenty-nine young foragers received their parting counsel this morning before departing for the pecan grove at the far edge of the meadow.</p>
|
||||
<p>The elder delivered a warm, sincere send-off, reminding each that "a nut buried in haste is a nut lost to spring." The youngsters, well-known throughout the hollow, listened with twitching ears.</p>
|
||||
<p>"If you know what a hard winter is," Elder Nutkin instructed, "you do not expect sympathy — you bury, and you remember." He closed with his best wishes and a flick of the tail.</p>
|
||||
|
||||
<div class="boxed">
|
||||
<div class="hed-lg">CACHE COUNT<br>TOMORROW</div>
|
||||
</div>
|
||||
|
||||
<p>After days of probing into the colony's winter reserves, the granary committee will release its long-awaited cache count tomorrow morning at first light.</p>
|
||||
<p>Various forager figures, including all members of the spring litter, have been summoned to the council stump to verify the tally before the frost settles over the grove.</p>
|
||||
<p>Today, committee members made an inspecting tour of all parish hollows and storage knots.</p>
|
||||
|
||||
<hr class="rule" style="margin:10px 0 8px;">
|
||||
<div class="weather">
|
||||
<div class="label">The Weather</div>
|
||||
<hr class="hair" style="margin:5px 0;">
|
||||
<p>Partly cloudy tonight. Friday considerably crisper, scattered acorn-fall likely. High temperature near 62°.</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="col">
|
||||
<div class="hed-xl">Squirrel Stakes Everything On The Dash</div>
|
||||
<p class="kicker">Colony Claims Million Sunflower Seeds Secured By<br>Fast-Moving Tail Brigade as Cat Warns Of Fence</p>
|
||||
<p class="byline">(By Nutwire Service)</p>
|
||||
<hr class="hair" style="margin:4px 0 8px;">
|
||||
<p class="lede">The grove's boldest and greatest offensive against the well-stocked pantry reached flood tide today. A stream of proclamations and announcements from the council stump claimed that foraging forces had smashed to within twelve feet of the pantry door.</p>
|
||||
<p>The whole backyard front has been broken, scouts reported, with sixty to seventy bird feeders — possibly a thousand seeds each — emptied and the squirrel position considered all but unassailable.</p>
|
||||
|
||||
<div class="hed-section">RECORD HOARD</div>
|
||||
<hr class="hair" style="margin:0 0 8px;">
|
||||
<p>Down in the hollow, there was no denying the festive mood that has settled north of the old oak, at least for the moment. The brigade swept the lower garden, leaving behind the scattered and scratched-over patches of the once-tidy flower bed.</p>
|
||||
<p>The council painted a picture of foragers advancing swiftly toward the porch under clear skies and along dry roads, leaving behind the bewildered and largely indifferent house cat.</p>
|
||||
<p>It was revealed that the lead forager made a statement at the crack of dawn, declaring the offensive everything she had — risking everything in a desperate dash for the suet cake before nightfall.</p>
|
||||
<p>Resident birds, for their part, criticized the willful acrobatic actions of the brigade, warning it was unlikely to spread to colder weather without consequence.</p>
|
||||
<p class="jump">(Continued on Page 18-B)</p>
|
||||
</div>
|
||||
|
|
@ -1,70 +1,8 @@
|
|||
---
|
||||
layout: edition
|
||||
volume_number: I
|
||||
edition_number: 1
|
||||
edition_number: 2
|
||||
date: 2026-07-04
|
||||
status: published
|
||||
title: "ACORN HOARD AT RECORD HIGH AS WINTER LOOMS"
|
||||
title: "FDT"
|
||||
---
|
||||
|
||||
<div class="col">
|
||||
<div class="hed-lg center">Beloved Oak-Voiced Hazel Bushtail Retires</div>
|
||||
<hr class="hair" style="margin:4px 0 8px;">
|
||||
<img class="photo" src="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='320' height='240'%3E%3Crect width='320' height='240' fill='%23bdb39a'/%3E%3Crect x='0' y='0' width='320' height='240' fill='none' stroke='%23000' stroke-width='1'/%3E%3Cellipse cx='160' cy='130' rx='70' ry='80' fill='%23968a6e'/%3E%3Ccircle cx='160' cy='80' r='34' fill='%23a89b7c'/%3E%3Cpath d='M120 70 q-14 -34 4 -44 q10 16 8 34z' fill='%23877b60'/%3E%3Cpath d='M200 70 q14 -34 -4 -44 q-10 16 -8 34z' fill='%23877b60'/%3E%3Cpath d='M210 150 q60 -10 70 -90 q14 60 -34 110z' fill='%23877b60'/%3E%3Ccircle cx='150' cy='78' r='4' fill='%23222'/%3E%3Ccircle cx='172' cy='78' r='4' fill='%23222'/%3E%3Cpath d='M156 90 q5 5 10 0' fill='none' stroke='%23222' stroke-width='2'/%3E%3C/svg%3E" alt="Hazel Bushtail">
|
||||
<p class="caption">The forest community paused this week to honor Hazel Bushtail, whose famous chattering calls guided three generations of saplings to safety. Above, she is shown beside the Grand Oak where she nested for nineteen seasons.</p>
|
||||
<p class="lede">With her trademark flick of the tail, Hazel Bushtail announced her retirement to a crowd of well-wishers gathered beneath the old hickory. For nearly two decades she served as lookout for the eastern grove, sounding the alarm at the first sign of hawk or hound.</p>
|
||||
<p>Neighbors recalled her tireless winters and the countless caches she helped recover when the snow buried every familiar landmark. "She never lost a single nut she meant to find," said one tearful admirer.</p>
|
||||
|
||||
<hr class="rule" style="margin:10px 0 8px;">
|
||||
<div class="hed-md">'Tall Fences Will Not Keep Us From The Feeders' Mayor Tells Grove</div>
|
||||
<p>OAK HOLLOW, Oct. 9 — In a rousing address delivered from the top rail of the garden gate, the mayor pledged that no barrier would stand between the colony and its rightful share of the sunflower seed.</p>
|
||||
<p>The speech drew chittering approval from rooftops across the district, though several elders urged caution against the resident terrier.</p>
|
||||
|
||||
<hr class="rule" style="margin:10px 0 8px;">
|
||||
<div class="hed-md">PRESIDENT OF THE BIRD FEEDER FLEES HIS POST</div>
|
||||
<p>BACKYARD CITY, Oct. 9 — The cardinal long thought to rule the hanging feeder abandoned his perch at dawn, leaving the bounty unguarded for the first time in memory.</p>
|
||||
</div>
|
||||
|
||||
<div class="col">
|
||||
<div class="hed-xl">Bold Raiders Only 12 Feet From Pantry; Feast Near</div>
|
||||
<hr class="hair" style="margin:6px 0 8px;">
|
||||
|
||||
<div class="hed-lg">Elder Nutkin Counsels 29 Young Foragers</div>
|
||||
<p class="kicker">Large, Well-Whiskered Group<br>Sets Out For The Pecan Grove</p>
|
||||
<hr class="hair" style="margin:6px 0 8px;">
|
||||
<p>With the venerable Elder Nutkin presiding, twenty-nine young foragers received their parting counsel this morning before departing for the pecan grove at the far edge of the meadow.</p>
|
||||
<p>The elder delivered a warm, sincere send-off, reminding each that "a nut buried in haste is a nut lost to spring." The youngsters, well-known throughout the hollow, listened with twitching ears.</p>
|
||||
<p>"If you know what a hard winter is," Elder Nutkin instructed, "you do not expect sympathy — you bury, and you remember." He closed with his best wishes and a flick of the tail.</p>
|
||||
|
||||
<div class="boxed">
|
||||
<div class="hed-lg">CACHE COUNT<br>TOMORROW</div>
|
||||
</div>
|
||||
|
||||
<p>After days of probing into the colony's winter reserves, the granary committee will release its long-awaited cache count tomorrow morning at first light.</p>
|
||||
<p>Various forager figures, including all members of the spring litter, have been summoned to the council stump to verify the tally before the frost settles over the grove.</p>
|
||||
<p>Today, committee members made an inspecting tour of all parish hollows and storage knots.</p>
|
||||
|
||||
<hr class="rule" style="margin:10px 0 8px;">
|
||||
<div class="weather">
|
||||
<div class="label">The Weather</div>
|
||||
<hr class="hair" style="margin:5px 0;">
|
||||
<p>Partly cloudy tonight. Friday considerably crisper, scattered acorn-fall likely. High temperature near 62°.</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="col">
|
||||
<div class="hed-xl">Squirrel Stakes Everything On The Dash</div>
|
||||
<p class="kicker">Colony Claims Million Sunflower Seeds Secured By<br>Fast-Moving Tail Brigade as Cat Warns Of Fence</p>
|
||||
<p class="byline">(By Nutwire Service)</p>
|
||||
<hr class="hair" style="margin:4px 0 8px;">
|
||||
<p class="lede">The grove's boldest and greatest offensive against the well-stocked pantry reached flood tide today. A stream of proclamations and announcements from the council stump claimed that foraging forces had smashed to within twelve feet of the pantry door.</p>
|
||||
<p>The whole backyard front has been broken, scouts reported, with sixty to seventy bird feeders — possibly a thousand seeds each — emptied and the squirrel position considered all but unassailable.</p>
|
||||
|
||||
<div class="hed-section">RECORD HOARD</div>
|
||||
<hr class="hair" style="margin:0 0 8px;">
|
||||
<p>Down in the hollow, there was no denying the festive mood that has settled north of the old oak, at least for the moment. The brigade swept the lower garden, leaving behind the scattered and scratched-over patches of the once-tidy flower bed.</p>
|
||||
<p>The council painted a picture of foragers advancing swiftly toward the porch under clear skies and along dry roads, leaving behind the bewildered and largely indifferent house cat.</p>
|
||||
<p>It was revealed that the lead forager made a statement at the crack of dawn, declaring the offensive everything she had — risking everything in a desperate dash for the suet cake before nightfall.</p>
|
||||
<p>Resident birds, for their part, criticized the willful acrobatic actions of the brigade, warning it was unlikely to spread to colder weather without consequence.</p>
|
||||
<p class="jump">(Continued on Page 18-B)</p>
|
||||
</div>
|
||||
|
|
|
|||
|
|
@ -1,18 +0,0 @@
|
|||
// content/editions/editions.11tydata.js
|
||||
module.exports = {
|
||||
eleventyComputed: {
|
||||
// Dynamically build the permalink based on the folder date and file slug
|
||||
permalink: (data) => {
|
||||
// If it's the index.md of the edition, route to /archive/YYYY-MM-DD/
|
||||
if (data.page.fileSlug === 'index' || data.page.fileSlug === '') {
|
||||
// Extract date from the parent folder name
|
||||
const folderName = data.page.filePathStem.split('/').slice(-2, -1)[0];
|
||||
return `/archive/${folderName}/`;
|
||||
}
|
||||
|
||||
// If it's an article, route to /archive/YYYY-MM-DD/article-slug/
|
||||
const folderName = data.page.filePathStem.split('/').slice(-3, -2)[0];
|
||||
return `/archive/${folderName}/${data.page.fileSlug}/`;
|
||||
}
|
||||
}
|
||||
};
|
||||
7
content/index.11tydata.js
Normal file
7
content/index.11tydata.js
Normal file
|
|
@ -0,0 +1,7 @@
|
|||
module.exports = {
|
||||
eleventyComputed: {
|
||||
title: data => data.latest ? data.latest.data.title : "Printing Presses Warming Up",
|
||||
date: data => data.latest ? data.latest.date : new Date(),
|
||||
edition_number: data => data.latest ? data.latest.data.edition_number : 0
|
||||
}
|
||||
};
|
||||
9
content/index.njk
Normal file
9
content/index.njk
Normal file
|
|
@ -0,0 +1,9 @@
|
|||
---
|
||||
pagination:
|
||||
data: collections.currentEdition
|
||||
size: 1
|
||||
alias: latest
|
||||
layout: edition
|
||||
permalink: /
|
||||
---
|
||||
{{ latest.templateContent | safe }}
|
||||
|
|
@ -20,6 +20,17 @@ module.exports = function(eleventyConfig) {
|
|||
eleventyConfig.addLayoutAlias("article", "layouts/article.njk");
|
||||
eleventyConfig.addLayoutAlias("base", "layouts/base.njk");
|
||||
|
||||
// 4. Force UTC date formatting to fix the 5-hour timezone shift
|
||||
eleventyConfig.addFilter("newsDate", function(dateObj) {
|
||||
return new Date(dateObj).toLocaleDateString('en-US', {
|
||||
timeZone: 'UTC',
|
||||
weekday: 'long',
|
||||
month: 'long',
|
||||
day: 'numeric',
|
||||
year: 'numeric'
|
||||
});
|
||||
});
|
||||
|
||||
return {
|
||||
dir: {
|
||||
input: "content",
|
||||
|
|
|
|||
41
scripts/new-edition.sh
Executable file
41
scripts/new-edition.sh
Executable file
|
|
@ -0,0 +1,41 @@
|
|||
#!/bin/bash
|
||||
|
||||
# 1. Enforce the "One Draft Limit" rule
|
||||
if grep -qr "status: draft" content/editions/ 2>/dev/null; then
|
||||
echo "❌ Error: An open draft already exists. Publish or delete it first."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# 2. Calculate the next edition number
|
||||
LATEST_ED=$(grep -h "^edition_number:" content/editions/*/index.md 2>/dev/null | awk '{print $2}' | sort -n | tail -1)
|
||||
NEXT_ED=$((LATEST_ED + 1))
|
||||
NEXT_DATE=$(date +%Y-%m-%d)
|
||||
DIR="content/editions/$NEXT_DATE"
|
||||
|
||||
# 3. Prevent overwriting today's edition if one was already published today
|
||||
if [ -d "$DIR" ]; then
|
||||
echo "❌ Error: An edition for $NEXT_DATE already exists."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# 4. Scaffold the directory and the index.md front matter
|
||||
mkdir -p "$DIR"
|
||||
cat <<EOF > "$DIR/index.md"
|
||||
---
|
||||
layout: edition
|
||||
edition_number: $NEXT_ED
|
||||
date: $NEXT_DATE
|
||||
status: draft
|
||||
title: "Edition No. $NEXT_ED"
|
||||
---
|
||||
EOF
|
||||
|
||||
# 5. Handle the Git branch routing
|
||||
BRANCH_NAME="edition/$NEXT_DATE/open"
|
||||
git checkout -b "$BRANCH_NAME"
|
||||
git add "$DIR/index.md"
|
||||
git commit -m "chore: scaffold draft for Edition $NEXT_ED"
|
||||
|
||||
echo "✅ Success! Scaffolded Edition $NEXT_ED."
|
||||
echo "🌲 Moved to new branch: $BRANCH_NAME"
|
||||
echo "🤖 Agents may now open PRs targeting this branch."
|
||||
15
scripts/publish.sh
Executable file
15
scripts/publish.sh
Executable file
|
|
@ -0,0 +1,15 @@
|
|||
#!/bin/bash
|
||||
|
||||
# Find the file containing the draft
|
||||
DRAFT_FILE=$(grep -rl "^status: draft" content/editions/ | head -n 1)
|
||||
|
||||
if [ -z "$DRAFT_FILE" ]; then
|
||||
echo "❌ Error: No open drafts found to publish."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Flip the status using sed
|
||||
sed -i 's/^status: draft/status: published/' "$DRAFT_FILE"
|
||||
|
||||
echo "✅ Success! Flipped status to published."
|
||||
echo "📰 Run 'make build' to generate the archive, then commit and merge to main."
|
||||
Loading…
Reference in a new issue