1
0
Fork 0

Compare commits

...

11 Commits

Author SHA1 Message Date
Ainsley Ellis 998b3d131a Add "Miscellaneous" skills to grad school CV 2025-06-03 00:57:02 -04:00
Ainsley Ellis d7e894c444 Expand "UI/UX" to their full terms 2025-06-03 00:52:51 -04:00
Ainsley Ellis dca66513e5 Ignore transcripts folder 2025-06-03 00:42:02 -04:00
Ainsley Ellis cd1b4b28f8 Fix file path of distribution folder 2025-06-03 00:41:04 -04:00
Ainsley Ellis 19f3d1725a Add graduate school template 2025-06-03 00:39:35 -04:00
Ainsley Ellis 46a7c8e8e2 Move smaller, reusable templates to separate file 2025-06-03 00:31:17 -04:00
Ainsley Ellis 5e50549d2e Add two description types: brief and full 2025-06-03 00:29:08 -04:00
Ainsley Ellis 081dca1390 Move skill category names to attribute, add "Languages" 2025-06-03 00:00:18 -04:00
Ainsley Ellis 3e60ec4798 Add details to institutions, use them in template
- Location (city, state, and country)
- Specific school name
- Start and end dates
- Grade point average
- Nest honors in their own element
2025-06-02 20:16:25 -04:00
Ainsley Ellis e95a3a05c3 Add page numbers in print 2025-06-02 20:00:46 -04:00
Ainsley Ellis 28bd7f840a Adjust description list styling 2025-06-02 19:59:40 -04:00
12 changed files with 287 additions and 103 deletions

1
.gitignore vendored
View File

@ -1 +1,2 @@
dist
transcripts

View File

@ -100,14 +100,26 @@ dl {
}
dt {
margin-block-start: 0.375em;
margin-top: 0.375em;
font-weight: 700;
}
dd {
margin-inline-start: 2.5em;
margin-left: 2.5em;
margin-inline-start: 1.5em;
margin-left: 1.5em;
}
#education hgroup h3 {
display: inline;
}
#education hgroup p {
float: end;
float: right;
}
#skills h3 {
margin-block-start: 0.25em;
margin-top: 0.25em;

View File

@ -2,6 +2,10 @@
size: 8.5in 11in;
margin: 0.5in;
padding: 0;
@bottom-center {
content: counter(page);
}
}
body { margin: 0; }

118
cv.xml
View File

