Update CV: improve teaching format, publications, and add publications section
This commit is contained in:
parent
70dee4681b
commit
161d23aba7
148
pages/cv.vue
148
pages/cv.vue
|
|
@ -91,9 +91,50 @@ useHead({
|
||||||
<span class="item-subtitle">{{ teach.position }}</span>
|
<span class="item-subtitle">{{ teach.position }}</span>
|
||||||
</div>
|
</div>
|
||||||
<div class="item-detail">{{ formatMonth(teach.startDate) }} – {{ formatMonth(teach.endDate) }}</div>
|
<div class="item-detail">{{ formatMonth(teach.startDate) }} – {{ formatMonth(teach.endDate) }}</div>
|
||||||
<ul v-if="teach.highlights" class="item-list">
|
<template v-if="teach.highlights || teach.courses">
|
||||||
<li v-for="h in teach.highlights">{{ h }}</li>
|
<div class="item-detail ml-4 hanging-indent">
|
||||||
</ul>
|
<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>
|
||||||
</div>
|
</div>
|
||||||
</section>
|
</section>
|
||||||
|
|
@ -127,9 +168,48 @@ useHead({
|
||||||
<span class="item-subtitle">{{ w.position }}</span>
|
<span class="item-subtitle">{{ w.position }}</span>
|
||||||
</div>
|
</div>
|
||||||
<div class="item-detail">{{ formatMonth(w.startDate) }} – {{ formatMonth(w.endDate) }}</div>
|
<div class="item-detail">{{ formatMonth(w.startDate) }} – {{ formatMonth(w.endDate) }}</div>
|
||||||
<ul v-if="w.highlights" class="item-list">
|
<div v-if="w.summary" class="item-detail ml-4 hanging-indent">
|
||||||
<li v-for="h in w.highlights">{{ h }}</li>
|
<strong>Project:</strong> {{ w.summary.replace('Project: ', '') }}
|
||||||
</ul>
|
</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>
|
||||||
</div>
|
</div>
|
||||||
</section>
|
</section>
|
||||||
|
|
@ -154,57 +234,6 @@ useHead({
|
||||||
</p>
|
</p>
|
||||||
</section>
|
</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 -->
|
<!-- References -->
|
||||||
<section v-if="resume?.references?.length" class="cv-section">
|
<section v-if="resume?.references?.length" class="cv-section">
|
||||||
<h4>References</h4>
|
<h4>References</h4>
|
||||||
|
|
@ -323,6 +352,11 @@ useHead({
|
||||||
margin-bottom: 2px;
|
margin-bottom: 2px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.hanging-indent {
|
||||||
|
padding-left: 1rem;
|
||||||
|
text-indent: -1rem;
|
||||||
|
}
|
||||||
|
|
||||||
.year-group {
|
.year-group {
|
||||||
margin-bottom: 12px;
|
margin-bottom: 12px;
|
||||||
margin-left: 10px;
|
margin-left: 10px;
|
||||||
|
|
|
||||||
|
|
@ -1,8 +1,16 @@
|
||||||
import { readFileSync } from 'node:fs'
|
import { readFileSync } from 'node:fs'
|
||||||
|
|
||||||
const dataFile = './server/data/resume.json'
|
const dataFile = './server/data/resume.json'
|
||||||
|
const pubsFile = './server/data/publications.json'
|
||||||
|
|
||||||
export default defineEventHandler(() => {
|
export default defineEventHandler(() => {
|
||||||
const raw = readFileSync(dataFile, 'utf-8')
|
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
|
||||||
})
|
})
|
||||||
|
|
|
||||||
|
|
@ -5,7 +5,7 @@
|
||||||
"label": "Curriculum Vitae",
|
"label": "Curriculum Vitae",
|
||||||
"email": "mwinter@unboundedpress.org",
|
"email": "mwinter@unboundedpress.org",
|
||||||
"phone": "+49.176.6807.2118",
|
"phone": "+49.176.6807.2118",
|
||||||
"website": "www.unboundedpress.org",
|
"website": "https://unboundedpress.org",
|
||||||
"summary": "here is a statement",
|
"summary": "here is a statement",
|
||||||
"location": {
|
"location": {
|
||||||
"address": "Stockholmer Strasse 32",
|
"address": "Stockholmer Strasse 32",
|
||||||
|
|
@ -21,10 +21,26 @@
|
||||||
"position": "University Professor of Sound and Intermedia",
|
"position": "University Professor of Sound and Intermedia",
|
||||||
"website": "https://gmpu.ac.at/",
|
"website": "https://gmpu.ac.at/",
|
||||||
"startDate": "2025-03-03",
|
"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": [
|
"highlights": [
|
||||||
"Topics: Sound Art and Intermedia",
|
"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"}
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue