1
0
Fork 0

Compare commits

...

2 Commits

Author SHA1 Message Date
Ainsley Ellis 4852f100a3 Add XSLT for CVs 2025-05-31 07:27:12 -04:00
Ainsley Ellis 0b8f76b604 Add web development CV 2025-05-31 07:14:06 -04:00
7 changed files with 591 additions and 0 deletions

122
assets/css/all.css Executable file
View File

@ -0,0 +1,122 @@
body {
margin: 0;
}
h1,
h2,
h3,
h4 {
margin: 0;
}
h1 {
text-align: center;
}
h2 {
margin-block-end: 0.25em;
margin-bottom: 0.25em;
border-block-end: 0.0625em solid currentColor;
border-bottom: 0.0625em solid currentColor;
font-variant: small-caps;
}
.headline {
margin-block-end: 1em;
margin-bottom: 1em;
text-align: center;
}
address {
margin-block-end: 1em;
margin-bottom: 1em;
display: flex;
justify-content: space-between;
flex-wrap: wrap;
gap: 0.5em;
}
address>ul {
margin: 0;
padding: 0;
display: inline-block;
}
address> :last-child {
text-align: end;
}
p {
margin: 0;
}
hr {
width: 50%;
}
main > section+section,
article+article {
margin-block-start: 1em;
margin-top: 1em;
}
article>article {
margin-block-start: 0.5em;
margin-top: 0.5em;
}
article header {
display: flex;
justify-content: space-between;
flex-wrap: wrap;
gap: 0.5em;
}
article header p {
text-align: end;
}
article > p {
margin-block-start: 0.25em;
margin-top: 0.25em;
}
dl {
margin: 0;
}
dt {
font-weight: 700;
}
dd {
margin-inline-start: 2.5em;
margin-left: 2.5em;
}
#skills h3 {
margin-block-start: 0.25em;
margin-top: 0.25em;
}
#skills ul {
margin: 0;
padding: 0;
list-style-type: none;
}
#skills li {
display: inline;
}
#skills li::after {
content: ",";
}
#skills li:last-child::after {
content: none;
}
footer {
text-align: center;
}

16
assets/css/print.css Executable file
View File

@ -0,0 +1,16 @@
@page {
size: 8.5in 11in;
margin: 0.5in;
padding: 0;
}
body { margin: 0; }
article,
footer {
break-inside: avoid-page;
}
a:visited {
color: blue;
}

8
assets/css/screen.css Executable file
View File

@ -0,0 +1,8 @@
body {
padding: 1em;
}
main {
margin: 0 auto;
max-width: 50em;
}

283
cvs/web-development.xml Normal file
View File