@ -8,7 +8,7 @@
<duration>
<start datetime="2021-06">June 2021</start>
</duration>
<description>
<description type="full">
<p>
As a teaching assistant, I am responsible for
fielding student questions before, during, and after
@ -22,13 +22,18 @@
libraries.
</p>
</description>
<description type="brief">
<p>
I have worked with hundreds of students from various backgrounds over thousands of hours, explaining complex computer science concepts in a digestible ad approachable manner.
</p>
</description>
</role>
<role>
<title>Senior Tutor</title>
<duration>
<start datetime="2021-10">October 2021</start>
</duration>
<description>
<description type="full">
<p>
I was recognised as a sought-after, highly effective
tutor to recieve this title. I worked around the
@ -38,6 +43,11 @@
through the lens of their existing knowledge.
</p>
</description>
<description type="brief">
<p>
I was recognised as a sought-after, highly effective tutor to receive this title; I provided individualised assistance to learners, helping them form useful working habits and empowering them to follow their curiosity when programming.
</p>
</description>
</role>
</company>
<company>
@ -47,7 +57,7 @@
<duration>
<start datetime="2024-05">May 2024</start>
</duration>
<description>
<description type="full">
<p>
<i>Sixfold</i> is a writer-voted journal of poetry and
short stories. I am in charge of the publication's
@ -68,6 +78,13 @@
publications.
</p>
</description>
<description type="brief">
<p>
<i>Sixfold</i> is a writer-voted journal of poetry and
short stories. I am in charge of the publication's
website and overall digital presence.
</p>
</description>
</role>
</company>
<company>
@ -77,7 +94,7 @@
<duration>
<start datetime="2022-11">November 2022</start>
</duration>
<description>
<description type="full">
<p>
Public Offering is the not-for-profit digital services
organisation I created to help build a better web.
@ -98,6 +115,12 @@
Etherpad instance.
</p>
</description>
<description type="brief">
<p>
Public Offering is the not-for-profit digital services
organisation I created to help build a better web. I provide pay-what-you-can web hosting and a collection of other useful digital tools.
</p>
</description>
</role>
</company>
<company>
@ -108,7 +131,7 @@
<start datetime="2022-09">September 2022</start>
<end datetime="2023-05">May 2023</end>
</duration>
<description>
<description type="full">
<p>
After regularly advocating for accessible design
processes, I was given a promotion that emphasised
@ -122,6 +145,13 @@
simplify inter-department communication.
</p>
</description>
<description type="brief">
<p>
After regularly advocating for accessible design
processes, I was given a promotion that emphasised
this work, which allowed me to I performed detailed accessibility audits for both new and existing clients.
</p>
</description>
</role>
<role>
<title>Developer</title>
@ -129,7 +159,7 @@
<start datetime="2021-05">May 2021</start>
<end datetime="2022-09">September 2022</end>
</duration>
<description>
<description type="full">
<p>
I came on as the sole in-house developer and
immediately took charge of the agency's dozens of
@ -141,6 +171,11 @@
accessibility issues before the development phase.
</p>
</description>
<description type="brief">
<p>
I was hired as the sole in-house developer for this small design agency, and immediately took over mantenance for its dozens of client sites, building new workflows not only for development, but for inter-agency communication.
</p>
</description>
</role>
</company>
<company>
@ -150,7 +185,7 @@
<duration>
<start datetime="2018-09">September 2018</start>
</duration>
<description>
<description type="full">
<p>
I have worked with theater companies, non-profits,
and creative individuals with unique digital ideas.
@ -162,6 +197,12 @@
and time zones with both clients and testers.
</p>
</description>
<description type="brief">
<p>
I have worked with theater companies, non-profits,
and creative individuals on unique digital ideas that have been presented as part of international arts festivals.
</p>
</description>
</role>
</company>
<company>
@ -173,7 +214,7 @@
<start datetime="2025-01">January 2025</start>
<end datetime="2025-01">January 2025</end>
</duration>
<description>
<description type="brief">
<p>
I designed the lighting in collaboration with the
performers during their one and only rehearsal in
@ -193,7 +234,7 @@
<start datetime="2024-05">May 2024</start>
<end datetime="2024-08">August 2024</end>
</duration>
<description>
<description type="full">
<p>
Over the show's three-month run, I was in charge of
greeting guests; scanning tickets; and communicating
@ -211,6 +252,9 @@
departure.
</p>
</description>
<description type="brief">
<p>Over the three-month run of this immersive Off-Off-Broadway show, I handled the ticket sales across multiple platforms, managed the front-of-house area while checking in guests, and set up the elaborate lobby decorations before, during, and after each performance.</p>
</description>
<url>https://www.sheencenter.org/events/detail/odd-man-out</url>
</role>
</company>
@ -223,7 +267,7 @@
<start datetime="2024-03">March 2024</start>
<end datetime="2024-04">April 2024</end>
</duration>
<description>
<description type="brief">
<p>
I was in charge of maintaining the front-of-house,
selling merchandise, and scanning tickets via
@ -244,7 +288,7 @@
<start datetime="2023-05">May 2023</start>
<end datetime="2023-06">June 2023</end>
</duration>
<description>
<description type="brief">
<p>
I sourced the sound effects and music for the show,
organising them into a QLab workspace for the
@ -264,7 +308,7 @@
<start datetime="2020-02">February 2020</start>
<end datetime="2020-03">March 2020</end>
</duration>
<description>
<description type="brief">
<p>I worked with the writer-director to create music and sound effects for this one-woman show. I was also in charge of operating the sound board during the performances.</p>
</description>
<url>https://www.broadwayworld.com/off-off-broadway/article/THIS-FEELING-A-New-Romantic-Comedy-Premieres-At-The-Frigid-Fringe-Festival-20200225</url>
@ -275,7 +319,7 @@
<project>
<name>GoAccess</name>
<activity>Contributor</activity>
<description>
<description type="brief">
<p>
I refactored the generated log reports to use semantic
HTML, improving accessibility and simplifying
@ -288,7 +332,7 @@
<project>
<name>ProseMirror</name>
<activity>Plugin Developer, Forum Participant</activity>
<description>
<description type="brief">
<p>
I've published four ProseMirror plugins—a document
outline, a semantic editing menu, a node insertion menu,
@ -301,27 +345,42 @@
<education>
<institution>
<name>New York University</name>
<location>New York, NY, United States</location>
<degree>
<level>Bachelor of Fine Arts</level>
<concentration>Theatre</concentration>
<awarded>2020-12</awarded>
<distinction>Magna cum laude</distinction>
<distinction>Tisch School of the Arts Deans List</distinction>
<school>Tisch School of the Arts</school>
<duration>
<start datetime="2017-09">September 2017</start>
<end datetime="2020-12">December 2020</end>
</duration>
<gpa>3.851</gpa>
<honors>
<item>Magna cum laude</item>
<item>Tisch School of the Arts Deans List</item>
</honors>
</degree>
<degree>
<level>Minor</level>
<concentration>Web Programming and Applications</concentration>
<awarded>2020-12</awarded>
<school>Courant Institute of Mathematical Sciences</school>
<duration>
<start datetime="2018-01">January 2018</start>
<end datetime="2020-12">December 2020</end>
</duration>
</degree>
</institution>
</education>
<skills>
<category>
<name>Certifications</name>
<category name="Languages">
<item>Romanian (A1; reading, writing, speaking, listening)</item>
<item>Irish Gaelic (A1; reading, writing)</item>
<item>Portuguese (A1; reading, writing)</item>
</category>
<category name="Certifications">
<item>Section 508: DHS Trusted Tester</item>
</category>
<category>
<name>Languages</name>
<category name="Programming &amp; Scripting Languages">
<item>(X)HTML</item>
<item>XML</item>
<item>XSLT</item>
@ -333,15 +392,13 @@
<item>SQL/MySQL/PostgreSQL</item>
<item>NoSQL</item>
</category>
<category>
<name>Operating Systems</name>
<category name="Operating Systems">
<item>Ubuntu Linux</item>
<item>Microsoft Windows</item>
<item>MacOS</item>
<item>Arch Linux</item>
</category>
<category>
<name>Programs</name>
<category name="Programs">
<item>Vim</item>
<item>Git</item>
<item>Bash</item>
@ -351,8 +408,7 @@
<item>Unity</item>
<item>Final Cut</item>
</category>
<category>
<name>Frameworks, Libraries, and Tools</name>
<category name="Frameworks, Libraries, and Tools">
<item>Web Content Accessibility Guidelines (WCAG)</item>
<item>htmx</item>
<item>Web Components</item>
@ -377,11 +433,11 @@
<item>Docker</item>
<item>Vonage/Nexmo</item>
</category>
<category>
<name>Miscellaneous</name>
<category name="Miscellaneous">
<item>Database administration</item>
<item>Server upkeep</item>
<item>UI/UX</item>
<item>User interface design</item>
<item>User experience design</item>
<item>Captioning</item>
<item>Transcription</item>
</category>

