281 lines
7.6 KiB
Plaintext
281 lines
7.6 KiB
Plaintext
<%
|
||
function linkInDiv(url) {
|
||
if (!url) return ''
|
||
return `<div class="url row"><a href="${url}">${fn.noSchemaURL(url)}</a></div>`
|
||
}
|
||
%>
|
||
|
||
<!-- Basics -->
|
||
<section class="basics-section">
|
||
<h1><%= cv.basics.name %></h1>
|
||
<% if (cv.basics.label) { %>
|
||
<div class="label row"><%= cv.basics.label %></div>
|
||
<% } %>
|
||
<% if (cv.basics.url) { %>
|
||
<div class="url row">
|
||
<%- fn.getIconSVG('mdi:link-variant') %>
|
||
<a href="<%= cv.basics.url %>"><%= fn.noSchemaURL(cv.basics.url) %></a>
|
||
</div>
|
||
<% } %>
|
||
<% if (cv.basics.summary) { %>
|
||
<div class="summary p"><%- fn.renderMarkdown(cv.basics.summary) %></div>
|
||
<% } %>
|
||
<div class="contact row">
|
||
<% if (cv.basics.email) { %>
|
||
<div class="item">
|
||
<%- fn.getIconSVG('mdi:email') %>
|
||
<span><a href="mailto:<%= cv.basics.email %>"><%= cv.basics.email %></a></span>
|
||
</div>
|
||
<% } %>
|
||
<% if (cv.basics.phone) { %>
|
||
<div class="item">
|
||
<%- fn.getIconSVG('mdi:phone') %>
|
||
<span><%= cv.basics.phone %></span>
|
||
</div>
|
||
<% } %>
|
||
<% if (cv.basics.location) { %>
|
||
<div class="item">
|
||
<%- fn.getIconSVG('mdi:location') %>
|
||
<span><%= cv.basics.location.city %>, <%= cv.basics.location.countryCode %></span>
|
||
</div>
|
||
<% } %>
|
||
</div>
|
||
</section>
|
||
|
||
|
||
<%
|
||
function dateRange(item, level) {
|
||
let {startDate, endDate} = item
|
||
if (!startDate && !endDate) return ''
|
||
let format
|
||
// level: 1: year, 2: month, 3: day
|
||
switch (level) {
|
||
case 1:
|
||
format = 'YYYY'
|
||
break;
|
||
case 2:
|
||
format = 'MMM YYYY'
|
||
break;
|
||
}
|
||
if (format) {
|
||
startDate = startDate ? fn.reformatDate(startDate, format) : ''
|
||
endDate = endDate ? fn.reformatDate(endDate, format) : ''
|
||
}
|
||
let result = ''
|
||
if (startDate && endDate) {
|
||
result = `${startDate} – ${endDate}`
|
||
} else if (startDate) {
|
||
result = `Since ${startDate}`
|
||
} else if (endDate) {
|
||
result = `Until ${endDate}`
|
||
}
|
||
return `<div class="date-range">${result}</div>`
|
||
}
|
||
%>
|
||
|
||
<!-- Educations -->
|
||
<% if (cv.education) { %>
|
||
<section class="education-section">
|
||
<div class="section-title">
|
||
<h2>Educations</h2>
|
||
<div class="line"></div>
|
||
</div>
|
||
<% for (const item of cv.education) { %>
|
||
<div class="education section-item">
|
||
<div class="row space-between">
|
||
<h3><%= item.institution %></h3>
|
||
<%- linkInDiv(item.url) %>
|
||
</div>
|
||
<div class="row space-between">
|
||
<div class="study _ul _fz-4">
|
||
<%= item.studyType %>, <%= item.area %>
|
||
</div>
|
||
<%- dateRange(item, 2) %>
|
||
</div>
|
||
<div class="score row">Overall GPA: <%= item.score %></div>
|
||
<% if (item.courses && item.courses.length > 0) { %>
|
||
<div class="courses row">
|
||
Courses: <%= item.courses.join('; ') %>
|
||
</div>
|
||
<% } %>
|
||
</div>
|
||
<% } %>
|
||
</section>
|
||
<% } %>
|
||
|
||
<!-- Work -->
|
||
<% if (cv.work) { %>
|
||
<section class="work-section">
|
||
<div class="section-title">
|
||
<h2>Work</h2>
|
||
<div class="line"></div>
|
||
</div>
|
||
<% for (const item of cv.work) { %>
|
||
<div class="work section-item">
|
||
<div class="row space-between">
|
||
<h3><%= item.name %></h3>
|
||
<%- linkInDiv(item.url) %>
|
||
</div>
|
||
<div class="row space-between">
|
||
<div class="position _ul _fz-4"><%= item.position %></div>
|
||
<%- dateRange(item, 2) %>
|
||
</div>
|
||
<div class="summary p"><%- fn.renderMarkdown(item.summary) %></div>
|
||
<% if (item.highlights && item.highlights.length > 0) { %>
|
||
<div class="highlights row">
|
||
<ul>
|
||
<% for (const hl of item.highlights) { %>
|
||
<li><%- fn.renderMarkdown(hl, true) %></li>
|
||
<% } %>
|
||
</ul>
|
||
</div>
|
||
<% } %>
|
||
</div>
|
||
<% } %>
|
||
</section>
|
||
<% } %>
|
||
|
||
<!-- Projects -->
|
||
<% if (cv.projects) { %>
|
||
<section class="projects-section">
|
||
<div class="section-title">
|
||
<h2>Projects</h2>
|
||
<div class="line"></div>
|
||
</div>
|
||
<% for (const item of cv.projects) { %>
|
||
<div class="project section-item">
|
||
<div class="row space-between">
|
||
<h3><%= item.name %></h3>
|
||
<%- linkInDiv(item.url) %>
|
||
</div>
|
||
<div class="row space-between">
|
||
<% if (item.roles && item.roles.length > 0) { %>
|
||
<div class="roles _ul _fz-4"><%= item.roles.join(', ') %></div>
|
||
<% } %>
|
||
<%- dateRange(item, 2) %>
|
||
</div>
|
||
<div class="p _text-dim"><%- fn.renderMarkdown(item.description) %></div>
|
||
<% if (item.highlights && item.highlights.length > 0) { %>
|
||
<% if (item.highlights.length === 1) { %>
|
||
<div class="highlights p"><%- fn.renderMarkdown(item.highlights[0], true) %></div>
|
||
<% } else { %>
|
||
<div class="highlights row">
|
||
<ul>
|
||
<% for (const hl of item.highlights) { %>
|
||
<li><%- fn.renderMarkdown(hl, true) %></li>
|
||
<% } %>
|
||
</ul>
|
||
</div>
|
||
<% } %>
|
||
<% } %>
|
||
<div class="keywords row">
|
||
<% for (const kw of item.keywords) { %>
|
||
<span class="item"><%= kw %></span>
|
||
<% } %>
|
||
</div>
|
||
</div>
|
||
<% } %>
|
||
</section>
|
||
<% } %>
|
||
|
||
<!-- Side-projects -->
|
||
<% if (cv.sideProjects) { %>
|
||
<section class="sideprojects-section">
|
||
<div class="section-title">
|
||
<h2>Side-projects</h2>
|
||
<div class="line"></div>
|
||
</div>
|
||
<div class="two-columns">
|
||
<% for (const item of cv.sideProjects) { %>
|
||
<div class="sideproject section-item">
|
||
<div class="row space-between">
|
||
<h3><%= item.name %></h3>
|
||
<%- dateRange(item, 1) %>
|
||
</div>
|
||
<% if (item.url) { %>
|
||
<div class="url row">
|
||
<%- fn.getIconSVG('mdi:link-variant') %>
|
||
<a href="<%= item.url %>"><%= fn.noSchemaURL(item.url) %></a>
|
||
</div>
|
||
<% } %>
|
||
<div class="description"><%- fn.renderMarkdown(item.description) %></div>
|
||
<% if (item.keywords && item.keywords.length > 0) { %>
|
||
<div class="keywords row">
|
||
<% for (const kw of item.keywords) { %>
|
||
<span class="item"><%= kw %></span>
|
||
<% } %>
|
||
</div>
|
||
<% } %>
|
||
</div>
|
||
<% } %>
|
||
</div>
|
||
</section>
|
||
<% } %>
|
||
|
||
<!-- Skills -->
|
||
<% if (cv.skills) { %>
|
||
<section class="skills-section">
|
||
<div class="section-title">
|
||
<h2>Skills</h2>
|
||
<div class="line"></div>
|
||
</div>
|
||
<div class="two-columns">
|
||
<% for (const item of cv.skills) { %>
|
||
<div class="skill section-item">
|
||
<h3><%= item.name %></h3>
|
||
<div class="level row _ul _fz-4"><%= item.level %></div>
|
||
<% if (item.summary) { %>
|
||
<div class="summary p"><%- fn.renderMarkdown(item.summary) %></div>
|
||
<% } %>
|
||
<% if (item.keywords && item.keywords.length > 0) { %>
|
||
<div class="keywords">
|
||
<% for (const kw of item.keywords) { %>
|
||
<span class="item"><%= kw %></span>
|
||
<% } %>
|
||
</div>
|
||
<% } %>
|
||
</div>
|
||
<% } %>
|
||
</div>
|
||
</section>
|
||
<% } %>
|
||
|
||
<!-- Languages -->
|
||
<% if (cv.languages) { %>
|
||
<section class="languages-section page-unit">
|
||
<div class="section-title">
|
||
<h2>Languages</h2>
|
||
<div class="line"></div>
|
||
</div>
|
||
<% for (const item of cv.languages) { %>
|
||
<div class="language section-item">
|
||
<h3><%= item.language %></h3>
|
||
<div class="fluency row _ul _fz-4"><%= item.fluency %></div>
|
||
<% if (item.summary) { %>
|
||
<div class="summary p"><%- fn.renderMarkdown(item.summary) %></div>
|
||
<% } %>
|
||
</div>
|
||
<% } %>
|
||
</section>
|
||
<% } %>
|
||
|
||
|
||
<!-- TODO: -->
|
||
<!-- Awards -->
|
||
<!-- Volunteer -->
|
||
<!-- Publications -->
|
||
<!-- References -->
|
||
<!-- Interests -->
|
||
|
||
<!-- meta -->
|
||
<% if (cv.meta) { %>
|
||
<footer>
|
||
<% if (cv.meta.version) { %>
|
||
<div class="version">Version: <%= cv.meta.version %></div>
|
||
<% } %>
|
||
<% if (cv.meta.lastModified) { %>
|
||
<div class="version">Last modified: <%= cv.meta.lastModified %></div>
|
||
<% } %>
|
||
</footer>
|
||
<% } %>
|