@ -0,0 +1,283 @@
<?xml version="1.0" encoding="UTF-8"?>
<cv>
<work-history>
<company>
<name>edX</name>
<role>
<title>Full-Stack Bootcamp Teaching Assistant</title>
<duration>
<start datetime="2021-06">June 2021</start>
</duration>
<description>
<p>
As a teaching assistant, I am responsible for
fielding student questions before, during, and after
lectures; I also serve as a substitute instructor
when required. I have worked with hundreds of
students from various backgrounds, explaining
everything from for loops to full-stack deployment.
After spending thousands of hours assisting
learners, I have a deep knowledge of current front-
and back-end technologies, frameworks, and
libraries.
</p>
</description>
</role>
<role>
<title>Senior Tutor</title>
<duration>
<start datetime="2021-10">October 2021</start>
</duration>
<description>
<p>
I was recognised as a sought-after, highly effective
tutor to recieve this title. I worked around the
busy schedules of our students, helping them build
individualised learning patterns, and I explained
industry best practices for full-stack developers
through the lens of their existing knowledge.
</p>
</description>
</role>
</company>
<company>
<name>Sixfold</name>
<role>
<title>Publisher &amp; Maintainer</title>
<duration>
<start datetime="2024-05">May 2024</start>
</duration>
<description>
<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>
<p>
I took over the maintenance of this 11-year-old PHP site and split it in two: a static Eleventy site presents old
issues, contest instructions, and digital publishing
guides for the more than 9,000 monthly visitors, and
a rebuilt PHP site is responsible for running the
quarterly contests for our thirty-one thousand
members. Both sites were migrated from Amazon Web
Services to a basic Linode server, decreasing
monthly costs by more than fifty times. This single
five-dollar server also runs a Forgejo instance that
hosts the source code for both sites. I edit,
proofread, and publish both the digital and print
publications.
</p>
</description>
</role>
</company>
<company>
<name>Public Offering</name>
<role>
<title>Founder and Infrastructure Engineer</title>
<duration>
<start datetime="2022-11">November 2022</start>
</duration>
<description>
<p>
Public Offering is the not-for-profit digital services
organisation I created to help build a better web.
</p>
<p>
I worked with interested individuals to build
static, performant, multilingual websites that
showcased their personality. These sites are edited
with a bespoke, open-source CMS that gets out of
their way. I built the CMS to gain a better
understanding of how they worked, and to implement
features that currently available applications did
not yet have, such as a multilingual media library,
responsive editor design, and non-image media items.
It also utilises a custom, dependency-free router I
wrote for the core Node HTTP server. We also offer
an invite-only Forgejo instance and a public
Etherpad instance.
</p>
</description>
</role>
</company>
<company>
<name>Leibowitz Branding &amp; Design</name>
<role>
<title>Full-Stack Developer and Accessibility Specialist</title>
<duration>
<start datetime="2022-09">September 2022</start>
<end datetime="2023-05">May 2023</end>
</duration>
<description>
<p>
After regularly advocating for accessible design
processes, I was given a promotion that emphasised
this work. I performed detailed accessibility audits
for our existing clients using skills from my
Trusted Tester certification. I presented concise,
prioritised accessibility reports with
citations and clear remediation steps. My new role
also involved working with account mangers to
improve the agency's information architecture and
simplify inter-department communication.
</p>
</description>
</role>
<role>
<title>Developer</title>
<duration>
<start datetime="2021-05">May 2021</start>
<end datetime="2022-09">September 2022</end>
</duration>
<description>
<p>
I came on as the sole in-house developer and
immediately took charge of the agency's dozens of
client sites, performing regular maintenance of
plugins and third-party data feeds. After gaining
familiarity with their work, I began introducing
accessible design principles onto our design
process, working with our designers to catch
accessibility issues before the development phase.
</p>
</description>
</role>
</company>
<company>
<name>Freelance Work</name>
<role>
<title>Various International Digital Works</title>
<duration>
<start datetime="2018-09">September 2018</start>
</duration>
<description>
<p>
I have worked with theater companies, non-profits,
and creative individuals with unique digital ideas.
These word-of-mouth commissions have allowed me to
travel to various countries, participate in
festivals, engage with new technologies, and form
invaluable friendships. The remote portion of this
work involved communicating across various mediums
and time zones with both clients and testers.
</p>
</description>
</role>
</company>
</work-history>
<foss-contributions>
<project>
<name>GoAccess</name>
<activity>Contributor</activity>
<description>
<p>
I refactored the generated log reports to use semantic
HTML, improving accessibility and simplifying
maintenance. I also began replacing outdated
dependencies with native browser alternatives to
decrease report sizes and close years-old issues.
</p>
</description>
</project>
<project>
<name>ProseMirror</name>
<activity>Plugin Developer, Forum Participant</activity>
<description>
<p>
I've published four ProseMirror plugins—a document
outline, a semantic editing menu, a node insertion menu,
and a node inspector—to simplify more complex document
manipulation tasks.
</p>
</description>
</project>
</foss-contributions>
<education>
<institution>
<name>New York University</name>
<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>
</degree>
<degree>
<level>Minor</level>
<concentration>Web Programming and Applications</concentration>
<awarded>2020-12</awarded>
</degree>
</institution>
</education>
<skills>
<category>
<name>Certifications</name>
<item>Section 508: DHS Trusted Tester</item>
</category>
<category>
<name>Languages</name>
<item>(X)HTML</item>
<item>XML</item>
<item>XSLT</item>
<item>CSS</item>
<item>JavaScript</item>
<item>PHP</item>
<item>Python</item>
<item>Go</item>
<item>SQL/MySQL/PostgreSQL</item>
<item>NoSQL</item>
</category>
<category>
<name>Operating Systems</name>
<item>Ubuntu Linux</item>
<item>Microsoft Windows</item>
<item>MacOS</item>
<item>Arch Linux</item>
</category>
<category>
<name>Programs</name>
<item>Vim</item>
<item>Git</item>
<item>Bash</item>
<item>Inkscape</item>
<item>Figma</item>
<item>Adobe Creative Cloud</item>
<item>Unity</item>
<item>Final Cut</item>
</category>
<category>
<name>Frameworks, Libraries, and Tools</name>
<item>Web Content Accessibility Guidelines (WCAG)</item>
<item>htmx</item>
<item>Web Components</item>
<item>WebRTC</item>
<item>static-site generators</item>
<item>content management systems</item>
<item>EPUB</item>
<item>Node.js</item>
<item>Bootstrap</item>
<item>Tailwind</item>
<item>SSH</item>
<item>SMTP</item>
<item>nginx</item>
<item>Apache</item>
<item>Open Graph</item>
<item>React/Redux</item>
<item>TypeScript</item>
<item>Electron</item>
<item>Svelte</item>
<item>Cypress</item>
<item>Jest</item>
<item>Docker</item>
<item>Vonage/Nexmo</item>
</category>
<category>
<name>Miscellaneous</name>
<item>Database administration</item>
<item>Server upkeep</item>
<item>UI/UX</item>
<item>Captioning</item>
<item>Transcription</item>
</category>
</skills>
</cv>