View File

@ -1,7 +1,7 @@
#!/bin/sh
hash="$(git rev-parse HEAD)"
mkdir -p ../dist
mkdir -p ./dist
xsltproc --stringparam hash "$hash" ./templates/cv.xsl cv.xml > ./dist/cv.html
weasyprint --quiet ./dist/cv.html ./dist/cv.pdf

7
scripts/grad-school.sh Normal file
View File

@ -0,0 +1,7 @@
#!/bin/sh
hash="$(git rev-parse HEAD)"
mkdir -p ./dist
xsltproc ./templates/grad-school.xsl cv.xml > ./dist/grad-school.html
weasyprint --quiet ./dist/grad-school.html ./dist/grad-school.pdf

View File

@ -5,7 +5,7 @@ company="$2" || ""
date="$(date +'%d %B %Y')"
signature="$(base64 ./assets/signature.svg)"
mkdir -p ../dist
mkdir -p ./dist
echo $body | xsltproc --stringparam company "$company" --stringparam date "$date" --stringparam signature "$signature" ./templates/letter.xsl - > ./dist/letter.html
weasyprint --quiet ./dist/letter.html ./dist/letter.pdf

View File

@ -1,75 +1,8 @@
<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:import href="./index.xsl"/>
<xsl:output method="html" version="1.0" encoding="UTF-8" indent="yes" standalone="yes" doctype-system="about:legacy-compat" />
<xsl:param name="title" select="'Ainsley Ellis CV'"/>
<xsl:template name="company">
<article>
<h3><xsl:value-of select="./name/text()"/></h3>
<xsl:for-each select="./role">
<xsl:call-template name="role"/>
</xsl:for-each>
</article>
</xsl:template>
<xsl:template name="project">
<article>
<header>
<h3><xsl:value-of select="./name/text()" /></h3>
<p>
<xsl:value-of select="./activity/text()" />
</p>
</header>
<xsl:copy-of select="./description/node()" />
</article>
</xsl:template>
<xsl:template name="institution">
<article>
<h3><xsl:value-of select="./name/text()" /></h3>
<dl>
<xsl:for-each select="./degree">
<dt><xsl:value-of select="./level/text()" /> in <xsl:value-of select="./concentration/text()" /></dt>
<xsl:for-each select="./distinction">
<dd><xsl:value-of select="./text()" /></dd>
</xsl:for-each>
</xsl:for-each>
</dl>
</article>
</xsl:template>
<xsl:template name="skill-category">
<section>
<h3><xsl:value-of select="./name/text()" /></h3>
<ul role="list">
<xsl:for-each select="./item">
<li><xsl:value-of select="./text()" /></li>
</xsl:for-each>
</ul>
</section>
</xsl:template>
<xsl:template name="role">
<article>
<header>
<h4><xsl:value-of select="./title/text()" /></h4>
<p>
<time>
<xsl:attribute name="datetime">
<xsl:value-of select="./duration/start[@datetime]" />
</xsl:attribute>
<xsl:value-of select="./duration/start/text()" />
</time>
<xsl:choose>
<xsl:when test="./duration/start[@datetime] != ./duration/end[@datetime]">&#160;to&#160;<time>
<xsl:attribute name="datetime">
<xsl:value-of select="./duration/end[@datetime]" />
</xsl:attribute>
<xsl:value-of select="./duration/end/text()" />
</time>
</xsl:when>
<xsl:when test="not(boolean(./duration/end))">&#160;to&#160;Present</xsl:when>
</xsl:choose>
</p>
</header>
<xsl:copy-of select="./description/node()" />
</article>
</xsl:template>
<xsl:template match="/cv" data-xmlns="http://www.w3.org/1999/xhtml">
<html lang="en" dir="ltr">
<!-- The Yesterweb is dead, long live the Yesterweb! -->

