Converted 'article' nomenclature to 'interview'

This commit is contained in:
Nathan Schneider 2025-04-30 22:55:43 -06:00
parent f7bbe50ff7
commit 7ef9e26166
27 changed files with 92 additions and 92 deletions

View File

@ -20,24 +20,24 @@ Then, to serve the site locally:
hugo server
```
## Articles
## Interviews
see `/archetypes/article.md` for the article template. You can create a new article with:
see `/archetypes/interview.md` for the interview template. You can create a new interview with:
```
hugo new content content/articles/lastname-interview_title.md
hugo new content content/interviews/lastname-interview_title.md
```
This will create a new article in the `content/articles` directory with the current date and the title you provide. You can then edit the file to add your content.
This will create a new interview in the `content/interviews` directory with the current date and the title you provide. You can then edit the file to add your content.
Alternately, you can manually add a file there in the proper format.
### Headshots
Optionally you can add a headshot photo to your article. To do this:
Optionally you can add a headshot photo to your interview. To do this:
1. Place your image file in the `/assets/headshots/` directory
2. Add a `headshot` field to your article's front matter with just the filename. For example:
2. Add a `headshot` field to your interview's front matter with just the filename. For example:
```yaml
headshot: "firstname_lastname.jpg"
@ -47,7 +47,7 @@ headshot: "firstname_lastname.jpg"
### Narrator links
You can add links to an article that relate to the narrator. To do this, add a `links` field to the front matter of the article. The value should be a list of objects, each with a `text` and `url` field. For example:
You can add links to an interview that relate to the narrator. To do this, add a `links` field to the front matter of the interview. The value should be a list of objects, each with a `text` and `url` field. For example:
```
links:
@ -56,11 +56,11 @@ links:
- text: "My Twitter"
url: "https://twitter.com/example"
```
This will include the links in the article page. The links will be displayed as a list with the text as the link text and the URL as the link target.
This will include the links in the interview page. The links will be displayed as a list with the text as the link text and the URL as the link target.
### Open Graph Image
You can add Open Graph image (for social media sharing) to an article. To do this, add a `ogImage` field to the front matter of the article. The value should be the path to the image file. For example:
You can add Open Graph image (for social media sharing) to an interview. To do this, add a `ogImage` field to the front matter of the interview. The value should be the path to the image file. For example:
```yaml
ogImage: "/images/my-image.jpg"

View File

@ -4,7 +4,7 @@
}
.wompum-container .wompum-grid,
.wompum-container .wompum-article-grid {
.wompum-container .wompum-interview-grid {
gap: 2px;
height: 100%;
min-height: 2px;
@ -12,17 +12,17 @@
}
.wompum-container--wide-gap .wompum-grid,
.wompum-container--wide-gap .wompum-article-grid {
.wompum-container--wide-gap .wompum-interview-grid {
gap: 1rem;
}
.wompum-container--no-gap .wompum-grid,
.wompum-container--no-gap .wompum-article-grid {
.wompum-container--no-gap .wompum-interview-grid {
gap: 0;
}
.wompum-grid,
.wompum-article-grid {
.wompum-interview-grid {
display: grid;
width: 100%;
}

View File

@ -4,23 +4,23 @@
margin-left: -1rem;
}
.article-title--single .article-title__narrator {
.interview-title--single .interview-title__narrator {
@apply mb-2 block font-light;
}
.article-title--single .article-title__subject {
.interview-title--single .interview-title__subject {
font-size: 1.5em;
}
.article-title--list {
.interview-title--list {
@apply text-2xl font-bold text-gray-900 group-hover:text-pine-900 underline underline-offset-5 decoration-sand-500 hover:decoration-pine-900
dark:text-sand-100 dark:group-hover:text-sand-500 dark:decoration-sand-900 dark:hover:decoration-sand-500;
}
.article-title--list .article-title__narrator::after {
.interview-title--list .interview-title__narrator::after {
content: ":";
}
.article-title--list .article-title__subject {
.interview-title--list .interview-title__subject {
@apply font-light;
}

View File

@ -50,4 +50,4 @@ body {
@import "components/wompum.css";
@import "fonts.css";
@import "main.css";
@import "article.css";
@import "interview.css";

View File

@ -98,7 +98,7 @@ class WompumGrid {
}
}
class ArticleGrid extends WompumGrid {
class InterviewGrid extends WompumGrid {
constructor(element, metadata) {
super(element);
this.metadata = metadata;
@ -249,16 +249,16 @@ document.addEventListener('DOMContentLoaded', () => {
grid.init();
});
// Initialize article grids
document.querySelectorAll('.wompum-article-grid').forEach(element => {
// Initialize interview grids
document.querySelectorAll('.wompum-interview-grid').forEach(element => {
let metadata = {};
try {
metadata = JSON.parse(element.dataset.metadata || '{}');
} catch (e) {
console.error('Error parsing metadata for article grid:', e);
console.error('Error parsing metadata for interview grid:', e);
}
const grid = new ArticleGrid(element, metadata);
const grid = new InterviewGrid(element, metadata);
grid.init();
});

View File

@ -7,7 +7,7 @@ approved: 2024-10-11
summary: "After widespread resistance to codes of conduct in open-source software communities, Coraline Ada Ehmke's Contributor Covenant became the most popular code of conduct in the ecosystem."
location: "Chicago, USA"
#headshot: "placeholder-headshot.png"
topics: [code of conduct, conflict, mediation, gender, open source, organizations, software]
topics: [code of conduct, conflict, mediation, gender, open source, software]
links:
- text: "Personal website"
url: "https://where.coraline.codes"

View File

@ -83,7 +83,7 @@ I used to do this in a more mystical way before. You can just measure a person's
The other way of teaching, which is “slapping the person in the face”? I think that's a lot of arrogance, because I'm going to tell you what you have instantly, all the products, all the solutions. But I didn't give you a path to walk. Your body will improve in three months, you will improve. But then what will you do afterward? You'll come back, and I'll see you again. And it was precisely this that I wanted to escape from.
If I hadn't escaped from this, today I would have a fuller schedule. I would charge more for my consultation. I'd just be measuring pulses, just doing that. I would earn more money. I wouldn't be making free videos, then answering two hundred questions per video. But if I really believe it, I'm thirty-nine years old. If I really believe that I'm going to die, I'm going to be born again, one of the things I wanted to do was leave knowledge good enough because people talk about the Final Judgment in the Bible. Ayurveda says that there is a moment of disembodiment, a millisecond that you will experience your life. And you will say to yourself. And that's what the Ayahuasca folks call DMT, divine particle, that kind of thing. Ayurveda explains this in a very cool way.
If I hadn't escaped from this, today I would have a fuller schedule. I would charge more for my consultation. I'd just be measuring pulses, just doing that. I would earn more money. I wouldn't be making free videos, then answering two hundred questions per video. But if I really believe it, I'm thirty-nine years old. If I really believe that I'm going to die, I'm going to be born again, one of the things I wanted to do was leave knowledge good enough because people talk about the Final Judgment in the Bible. Ayurveda says that there is a moment of disembodiment, a millisecond that you will experience your life. And you will say to yourself. And that's what the Ayahuasca folks call DMT, divine pinterview, that kind of thing. Ayurveda explains this in a very cool way.
A few years ago, I got into the idea that I couldn't die because I hadn't recorded my diagnostic course yet. So I think you get the desire to communicate in a way... that's what happened in my life. I want to be well with myself. That's it. And I also became a person who had to learn the division between right and wrong in the sense of going beyond just being nice. So I can't just be the nice guy on the Live. I also have to be harsh sometimes. I also have to scold sometimes. And it's part of this path that I've adopted. I used to get angry when people called me master. Because all my masters disappointed me. Today, if you want to call me Master, call me, but I'm an Ayurveda teacher. I'm here to pass on what I've studied, as incomplete as it may be.

View File

@ -161,7 +161,7 @@ So we had these submissions---the RDF people had gone, so we had these two sets
We couldn't agree on any one of the models. Finally, Tantek and I sat down, and Tantek was like, "Hey, look, we can just publish all of these. Let's just go ahead and do it. That way we don't have to argue about which one's right and which one's wrong. Let's just get them out, and they'll be official W3C standards, and they're out there."
James Snell had taken the earlier versions of ActivityStreams and made a new one that was JSON-based---ActivityStreams 2.0. He had built most of it already, so we were in an editorial stage by then. It's the data structures defining what is a note, what is an article, what is an image. What does it mean to like something, to follow someone? He set up that architecture of the data structures. ActivityPump was the protocol for getting those data structures moved around.
James Snell had taken the earlier versions of ActivityStreams and made a new one that was JSON-based---ActivityStreams 2.0. He had built most of it already, so we were in an editorial stage by then. It's the data structures defining what is a note, what is an interview, what is an image. What does it mean to like something, to follow someone? He set up that architecture of the data structures. ActivityPump was the protocol for getting those data structures moved around.
But Erin, who submitted this proposal, was not interested in taking it any further. We had two people who had joined the group from an open-source project called MediaGoblin. It was kind of a distributed social network with a focus on images and video and things like that. They wanted to support OStatus, and I had been like, "Hey, you should come be part of this W3C thing. We're doing the next protocol after OStatus, so come help build that."

View File

@ -37,7 +37,7 @@
<!-- Open Graph / Facebook -->
<meta property="og:site_name" content="{{ .Site.Title }}" />
<meta property="og:type" content="{{ if .IsPage }}article{{ else }}website{{ end }}" />
<meta property="og:type" content="{{ if .IsPage }}interview{{ else }}website{{ end }}" />
<meta property="og:url" content="{{ .Permalink }}" />
<meta property="og:title" content="{{ $title }}" />
<meta property="og:description" content="{{ $description }}" />
@ -53,18 +53,18 @@
<meta name="twitter:image" content="{{ . | absURL }}" />
{{ end }}
<!-- Article Specific -->
{{ if and .IsPage (eq .Type "articles") }}
<meta property="article:published_time" content="{{ .Date.Format "2006-01-02T15:04:05Z07:00" }}" />
<meta property="article:modified_time" content="{{ .Lastmod.Format "2006-01-02T15:04:05Z07:00" }}" />
<meta property="article:section" content="Oral History" />
<!-- Interview Specific -->
{{ if and .IsPage (eq .Type "interviews") }}
<meta property="interview:published_time" content="{{ .Date.Format "2006-01-02T15:04:05Z07:00" }}" />
<meta property="interview:modified_time" content="{{ .Lastmod.Format "2006-01-02T15:04:05Z07:00" }}" />
<meta property="interview:section" content="Oral History" />
{{ with .Params.topics }}
{{ range . }}
<meta property="article:tag" content="{{ . }}" />
<meta property="interview:tag" content="{{ . }}" />
{{ end }}
{{ end }}
{{/* Author information using standard meta topics instead of article:author */}}
{{/* Author information using standard meta topics instead of interview:author */}}
{{ with .Params.narrator }}
<meta name="author" content="{{ . }}" />
{{ end }}

View File

@ -1,5 +1,5 @@
{{ define "main" }}
<article class="single-default">
<interview class="single-default">
<header class="mb-8 wompum-container wompum-container--wide-gap aspect-3/1 md:aspect-4/1">
<div class="wompum-grid" data-text="{{ .Params.wompum | default .Title }}" data-columns="7" data-rows="5"></div>
</header>
@ -15,5 +15,5 @@
{{ end }}
{{ end }}
</div>
</article>
</interview>
{{ end }}

View File

@ -5,7 +5,7 @@
</header>
<main class="flex flex-wrap container mx-auto justify-center">
<ul class="flex flex-col md:gap-4 gap-16 w-full mb-16 mt-4">
{{ partial "article-list.html" (dict "Pages" .Data.Pages) }}
{{ partial "interview-list.html" (dict "Pages" .Data.Pages) }}
</ul>
{{ if gt (len (index .Site.Taxonomies .Data.Singular)) 1 }}

View File

@ -1,7 +1,7 @@
{{ define "main" }}
<main class="flex flex-col md:flex-row gap-4 md:gap-8 lg:gap-16 justify-around mt-8 max-w-screen-xl mx-auto">
<ul class="flex flex-col md:gap-4 gap-16 w-full mb-16">
{{ partial "article-list.html" (dict "Pages" (where .Site.RegularPages "Section" "articles")) }}
{{ partial "interview-list.html" (dict "Pages" (where .Site.RegularPages "Section" "interviews")) }}
</ul>
<aside class="max-w-prose md:w-1/4 flex flex-col gap-8 mb-8">

View File

@ -1,8 +1,8 @@
{{ define "main" }}
<article class="single-article">
<interview class="single-interview">
<header class="mb-4 wompum-container wompum-container--wide-gap aspect-2/1 md:aspect-3/1">{{ partial "article-wompum.html" . }}</header>
<header class="mb-4 wompum-container wompum-container--wide-gap aspect-2/1 md:aspect-3/1">{{ partial "interview-wompum.html" . }}</header>
<div class="flex md:flex-row flex-col gap-4 mt-4">
<aside class="md:sticky md:top-24 md:h-screen lg:w-1/3 p-4 font-iosevka">
@ -17,17 +17,17 @@
) }}
</div>
{{ end }}
<div class="md:block hidden">{{ partial "article-metadata.html" . }}</div>
<div class="md:block hidden">{{ partial "interview-metadata.html" . }}</div>
</aside>
<div class="prose lg:prose-xl dark:prose-invert lg:w-2/3 p-4 mx-auto md:mx-0">
<p class="font-bold text-4xl article-title article-title--single">{{ partial "article-title" . }}</p>
<p class="font-bold text-4xl interview-title interview-title--single">{{ partial "interview-title" . }}</p>
{{ .Content }}
</div>
<aside class="md:hidden block p-8 mt-8 border-t border-gray-200">{{ partial "article-metadata.html" . }}</aside>
<aside class="md:hidden block p-8 mt-8 border-t border-gray-200">{{ partial "interview-metadata.html" . }}</aside>
</div>
</article>
</interview>
<aside class="max-w-screen-xl mx-auto">
{{ partial "related-articles" (dict "page" . "topics" .Params.topics "limit" 3) }}
{{ partial "related-interviews" (dict "page" . "topics" .Params.topics "limit" 3) }}
</aside>
<div class="text-center my-12"><a href="/">Go Home</a></div>
{{ end }}

View File

@ -1,3 +0,0 @@
{{- if and .Params.narrator .Params.subject -}}
<span class="article-title__narrator">{{- .Params.narrator }}</span> <span class="article-title__subject">{{ .Params.subject -}}</span>
{{- end -}}

View File

@ -6,7 +6,7 @@
{{- end -}}
<li class="group flex md:flex-row flex-col md:gap-4 gap-2 md:items-center">
<div class="flex-1 min-w-0 flex gap-2 items-center h-full">
<a class="wompum-container h-full aspect-7/2 md:aspect-auto" href="{{ $page.RelPermalink }}">{{ partial "article-wompum.html" $page }}</a>
<a class="wompum-container h-full aspect-7/2 md:aspect-auto" href="{{ $page.RelPermalink }}">{{ partial "interview-wompum.html" $page }}</a>
<time class="text-gray-800 dark:text-sand-500 font-iosevka w-12 flex-shrink-0" datetime="{{ $page.Date.Format "2006-01-02" }}">
<p>{{ $page.Date.Format "Jan" }}</p>
<p>{{ $page.Date.Format "02" }}</p>
@ -14,7 +14,7 @@
</time>
</div>
<div class="flex flex-col gap-2 md:w-3/5 flex-shrink-0 md:py-8">
<a class="article-title article-title--list" href="{{ $page.RelPermalink }}">{{ partial "article-title" $page }}</a>
<a class="interview-title interview-title--list" href="{{ $page.RelPermalink }}">{{ partial "interview-title" $page }}</a>
{{ if $page.Params.location }}
<p class="light:text-gray-800 dark:text-sand-100 italic">{{ $page.Params.location }}</p>
{{ end }}

View File

@ -0,0 +1,3 @@
{{- if and .Params.narrator .Params.subject -}}
<span class="interview-title__narrator">{{- .Params.narrator }}</span> <span class="interview-title__subject">{{ .Params.subject -}}</span>
{{- end -}}

View File

@ -1,4 +1,4 @@
<div class="wompum-article-grid"
<div class="wompum-interview-grid"
data-metadata="{{ dict "narrator" .Params.narrator "subject" .Params.subject "facilitator" .Params.facilitator | jsonify }}"
data-columns="7"
data-rows="5">

View File

@ -1,40 +0,0 @@
{{- $topics := .topics -}}
{{- $limit := default 3 .limit -}}
{{- $currentPath := .page.RelPermalink -}}
{{- $related := where (where site.RegularPages "Type" "articles") "RelPermalink" "!=" $currentPath -}}
{{- $matchingArticles := slice -}}
{{/* First try to find articles with matching topics */}}
{{- range $related -}}
{{- $matches := 0 -}}
{{- range .Params.topics -}}
{{- if in $topics . -}}
{{- $matches = add $matches 1 -}}
{{- end -}}
{{- end -}}
{{- if gt $matches 0 -}}
{{- $matchingArticles = $matchingArticles | append (dict "page" . "matches" $matches) -}}
{{- end -}}
{{- end -}}
{{/* If we found matching articles, sort by number of matching topics */}}
{{- $finalArticles := slice -}}
{{- if gt (len $matchingArticles) 0 -}}
{{- $finalArticles = first $limit (sort $matchingArticles "matches" "desc") -}}
{{- else -}}
{{/* Fallback to showing other articles sorted by date */}}
{{- $finalArticles = first $limit (sort $related "Date" "desc") -}}
{{- end -}}
{{- if gt (len $finalArticles) 0 -}}
<div class="related-articles flex flex-wrap gap-4">
<h2 class="title text-3xl font-bold">Related Articles</h2>
<div class="wompum-container wompum-container--no-gap">
<div class="wompum-grid" data-text="Related Articles" data-columns="8" data-rows="1"></div>
</div>
<ul class="flex flex-col gap-4 w-full">
{{ partial "article-list" (dict "Pages" $finalArticles) }}
</ul>
</div>
{{- end -}}

View File

@ -0,0 +1,40 @@
{{- $topics := .topics -}}
{{- $limit := default 3 .limit -}}
{{- $currentPath := .page.RelPermalink -}}
{{- $related := where (where site.RegularPages "Type" "interviews") "RelPermalink" "!=" $currentPath -}}
{{- $matchingInterviews := slice -}}
{{/* First try to find interviews with matching topics */}}
{{- range $related -}}
{{- $matches := 0 -}}
{{- range .Params.topics -}}
{{- if in $topics . -}}
{{- $matches = add $matches 1 -}}
{{- end -}}
{{- end -}}
{{- if gt $matches 0 -}}
{{- $matchingInterviews = $matchingInterviews | append (dict "page" . "matches" $matches) -}}
{{- end -}}
{{- end -}}
{{/* If we found matching interviews, sort by number of matching topics */}}
{{- $finalInterviews := slice -}}
{{- if gt (len $matchingInterviews) 0 -}}
{{- $finalInterviews = first $limit (sort $matchingInterviews "matches" "desc") -}}
{{- else -}}
{{/* Fallback to showing other interviews sorted by date */}}
{{- $finalInterviews = first $limit (sort $related "Date" "desc") -}}
{{- end -}}
{{- if gt (len $finalInterviews) 0 -}}
<div class="related-interviews flex flex-wrap gap-4">
<h2 class="title text-3xl font-bold">Related Interviews</h2>
<div class="wompum-container wompum-container--no-gap">
<div class="wompum-grid" data-text="Related Interviews" data-columns="8" data-rows="1"></div>
</div>
<ul class="flex flex-col gap-4 w-full">
{{ partial "interview-list" (dict "Pages" $finalInterviews) }}
</ul>
</div>
{{- end -}}