132
templates/cv.xsl Normal file
View File

@ -0,0 +1,132 @@
<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<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>
to
<xsl:choose>
<xsl:when test="./duration/end">
<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:otherwise>Present</xsl:otherwise>
</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! -->
<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/header.xml')"/>
<!-- <xsl:copy-of select="/cv"/> -->
<section id="objective">
<h2>Objective</h2>
<!-- select specific objective from xml file -->
<xsl:copy-of select="document('./fragments/objectives.xml')/objectives/objective[@name='web-development']/node()"/>
</section>
<section id="work-history">
<h2>Work History</h2>
<xsl:for-each select="./work-history/company">
<xsl:call-template name="company"/>
</xsl:for-each>
</section>
<section id="open-source-contributions">
<h2>Open-source Contributions</h2>
<xsl:for-each select="./foss-contributions/project">
<xsl:call-template name="project"/>
</xsl:for-each>
</section>
<section id="education">
<h2>Education</h2>
<xsl:for-each select="./education/institution">
<xsl:call-template name="institution"/>
</xsl:for-each>
</section>
<section id="skills">
<h2>Skills</h2>
<xsl:for-each select="./skills/category">
<xsl:call-template name="skill-category"/>
</xsl:for-each>
</section>
</main>
<hr/>
<xsl:if test="$hash">
<footer>
<p>
<small>Built with XSLT (<a>
<xsl:attribute name="href">https://git.pub0.org/heyainsleymae/curriculum-vitae/src/commit/<xsl:value-of select="$hash" /></xsl:attribute>view commit</a>)</small></p>
</footer>
</xsl:if>
</body>
</html>
</xsl:template>
</xsl:stylesheet>

View File

@ -0,0 +1,16 @@
<?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">Ainsley Ellis &lt;ainsleymae@proton.me&gt;</a>
</li>
<li>Website: <a href="https://ains.me">ains.me</a></li>
<li>
<code>heyainsleymae</code> on <a href="https://codeberg.org/heyainsleymae">Codeberg</a>, <a href="https://github.com/heyainsleymae">GitHub</a>, and <a href="https://npmjs.com/~heyainsleymae">npm</a>
</li>
</ul>
<p>America/New_York (NYC)<br />Remote or hybrid work, open to relocation</p>
</address>
</header>

View File

@ -0,0 +1,14 @@
<objectives>
<objective name="web-development">
<p>
I am an accomplished full-stack developer with a passion for
accessibility and open web standards. I have experience building large, scalable
projects from scratch, improving internal processes and
design systems, and mentoring junior engineers. I hold a
<b>Section 508 Trusted Tester</b> certification from the United
States Department of Homeland Security. I want to work with a
diverse team to build accessible products that entertain,
inform, or assist the public.
</p>
</objective>
</objectives>