View File

@ -0,0 +1,13 @@
<?xml version="1.0" encoding="UTF-8"?>
<header>
<h1>Ainsley Ellis</h1>
<p class="headline">Artist, Programmer, Digital Citizen</p>
<address>
<ul role="list">
<li>Email: <a href="mailto:ainsleymae@proton.me">ainsleymae@proton.me</a>
</li>
<li>Website: <a href="https://ains.me">ains.me</a></li>
</ul>
<p>New York, NY, United States</p>
</address>
</header>

View File

@ -23,4 +23,10 @@
run smoothly.
</p>
</objective>
<objective name="grad-school">
<p>
I am a multidisciplinary artist and web developer that enjoys using my skills to assist others. As we enter an increasingly polarised and digitised world, I want to deepen my understanding of the building blocks of communication so that I may more effectively employ it in both my work and my everyday life, breaking down barriers between people and empowering them to navigate both the outside world and their own internal world more confidently.
</p>
</objective>
</objectives>

53
templates/grad-school.xsl Normal file
View File

@ -0,0 +1,53 @@
<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:import href="./index.xsl"/>
<xsl:output method="html" version="1.0" encoding="UTF-8" indent="yes" standalone="yes" doctype-system="about:legacy-compat" />
<xsl:param name="title" select="'Ainsley Ellis CV'"/>
<xsl:template match="/cv" data-xmlns="http://www.w3.org/1999/xhtml">
<html lang="en" dir="ltr">
<!-- The Yesterweb is dead, long live the Yesterweb! -->
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<meta name="color-scheme" content="light dark" />
<title><xsl:value-of select="$title"/></title>
<link rel="stylesheet" href="../assets/css/all.css" />
<link rel="stylesheet" href="../assets/css/screen.css" media="screen" />
<link rel="stylesheet" href="../assets/css/print.css" media="print" />
</head>
<body>
<main>
<xsl:copy-of select="document('./fragments/grad-school/header.xml')"/>
<!-- <xsl:copy-of select="/cv"/> -->
<section id="motivation">
<h2>Motivation</h2>
<!-- select specific objective from xml file -->
<xsl:copy-of select="document('./fragments/objectives.xml')/objectives/objective[@name='grad-school']/node()"/>
</section>
<section id="education">
<h2>Education</h2>
<xsl:for-each select="./education/institution">
<xsl:call-template name="institution"/>
</xsl:for-each>
</section>
<section id="work-history">
<h2>Work History</h2>
<xsl:for-each select="./work-history/company">
<xsl:call-template name="company">
<xsl:with-param name="type">brief</xsl:with-param>
</xsl:call-template>
</xsl:for-each>
</section>
<section id="skills">
<h2>Relevant Skills</h2>
<xsl:for-each select="./skills/category">
<xsl:if test="@name = 'Languages' or @name = 'Miscellaneous'">
<xsl:call-template name="skill-category"/>
</xsl:if>
</xsl:for-each>
</section>
</main>
</body>
</html>
</xsl:template>
</xsl:stylesheet>

