Update CV: improve teaching format, publications, and add publications section

This commit is contained in:
Michael Winter 2026-02-27 16:34:19 +01:00
parent 70dee4681b
commit 161d23aba7
3 changed files with 119 additions and 61 deletions

View file

@ -91,9 +91,50 @@ useHead({
<span class="item-subtitle">{{ teach.position }}</span>
</div>
<div class="item-detail">{{ formatMonth(teach.startDate) }} {{ formatMonth(teach.endDate) }}</div>
<ul v-if="teach.highlights" class="item-list">
<li v-for="h in teach.highlights">{{ h }}</li>
</ul>
<template v-if="teach.highlights || teach.courses">
<div class="item-detail ml-4 hanging-indent">
<strong>Subjects and courses:</strong>{{ ' ' }}<template v-if="teach.highlights">
<template v-for="h in teach.highlights">{{ h.startsWith('Topics:') ? h.replace('Topics: ', '') : '' }}</template>
</template><template v-if="teach.highlights && teach.courses">, </template><template v-if="teach.courses">{{ teach.courses.join(', ') }}</template>
</div>
<template v-for="h in teach.highlights">
<div v-if="h.startsWith && h.startsWith('Activities')" class="item-detail ml-4 hanging-indent">
<strong>Activities and Responsibilities:</strong> {{ h.replace(/^Activities( and Responsibilities)?: /, '') }}
</div>
<div v-else-if="h.startsWith && !h.startsWith('Topics:')" class="item-detail ml-4 hanging-indent">
{{ h }}
</div>
</template>
</template>
<div v-else-if="teach.summary" class="item-detail ml-4 hanging-indent">
{{ teach.summary }}
</div>
<div v-if="teach.committees" class="item-detail ml-4 hanging-indent">
<strong>Committees:</strong> {{ teach.committees.map(c => c.role + ' - ' + c.name).join('; ') }}
</div>
<div v-if="teach.events" class="item-detail ml-4 hanging-indent">
<strong>Events:</strong> {{ teach.events.map(e => e.name + ' (' + e.type + ')').join(', ') }}
</div>
</div>
</div>
</section>
<!-- Publications -->
<section v-if="resume?.publications?.length" class="cv-section">
<h4>Publications</h4>
<div class="cv-entry">
<div v-for="pub in resume.publications" :key="pub.id" class="item">
<div class="item-title" v-html="pub.entryTags?.title"></div>
<div class="bib ml-4">
<span v-if="pub.entryTags?.author">{{ pub.entryTags.author }}.</span>
<span v-if="pub.entryTags?.editor">
<span v-if="pub.entryTags?.author">, </span>editors {{ pub.entryTags.editor }}.
</span>
<span v-if="pub.entryTags?.booktitle"><em>{{ pub.entryTags.booktitle }}.</em></span>
<span v-if="pub.entryTags?.journal"><em>{{ pub.entryTags.journal }}</em>,</span>
<span v-if="pub.entryTags?.volume">vol. {{ pub.entryTags.volume }}</span>
<span v-if="pub.entryTags?.publisher">{{ pub.entryTags.publisher }},</span> {{ pub.entryTags?.year }}.
</div>
</div>
</div>
</section>
@ -127,9 +168,48 @@ useHead({
<span class="item-subtitle">{{ w.position }}</span>
</div>
<div class="item-detail">{{ formatMonth(w.startDate) }} {{ formatMonth(w.endDate) }}</div>
<ul v-if="w.highlights" class="item-list">
<li v-for="h in w.highlights">{{ h }}</li>
</ul>
<div v-if="w.summary" class="item-detail ml-4 hanging-indent">
<strong>Project:</strong> {{ w.summary.replace('Project: ', '') }}
</div>
<div v-if="w.highlights" class="ml-4">
<div v-for="h in w.highlights" class="item-detail hanging-indent">
<span v-if="h.startsWith('Activities')"><strong>Activities and Responsibilities:</strong> {{ h.replace(/^Activities( and Responsibilities)?: /, '') }}</span>
<span v-else>{{ h }}</span>
</div>
</div>
</div>
</div>
</section>
<!-- Recordings -->
<section v-if="resume?.solo_releases?.length || resume?.compilation_releases?.length" class="cv-section">
<h4>Recordings</h4>
<div v-if="resume?.solo_releases?.length" class="subsection">
<div class="subsection-title"><strong>Solo Albums</strong></div>
<div v-for="(rel, idx) in resume.solo_releases" :key="idx" class="item recording-item">
<span class="item-title">{{ rel.title }}</span>
<span class="item-detail ml-4">{{ rel.publisher }}. {{ rel.media_type }}. {{ rel.date }}.</span>
</div>
</div>
<div v-if="resume?.compilation_releases?.length" class="subsection">
<div class="subsection-title"><strong>Compilation Albums</strong></div>
<div v-for="(rel, idx) in resume.compilation_releases" :key="idx" class="item recording-item">
<span class="item-title">{{ rel.title }}</span>
<span class="item-detail ml-4">{{ rel.publisher }}. {{ rel.media_type }}. {{ rel.date }}.</span>
<div class="item-detail ml-4">featuring <span class="italic">{{ rel.work }}</span></div>
</div>
</div>
</section>
<!-- Residencies -->
<section v-if="resume?.residencies?.length" class="cv-section">
<h4>Residencies and Awards</h4>
<div class="cv-entry">
<div v-for="(res, idx) in resume.residencies" :key="idx" class="item">
<span class="item-title">{{ res.org }}</span>
<span class="item-meta">{{ res.date }}</span>
</div>
</div>
</section>
@ -154,57 +234,6 @@ useHead({
</p>
</section>
<!-- Publications -->
<section v-if="resume?.publications?.length" class="cv-section">
<h4>Publications</h4>
<div class="cv-entry">
<div v-for="pub in resume.publications" :key="pub.id" class="item">
<div class="item-title" v-html="pub.entryTags?.title"></div>
<div class="bib">
{{ pub.entryTags?.author }}
<span v-if="pub.entryTags?.editor">, editors {{ pub.entryTags.editor }}.</span>
<span v-if="pub.entryTags?.booktitle"><em>{{ pub.entryTags.booktitle }}.</em></span>
<span v-if="pub.entryTags?.journal"><em>{{ pub.entryTags.journal }}</em>,</span>
<span v-if="pub.entryTags?.volume">vol. {{ pub.entryTags.volume }}</span>
<span v-if="pub.entryTags?.publisher">{{ pub.entryTags.publisher }},</span> {{ pub.entryTags?.year }}.
</div>
</div>
</div>
</section>
<!-- Recordings -->
<section v-if="resume?.solo_releases?.length || resume?.compilation_releases?.length" class="cv-section">
<h4>Recordings</h4>
<div v-if="resume?.solo_releases?.length" class="subsection">
<div class="subsection-title"><strong>Solo Albums</strong></div>
<div v-for="(rel, idx) in resume.solo_releases" :key="idx" class="item recording-item">
<span class="item-title">{{ rel.title }}</span>
<span class="item-detail">{{ rel.publisher }}. {{ rel.media_type }}. {{ rel.date }}.</span>
</div>
</div>
<div v-if="resume?.compilation_releases?.length" class="subsection">
<div class="subsection-title"><strong>Compilation Albums</strong></div>
<div v-for="(rel, idx) in resume.compilation_releases" :key="idx" class="item recording-item">
<span class="item-title">{{ rel.title }}</span>
<span class="item-detail">{{ rel.publisher }}. {{ rel.media_type }}. {{ rel.date }}.</span>
<div class="item-detail">featuring <span class="italic">{{ rel.work }}</span></div>
</div>
</div>
</section>
<!-- Residencies -->
<section v-if="resume?.residencies?.length" class="cv-section">
<h4>Residencies and Awards</h4>
<div class="cv-entry">
<div v-for="(res, idx) in resume.residencies" :key="idx" class="item">
<span class="item-title">{{ res.org }}</span>
<span class="item-meta">{{ res.date }}</span>
</div>
</div>
</section>
<!-- References -->
<section v-if="resume?.references?.length" class="cv-section">
<h4>References</h4>
@ -323,6 +352,11 @@ useHead({
margin-bottom: 2px;
}
.hanging-indent {
padding-left: 1rem;
text-indent: -1rem;
}
.year-group {
margin-bottom: 12px;
margin-left: 10px;

View file

@ -1,8 +1,16 @@
import { readFileSync } from 'node:fs'
const dataFile = './server/data/resume.json'
const pubsFile = './server/data/publications.json'
export default defineEventHandler(() => {
const raw = readFileSync(dataFile, 'utf-8')
return JSON.parse(raw)
const resume = JSON.parse(raw)
const pubsRaw = readFileSync(pubsFile, 'utf-8')
const publications = JSON.parse(pubsRaw)
resume.publications = publications
return resume
})

View file

@ -5,7 +5,7 @@
"label": "Curriculum Vitae",
"email": "mwinter@unboundedpress.org",
"phone": "+49.176.6807.2118",
"website": "www.unboundedpress.org",
"website": "https://unboundedpress.org",
"summary": "here is a statement",
"location": {
"address": "Stockholmer Strasse 32",
@ -21,10 +21,26 @@
"position": "University Professor of Sound and Intermedia",
"website": "https://gmpu.ac.at/",
"startDate": "2025-03-03",
"summary": "Courses: Experimental Music Workshop",
"courses": [
"Experimental Music Workshop",
"Musicology Seminar",
"History of Tuning Systems",
"Sound and Intermedia curricula (launching Winter 2026)"
],
"highlights": [
"Topics: Sound Art and Intermedia",
"Activities and Responsibilities: Develop a sound and intermedia program, aid in development of a doctoral program, and conduct artistic research"
"Activities: Develop sound and intermedia program, aid in development of doctoral program, conduct artistic research, organize events"
],
"committees": [
{"role": "Vorsitzender (Chair)", "name": "Arbeitskreis für Gleichbehandlung"},
{"role": "Member", "name": "Studienkommission"},
{"role": "Member", "name": "Folep (Artistic Research Direction)"}
],
"events": [
{"name": "NOISE SILENCE ACTION", "type": "Concert"},
{"name": "Intentional and Random", "type": "Concert"},
{"name": "Embodied Differences", "type": "Workshop"},
{"name": "The Between Things", "type": "Forum"}
]
},
{