Initial commit: Hugo static site for nerdy events
Some checks failed
Build Hugo Site / build (push) Failing after 19s
Some checks failed
Build Hugo Site / build (push) Failing after 19s
- Custom cyberpunk/console theme with pure CSS - Event management with RSS and iCal calendar feeds - Gitea workflow for automated deployment - Complete documentation and setup instructions 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
48
layouts/events/calendar.ics
Normal file
48
layouts/events/calendar.ics
Normal file
@@ -0,0 +1,48 @@
|
||||
BEGIN:VCALENDAR
|
||||
VERSION:2.0
|
||||
PRODID:-//NERDER.LAND//Event Calendar//EN
|
||||
NAME:{{ .Site.Title }} Events
|
||||
X-WR-CALNAME:{{ .Site.Title }} Events
|
||||
DESCRIPTION:{{ .Site.Params.description }}
|
||||
TIMEZONE-ID:America/Denver
|
||||
BEGIN:VTIMEZONE
|
||||
TZID:America/Denver
|
||||
BEGIN:DAYLIGHT
|
||||
TZOFFSETFROM:-0700
|
||||
TZOFFSETTO:-0600
|
||||
TZNAME:MDT
|
||||
DTSTART:20250309T020000
|
||||
RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU
|
||||
END:DAYLIGHT
|
||||
BEGIN:STANDARD
|
||||
TZOFFSETFROM:-0600
|
||||
TZOFFSETTO:-0700
|
||||
TZNAME:MST
|
||||
DTSTART:20251102T020000
|
||||
RRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU
|
||||
END:STANDARD
|
||||
END:VTIMEZONE
|
||||
{{- range .RegularPages }}
|
||||
BEGIN:VEVENT
|
||||
UID:{{ .File.UniqueID }}@{{ $.Site.BaseURL | replaceRE "^https?://" "" }}
|
||||
DTSTART;TZID=America/Denver:{{ .Params.date | dateFormat "20060102T150405" }}
|
||||
{{- if .Params.end_date }}
|
||||
DTEND;TZID=America/Denver:{{ .Params.end_date | dateFormat "20060102T150405" }}
|
||||
{{- else }}
|
||||
DTEND;TZID=America/Denver:{{ .Params.date.Add (time.ParseDuration "2h") | dateFormat "20060102T150405" }}
|
||||
{{- end }}
|
||||
DTSTAMP:{{ now | dateFormat "20060102T150405Z" }}
|
||||
SUMMARY:{{ .Title }}
|
||||
DESCRIPTION:{{ .Summary | replaceRE "\n" "\\n" | replaceRE "," "\\," }}
|
||||
{{- if .Params.location }}
|
||||
LOCATION:{{ .Params.location | replaceRE "," "\\," }}
|
||||
{{- end }}
|
||||
URL:{{ .Permalink }}
|
||||
{{- if .Params.organizer }}
|
||||
ORGANIZER:{{ .Params.organizer | replaceRE "," "\\," }}
|
||||
{{- end }}
|
||||
STATUS:CONFIRMED
|
||||
TRANSP:OPAQUE
|
||||
END:VEVENT
|
||||
{{- end }}
|
||||
END:VCALENDAR
|
||||
39
layouts/events/rss.xml
Normal file
39
layouts/events/rss.xml
Normal file
@@ -0,0 +1,39 @@
|
||||
{{- $pctx := . -}}
|
||||
{{- if .IsHome -}}{{ $pctx = .Site }}{{- end -}}
|
||||
{{- $pages := slice -}}
|
||||
{{- if or $.IsHome $.IsSection -}}
|
||||
{{- $pages = $pctx.RegularPages -}}
|
||||
{{- else -}}
|
||||
{{- $pages = $pctx.Pages -}}
|
||||
{{- end -}}
|
||||
{{- $limit := .Site.Config.Services.RSS.Limit -}}
|
||||
{{- if ge $limit 1 -}}
|
||||
{{- $pages = $pages | first $limit -}}
|
||||
{{- end -}}
|
||||
{{- printf "<?xml version=\"1.0\" encoding=\"utf-8\" standalone=\"yes\"?>" | safeHTML }}
|
||||
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
|
||||
<channel>
|
||||
<title>{{ if eq .Title .Site.Title }}{{ .Site.Title }}{{ else }}{{ with .Title }}{{.}} on {{ end }}{{ .Site.Title }}{{ end }}</title>
|
||||
<link>{{ .Permalink }}</link>
|
||||
<description>{{ .Site.Params.description | default "Recent events" }}</description>
|
||||
<generator>Hugo -- gohugo.io</generator>{{ with .Site.LanguageCode }}
|
||||
<language>{{.}}</language>{{end}}{{ with .Site.Author.email }}
|
||||
<managingEditor>{{.}}{{ with $.Site.Author.name }} ({{.}}){{end}}</managingEditor>{{end}}{{ with .Site.Author.email }}
|
||||
<webMaster>{{.}}{{ with $.Site.Author.name }} ({{.}}){{end}}</webMaster>{{end}}{{ with .Site.Copyright }}
|
||||
<copyright>{{.}}</copyright>{{end}}{{ if not .Date.IsZero }}
|
||||
<lastBuildDate>{{ .Date.Format "Mon, 02 Jan 2006 15:04:05 -0700" | safeHTML }}</lastBuildDate>{{ end }}
|
||||
{{- with .OutputFormats.Get "RSS" -}}
|
||||
{{ printf "<atom:link href=%q rel=\"self\" type=%q />" .Permalink .MediaType | safeHTML }}
|
||||
{{- end -}}
|
||||
{{ range $pages }}
|
||||
<item>
|
||||
<title>{{ .Title }}</title>
|
||||
<link>{{ .Permalink }}</link>
|
||||
<pubDate>{{ .Date.Format "Mon, 02 Jan 2006 15:04:05 -0700" | safeHTML }}</pubDate>
|
||||
{{ with .Site.Author.email }}<author>{{.}}{{ with $.Site.Author.name }} ({{.}}){{end}}</author>{{end}}
|
||||
<guid>{{ .Permalink }}</guid>
|
||||
<description>{{ with .Params.location }}📍 {{ . }} | {{ end }}{{ with .Params.date }}🗓️ {{ dateFormat "January 2, 2006 at 3:04 PM MST" . }} | {{ end }}{{ with .Params.cost }}💰 {{ . }} | {{ end }}{{ .Summary | html }}</description>
|
||||
</item>
|
||||
{{ end }}
|
||||
</channel>
|
||||
</rss>
|
||||
98
layouts/events/single.html
Normal file
98
layouts/events/single.html
Normal file
@@ -0,0 +1,98 @@
|
||||
{{ define "main" }}
|
||||
<article class="event-detail">
|
||||
<div class="ascii-border">
|
||||
<pre>
|
||||
+==================================================================+
|
||||
| EVENT DETAILS |
|
||||
+==================================================================+
|
||||
</pre>
|
||||
</div>
|
||||
|
||||
<h1>{{ .Title }}</h1>
|
||||
|
||||
<div class="event-meta">
|
||||
<div class="meta-item">
|
||||
<span class="meta-label">Date & Time</span>
|
||||
<span class="meta-value">{{ .Params.date | dateFormat "Monday, January 2, 2006 at 3:04 PM MST" }}</span>
|
||||
</div>
|
||||
|
||||
{{ if .Params.end_date }}
|
||||
<div class="meta-item">
|
||||
<span class="meta-label">End Time</span>
|
||||
<span class="meta-value">{{ .Params.end_date | dateFormat "Monday, January 2, 2006 at 3:04 PM MST" }}</span>
|
||||
</div>
|
||||
{{ end }}
|
||||
|
||||
<div class="meta-item">
|
||||
<span class="meta-label">Timezone</span>
|
||||
<span class="meta-value">Mountain Time (UTC-6)</span>
|
||||
</div>
|
||||
|
||||
{{ if .Params.location }}
|
||||
<div class="meta-item">
|
||||
<span class="meta-label">Location</span>
|
||||
<span class="meta-value">{{ .Params.location }}</span>
|
||||
</div>
|
||||
{{ end }}
|
||||
|
||||
{{ if .Params.organizer }}
|
||||
<div class="meta-item">
|
||||
<span class="meta-label">Organizer</span>
|
||||
<span class="meta-value">{{ .Params.organizer }}</span>
|
||||
</div>
|
||||
{{ end }}
|
||||
|
||||
{{ if .Params.capacity }}
|
||||
<div class="meta-item">
|
||||
<span class="meta-label">Capacity</span>
|
||||
<span class="meta-value">{{ .Params.capacity }} people</span>
|
||||
</div>
|
||||
{{ end }}
|
||||
|
||||
{{ if .Params.cost }}
|
||||
<div class="meta-item">
|
||||
<span class="meta-label">Cost</span>
|
||||
<span class="meta-value">{{ .Params.cost }}</span>
|
||||
</div>
|
||||
{{ end }}
|
||||
</div>
|
||||
|
||||
<div class="event-content">
|
||||
{{ .Content }}
|
||||
</div>
|
||||
|
||||
{{ if .Params.registration_url }}
|
||||
<div class="registration">
|
||||
<div class="ascii-border">
|
||||
<pre>
|
||||
+--------------------------------------------------------------+
|
||||
| REGISTRATION |
|
||||
+--------------------------------------------------------------+
|
||||
</pre>
|
||||
</div>
|
||||
<p class="prompt"><a href="{{ .Params.registration_url }}">Register for this event</a></p>
|
||||
</div>
|
||||
{{ end }}
|
||||
|
||||
{{ if .Params.contact }}
|
||||
<div class="contact">
|
||||
<h3>Contact Information</h3>
|
||||
<p>{{ .Params.contact }}</p>
|
||||
</div>
|
||||
{{ end }}
|
||||
|
||||
<div class="calendar-actions">
|
||||
<div class="ascii-border">
|
||||
<pre>
|
||||
+--------------------------------------------------------------+
|
||||
| ADD TO CALENDAR |
|
||||
+--------------------------------------------------------------+
|
||||
</pre>
|
||||
</div>
|
||||
<p class="prompt">
|
||||
<a href="{{ .RelPermalink }}calendar.ics" download>📅 Download Event (.ics)</a>
|
||||
</p>
|
||||
</div>
|
||||
|
||||
</article>
|
||||
{{ end }}
|
||||
48
layouts/events/single.ics
Normal file
48
layouts/events/single.ics
Normal file
@@ -0,0 +1,48 @@
|
||||
BEGIN:VCALENDAR
|
||||
VERSION:2.0
|
||||
PRODID:-//NERDER.LAND//Event Calendar//EN
|
||||
NAME:{{ .Title }}
|
||||
X-WR-CALNAME:{{ .Title }}
|
||||
TIMEZONE-ID:America/Denver
|
||||
BEGIN:VTIMEZONE
|
||||
TZID:America/Denver
|
||||
BEGIN:DAYLIGHT
|
||||
TZOFFSETFROM:-0700
|
||||
TZOFFSETTO:-0600
|
||||
TZNAME:MDT
|
||||
DTSTART:20250309T020000
|
||||
RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU
|
||||
END:DAYLIGHT
|
||||
BEGIN:STANDARD
|
||||
TZOFFSETFROM:-0600
|
||||
TZOFFSETTO:-0700
|
||||
TZNAME:MST
|
||||
DTSTART:20251102T020000
|
||||
RRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU
|
||||
END:STANDARD
|
||||
END:VTIMEZONE
|
||||
BEGIN:VEVENT
|
||||
UID:{{ .File.UniqueID }}@{{ .Site.BaseURL | replaceRE "^https?://" "" }}
|
||||
DTSTART;TZID=America/Denver:{{ .Params.date | dateFormat "20060102T150405" }}
|
||||
{{- if .Params.end_date }}
|
||||
DTEND;TZID=America/Denver:{{ .Params.end_date | dateFormat "20060102T150405" }}
|
||||
{{- else }}
|
||||
DTEND;TZID=America/Denver:{{ .Params.date.Add (time.ParseDuration "2h") | dateFormat "20060102T150405" }}
|
||||
{{- end }}
|
||||
DTSTAMP:{{ now | dateFormat "20060102T150405Z" }}
|
||||
SUMMARY:{{ .Title }}
|
||||
DESCRIPTION:{{ .Content | plainify | replaceRE "\n" "\\n" | replaceRE "," "\\," }}
|
||||
{{- if .Params.location }}
|
||||
LOCATION:{{ .Params.location | replaceRE "," "\\," }}
|
||||
{{- end }}
|
||||
URL:{{ .Permalink }}
|
||||
{{- if .Params.organizer }}
|
||||
ORGANIZER:{{ .Params.organizer | replaceRE "," "\\," }}
|
||||
{{- end }}
|
||||
{{- if .Params.contact }}
|
||||
CONTACT:{{ .Params.contact | replaceRE "," "\\," }}
|
||||
{{- end }}
|
||||
STATUS:CONFIRMED
|
||||
TRANSP:OPAQUE
|
||||
END:VEVENT
|
||||
END:VCALENDAR
|
||||
Reference in New Issue
Block a user