99
templates/index.xsl Normal file
View File

@ -0,0 +1,99 @@
<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template name="company">
<xsl:param name="type">full</xsl:param>
<article>
<h3><xsl:value-of select="./name/text()"/></h3>
<xsl:for-each select="./role">
<article>
<header>
<h4><xsl:value-of select="./title/text()" /></h4>
<p><xsl:call-template name="duration" /></p>
</header>
<xsl:if test="$type = 'full' and not(./description[@type=$type]/node())">
<xsl:copy-of select="./description[@type='brief']/node()" />
</xsl:if>
<xsl:copy-of select="./description[@type=$type]/node()" />
</article>
</xsl:for-each>
</article>
</xsl:template>
<xsl:template name="duration">
<time>
<xsl:attribute name="datetime">
<xsl:value-of select="./duration/start[@datetime]" />
</xsl:attribute>
<xsl:value-of select="./duration/start/text()" />
</time>
<xsl:choose>
<xsl:when test="./duration/start[@datetime] != ./duration/end[@datetime]">&#160;to&#160;<time>
<xsl:attribute name="datetime">
<xsl:value-of select="./duration/end[@datetime]" />
</xsl:attribute>
<xsl:value-of select="./duration/end/text()" />
</time>
</xsl:when>
<xsl:when test="not(boolean(./duration/end))">&#160;to&#160;Present</xsl:when>
</xsl:choose>
</xsl:template>
<xsl:template name="institution">
<article>
<hgroup>
<h3><xsl:value-of select="./name/text()" /></h3>
<p><xsl:value-of select="./location" /></p>
</hgroup>
<dl>
<xsl:for-each select="./degree">
<dt><xsl:value-of select="./level/text()" /> in <xsl:value-of select="./concentration/text()" /></dt>
<xsl:if test="boolean(./school)">
<dd>
<xsl:text>School: </xsl:text>
<xsl:value-of select="./school/text()" />
</dd>
</xsl:if>
<dd>
<xsl:text>Attended: </xsl:text>
<xsl:call-template name="duration" />
</dd>
<xsl:if test="boolean(./gpa)">
<dd>GPA: <xsl:value-of select="./gpa/text()" /></dd>
</xsl:if>
<xsl:if test="boolean(./honors)">
<dd>
<xsl:text>Honours: </xsl:text>
<xsl:for-each select="./honors/item">
<xsl:value-of select="./text()" />
<xsl:if test="not(position()=last())">, </xsl:if>
</xsl:for-each>
</dd>
</xsl:if>
</xsl:for-each>
</dl>
</article>
</xsl:template>
<xsl:template name="project">
<xsl:param name="type">full</xsl:param>
<article>
<header>
<h3><xsl:value-of select="./name/text()" /></h3>
<p>
<xsl:value-of select="./activity/text()" />
</p>
</header>
<xsl:if test="$type = 'full' and not(./description[@type=$type]/node())">
<xsl:copy-of select="./description[@type='brief']/node()" />
</xsl:if>
<xsl:copy-of select="./description[@type=$type]/node()" />
</article>
</xsl:template>
<xsl:template name="skill-category">
<section>
<h3><xsl:value-of select="@name" /></h3>
<ul role="list">
<xsl:for-each select="./item">
<li><xsl:value-of select="./text()" /></li>
</xsl:for-each>
</ul>
</section>
</xsl:template>
</xsl:stylesheet>