PDF Testing
This commit is contained in:
parent
ef3c231c1e
commit
125e8eb34f
|
@ -13,6 +13,7 @@ use Sikofitt\Config\ConfigTrait;
|
||||||
use Sikofitt\Json\JsonFileTrait;
|
use Sikofitt\Json\JsonFileTrait;
|
||||||
use Sikofitt\Json\JsonTrait;
|
use Sikofitt\Json\JsonTrait;
|
||||||
use Silex\Application;
|
use Silex\Application;
|
||||||
|
use Symfony\Component\HttpFoundation\Request;
|
||||||
|
|
||||||
require __DIR__ . '/../vendor/autoload.php';
|
require __DIR__ . '/../vendor/autoload.php';
|
||||||
|
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
# This file is auto-generated during the composer install
|
# This file is auto-generated during the composer install
|
||||||
app:
|
app:
|
||||||
debug: false
|
debug: true
|
||||||
environment: prod
|
environment: dev
|
||||||
title: 'R. Eric Wheeler | Resume'
|
title: 'R. Eric Wheeler | Resume'
|
||||||
email: eric@rewiv.com
|
email: eric@rewiv.com
|
||||||
phone: 510-646-2135
|
phone: 510-646-2135
|
||||||
|
|
|
@ -12,25 +12,32 @@
|
||||||
{% block apple_meta %}
|
{% block apple_meta %}
|
||||||
{# <link rel="apple-touch-icon-precomposed" href="images/apple-touch-icon.png"> #}
|
{# <link rel="apple-touch-icon-precomposed" href="images/apple-touch-icon.png"> #}
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
<link rel="stylesheet" href="{{ asset('css/resume.min.css') }}">
|
|
||||||
|
<link rel="stylesheet" href="{{ baseUrl ~ asset('css/resume.min.css') }}">
|
||||||
{% block stylesheets %}{% endblock %}
|
{% block stylesheets %}{% endblock %}
|
||||||
{% block inline_styles %}{% endblock %}
|
{% block inline_styles %}{% endblock %}
|
||||||
<script src="{{ asset('js/vendor/jquery.min.js') }}"></script>
|
<script src="{{ baseUrl ~ asset('js/vendor/jquery.min.js') }}"></script>
|
||||||
<script src="{{ asset('js/vendor/uikit.min.js') }}"></script>
|
<script src="{{ baseUrl ~ asset('js/vendor/uikit.min.js') }}"></script>
|
||||||
<script src="{{ asset('js/vendor/sticky.min.js') }}"></script>
|
<script src="{{ baseUrl ~ asset('js/vendor/sticky.min.js') }}"></script>
|
||||||
<script src="{{ asset('js/vendor/notify.min.js') }}"></script>
|
<script src="{{ baseUrl ~ asset('js/vendor/notify.min.js') }}"></script>
|
||||||
<script src="{{ asset('js/vendor/es6-shim.min.js') }}"></script>
|
<script src="{{ baseUrl ~ asset('js/vendor/es6-shim.min.js') }}"></script>
|
||||||
{% block javascripts_head %}{% endblock %}
|
{% block javascripts_head %}{% endblock %}
|
||||||
{% block inline_js_head %}{% endblock %}
|
{% block inline_js_head %}{% endblock %}
|
||||||
</head>
|
</head>
|
||||||
|
|
||||||
<body>
|
<body>
|
||||||
|
|
||||||
<div class="uk-container uk-container-center uk-margin-large-top uk-margin-large-bottom">
|
<div id="main" class="uk-container uk-container-center uk-margin-large-top uk-margin-large-bottom">
|
||||||
{% block body %}
|
{% block body %}
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
</div>
|
</div>
|
||||||
<script src="{{ asset('js/resume.min.js') }}"></script>
|
<footer id="footer" style="
|
||||||
|
margin-top: 100px;
|
||||||
|
height: 150px;
|
||||||
|
background-color: #000;
|
||||||
|
">
|
||||||
|
</footer>
|
||||||
|
<script src="{{ baseUrl ~ asset('js/resume.min.js') }}"></script>
|
||||||
{% block javascripts_foot %}{% endblock %}
|
{% block javascripts_foot %}{% endblock %}
|
||||||
{% block inline_js_foot %}{% endblock %}
|
{% block inline_js_foot %}{% endblock %}
|
||||||
</body>
|
</body>
|
||||||
|
|
|
@ -1,272 +1,161 @@
|
||||||
{% extends 'base.html.twig' %}
|
{% extends 'base.html.twig' %}
|
||||||
|
|
||||||
{% block title %}
|
{% block title %}
|
||||||
{{ app.config.app.title | default('Resume') }}
|
{{ app.config.app.title | default('Resume') }}
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
{% block body %}
|
{% block body %}
|
||||||
|
|
||||||
|
<style type="text/css">
|
||||||
|
.uk-sticky-active-sidebar {
|
||||||
|
margin-top: 35px;
|
||||||
|
}
|
||||||
|
|
||||||
<div class="uk-grid" data-uk-grid-margin xmlns="http://www.w3.org/1999/html">
|
div#sidebar.uk-active {
|
||||||
<div class="uk-width-1-1">
|
margin-top: 35px;
|
||||||
<h1 class="uk-heading-large">
|
transition: margin-top 2s;
|
||||||
{% if basics.name is not empty %}
|
}
|
||||||
{{ basics.name }}
|
</style>
|
||||||
{% else %}
|
<div class="uk-grid" data-uk-grid-margin xmlns="http://www.w3.org/1999/html">
|
||||||
{{ app.config.app.title|default('Resume') }}
|
<div class="uk-width-1-1">
|
||||||
{% endif %}
|
<h1 class="uk-heading-large">
|
||||||
{% if basics.label is not empty %}
|
{% if basics.name is not empty %}
|
||||||
<small class="uk-h2 uk-align-right uk-text-bottom">{{ basics.label }}</small>
|
{{ basics.name|title }}
|
||||||
{% endif %}
|
{% else %}
|
||||||
</h1>
|
{{ app.config.app.title|default('Resume') }}
|
||||||
<hr/>
|
{% endif %}
|
||||||
{% if basics.summary is not empty %}
|
{% if basics.label is not empty %}
|
||||||
<p class="uk-text-lead">{{ basics.summary }}</p>
|
<small class="uk-h2 uk-align-right uk-text-bottom">{{ basics.label }}</small>
|
||||||
|
{% endif %}
|
||||||
|
</h1>
|
||||||
|
<hr/>
|
||||||
|
{% if basics.summary is not empty %}
|
||||||
|
<p class="uk-text-lead">{{ basics.summary|raw }}</p>
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="uk-grid" data-uk-grid-margin>
|
||||||
|
<div id="uk-sticky-start" class="uk-width-medium-3-4">
|
||||||
|
{% include 'skills.html.twig' %}
|
||||||
|
{% include 'work.html.twig' %}
|
||||||
|
{% include 'references.html.twig' %}
|
||||||
|
</div>
|
||||||
|
<div class="uk-width-medium-1-4">
|
||||||
|
<div id="sidebar" class="uk-panel uk-panel-header uk-panel-box"
|
||||||
|
data-uk-sticky="{top:35, animation: 'uk-animation-slide-top', getWidthFrom:'#sidebar'}">
|
||||||
|
<div class="uk-panel-image">
|
||||||
|
<img
|
||||||
|
class="uk-align-right uk-thumbnail uk-border-circle uk-thumbnail-mini uk-animation-scale-up uk-img-preserve"
|
||||||
|
src="{{ basics.picture }}"/>
|
||||||
|
</div>
|
||||||
|
<h3 class="uk-panel-title">Contact</h3>
|
||||||
|
|
||||||
|
<ul class="uk-list uk-list-line">
|
||||||
|
|
||||||
|
{% if app.config.app.phone is not empty %}
|
||||||
|
<li class="uk-list-space"><a href="#phone-modal" class="hidden-phone" data-uk-modal>Phone</a></li>
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
<li class="uk-list-space">
|
||||||
|
{% if basics.email is not empty %}
|
||||||
|
<a href="#contact-form-wrapper" data-uk-modal>{{ basics.email }}</a>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
|
||||||
</div>
|
</li>
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="uk-grid" data-uk-grid-margin>
|
{% if basics.website is not empty %}
|
||||||
<div class="uk-width-medium-3-4">
|
<li class="uk-list-space">
|
||||||
<h1>Experience</h1>
|
<a href="{{ basics.website }}" target="_blank" title="Home page">{{ basics.website }}</a>
|
||||||
<div class="uk-panel uk-panel-header">
|
</li>
|
||||||
|
{% endif %}
|
||||||
<div class="resume-positions">
|
{% if basics.location|length > 0 and basics.location is not empty %}
|
||||||
{% for position in work %}
|
<li class="uk-list-space">
|
||||||
<h3 class="company uk-panel-title uk-animation-slide-left">
|
<address>
|
||||||
{{ position.company }}
|
{% set location = basics.location %}
|
||||||
<small class="uk-align-right">
|
|
||||||
{{ position.startDate|date('M, Y') }} -
|
|
||||||
{% if position.endDate is not defined %}
|
|
||||||
Current
|
|
||||||
{% else %}
|
|
||||||
{{ position.endDate|date('M, Y') }}
|
|
||||||
{% endif %}
|
|
||||||
|
|
||||||
(~
|
|
||||||
{% if position.endDate is not defined %}
|
|
||||||
{{ position.startDate|date_diff }}
|
|
||||||
{% else %}
|
|
||||||
{{ position.startDate|date_diff(position.endDate) }}
|
|
||||||
{% endif %}
|
|
||||||
)
|
|
||||||
</small>
|
|
||||||
</h3>
|
|
||||||
<h5>{{ position.position }}</h5>
|
|
||||||
<p class="summary uk-text-primary uk-text-large">
|
|
||||||
{{ position.summary|raw }}
|
|
||||||
</p>
|
|
||||||
{% if position.highlights is defined and position.highlights is not empty %}
|
|
||||||
<dl class="uk-description-list-horizontal uk-animation-slide-right">
|
|
||||||
<dt>Highlights</dt>
|
|
||||||
{% for highlight in position.highlights %}
|
|
||||||
<dd class="uk-margin-small-top uk-margin-small-bottom">{{ highlight|raw }} {# raw is deprecated in 2.0 #}</dd>
|
|
||||||
{% endfor %}
|
|
||||||
</dl>
|
|
||||||
{% endif %}
|
|
||||||
<hr class="uk-hr-light"/>
|
|
||||||
{% endfor %}
|
|
||||||
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="uk-width-medium-1-4">
|
|
||||||
|
|
||||||
<div class="uk-panel uk-panel-header uk-panel-box" data-uk-sticky="{top:35}">
|
|
||||||
|
|
||||||
|
|
||||||
<div class="uk-panel-image">
|
|
||||||
<img class="uk-align-right uk-thumbnail uk-border-circle uk-thumbnail-mini uk-animation-scale-up uk-img-preserve" src="{{ basics.picture }}"/>
|
|
||||||
</div>
|
|
||||||
<h3 class="uk-panel-title">Contact</h3>
|
|
||||||
|
|
||||||
<ul class="uk-list uk-list-line">
|
|
||||||
|
|
||||||
{% if app.config.app.phone is not empty %}
|
|
||||||
|
|
||||||
<li class="uk-list-space"><a href="#captcha" class="hidden-phone" data-uk-modal>Phone</a></li>
|
|
||||||
{% endif %}
|
|
||||||
|
|
||||||
<li class="uk-list-space">
|
|
||||||
{% if basics.email is not empty %}
|
|
||||||
<a href="#contact-form-wrapper" data-uk-modal>{{ basics.email }}</a>
|
|
||||||
{% endif %}
|
|
||||||
|
|
||||||
</li>
|
|
||||||
|
|
||||||
{% if basics.website is not empty %}
|
|
||||||
<li class="uk-list-space"><a href="{{ basics.website }}" target="_blank"
|
|
||||||
title="Home page">{{ basics.website }}</a></li>
|
|
||||||
{% endif %}
|
|
||||||
{% if basics.location|length > 0 and basics.location is not empty %}
|
|
||||||
<li class="uk-list-space">
|
|
||||||
<address>
|
|
||||||
{% set location = basics.location %}
|
|
||||||
|
|
||||||
{% if location.address is not empty %}
|
|
||||||
{{ location.address }}<br/>
|
|
||||||
{% endif %}
|
|
||||||
{% if location.city is not empty %}
|
|
||||||
{{ location.city }},
|
|
||||||
{% endif %}
|
|
||||||
{% if location.region is not empty %}
|
|
||||||
{{ location.region }},
|
|
||||||
{% endif %}
|
|
||||||
{% if location.countryCode is not empty %}
|
|
||||||
{{ location.countryCode }}
|
|
||||||
{% endif %}<br/>
|
|
||||||
|
|
||||||
</address>
|
|
||||||
</li>
|
|
||||||
{% endif %}
|
|
||||||
<li class="uk-list-space">
|
|
||||||
{% for profile in basics.profiles %}
|
|
||||||
{{ render_profile(profile)|raw }}
|
|
||||||
{% endfor %}
|
|
||||||
|
|
||||||
</li>
|
|
||||||
<li class="uk-list-divider"></li>
|
|
||||||
</ul>
|
|
||||||
{% if skills is defined and skills is not empty %}
|
|
||||||
|
|
||||||
<h3 class="uk-panel-title">Skills</h3>
|
|
||||||
|
|
||||||
<dl class="uk-description-list-line">
|
|
||||||
{% for skill in skills %}
|
|
||||||
<dt class="uk-text-bold">{{ skill.name }}</dt>
|
|
||||||
<dd>{{ skill.keywords|join(', ')|raw }}</dd>
|
|
||||||
{% endfor %}
|
|
||||||
</dl>
|
|
||||||
|
|
||||||
|
{% if location.address is not empty %}
|
||||||
|
{{ location.address }}<br/>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
{% if location.city is not empty %}
|
||||||
|
{{ location.city }},
|
||||||
</div>
|
|
||||||
|
|
||||||
|
|
||||||
</div>
|
|
||||||
|
|
||||||
</div>
|
|
||||||
<div id="contact-form-wrapper" class="uk-modal">
|
|
||||||
<div class="uk-modal-dialog uk-modal-dialog-blank">
|
|
||||||
<button class="uk-modal-close uk-close" type="button"></button>
|
|
||||||
|
|
||||||
<div class="uk-grid uk-flex-center uk-grid-divider uk-flex-middle uk-height-viewport uk-cover-background">
|
|
||||||
|
|
||||||
<div class="uk-width-small-1-1 uk-width-large-1-2" id="contact-form">
|
|
||||||
<div class="uk-container uk-container-center">
|
|
||||||
{{ form_start(contact_form) }}
|
|
||||||
|
|
||||||
<fieldset data-uk-margin>
|
|
||||||
<legend>Contact {% if basics.email is not empty %}
|
|
||||||
<small class="uk-align-right">{{ basics.email }}</small>{% endif %}</legend>
|
|
||||||
<div class="uk-form-row">
|
|
||||||
{{ form_label(contact_form.name) }}
|
|
||||||
<div class="uk-form-controls">
|
|
||||||
{{ form_widget(contact_form.name) }}
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="uk-form-row">
|
|
||||||
{{ form_label(contact_form.email) }}
|
|
||||||
<div class="uk-form-controls">
|
|
||||||
{{ form_widget(contact_form.email) }}
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="uk-form-row">
|
|
||||||
{{ form_label(contact_form.message|raw) }}
|
|
||||||
<div class="uk-form-controls">
|
|
||||||
{{ form_widget(contact_form.message) }}
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="uk-form-row">
|
|
||||||
{{ form_label(contact_form.submit) }}
|
|
||||||
<div class="uk-form-controls">
|
|
||||||
{{ form_widget(contact_form.submit) }}
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
{{ form_rest(contact_form) }}
|
|
||||||
</fieldset>
|
|
||||||
{{ form_end(contact_form) }}
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
|
|
||||||
<!-- phone -->
|
|
||||||
<div id="captcha" class="uk-modal">
|
|
||||||
<div class="uk-modal-dialog uk-modal-dialog-blank">
|
|
||||||
<button class="uk-modal-close uk-close" type="button"></button>
|
|
||||||
|
|
||||||
<div class="uk-grid uk-flex-center uk-grid-match uk-grid-divider uk-flex-middle uk-height-viewport uk-cover-background">
|
|
||||||
|
|
||||||
<div id="recaptcha-wrapper">
|
|
||||||
<h1>Verify</h1>
|
|
||||||
<div>
|
|
||||||
<p> Verify that you are a human please.</p>
|
|
||||||
<form class="uk-form" id="recaptcha" method="post" action="{{ path('api_captcha') }}"
|
|
||||||
onsubmit="return false;">
|
|
||||||
<div class="uk-form-row">
|
|
||||||
<div class="g-recaptcha" data-sitekey="6LcvmSQTAAAAAMmf9w6mhCbpdLvknuD9SGVHT0q-"></div>
|
|
||||||
</div>
|
|
||||||
<div class="uk-form-row">
|
|
||||||
<input type="submit" class="uk-button" id="submit" name="submit" value="Verify"/>
|
|
||||||
</div>
|
|
||||||
</form>
|
|
||||||
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div id="offcanvas" class="uk-offcanvas">
|
|
||||||
<div class="uk-offcanvas-bar">
|
|
||||||
<ul class="uk-list uk-list-line">
|
|
||||||
{% if basics.email is not empty %}
|
|
||||||
<li>{{ basics.email }}</li>
|
|
||||||
{% endif %}
|
{% endif %}
|
||||||
{% if basics.phone is not empty %}
|
{% if location.region is not empty %}
|
||||||
<li>{{ basics.phone }}</li>
|
{{ location.region }},
|
||||||
{% endif %}
|
{% endif %}
|
||||||
{% if basics.location|length > 0 and basics.location is not empty %}
|
{% if location.countryCode is not empty %}
|
||||||
<li>
|
{{ location.countryCode }}
|
||||||
<address>
|
{% endif %}<br/>
|
||||||
{% for location in basics.location %}
|
|
||||||
{% if location.address is not empty %}
|
</address>
|
||||||
{{ location.address }}<br/>
|
</li>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
{% if location.city is not empty %}
|
<li class="uk-list-space">
|
||||||
{{ location.city }}
|
{% for profile in basics.profiles %}
|
||||||
{% if location.postalCode is not empty %}
|
{{ render_profile(profile)|raw }}
|
||||||
{{ location.postalCode }}
|
{% endfor %}
|
||||||
{% endif %}
|
|
||||||
{% if location.countryCode is not empty %}
|
</li>
|
||||||
{{ location.countryCode }}
|
|
||||||
{% endif %}<br/>
|
</ul>
|
||||||
{% endif %}
|
|
||||||
{% endfor %}
|
</div>
|
||||||
</address>
|
|
||||||
</li>
|
|
||||||
{% endif %}
|
|
||||||
<li>
|
|
||||||
|
|
||||||
</li>
|
|
||||||
</ul>
|
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
<div id="spinner-modal" class="uk-modal">
|
|
||||||
<div class="uk-modal-dialog uk-animation-scale-up uk-animation-bottom-center">
|
</div>
|
||||||
<p class="uk-text-center uk-h2 uk-margin uk-text-primary">Sending message ...
|
{% include 'contact.html.twig' %}
|
||||||
<i class="uk-margin-left uk-icon uk-icon-spinner uk-icon-spin"></i>
|
|
||||||
</p>
|
|
||||||
</div>
|
{% include 'phone.html.twig' %}
|
||||||
|
|
||||||
|
<div id="offcanvas" class="uk-offcanvas">
|
||||||
|
<div class="uk-offcanvas-bar">
|
||||||
|
<ul class="uk-list uk-list-line">
|
||||||
|
{% if basics.email is not empty %}
|
||||||
|
<li>{{ basics.email }}</li>
|
||||||
|
{% endif %}
|
||||||
|
{% if basics.phone is not empty %}
|
||||||
|
<li>{{ basics.phone }}</li>
|
||||||
|
{% endif %}
|
||||||
|
{% if basics.location|length > 0 and basics.location is not empty %}
|
||||||
|
<li>
|
||||||
|
<address>
|
||||||
|
{% for location in basics.location %}
|
||||||
|
{% if location.address is not empty %}
|
||||||
|
{{ location.address }}<br/>
|
||||||
|
{% endif %}
|
||||||
|
{% if location.city is not empty %}
|
||||||
|
{{ location.city }}
|
||||||
|
{% if location.postalCode is not empty %}
|
||||||
|
{{ location.postalCode }}
|
||||||
|
{% endif %}
|
||||||
|
{% if location.countryCode is not empty %}
|
||||||
|
{{ location.countryCode }}
|
||||||
|
{% endif %}<br/>
|
||||||
|
{% endif %}
|
||||||
|
{% endfor %}
|
||||||
|
</address>
|
||||||
|
</li>
|
||||||
|
{% endif %}
|
||||||
|
<li>
|
||||||
|
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
|
</div>
|
||||||
|
<div id="spinner-modal" class="uk-modal">
|
||||||
|
<div class="uk-modal-dialog uk-animation-scale-up uk-animation-bottom-center">
|
||||||
|
<p class="uk-text-center uk-h2 uk-margin uk-text-primary">Sending message ...
|
||||||
|
<i class="uk-margin-left uk-icon uk-icon-spinner uk-icon-spin"></i>
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
|
||||||
{% block javascripts_foot %}
|
{% block javascripts_foot %}
|
||||||
<script src='https://www.google.com/recaptcha/api.js'></script>
|
<script src='https://www.google.com/recaptcha/api.js'></script>
|
||||||
|
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
|
|
@ -0,0 +1,12 @@
|
||||||
|
{% if references is defined and references is not empty %}
|
||||||
|
<h1 id="references">References</h1>
|
||||||
|
<div class="uk-panel uk-panel-header">
|
||||||
|
{% for reference in references %}
|
||||||
|
<blockquote class="uk">
|
||||||
|
<p>{{ reference.reference|raw }}</p>
|
||||||
|
<small>{{ reference.name }}</small>
|
||||||
|
</blockquote>
|
||||||
|
{% endfor %}
|
||||||
|
|
||||||
|
{% endif %}
|
||||||
|
</div>
|
|
@ -0,0 +1,13 @@
|
||||||
|
{% if skills is defined and skills is not empty %}
|
||||||
|
|
||||||
|
<h1 id="skills">Skills</h1>
|
||||||
|
<dl class="uk-description-list-line">
|
||||||
|
{% for skill in skills %}
|
||||||
|
<dt class="uk-text-bold uk-margin-small">{{ skill.name }}</dt>
|
||||||
|
|
||||||
|
<dd class="uk-margin-small">{{ skill.keywords|join(', ') }}</dd>
|
||||||
|
|
||||||
|
{% endfor %}
|
||||||
|
</dl>
|
||||||
|
|
||||||
|
{% endif %}
|
|
@ -0,0 +1,41 @@
|
||||||
|
<h1 id="experience">Experience</h1>
|
||||||
|
<div class="uk-panel uk-panel-header">
|
||||||
|
|
||||||
|
<div class="resume-positions">
|
||||||
|
{% for position in work %}
|
||||||
|
<h3 class="company uk-panel-title uk-animation-slide-left">
|
||||||
|
{{ position.company }}
|
||||||
|
<small class="uk-align-right">
|
||||||
|
{{ position.startDate|date('M, Y') }} -
|
||||||
|
{% if position.endDate is not defined %}
|
||||||
|
Current
|
||||||
|
{% else %}
|
||||||
|
{{ position.endDate|date('M, Y') }}
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
(~
|
||||||
|
{% if position.endDate is not defined %}
|
||||||
|
{{ position.startDate|date_diff }}
|
||||||
|
{% else %}
|
||||||
|
{{ position.startDate|date_diff(position.endDate) }}
|
||||||
|
{% endif %}
|
||||||
|
)
|
||||||
|
</small>
|
||||||
|
</h3>
|
||||||
|
<h5>{{ position.position }}</h5>
|
||||||
|
<p class="summary uk-text-primary uk-text-large">
|
||||||
|
{{ position.summary|raw }}
|
||||||
|
</p>
|
||||||
|
{% if position.highlights is defined and position.highlights is not empty %}
|
||||||
|
<dl class="uk-description-list-horizontal uk-animation-slide-right">
|
||||||
|
<dt>Highlights</dt>
|
||||||
|
{% for highlight in position.highlights %}
|
||||||
|
<dd class="uk-margin-small-top uk-margin-bottom">{{ highlight|raw }} {# raw is deprecated in 2.0 #}</dd>
|
||||||
|
{% endfor %}
|
||||||
|
</dl>
|
||||||
|
{% endif %}
|
||||||
|
<hr class="uk-hr-light"/>
|
||||||
|
{% endfor %}
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</div>
|
|
@ -36,5 +36,6 @@ $application->add(new SchemaValidationCommand());
|
||||||
$application->add($twigDebugCommand);
|
$application->add($twigDebugCommand);
|
||||||
$application->add($twigLintCommand);
|
$application->add($twigLintCommand);
|
||||||
$application->add(new \Symfony\CS\Console\Command\FixCommand());
|
$application->add(new \Symfony\CS\Console\Command\FixCommand());
|
||||||
|
$application->add(new Sikofitt\Command\CreatePdfCommand());
|
||||||
$application->run($input);
|
$application->run($input);
|
||||||
|
|
||||||
|
|
296
data/resume.json
296
data/resume.json
|
@ -1,133 +1,169 @@
|
||||||
{
|
{
|
||||||
"basics": {
|
"basics": {
|
||||||
"name": "R. Eric Wheeler",
|
"name": "R. Eric WHeeler",
|
||||||
"label": "Developer / Systems",
|
"label": "Developer / Systems",
|
||||||
"picture": "http://rewiv.com/storage/me.png",
|
"picture": "http://rewiv.com/storage/me.png",
|
||||||
"email": "eric@ericwheeler.net",
|
"email": "eric@ericwheeler.net",
|
||||||
"phone": "",
|
"phone": "510-646-2135",
|
||||||
"website": "https://code.reric.me",
|
"website": "http://rewiv.com",
|
||||||
"summary": "My name is Eric Wheeler. I enjoy programming, working on computer hardware/electronics, music and gardening.",
|
"summary": "My name is Eric Wheeler.<br /> I enjoy programming, working on computer hardware/electronics, music and gardening. My computer experience dates back to the Apple II/e. I enjoy learning in general, although my focus is mainly on new technologies. I have excellent problem solving skills, I adapt well to new things, and learn very quickly.",
|
||||||
"location": {
|
"location": {
|
||||||
"address": "",
|
"address": "",
|
||||||
"postalCode": "CA 94578",
|
"postalCode": "94578",
|
||||||
"city": "San Leandro",
|
"city": "San Leandro",
|
||||||
"countryCode": "US",
|
"countryCode": "US",
|
||||||
"region": "California"
|
"region": "California"
|
||||||
},
|
|
||||||
"profiles": [
|
|
||||||
{
|
|
||||||
"network": "Twitter",
|
|
||||||
"username": "sikofitt",
|
|
||||||
"url": "https://twitter.com/sikofitt"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"network": "Github",
|
|
||||||
"username": "sikofitt",
|
|
||||||
"url": ""
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"network": "Gitlab",
|
|
||||||
"username": "sikofitt",
|
|
||||||
"url": "https://repos.bgemi.net/u/sikofitt"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"network": "linkedin",
|
|
||||||
"username": "reric",
|
|
||||||
"url": "https://www.linkedin.com/in/reric"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
},
|
||||||
"work": [
|
"profiles": [
|
||||||
{
|
{
|
||||||
"company": "Stanford University",
|
"network": "Twitter",
|
||||||
"position": "Developer / Systems Administrator",
|
"username": "sikofitt",
|
||||||
"website": "https://ee.stanford.edu",
|
"url": "https://twitter.com/sikofitt"
|
||||||
"startDate": "2007-05-27",
|
},
|
||||||
"summary": "I have done many different things during my employment at Stanford University.<br />A few of things things have been : Desktop Support, Computer cluster administration for the NSF and NNIN using Scyld Clusterware, General programing/debugging and frontend as well as backend web development using a number of different technologies.",
|
{
|
||||||
"highlights": [
|
"network": "Github",
|
||||||
"Repaired and Maintained a 64 node research computing cluster for the <a href=\"//nnin.org\" title=\"National Nanotechnology Infrastructure Network\">NNIN</a> funded by the <a href=\"//nsf.gov\" title=\"National Science Foundation\">NSF</a>.",
|
"username": "sikofitt",
|
||||||
"Converted Electrical Engineering's static web site to Drupal 7.",
|
"url": "https://github.com/sikofitt"
|
||||||
"Created many Drupal 7 modules for the EE website including a custom events, lecture and committe minutes content type, a CDN module for uploading and recieving images/videos/documents, an Orglist module for displaying Faculty, Students, and Staff from a custom API.",
|
},
|
||||||
"Created a custom Drupal 7 site for the SystemX organization with integrated login for affiliates as well as Stanford staff."
|
{
|
||||||
]
|
"network": "Gitlab",
|
||||||
},
|
"username": "sikofitt",
|
||||||
{
|
"url": "https://repos.bgemi.net/u/sikofitt"
|
||||||
"company": "Searchathlon INC.",
|
},
|
||||||
"position": "Web Developer / Linux System Administration",
|
{
|
||||||
"website": "http://searchathlon.com",
|
"network": "linkedin",
|
||||||
"startDate": "2005-01-01",
|
"username": "reric",
|
||||||
"endDate": "2006-01-01",
|
"url": "https://www.linkedin.com/in/reric"
|
||||||
"summary": "",
|
}
|
||||||
"highlights": []
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"volunteer": [],
|
|
||||||
"education": [],
|
|
||||||
"awards": [],
|
|
||||||
"publications": [],
|
|
||||||
"skills": [
|
|
||||||
{
|
|
||||||
"name": "Web Development / Design",
|
|
||||||
"level": "",
|
|
||||||
"keywords": [
|
|
||||||
"HTML5",
|
|
||||||
"CSS3",
|
|
||||||
"Javascript",
|
|
||||||
"jQuery",
|
|
||||||
"NPM",
|
|
||||||
"Bower",
|
|
||||||
"Grunt",
|
|
||||||
"Let's Encrypt"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "PHP",
|
|
||||||
"level": "",
|
|
||||||
"keywords": [
|
|
||||||
"PHP5",
|
|
||||||
"PHP7",
|
|
||||||
"<b>Drupal 7</b>",
|
|
||||||
"Symfony 2",
|
|
||||||
"Symfony 3",
|
|
||||||
"OOP",
|
|
||||||
"Silex",
|
|
||||||
"Slim",
|
|
||||||
"Doctrine",
|
|
||||||
"Composer"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "PHP",
|
|
||||||
"level": "",
|
|
||||||
"keywords": [
|
|
||||||
"PHP5",
|
|
||||||
"PHP7",
|
|
||||||
"Symfony 2",
|
|
||||||
"Symfony 3",
|
|
||||||
"OOP",
|
|
||||||
"Silex",
|
|
||||||
"Slim",
|
|
||||||
"Doctrine",
|
|
||||||
"Composer"
|
|
||||||
]
|
|
||||||
}
|
|
||||||
|
|
||||||
],
|
|
||||||
"languages": [],
|
|
||||||
"interests": [
|
|
||||||
{
|
|
||||||
"name": "Computers",
|
|
||||||
"keywords": [
|
|
||||||
"Hardware",
|
|
||||||
"Programming",
|
|
||||||
"Design"
|
|
||||||
]
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"references": [
|
|
||||||
{
|
|
||||||
"name": "Erlich Bachman",
|
|
||||||
"reference": "It is my pleasure to recommend Richard, his performance working as a consultant for Main St. Company proved that he will be a valuable addition to any company."
|
|
||||||
}
|
|
||||||
]
|
]
|
||||||
}
|
},
|
||||||
|
"work": [
|
||||||
|
{
|
||||||
|
"company": "Stanford University",
|
||||||
|
"position": "Developer / System Administrator",
|
||||||
|
"website": "https://ee.stanford.edu",
|
||||||
|
"startDate": "2007-05-27",
|
||||||
|
"summary": "I have done many different things during my employment at Stanford University.<br />A few of things things have been : Desktop Support, Computer cluster administration for the NSF and NNIN using Scyld Clusterware, General programing/debugging and frontend as well as backend web development using a number of different technologies.",
|
||||||
|
"highlights": [
|
||||||
|
"Repaired and Maintained a 64 node research computing cluster for the <a href=\\\"//nnin.org\\\" title=\\\"National Nanotechnology Infrastructure Network\\\">NNIN</a> funded by the <a href=\\\"//nsf.gov\\\" title=\\\"National Science Foundation\\\">NSF</a>.",
|
||||||
|
"Converted Electrical Engineering's static web site to Drupal 7.",
|
||||||
|
"Created many Drupal 7 modules for the EE website including a custom events, lecture and committe minutes content type, a CDN module for uploading and recieving images/videos/documents, an Orglist module for displaying Faculty, Students, and Staff from a custom API.",
|
||||||
|
"Created a custom Drupal 7 site for the SystemX organization with integrated login for affiliates as well as Stanford staff."
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"company": "Searchathlon",
|
||||||
|
"position": "Web Developer / Linux System Administrator",
|
||||||
|
"startDate": "2005-01-01",
|
||||||
|
"endDate": "2007-01-01",
|
||||||
|
"summary": "Searchathlon was a search startup for media. My main duties were administrating a Linux server running Fedora core 3 and web maintenance/development using Apache. Other duties included managing Apache and IIS web servers on a Windows 2000 setup.",
|
||||||
|
"highlights": [
|
||||||
|
"Created a working Apache/ Microsoft ASP (Active Server Pages) setup on Fedora Core Linux version 3 using a CGI (Common Gateway Interface) setup."
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"volunteer": [],
|
||||||
|
"education": [],
|
||||||
|
"awards": [],
|
||||||
|
"publications": [],
|
||||||
|
"skills": [
|
||||||
|
{
|
||||||
|
"name": "Web Development / Design (Back end)",
|
||||||
|
"level": "",
|
||||||
|
"keywords": [
|
||||||
|
"NPM",
|
||||||
|
"Bower",
|
||||||
|
"GruntJS",
|
||||||
|
"Let's Encrypt",
|
||||||
|
"MySQL",
|
||||||
|
"PostgresSQL",
|
||||||
|
"JSON",
|
||||||
|
"XML",
|
||||||
|
"Apache 2.2/2.4",
|
||||||
|
"Nginx",
|
||||||
|
"Pound web proxy",
|
||||||
|
"Deployment (Heroku, Dokku)",
|
||||||
|
"Virtualization (Virtualbox / VMWare, Vagrant)"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Web Development / Design (Front end)",
|
||||||
|
"level": "",
|
||||||
|
"keywords": [
|
||||||
|
"HTML 4/5",
|
||||||
|
"CSS 2/3",
|
||||||
|
"Javascript",
|
||||||
|
"jQuery"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "PHP",
|
||||||
|
"level": "",
|
||||||
|
"keywords": [
|
||||||
|
"PHP 5.3-5.6 / 7",
|
||||||
|
"Composer",
|
||||||
|
"Symfony 2 / 3",
|
||||||
|
"Silex 1 / 2",
|
||||||
|
"Slim 2 / 3",
|
||||||
|
"Doctrine"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "General Programing",
|
||||||
|
"level": "",
|
||||||
|
"keywords": [
|
||||||
|
"OOP",
|
||||||
|
"Turbo Pascal / Free Pascal",
|
||||||
|
"Python",
|
||||||
|
"C++",
|
||||||
|
"C",
|
||||||
|
"Perl"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "System Administration",
|
||||||
|
"level": "",
|
||||||
|
"keywords": [
|
||||||
|
"Linux (Gentoo, Centos/Red Hat/Debian/Ubuntu)",
|
||||||
|
"Mac OS/X",
|
||||||
|
"Solaris 10/11",
|
||||||
|
"Windows XP / 7 / 8 / 8.1 / 10 / 2000 / 2003",
|
||||||
|
"Bash",
|
||||||
|
"ZSH",
|
||||||
|
"Penguin Computing Scyld ClusterWare HPC (High Performance Computing)",
|
||||||
|
"Source Code Building (auto-tools, auto-make, auto-conf)",
|
||||||
|
"MS-DOS 5-7 / FreeDOS",
|
||||||
|
"FTP",
|
||||||
|
"SFTP/SSH",
|
||||||
|
"Log debugging",
|
||||||
|
"Network debugging"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"languages": [
|
||||||
|
{
|
||||||
|
"language": "English",
|
||||||
|
"fluency": "Native"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"interests": [
|
||||||
|
{
|
||||||
|
"name": "Computers",
|
||||||
|
"keywords": [
|
||||||
|
"Hardware",
|
||||||
|
"Programming",
|
||||||
|
"Design"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"references": [
|
||||||
|
{
|
||||||
|
"name": "Craig Stadler",
|
||||||
|
"reference": "It is my pleasure to recommend Richard, his performance working as a consultant for Main St. Company proved that he will be a valuable addition to any company."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "John Doe",
|
||||||
|
"reference": "Richard is awesome and cool."
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
|
@ -0,0 +1,56 @@
|
||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* Created by PhpStorm.
|
||||||
|
* User: eric
|
||||||
|
* Date: 7/16/16
|
||||||
|
* Time: 3:05 PM
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace Sikofitt\Command;
|
||||||
|
|
||||||
|
|
||||||
|
use Knp\Command\Command;
|
||||||
|
use Symfony\Component\Console\Input\InputInterface;
|
||||||
|
use Symfony\Component\Console\Output\OutputInterface;
|
||||||
|
use Symfony\Component\Console\Style;
|
||||||
|
use Knp\Snappy\Pdf;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Class CreatePdfCommand
|
||||||
|
*
|
||||||
|
* @package Sikofitt\Command
|
||||||
|
*/
|
||||||
|
class CreatePdfCommand extends Command
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public function configure ()
|
||||||
|
{
|
||||||
|
$this->setName('resume:pdf:create')
|
||||||
|
->setDescription('Create a pdf of your website.')
|
||||||
|
->setProcessTitle('PDF Creation');
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param InputInterface $input
|
||||||
|
* @param OutputInterface $output
|
||||||
|
*/
|
||||||
|
public function interact (InputInterface $input, OutputInterface $output)
|
||||||
|
{
|
||||||
|
$index = $this->getSilexApplication()->renderView('index.html.twig', ['renderPdf' => true]);
|
||||||
|
$pdf = new Pdf($this->getSilexApplication()->getRootDirectory() . '/vendor/bin/wkhtmltopdf-amd64');
|
||||||
|
$pdf->generateFromHtml($index, $this->getSilexApplication()->getRootDirectory() . '/resume.pdf', ['keep-relative-links' => false, 'resolve-relative-links' => false, 'load-error-handling' => false, 'disable-javascript' => true, 'disable-external-links' => true, 'disable-internal-links' => true]);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param InputInterface $input
|
||||||
|
* @param OutputInterface $output
|
||||||
|
*/
|
||||||
|
public function execute (InputInterface $input, OutputInterface $output)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -19,6 +19,8 @@ use Symfony\Component\Form\Form;
|
||||||
use Symfony\Component\Form\FormFactory;
|
use Symfony\Component\Form\FormFactory;
|
||||||
use Symfony\Component\HttpFoundation\JsonResponse;
|
use Symfony\Component\HttpFoundation\JsonResponse;
|
||||||
use Symfony\Component\HttpFoundation\Request;
|
use Symfony\Component\HttpFoundation\Request;
|
||||||
|
use Knp\Snappy\Pdf;
|
||||||
|
use Symfony\Component\HttpFoundation\Response;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Class ResumeControllerProvider
|
* Class ResumeControllerProvider
|
||||||
|
@ -45,11 +47,39 @@ class ResumeControllerProvider implements ControllerProviderInterface
|
||||||
|
|
||||||
$contactForm = $app['form.factory']->create(ContactType::class);
|
$contactForm = $app['form.factory']->create(ContactType::class);
|
||||||
$controllers = $app['controllers_factory'];
|
$controllers = $app['controllers_factory'];
|
||||||
|
$controllers->get('/pdf', function (Request $request) use ($app) {
|
||||||
|
$pdf = new Pdf($app->getRootDirectory() . '/vendor/bin/wkhtmltopdf-amd64');
|
||||||
|
$content = $app->render('index.html.twig', [
|
||||||
|
'renderPdf' => true,
|
||||||
|
'baseUrl' => $request->getSchemeAndHttpHost(),
|
||||||
|
'fullData' => $this->resumeData,
|
||||||
|
'basics' => $this->getResumeBasics(),
|
||||||
|
'work' => $this->getResumeWork(),
|
||||||
|
'volunteer' => $this->getResumeVolunteer(),
|
||||||
|
'education' => $this->getResumeEducation(),
|
||||||
|
'awards' => $this->getResumeAwards(),
|
||||||
|
'publications' => $this->getResumePublications(),
|
||||||
|
'skills' => $this->getResumeSkills(),
|
||||||
|
'languages' => $this->getResumeLanguages(),
|
||||||
|
'interests' => $this->getResumeInterests(),
|
||||||
|
'references' => $this->getResumeReferences(),
|
||||||
|
]);
|
||||||
|
|
||||||
|
$renderedPdf = $pdf->getOutputFromHtml($content->getContent());
|
||||||
|
|
||||||
|
$response = new Response();
|
||||||
|
$response->setContent($renderedPdf);
|
||||||
|
$response->setStatusCode(200);
|
||||||
|
$response->headers->set('Content-Type', 'application/pdf');
|
||||||
|
$response->headers->set('Content-Disposition', 'attachment; filename="resume.pdf');
|
||||||
|
return $response;
|
||||||
|
});
|
||||||
$controllers->get('/', function (Request $request) use ($app, $contactForm) {
|
$controllers->get('/', function (Request $request) use ($app, $contactForm) {
|
||||||
|
|
||||||
|
|
||||||
return $app['twig']->render('index.html.twig', [
|
return $app['twig']->render('index.html.twig', [
|
||||||
|
'renderPdf' => false,
|
||||||
|
'baseUrl' => $request->getSchemeAndHttpHost(),
|
||||||
'fullData' => $this->resumeData,
|
'fullData' => $this->resumeData,
|
||||||
'basics' => $this->getResumeBasics(),
|
'basics' => $this->getResumeBasics(),
|
||||||
'work' => $this->getResumeWork(),
|
'work' => $this->getResumeWork(),
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
jq = jQuery.noConflict();
|
jq = jQuery.noConflict();
|
||||||
|
|
||||||
jq(document).ready(function (jq) {
|
jq(document).ready(function (jq) {
|
||||||
jq('form#recaptcha').on('submit', function (event) {
|
jq('form#phone-recaptcha').on('submit', function (event) {
|
||||||
event.stopImmediatePropagation();
|
event.stopImmediatePropagation();
|
||||||
event.stopPropagation();
|
event.stopPropagation();
|
||||||
jq.post(jq(this).attr('action'), jq(this).serialize(), function (response) {
|
jq.post(jq(this).attr('action'), jq(this).serialize(), function (response) {
|
||||||
|
@ -28,7 +28,7 @@ jq(document).ready(function (jq) {
|
||||||
phone.attr('href', 'tel:' + data.message.phone);
|
phone.attr('href', 'tel:' + data.message.phone);
|
||||||
phone.text(data.message.phone);
|
phone.text(data.message.phone);
|
||||||
divRoot.append(h1);
|
divRoot.append(h1);
|
||||||
jq('#recaptcha-wrapper').replaceWith(divRoot);
|
jq('#phone-recaptcha-wrapper').replaceWith(divRoot);
|
||||||
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
Loading…
Reference in New Issue