Initial commit
This commit is contained in:
2
app/conf/.gitignore
vendored
Normal file
2
app/conf/.gitignore
vendored
Normal file
@@ -0,0 +1,2 @@
|
||||
/dossier_dev.yaml
|
||||
/dossier_prod.yaml
|
||||
85
app/conf/dossier.yaml
Normal file
85
app/conf/dossier.yaml
Normal file
@@ -0,0 +1,85 @@
|
||||
### Settings file for magdev/dossier
|
||||
charset: utf-8
|
||||
|
||||
# Date formats
|
||||
date:
|
||||
format:
|
||||
long: "d. F Y"
|
||||
short: "d.m.Y"
|
||||
|
||||
# Settings for TranslatorService
|
||||
translator:
|
||||
locale: en
|
||||
fallback_locales:
|
||||
- en
|
||||
- de
|
||||
|
||||
# Settings for the CV
|
||||
cv:
|
||||
default_tag: experience
|
||||
tags:
|
||||
- experience
|
||||
- education
|
||||
- other
|
||||
|
||||
# Form settings
|
||||
form:
|
||||
label:
|
||||
length: 40
|
||||
prefix: ' '
|
||||
|
||||
# Available language levels
|
||||
language:
|
||||
default_level: native
|
||||
levels:
|
||||
- native
|
||||
- fluent
|
||||
- good
|
||||
- beginner
|
||||
|
||||
# Monolog settings
|
||||
monolog:
|
||||
log_level: 200
|
||||
skip_class_partials:
|
||||
- 'Magdev\\Dossier\\'
|
||||
- 'Symfony\\Component\\'
|
||||
|
||||
# Output styles
|
||||
style:
|
||||
dossier_status_thresholds:
|
||||
- { min: 0, max: 54, color: 'lightred' }
|
||||
- { min: 55, max: 74, color: 'lightyellow' }
|
||||
- { min: 75, max: 100, color: 'lightgreen' }
|
||||
|
||||
|
||||
# Settings for external editor
|
||||
editor:
|
||||
command: '/usr/bin/kate %s'
|
||||
|
||||
# PDFShift settings
|
||||
pdfshift:
|
||||
apikey: ''
|
||||
page:
|
||||
format: A4
|
||||
margin:
|
||||
left: 0
|
||||
right: 0
|
||||
top: 0
|
||||
bottom: 0
|
||||
header:
|
||||
spacing: 20px
|
||||
footer:
|
||||
spacing: 20px
|
||||
security:
|
||||
author: ''
|
||||
userPassword: ''
|
||||
ownerPassword: ''
|
||||
noPrint: false
|
||||
noCopy: false
|
||||
noModify: true
|
||||
stylesheet:
|
||||
use_print: true
|
||||
http:
|
||||
user_agent: ''
|
||||
|
||||
|
||||
2
app/conf/parameters.yaml
Normal file
2
app/conf/parameters.yaml
Normal file
@@ -0,0 +1,2 @@
|
||||
parameters:
|
||||
scss.formatter: "\\Leafo\\ScssPhp\\Formatter\\Crunched"
|
||||
59
app/conf/services.yaml
Normal file
59
app/conf/services.yaml
Normal file
@@ -0,0 +1,59 @@
|
||||
imports:
|
||||
- { resource: 'parameters.yaml' }
|
||||
- { resource: '/etc/dossier/parameters.yaml', ignore_errors: true }
|
||||
|
||||
services:
|
||||
|
||||
config:
|
||||
class: '\Magdev\Dossier\Service\ConfigService'
|
||||
|
||||
monolog:
|
||||
class: '\Magdev\Dossier\Service\MonologService'
|
||||
arguments: ['@config']
|
||||
|
||||
phar_helper:
|
||||
class: '\Magdev\Dossier\Service\PharHelperService'
|
||||
arguments: ['@monolog']
|
||||
|
||||
minifer:
|
||||
class: '\Magdev\Dossier\Service\MinifierService'
|
||||
arguments: ['@monolog']
|
||||
|
||||
translator:
|
||||
class: '\Magdev\Dossier\Service\TranslatorService'
|
||||
arguments: ['@config', '@monolog']
|
||||
|
||||
uri_helper:
|
||||
class: '\Magdev\Dossier\Service\UriHelperService'
|
||||
arguments: ['@monolog', '@phar_helper']
|
||||
|
||||
formatter:
|
||||
class: '\Magdev\Dossier\Service\FormatterService'
|
||||
arguments: ['@translator']
|
||||
|
||||
markdown:
|
||||
class: '\Magdev\Dossier\Service\MarkdownService'
|
||||
arguments: ['@monolog', '@formatter']
|
||||
|
||||
output_helper:
|
||||
class: '\Magdev\Dossier\Service\OutputHelperService'
|
||||
arguments: ['@translator']
|
||||
|
||||
template:
|
||||
class: '\Magdev\Dossier\Service\TemplateService'
|
||||
arguments: ['@markdown', '@translator', '@minifer', '@config', '@monolog']
|
||||
|
||||
cssproc:
|
||||
class: '\Magdev\Dossier\Service\StylesheetProcessorService'
|
||||
arguments: ['@monolog', '@template', '%scss.formatter%']
|
||||
|
||||
analyzer:
|
||||
class: '\Magdev\Dossier\Service\AnalyzerService'
|
||||
arguments: ['@config', '@monolog']
|
||||
|
||||
pdf:
|
||||
class: '\Magdev\Dossier\Service\PdfService'
|
||||
arguments: ['@config', '@monolog', '@template']
|
||||
|
||||
|
||||
|
||||
190
app/locale/messages.de.yaml
Normal file
190
app/locale/messages.de.yaml
Normal file
@@ -0,0 +1,190 @@
|
||||
app:
|
||||
header: 'Persönliches Dossier aus Markdown-Dateien erstellen'
|
||||
|
||||
date:
|
||||
start: 'Beginn'
|
||||
end: 'Ende'
|
||||
until: 'bis'
|
||||
today: 'heute'
|
||||
|
||||
format:
|
||||
year: "Ein Jahr|%y Jahre"
|
||||
month: "Ein Monat|%m Monate"
|
||||
day: "Ein Tag|%d Tage"
|
||||
info:
|
||||
debug_mode: 'DEBUG MODE '
|
||||
environment: 'ENVIRONMENT '
|
||||
|
||||
toc:
|
||||
resume: 'Einseitiges Résumé'
|
||||
cv: 'Curriculum Vitae'
|
||||
certs: 'Zeugnisse und Zertifikate'
|
||||
projects: 'Aktuelle Seitenprojekte'
|
||||
|
||||
form:
|
||||
init:
|
||||
header: 'Neues Dossier initialisieren'
|
||||
use_userstyles: 'Möchten sie benutzerdefinierte Stylesheets verwenden?'
|
||||
style_type: 'Preprocessor Typ'
|
||||
intro:
|
||||
header:
|
||||
add: 'Einleitungsseite erstellen'
|
||||
edit: 'Einleitungsseite bearbeiten'
|
||||
text: 'Bitte geben sie den Einleitungstext ein'
|
||||
add_quotes: 'Möchten sie Zitate hinzufügen?'
|
||||
quote_text: 'Zitat'
|
||||
quote_author: 'Autor des Zitats'
|
||||
show_quotes: 'Wo sollen die Zitate angezeigt werden?'
|
||||
person:
|
||||
header:
|
||||
add: 'Persönliche Daten erstellen'
|
||||
edit: 'Persönliche Daten bearbeiten'
|
||||
firstname: 'Vorname'
|
||||
lastname: 'Nachname'
|
||||
nationality: 'Nationalität'
|
||||
birthdate: 'Geburtsdatum (YYYY-MM-DD)'
|
||||
birthplace: 'Geburtsort'
|
||||
residence: 'Aktueller Wohnort'
|
||||
status: 'Familientstand'
|
||||
tagline: 'Tagline'
|
||||
work_license: 'Lizenz'
|
||||
language: 'Sprache'
|
||||
level: 'Grad'
|
||||
text: 'Kurzbiographie'
|
||||
add_languages: 'Möchten sie Sprachen hinzufügen?'
|
||||
projects: 'Seitenprojekte'
|
||||
interests: 'Persönliche Interessen'
|
||||
links: 'Links'
|
||||
cv:
|
||||
header:
|
||||
add: 'CV-Eintrag erstellen'
|
||||
edit: 'CV-Eintrag bearbeiten'
|
||||
text: 'Bitte geben sie einen Text ein'
|
||||
start_date: 'Start-Datum (YYYY-MM-DD)'
|
||||
end_date: 'End-Datum (YYYY-MM-DD)'
|
||||
position: 'Position'
|
||||
company: 'Unternehmen'
|
||||
industry: 'Branche'
|
||||
qualification: 'Abschluss'
|
||||
tag: 'Tag'
|
||||
skills: 'Fertigkeiten und Kenntnisse'
|
||||
achievements: 'Erreichte Ziele'
|
||||
toolbox: 'Werkzeuge'
|
||||
use_in_resume: 'In Résumé verwenden?'
|
||||
cover:
|
||||
subtitle: 'Bewerbungsdossier'
|
||||
|
||||
intro:
|
||||
toc: 'Auf den folgenden Seiten finden sie als Beilagen:'
|
||||
|
||||
projects:
|
||||
header: 'Aktuelle Projekte'
|
||||
fields:
|
||||
status: 'Status'
|
||||
role: 'Rolle'
|
||||
status:
|
||||
development: 'In Entwicklung'
|
||||
production: 'Produktivbetrieb'
|
||||
private: 'Privat'
|
||||
published: 'Veröffentlicht'
|
||||
eol: 'Nicht mehr im Einsatz'
|
||||
|
||||
cv:
|
||||
header: 'Curriculum Vitae'
|
||||
headers:
|
||||
education: "Schule, Aus- und Weiterbildung"
|
||||
experience: 'Berufserfahrung'
|
||||
other: 'Sonstiges'
|
||||
entry:
|
||||
qualification: "Abschluss:"
|
||||
skills: 'Erworbene Fähigkeiten und Kenntnisse:'
|
||||
achievements: 'Erreichte Ziele'
|
||||
|
||||
resume:
|
||||
header: 'Résumé'
|
||||
headers:
|
||||
skills: 'Kenntnisse und Fähigkeiten'
|
||||
personal: 'Persönliche Informationen'
|
||||
links: 'Links'
|
||||
contact: 'Kontaktdaten'
|
||||
achievements: 'Erreichte Ziele'
|
||||
experience: 'Berufserfahrung'
|
||||
qualification: 'Qualifikationen'
|
||||
bio: 'Bio'
|
||||
toolbox: 'Werkzeuge'
|
||||
personal_interest: 'Persönliche Interessen'
|
||||
current_projects: 'Aktuelle Seitenprojekte'
|
||||
references: Referenzen
|
||||
personal:
|
||||
name: 'Name'
|
||||
birthdate: 'Geboren am'
|
||||
birthplace: 'in'
|
||||
status: 'Familienstatus'
|
||||
nationality: 'Nationalität'
|
||||
languages: 'Sprachen'
|
||||
residence: 'Akt. Wohnort'
|
||||
work_license: 'Lizenz'
|
||||
language:
|
||||
level:
|
||||
native: 'Muttersprache'
|
||||
fluent: 'Flüssig'
|
||||
good: 'Gut'
|
||||
contact:
|
||||
email: 'E-Mail'
|
||||
phone: 'Telefon'
|
||||
chat: 'Hangouts'
|
||||
|
||||
certs:
|
||||
header: 'Zeugnisse und Zertifikate'
|
||||
|
||||
server:
|
||||
index:
|
||||
header: 'Dossier'
|
||||
title: 'Dossier Übersicht'
|
||||
filesize: 'Dateigrösse'
|
||||
filetime: 'Erstellt am'
|
||||
new_window: 'In neuen Fenster/Tab öffnen'
|
||||
|
||||
message:
|
||||
input:
|
||||
required_value: 'Dieser Wert ist erforderlich'
|
||||
invalid_date: 'Ungültiges Datum'
|
||||
invalid_tag: 'Ungültige Kategorie: %s'
|
||||
build:
|
||||
success: 'Ihr persönliches Dossier wurde erfoglreich erstellt'
|
||||
dump:
|
||||
success: 'Eine lokale Kopie des Themes %theme% wurde erfolgreich erstellt'
|
||||
export:
|
||||
template_dir: 'Bitte tragen sie folgendes in ihre .bashrc oder .profile ein:'
|
||||
template_homedir: 'Die Dateien wurden nach ~/.dossier/tpl kopiert'
|
||||
code:
|
||||
template_environment: 'export DOSSIER_THEME_DIR="%path%"'
|
||||
entry:
|
||||
success: 'Der CV-Eintrag wurde erfolgreich erstellt'
|
||||
command:
|
||||
initialized: 'Umgebung initiaisiert'
|
||||
output_file: 'Ausgabe-Datei'
|
||||
locale: 'Verwende Sprache: %locale%'
|
||||
theme: 'Verwende Theme: %theme%'
|
||||
stylesheet:
|
||||
less: 'LESS-Stylesheet gefunden'
|
||||
scss: 'SCSS-Stylesheet gefunden'
|
||||
model:
|
||||
person: 'Person-Model geladen'
|
||||
intro: 'Intro-Model geladen'
|
||||
letter: 'Letter-Model geladen'
|
||||
cv: 'CV mit %count% Einträgen geladen'
|
||||
config:
|
||||
deleted: 'Konfigurationseintrag %path% wurde gelöscht oder auf den Standardwert zurückgesetzt'
|
||||
write:
|
||||
success: 'Datei %name% erfolgreiche gespeichert'
|
||||
html:
|
||||
created: 'HTML-Dokument in %file% erstellt'
|
||||
pdf:
|
||||
created: 'PDF-Dokument in %file% erstellt'
|
||||
|
||||
pdf:
|
||||
page:
|
||||
title: '{{title}}'
|
||||
number: '{{page}}'
|
||||
date: '{{date}}'
|
||||
117
app/locale/messages.en.yaml
Normal file
117
app/locale/messages.en.yaml
Normal file
@@ -0,0 +1,117 @@
|
||||
app:
|
||||
header: 'Create a personal dossier from Markdown files'
|
||||
|
||||
date:
|
||||
start: 'Begin'
|
||||
end: 'End'
|
||||
until: 'until'
|
||||
today: 'today'
|
||||
|
||||
format:
|
||||
year: "One year|%y years"
|
||||
month: "One month|%m months"
|
||||
day: "One day|%d days"
|
||||
|
||||
info:
|
||||
debug_mode: 'DEBUG MODE '
|
||||
environment: 'ENVIRONMENT '
|
||||
|
||||
cover:
|
||||
subtitle: 'Personal Dossier'
|
||||
|
||||
cv:
|
||||
header: 'Curriculum Vitae'
|
||||
headers:
|
||||
education: "Education"
|
||||
experience: 'Job Experience'
|
||||
other: 'Other'
|
||||
entry:
|
||||
qualification: "Degree:"
|
||||
skills: 'Obtained skills:'
|
||||
achievements: 'Achievements'
|
||||
question:
|
||||
intro: 'Bitte geben sie die entsprechenden Daten ein:'
|
||||
start_date: ' An welchem Tag begann die Tätigkeit? '
|
||||
end_date: ' An welchem Tag endete die Tätigkeit? '
|
||||
tag: ' Zu welcher Kategorie gehört der Eintrag? '
|
||||
position: ' Welche Position haben sie bekleidet? '
|
||||
company: ' Wie heisst die Firma, bei der sie angestellt waren? '
|
||||
industry: ' In welcher Branche waren sie tätig? '
|
||||
achievements: ' Welche Ziele haben sie während der Tätigkeit erreicht? '
|
||||
qualification: ' Welche Qualification haben sie erreicht? '
|
||||
skills: ' Welche fertigkeiten und Kenntnisse haben sie erworben? '
|
||||
notes: ' Notizen zu diesem Eintrag: '
|
||||
description: ' Beschreiben sie ihre Tätigkeiten: '
|
||||
use_in_resume: ' Soll dieser Eintrag im Résumé verwendet werden? '
|
||||
|
||||
resume:
|
||||
header: 'Résumé'
|
||||
headers:
|
||||
skills: 'Skills'
|
||||
personal: 'Personal Information'
|
||||
links: 'Links'
|
||||
contact: 'Contact'
|
||||
achievements: 'Achievements'
|
||||
experience: 'Job Experience'
|
||||
qualification: 'Qualifications'
|
||||
bio: 'Bio'
|
||||
toolbox: 'Toolbox'
|
||||
personal_interest: 'Personal Interests'
|
||||
current_projects: 'Current Sideprojects'
|
||||
personal:
|
||||
name: 'Name'
|
||||
birthdate: 'born at'
|
||||
birthplace: 'in'
|
||||
status: 'Familiy status'
|
||||
nationality: 'Nationality'
|
||||
languages: 'Languagues'
|
||||
residence: 'Current Residence'
|
||||
work_license: 'License'
|
||||
language:
|
||||
level:
|
||||
native: 'native'
|
||||
fluent: 'fluent'
|
||||
good: 'good'
|
||||
rookie: 'rookie'
|
||||
contact:
|
||||
email: 'E-Mail'
|
||||
phone: 'Phone'
|
||||
chat: 'Hangouts'
|
||||
|
||||
certs:
|
||||
header: 'Certificates'
|
||||
|
||||
message:
|
||||
input:
|
||||
required_value: 'This value is required'
|
||||
invalid_date: 'Invalid date'
|
||||
invalid_tag: 'Invalid tag: %s'
|
||||
build:
|
||||
success: 'Your personal dossier has been successfully built'
|
||||
dump:
|
||||
success: 'A local copy of the theme %theme% was created successfully'
|
||||
export:
|
||||
template_dir: 'Please add the following to your .bashrc or .profile file:'
|
||||
template_homedir: 'The files are copied to ~/.dossier/tpl'
|
||||
code:
|
||||
template_environment: 'export DOSSIER_THEME_DIR="%path%"'
|
||||
entry:
|
||||
success: 'Der CV-Eintrag wurde erfolgreich erstellt'
|
||||
command:
|
||||
initialized: 'Environment loaded'
|
||||
output_file: 'Output-File'
|
||||
locale: 'Using locale: %locale%'
|
||||
theme: 'Using theme: %theme%'
|
||||
stylesheet:
|
||||
less: 'LESS-Stylesheet found'
|
||||
scss: 'SCSS-Stylesheet found'
|
||||
model:
|
||||
person: 'Person-Model loaded'
|
||||
intro: 'Intro-Model loaded'
|
||||
cv: 'CV with %count% entries loaded'
|
||||
config:
|
||||
deleted: 'Configuration value %path% successfully deleted or resetted to default value'
|
||||
write:
|
||||
success: 'File %name% successfully written'
|
||||
|
||||
|
||||
1
app/tpl/.gitignore
vendored
Normal file
1
app/tpl/.gitignore
vendored
Normal file
@@ -0,0 +1 @@
|
||||
/latex/
|
||||
36
app/tpl/print/document.html.twig
Normal file
36
app/tpl/print/document.html.twig
Normal file
@@ -0,0 +1,36 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="{{ locale }}">
|
||||
<!-- Build with magdev/dossier -->
|
||||
<head>
|
||||
<meta char{{ ('set="'~config('charset')~'"')|raw }}>
|
||||
<meta name="viewport" content="width=device-width,initial-scale=1.0" />
|
||||
{% if favicon %}<link rel="shortcut icon" href="{{ favicon }}">{% endif %}
|
||||
<title>{{ 'cover.subtitle'|trans }} | {{ person.name }}</title>
|
||||
<style media="screen,print">
|
||||
{{ stylesheet|raw }}
|
||||
{{ userstyles|raw }}
|
||||
</style>
|
||||
</head>
|
||||
<body class="theme-{{ theme }}">
|
||||
{% if is_disabled(disabled.cover) == false %}
|
||||
{{ include('parts/cover.html.twig') }}
|
||||
{% endif %}
|
||||
<article>
|
||||
{% if is_disabled(disabled.intro) == false %}
|
||||
{{ include('parts/intro.html.twig') }}
|
||||
{% endif %}
|
||||
{% if is_disabled(disabled.resume) == false %}
|
||||
{{ include('parts/resume.html.twig') }}
|
||||
{% endif %}
|
||||
{% if is_disabled(disabled.projects) == false %}
|
||||
{{ include('parts/projects.html.twig') }}
|
||||
{% endif %}
|
||||
{% if is_disabled(disabled.cv) == false %}
|
||||
{{ include('parts/cv.html.twig') }}
|
||||
{% endif %}
|
||||
{% if is_disabled(disabled.certs) == false %}
|
||||
{{ include('parts/certs.html.twig') }}
|
||||
{% endif %}
|
||||
</article>
|
||||
</body>
|
||||
</html>
|
||||
BIN
app/tpl/print/favicon.ico
Normal file
BIN
app/tpl/print/favicon.ico
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 2.2 KiB |
BIN
app/tpl/print/favicon.png
Normal file
BIN
app/tpl/print/favicon.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 1.2 KiB |
603
app/tpl/print/less/global.less
Normal file
603
app/tpl/print/less/global.less
Normal file
@@ -0,0 +1,603 @@
|
||||
/**
|
||||
* LESS for magdev/resume print theme
|
||||
*/
|
||||
|
||||
// MIXINS:START
|
||||
|
||||
//
|
||||
// Mixins
|
||||
//
|
||||
.no-page-break-inside() {
|
||||
page-break-after: auto;
|
||||
page-break-before: auto;
|
||||
page-break-inside: avoid;
|
||||
}
|
||||
.border-radius(@radius) {
|
||||
-moz-border-radius: @radius;
|
||||
-webkit-border-radius: @radius;
|
||||
border-radius: @radius;
|
||||
}
|
||||
|
||||
.border-box(@width) {
|
||||
border-right: @width solid @base-accent-color;
|
||||
border-bottom: (@width * 2) solid @base-background-color;
|
||||
}
|
||||
|
||||
.clearfix() {
|
||||
&::after {
|
||||
display: block;
|
||||
content: '.';
|
||||
clear: both;
|
||||
visibility: hidden;
|
||||
height: 1px;
|
||||
font-size: 1px;
|
||||
}
|
||||
}
|
||||
|
||||
// MIXINS:END
|
||||
|
||||
// VARS:START
|
||||
|
||||
//
|
||||
// Variables
|
||||
//
|
||||
|
||||
// Base styles
|
||||
@base-font-family: Arial, Verdana;
|
||||
@base-font-size: 10pt;
|
||||
@base-font-color: #222;
|
||||
@base-background-color: #fff;
|
||||
@base-accent-color: #68d19b;
|
||||
|
||||
// Page format
|
||||
@page-format: A4 portrait;
|
||||
@page-margins: 11mm 17mm 17mm 17mm;
|
||||
|
||||
// Typography
|
||||
@headline-small-font-style: italic;
|
||||
@headline-font-weight: bold;
|
||||
@headline-border-style: 1px solid @base-accent-color;
|
||||
|
||||
@headline-1-size: (@base-font-size + 8pt);
|
||||
@headline-1-size-small: (@headline-1-size - 5pt);
|
||||
@headline-1-color: @base-font-color;
|
||||
@headline-1-color-small: lighten(@base-font-color, 20%);
|
||||
|
||||
@headline-2-size: (@base-font-size + 6pt);
|
||||
@headline-2-size-small: (@headline-2-size - 4pt);
|
||||
@headline-2-color: @base-font-color;
|
||||
@headline-2-color-small: lighten(@base-font-color, 20%);
|
||||
|
||||
@headline-3-size: @base-font-size;
|
||||
@headline-3-size-small: (@headline-3-size - 2pt);
|
||||
@headline-3-color: lighten(@base-font-color, 30%);
|
||||
@headline-3-color-small: lighten(@base-font-color, 15%);
|
||||
@headline-3-spacing: .4pt;
|
||||
@headline-3-transform: uppercase;
|
||||
|
||||
@headline-4-size: (@base-font-size + 1pt);
|
||||
@headline-4-size-small: (@headline-4-size - 2pt);
|
||||
@headline-4-color: @base-font-color;
|
||||
@headline-4-color-small: lighten(@base-font-color, 20%);
|
||||
|
||||
@paragraph-size: @base-font-size;
|
||||
@paragraph-size-small: (@paragraph-size - 2pt);
|
||||
@paragraph-color: @base-font-color;
|
||||
@paragraph-text-align: left;
|
||||
|
||||
@date-base-color: lighten(@base-font-color, 30%);
|
||||
@date-start-color: @base-accent-color;
|
||||
|
||||
|
||||
// Whitespace
|
||||
@headline-margin: .5cm 0 .2cm;
|
||||
@paragraph-margin: 0 0 .3cm;
|
||||
@paragraph-line-height: (@paragraph-size + 2pt);
|
||||
@column-space: .3cm;
|
||||
|
||||
@blockquote-vertical-space: .5cm;
|
||||
@blockquote-horizontal-wide: 3cm;
|
||||
@blockquote-horizontal-narrow: 1.5cm;
|
||||
|
||||
// Cover
|
||||
@cover-border-width: 6pt;
|
||||
@cover-text-position: 18cm 0 0 8cm;
|
||||
|
||||
// Intro
|
||||
@intro-paragraph-size: (@paragraph-size + .5pt);
|
||||
@intro-paragraph-line-height: (@intro-paragraph-size + 3pt);
|
||||
@intro-photo-border-radius: 0;
|
||||
@intro-photo-margin: .15cm 0 .3cm .5cm;
|
||||
@intro-photo-align: right;
|
||||
@intro-text-inset: .1cm;
|
||||
@intro-text-right-inset: .5cm;
|
||||
@intro-text-align: justify;
|
||||
|
||||
// Resume
|
||||
@resume-column-space: @column-space;
|
||||
@resume-border-width: @cv-border-width;
|
||||
@resume-label-color: lighten(@base-font-color, 30%);
|
||||
@resume-gutter-padding: .6cm;
|
||||
@resume-text-inset: .1cm;
|
||||
@resume-text-align: left;
|
||||
|
||||
// CV
|
||||
@cv-column-space: @column-space;
|
||||
@cv-border-width: 4pt;
|
||||
@cv-label-color: lighten(@base-font-color, 30%);
|
||||
@cv-text-align: @resume-text-align;
|
||||
|
||||
|
||||
// VARS:END
|
||||
|
||||
|
||||
|
||||
//
|
||||
// Styles
|
||||
//
|
||||
|
||||
|
||||
// Reset
|
||||
* {
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
border: 0;
|
||||
font-weight: normal;
|
||||
font-style: normal;
|
||||
}
|
||||
|
||||
|
||||
// Grid
|
||||
.row {
|
||||
display: flex;
|
||||
}
|
||||
.col {
|
||||
flex: 1;
|
||||
}
|
||||
|
||||
.col-border { flex: 0 0 1%; }
|
||||
.col-tenth { flex: 0 0 10%; }
|
||||
.col-eighth { flex: 0 0 12.5%; }
|
||||
.col-fifteen { flex: 0 0 15%; }
|
||||
.col-fifth { flex: 0 0 20%; }
|
||||
.col-quarter { flex: 0 0 25%; }
|
||||
.col-third { flex: 0 0 33.3333334%; }
|
||||
.col-half { flex: 0 0 50%; }
|
||||
.col-resume { flex: 0 0 48.5%; }
|
||||
.col-golden-narrow { flex: 0 0 38%; }
|
||||
.col-golden-wide { flex: 0 0 62%; }
|
||||
|
||||
|
||||
// Page settings for printing
|
||||
@page {
|
||||
size: @page-format;
|
||||
margin: @page-margins;
|
||||
}
|
||||
|
||||
// Base elements
|
||||
html, body {
|
||||
background-color: @base-background-color;
|
||||
font-family: @base-font-family;
|
||||
font-size: @base-font-size;
|
||||
color: @base-font-color;
|
||||
}
|
||||
section {
|
||||
page-break-before: always;
|
||||
}
|
||||
|
||||
h1, h2, h3 {
|
||||
font-weight: @headline-font-weight;
|
||||
margin: @headline-margin;
|
||||
page-break-after: avoid;
|
||||
|
||||
small {
|
||||
font-style: @headline-small-font-style;
|
||||
}
|
||||
}
|
||||
h1 {
|
||||
font-size: @headline-1-size;
|
||||
margin-top: 0;
|
||||
|
||||
small {
|
||||
font-size: @headline-1-size-small;
|
||||
color: @headline-1-color-small;
|
||||
}
|
||||
}
|
||||
h2 {
|
||||
font-size: @headline-2-size;
|
||||
border-bottom: @headline-border-style;
|
||||
margin-top: 0;
|
||||
|
||||
small {
|
||||
font-size: @headline-2-size-small;
|
||||
color: @headline-2-color-small;
|
||||
}
|
||||
}
|
||||
h3 {
|
||||
font-size: @headline-3-size;
|
||||
color: @headline-3-color;
|
||||
letter-spacing: @headline-3-spacing;
|
||||
text-transform: @headline-3-transform;
|
||||
|
||||
small {
|
||||
font-size: @headline-3-size-small;
|
||||
color: @headline-3-color-small;
|
||||
text-transform: none;
|
||||
}
|
||||
}
|
||||
p {
|
||||
margin: @paragraph-margin;
|
||||
font-size: @paragraph-size;
|
||||
text-align: @paragraph-text-align;
|
||||
color: @paragraph-color;
|
||||
|
||||
small {
|
||||
font-size: @paragraph-size-small;
|
||||
}
|
||||
}
|
||||
ul, ol, li {
|
||||
list-style-type: none;
|
||||
}
|
||||
|
||||
a, a:active, a:hover, a:visited {
|
||||
text-decoration: none;
|
||||
color: @base-font-color;
|
||||
}
|
||||
strong {
|
||||
font-weight: bold;
|
||||
}
|
||||
em {
|
||||
font-style: italic;
|
||||
}
|
||||
blockquote {
|
||||
padding: .3cm 1cm .15cm;
|
||||
color: lighten(@base-font-color, 30%);
|
||||
background-color: lighten(@base-font-color, 80%);
|
||||
border: 1px solid lighten(@base-font-color, 80%);
|
||||
font-style: italic;
|
||||
.border-radius(5pt);
|
||||
.clearfix();
|
||||
|
||||
.text {
|
||||
font-family: Georgia;
|
||||
font-size: (@paragraph-size + 2pt);
|
||||
font-style: italic;
|
||||
}
|
||||
.author {
|
||||
font-family: Georgia;
|
||||
font-size: (@paragraph-size - 1pt);
|
||||
font-style: italic;
|
||||
float: right;
|
||||
margin-top: .2cm;
|
||||
}
|
||||
}
|
||||
blockquote:nth-child(even) {
|
||||
margin: @blockquote-vertical-space @blockquote-horizontal-wide @blockquote-vertical-space @blockquote-horizontal-narrow;
|
||||
}
|
||||
blockquote:nth-child(odd) {
|
||||
margin: @blockquote-vertical-space @blockquote-horizontal-narrow @blockquote-vertical-space @blockquote-horizontal-wide;
|
||||
}
|
||||
|
||||
|
||||
dl.horizontal {
|
||||
dl {
|
||||
.no-page-break-inside();
|
||||
}
|
||||
dt, dd {
|
||||
display: inline-block;
|
||||
line-height: 14pt;
|
||||
}
|
||||
dt {
|
||||
text-align: right;
|
||||
padding-right: .2cm;
|
||||
font-size: (@base-font-size - 1pt);
|
||||
vertical-align: top;
|
||||
color: @resume-label-color;
|
||||
margin-top: .5pt;
|
||||
}
|
||||
dd {
|
||||
font-size: @base-font-size;
|
||||
text-align: @resume-text-align;
|
||||
|
||||
li, p {
|
||||
padding-left: 0;
|
||||
padding-right: 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
// Cover page
|
||||
.cover {
|
||||
.col-border {
|
||||
.border-box(@cover-border-width);
|
||||
}
|
||||
.col-content {
|
||||
padding-left: .3cm;
|
||||
}
|
||||
.text {
|
||||
margin: @cover-text-position;
|
||||
|
||||
h1 {
|
||||
font-size: 30pt;
|
||||
font-weight: bold;
|
||||
margin-top: 0;
|
||||
margin-bottom: .5cm;
|
||||
line-height: 26pt;
|
||||
}
|
||||
|
||||
.tagline {
|
||||
font-size: 20pt;
|
||||
color: lighten(@base-font-color, 30%);
|
||||
}
|
||||
|
||||
.subtitle {
|
||||
font-size: 12pt;
|
||||
font-style: italic;
|
||||
color: @base-accent-color;
|
||||
margin-bottom: 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// Certificate pages
|
||||
.certs {
|
||||
.certificate {
|
||||
text-align: center;
|
||||
page-break-after: always;
|
||||
|
||||
|
||||
figcaption {
|
||||
text-align: left;
|
||||
margin-bottom: .2cm;
|
||||
|
||||
h3 {
|
||||
small {
|
||||
text-transform: none;
|
||||
display: block;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
img {
|
||||
width: 95%;
|
||||
height: auto;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
// Introduction page
|
||||
.intro {
|
||||
h4 {
|
||||
border-bottom: 1pt solid lighten(@base-font-color, 40%);
|
||||
margin-bottom: 2pt;
|
||||
margin-top: 1.2cm;
|
||||
display: inline-block;
|
||||
}
|
||||
.toc {
|
||||
list-style-position: inside;
|
||||
padding-left: .3cm;
|
||||
|
||||
li {
|
||||
list-style-type: circle;
|
||||
font-size: @base-font-size;
|
||||
}
|
||||
}
|
||||
.content {
|
||||
padding-left: @intro-text-inset;
|
||||
padding-right: @intro-text-right-inset;
|
||||
.clearfix();
|
||||
|
||||
h2, h3 {
|
||||
margin-left: -@intro-text-inset;
|
||||
margin-right: -(@intro-text-inset + @intro-text-right-inset);
|
||||
}
|
||||
}
|
||||
.quotes {
|
||||
&.top {
|
||||
margin-bottom: 1cm;
|
||||
}
|
||||
&.bottom {
|
||||
margin-top: 1cm;
|
||||
}
|
||||
}
|
||||
p, li {
|
||||
line-height: @intro-paragraph-line-height;
|
||||
font-size: @intro-paragraph-size;
|
||||
text-align: @intro-text-align;
|
||||
}
|
||||
.photo {
|
||||
float: @intro-photo-align;
|
||||
margin: @intro-photo-margin;
|
||||
height: auto;
|
||||
.border-radius(@intro-photo-border-radius);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// Curriculum vitae
|
||||
.cv {
|
||||
.cv-entry {
|
||||
.no-page-break-inside();
|
||||
margin-bottom: .5cm;
|
||||
|
||||
h4 {
|
||||
font-weight: bold;
|
||||
font-size: @headline-4-size;
|
||||
color: @headline-4-color;
|
||||
|
||||
small {
|
||||
font-size: @headline-4-size-small;
|
||||
font-style: italic;
|
||||
color: @headline-4-color-small;
|
||||
}
|
||||
}
|
||||
|
||||
p {
|
||||
text-align: @cv-text-align;
|
||||
small {
|
||||
color: @cv-label-color;
|
||||
font-style: italic;
|
||||
}
|
||||
}
|
||||
.col-date {
|
||||
padding-right: @column-space;
|
||||
.border-box(@cv-border-width);
|
||||
}
|
||||
.col-info {
|
||||
padding-left: @column-space;
|
||||
|
||||
p {
|
||||
margin-bottom: .1cm;
|
||||
|
||||
&:last-child {
|
||||
margin-bottom: 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.date {
|
||||
font-size: @base-font-size;
|
||||
font-weight: bold;
|
||||
text-align: right;
|
||||
color: @date-base-color;
|
||||
|
||||
.start, .end {
|
||||
display: block;
|
||||
}
|
||||
|
||||
.start {
|
||||
font-size: (@base-font-size + 4pt);
|
||||
font-weight: bold;
|
||||
color: @date-start-color;
|
||||
}
|
||||
}
|
||||
|
||||
.company {
|
||||
font-size: (@base-font-size - 1pt);
|
||||
font-style: italic;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// Projects
|
||||
.projects {
|
||||
|
||||
.content {
|
||||
padding-left: @intro-text-inset;
|
||||
padding-right: @intro-text-right-inset;
|
||||
.clearfix();
|
||||
|
||||
h2, h3 {
|
||||
margin-left: -@intro-text-inset;
|
||||
margin-right: -(@intro-text-inset + @intro-text-right-inset);
|
||||
}
|
||||
}
|
||||
.short-description {
|
||||
font-weight: bold;
|
||||
font-size: (@base-font-size + .5pt);
|
||||
}
|
||||
dl.horizontal {
|
||||
display: none;
|
||||
dt {
|
||||
text-align: left;
|
||||
width: 1cm;
|
||||
}
|
||||
dd {
|
||||
padding-right: 1cm;
|
||||
p {
|
||||
margin: 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
p, li {
|
||||
line-height: @intro-paragraph-line-height;
|
||||
font-size: @intro-paragraph-size;
|
||||
text-align: @intro-text-align;
|
||||
}
|
||||
}
|
||||
|
||||
// Resume
|
||||
.resume {
|
||||
|
||||
dl.horizontal {
|
||||
dt {
|
||||
width: 2.1cm;
|
||||
}
|
||||
dd {
|
||||
width: 6cm;
|
||||
}
|
||||
}
|
||||
li, p {
|
||||
font-size: @base-font-size;
|
||||
text-align: @resume-text-align;
|
||||
padding-left: @resume-text-inset;
|
||||
padding-right: @resume-gutter-padding;
|
||||
}
|
||||
.col-resume {
|
||||
margin-top: .45cm;
|
||||
|
||||
h3:first-child {
|
||||
margin-top: .05cm;
|
||||
}
|
||||
}
|
||||
.col-1 {
|
||||
.border-box(@resume-border-width);
|
||||
flex: 0 0 47.5%;
|
||||
}
|
||||
.col-2 {
|
||||
padding-left: @resume-gutter-padding;
|
||||
flex: 0 0 50.5%;
|
||||
|
||||
li {
|
||||
margin-bottom: 3pt;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Footers and headers or PDF generation
|
||||
footer,
|
||||
header {
|
||||
display: block;
|
||||
|
||||
.left {
|
||||
text-align: left;
|
||||
}
|
||||
.center {
|
||||
text-align: center;
|
||||
}
|
||||
.right {
|
||||
text-align: right;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// Specific screen styles
|
||||
@media screen {
|
||||
html, body {
|
||||
height: 100%;
|
||||
}
|
||||
body {
|
||||
margin: 20px 30px 0;
|
||||
width: 19.5cm;
|
||||
}
|
||||
section {
|
||||
margin-bottom: 2cm;
|
||||
|
||||
&.cover {
|
||||
.text {
|
||||
margin: 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
.certs {
|
||||
.certificate {
|
||||
margin-bottom: 1.5cm;
|
||||
}
|
||||
}
|
||||
}
|
||||
50
app/tpl/print/macros.html.twig
Normal file
50
app/tpl/print/macros.html.twig
Normal file
@@ -0,0 +1,50 @@
|
||||
{% macro show_quotes(quotes, class) %}
|
||||
<div class="quotes {{ class|default('top') }}">
|
||||
{% for quote in quotes %}
|
||||
<blockquote>
|
||||
<span class="text">{{ quote.quoteText }}</span>
|
||||
{% if quote.quoteAuthor %}
|
||||
<span class="author">{{ quote.quoteAuthor }}</span>
|
||||
{% endif %}
|
||||
</blockquote>
|
||||
{% endfor %}
|
||||
</div>
|
||||
{% endmacro %}
|
||||
|
||||
|
||||
{% macro list_simple_array(entries, tag) %}
|
||||
{% set tag = tag|default('li') %}
|
||||
{% for line in entries %}
|
||||
<{{ tag }}>{{ line|inlinemd }}</{{ tag }}>
|
||||
{% endfor %}
|
||||
{% endmacro %}
|
||||
|
||||
|
||||
{% macro list_link_array(entries, tag) %}
|
||||
{% set tag = tag|default('li') %}
|
||||
{% for link in entries %}
|
||||
<{{ tag }}><a href="{{ link }}" target="_blank">{{ link }}</a></{{ tag }}>
|
||||
{% endfor %}
|
||||
{% endmacro %}
|
||||
|
||||
|
||||
{% macro list_entry_attribute(entries, attribute, tag) %}
|
||||
{% set tag = tag|default('li') %}
|
||||
{% for entry in entries %}
|
||||
{% if attribute(entry, attribute)|length > 0 %}
|
||||
{% for line in attribute(entry, attribute) %}
|
||||
<{{ tag }}>{{ line|inlinemd }}</{{ tag }}>
|
||||
{% endfor %}
|
||||
{% endif %}
|
||||
{% endfor %}
|
||||
{% endmacro %}
|
||||
|
||||
|
||||
{% macro list_references(references) %}
|
||||
{% for reference in references %}
|
||||
<li>
|
||||
|
||||
</li>
|
||||
{% endfor %}
|
||||
{% endmacro %}
|
||||
|
||||
16
app/tpl/print/parts/certs.html.twig
Normal file
16
app/tpl/print/parts/certs.html.twig
Normal file
@@ -0,0 +1,16 @@
|
||||
<section class="certs">
|
||||
<h2>{{ 'certs.header'|trans }}</h2>
|
||||
{% for entry in cv.filterByCertificates() %}
|
||||
{% for cert in entry.certificates %}
|
||||
<div class="certificate">
|
||||
<figure>
|
||||
<figcaption>
|
||||
<h3>{{ entry.position }} {% if cert.type %}- {{ cert.type }}{% endif %}
|
||||
<small>{{ entry.endDate.format('Y') }} - {{ entry.company }}</small></h3>
|
||||
</figcaption>
|
||||
<img src="{{ cert.dataUri|raw }}" alt="{{ cert.fileObject.filename }}">
|
||||
</figure>
|
||||
</div>
|
||||
{% endfor %}
|
||||
{% endfor %}
|
||||
</section>
|
||||
10
app/tpl/print/parts/cover.html.twig
Normal file
10
app/tpl/print/parts/cover.html.twig
Normal file
@@ -0,0 +1,10 @@
|
||||
<section class="cover">
|
||||
<div class="text row">
|
||||
<div class="col col-border"> </div>
|
||||
<div class="col col-content">
|
||||
<h1 class="title">{{ person.name }}</h1>
|
||||
<p class="tagline">{{ person.tagline|splitmerge|raw }}</p>
|
||||
<p class="subtitle">{{ 'cover.subtitle'|trans }}</p>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
12
app/tpl/print/parts/cv.html.twig
Normal file
12
app/tpl/print/parts/cv.html.twig
Normal file
@@ -0,0 +1,12 @@
|
||||
<section class="cv">
|
||||
<h2>{{ 'cv.header'|trans }}</h2>
|
||||
|
||||
{% for tag in tags %}
|
||||
<div class="tag tag-{{ tag }}">
|
||||
<h3>{{ ('cv.headers.' ~ tag)|trans }}</h3>
|
||||
{% for entry in cv.filterByTag(tag) %}
|
||||
{{ include('parts/cv/entry.html.twig') }}
|
||||
{% endfor %}
|
||||
</div>
|
||||
{% endfor %}
|
||||
</section>
|
||||
32
app/tpl/print/parts/cv/entry.html.twig
Normal file
32
app/tpl/print/parts/cv/entry.html.twig
Normal file
@@ -0,0 +1,32 @@
|
||||
<div class="cv-entry row">
|
||||
<div class="col col-fifteen col-date">
|
||||
<p class="date">
|
||||
<span class="start">{{ entry.startDate.format(config('date.format.short')) }}</span>
|
||||
<span class="end"><small>{{ 'date.until'|trans }}</small>
|
||||
{% if is_today(entry.endDate) %}
|
||||
{{ 'date.today'|trans }}
|
||||
{% else %}
|
||||
{{ entry.endDate.format(config('date.format.short')) }}
|
||||
{% endif %}
|
||||
</span>
|
||||
</p>
|
||||
</div>
|
||||
<div class="col col-info">
|
||||
<h4>{{ entry.position }} {% if entry.industry %}<small>({{ entry.industry }})</small>{% endif %}</h4>
|
||||
<p class="company">{{ entry.company }}</p>
|
||||
{% if entry.description %}
|
||||
<div class="content">
|
||||
{{ entry.description|raw }}
|
||||
</div>
|
||||
{% endif %}
|
||||
{% if entry.qualification %}
|
||||
<p class="qualification"><small>{{ 'cv.entry.qualification'|trans }}</small><br/>{{ entry.qualification }}</p>
|
||||
{% endif %}
|
||||
{% if entry.skills|length > 0 %}
|
||||
<p class="skills"><small>{{ 'cv.entry.skills'|trans }}</small><br/>{{ entry.skills|merge|inlinemd }}</p>
|
||||
{% endif %}
|
||||
{% if entry.achievements|length > 0 %}
|
||||
<p class="achievements"><small>{{ 'cv.entry.achievements'|trans }}</small><br/>{{ entry.achievements|merge|inlinemd }}</p>
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
37
app/tpl/print/parts/intro.html.twig
Normal file
37
app/tpl/print/parts/intro.html.twig
Normal file
@@ -0,0 +1,37 @@
|
||||
<section class="intro">
|
||||
{% import "macros.html.twig" as macros %}
|
||||
|
||||
{% if is_disabled(disabled.quotes) == false and intro.quotes|length > 0 and intro.showQuotes == 'top' %}
|
||||
{{ macros.show_quotes(intro.quotes, intro.showQuotes) }}
|
||||
{% endif %}
|
||||
|
||||
<div class="content">
|
||||
{% if intro.headline %}<h2>{{ intro.headline }}</h2>{% endif %}
|
||||
{% if intro.hasPhoto() %}
|
||||
<img src="{{ intro.photoDataUri }}" alt="{{ person.name }}" class="photo" width="{{ intro.photoSize }}">
|
||||
{% endif %}
|
||||
{{ intro.content|raw }}
|
||||
</div>
|
||||
|
||||
{% if is_disabled(disabled.quotes) == false and intro.quotes|length > 0 and intro.showQuotes == 'bottom' %}
|
||||
{{ macros.show_quotes(intro.quotes, intro.showQuotes) }}
|
||||
{% endif %}
|
||||
|
||||
{% if is_disabled(disabled.toc) == false %}
|
||||
<h4>{{ 'intro.toc'|trans }}</h4>
|
||||
<ul class="toc">
|
||||
{% if is_disabled(disabled.resume) == false %}
|
||||
<li>{{ 'toc.resume'|trans }}</li>
|
||||
{% endif %}
|
||||
{% if is_disabled(disabled.projects) == false %}
|
||||
<li>{{ 'toc.projects'|trans }}</li>
|
||||
{% endif %}
|
||||
{% if is_disabled(disabled.cv) == false %}
|
||||
<li>{{ 'toc.cv'|trans }}</li>
|
||||
{% endif %}
|
||||
{% if is_disabled(disabled.certs) == false %}
|
||||
<li>{{ 'toc.certs'|trans }}</li>
|
||||
{% endif %}
|
||||
</ul>
|
||||
{% endif %}
|
||||
</section>
|
||||
11
app/tpl/print/parts/pdf/footer.html.twig
Normal file
11
app/tpl/print/parts/pdf/footer.html.twig
Normal file
@@ -0,0 +1,11 @@
|
||||
<footer class="row">
|
||||
<div class="col col-third left">
|
||||
|
||||
</div>
|
||||
<div class="col col-third center">
|
||||
{{ 'pdf.page.number'|trans|raw }}
|
||||
</div>
|
||||
<div class="col col-third right">
|
||||
|
||||
</div>
|
||||
</footer>
|
||||
8
app/tpl/print/parts/pdf/header.html.twig
Normal file
8
app/tpl/print/parts/pdf/header.html.twig
Normal file
@@ -0,0 +1,8 @@
|
||||
<header class="row">
|
||||
<div class="col col-half left">
|
||||
{{ 'pdf.page.title'|trans|raw }}
|
||||
</div>
|
||||
<div class="col col-half right">
|
||||
{{ 'pdf.page.date'|trans|raw }}
|
||||
</div>
|
||||
</header>
|
||||
25
app/tpl/print/parts/projects.html.twig
Normal file
25
app/tpl/print/parts/projects.html.twig
Normal file
@@ -0,0 +1,25 @@
|
||||
{% if projects|length > 0 %}
|
||||
<section class="projects">
|
||||
<h2>{{ 'projects.header'|trans }}</h2>
|
||||
|
||||
<div class="content">
|
||||
{% for project in projects %}
|
||||
<article class="project">
|
||||
<h3>{{ project.name }} {% if project.stack %}<small>({{ project.stack }})</small>{% endif %}</h3>
|
||||
<dl class="horizontal">
|
||||
<dt>{{ 'projects.fields.status'|trans }}</dt>
|
||||
<dd>
|
||||
<p class="badge badge-{{ project.status }}">{{ ('projects.status.' ~ project.status)|trans }}</p>
|
||||
</dd>
|
||||
{% if project.role %}
|
||||
<dt>{{ 'projects.fields.role'|trans }}</dt>
|
||||
<dd>{{ project.role }}</dd>
|
||||
{% endif %}
|
||||
</dl>
|
||||
<p class="short-description">{{ project.shortDescription }}</p>
|
||||
{{ project.content|raw }}
|
||||
</article>
|
||||
{% endfor %}
|
||||
</div>
|
||||
</section>
|
||||
{% endif %}
|
||||
139
app/tpl/print/parts/resume.html.twig
Normal file
139
app/tpl/print/parts/resume.html.twig
Normal file
@@ -0,0 +1,139 @@
|
||||
{% set useInResume = cv.filterByUseInResume() %}
|
||||
{% set toolbox = cv.filterByToolbox() %}
|
||||
{% import "macros.html.twig" as macros %}
|
||||
|
||||
<section class="resume">
|
||||
<h2>{{ 'resume.header'|trans }}</h2>
|
||||
<div class="row">
|
||||
<div class="col col-resume col-1">
|
||||
|
||||
<!-- Personal Information -->
|
||||
<h3>{{ 'resume.headers.personal'|trans }}</h3>
|
||||
<dl class="horizontal">
|
||||
<dt>{{ 'resume.personal.name'|trans }}</dt>
|
||||
<dd>{{ person.getName(true) }}</dd>
|
||||
<dt>{{ 'resume.personal.birthdate'|trans }}</dt>
|
||||
<dd>{{ person.birthdate.format(config('date.format.long')) }}</dd>
|
||||
<dt>{{ 'resume.personal.birthplace'|trans }}</dt>
|
||||
<dd>{{ person.birthplace }}</dd>
|
||||
<dt>{{ 'resume.personal.residence'|trans }}</dt>
|
||||
<dd>{{ person.residence }}</dd>
|
||||
<dt>{{ 'resume.personal.status'|trans }}</dt>
|
||||
<dd>{{ person.status }}</dd>
|
||||
<dt>{{ 'resume.personal.nationality'|trans }}</dt>
|
||||
<dd>{{ person.nationality }}</dd>
|
||||
{% if person.workLicense %}
|
||||
<dt>{{ 'resume.personal.work_license'|trans }}</dt>
|
||||
<dd>{{ person.workLicense }}</dd>
|
||||
{% endif %}
|
||||
{% if person.languages|length > 0 %}
|
||||
<dt>{{ 'resume.personal.languages'|trans }}</dt>
|
||||
<dd>
|
||||
<ul>
|
||||
{% for lang in person.languages %}
|
||||
<li>{{ lang.language }} <small>({{ ('resume.language.level.' ~ lang.level)|trans }})</small></li>
|
||||
{% endfor %}
|
||||
</ul>
|
||||
</dd>
|
||||
{% endif %}
|
||||
</dl>
|
||||
|
||||
<!-- Contact Information -->
|
||||
{% if person.contacts|length > 0 %}
|
||||
<h3>{{ 'resume.headers.contact'|trans }}</h3>
|
||||
<dl class="horizontal">
|
||||
{% for contact in person.contacts %}
|
||||
{% set type = contact.type %}
|
||||
{% if contact.type == 'email' or contact.type == 'phone' %}
|
||||
{% set type = ('resume.contact.' ~ contact.type)|trans %}
|
||||
{% endif %}
|
||||
<dt>{{ type }}</dt>
|
||||
<dd>{{ contact.address }}</dd>
|
||||
{% endfor %}
|
||||
</dl>
|
||||
{% endif %}
|
||||
|
||||
<!-- Job Experience -->
|
||||
<h3>{{ 'resume.headers.experience'|trans }}</h3>
|
||||
<dl class="horizontal">
|
||||
{% for industry, length in cv.getExperienceYears() %}
|
||||
<dt>{{ industry }}</dt>
|
||||
<dd>{{ length }}</dd>
|
||||
{% endfor %}
|
||||
</dl>
|
||||
|
||||
<!-- Bio -->
|
||||
{% if person.content %}
|
||||
<h3>{{ 'resume.headers.bio'|trans }}</h3>
|
||||
<div class="bio">{{ person.content|raw }}</div>
|
||||
{% endif %}
|
||||
|
||||
<!-- Qualifications -->
|
||||
<h3>{{ 'resume.headers.qualification'|trans }}</h3>
|
||||
<ul>
|
||||
{% for entry in cv.qualifications %}
|
||||
<li>{{ entry.qualification|splitmerge(',', '</li><li>') }}</li>
|
||||
{% endfor %}
|
||||
</ul>
|
||||
|
||||
<!-- Personal Toolbox -->
|
||||
{% if toolbox|length > 0 %}
|
||||
<h3>{{ 'resume.headers.toolbox'|trans }}</h3>
|
||||
<ul>
|
||||
{% for entry in toolbox %}
|
||||
{{ macros.list_simple_array(entry.toolbox) }}
|
||||
{% endfor %}
|
||||
</ul>
|
||||
{% endif %}
|
||||
|
||||
<!-- Personal Interests -->
|
||||
{% if person.interests|length > 0 %}
|
||||
<h3>{{ 'resume.headers.personal_interest'|trans }}</h3>
|
||||
<ul>
|
||||
{{ macros.list_simple_array(person.interests) }}
|
||||
</ul>
|
||||
{% endif %}
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
<div class="col col-resume col-2">
|
||||
|
||||
|
||||
<!-- Links -->
|
||||
{% if person.links|length > 0 %}
|
||||
<h3>{{ 'resume.headers.links'|trans }}</h3>
|
||||
<ul>
|
||||
{{ macros.list_link_array(person.links) }}
|
||||
</ul>
|
||||
{% endif %}
|
||||
|
||||
<!-- References -->
|
||||
{% if person.references|length > 0 %}
|
||||
<h3>{{ 'resume.headers.references'|trans }}</h3>
|
||||
<ul>
|
||||
{{ macros.list_references(person.references) }}
|
||||
</ul>
|
||||
{% endif %}
|
||||
|
||||
{% if person.projects|length > 0 %}
|
||||
<h3>{{ 'resume.headers.current_projects'|trans }}</h3>
|
||||
<ul>
|
||||
{{ macros.list_simple_array(person.projects) }}
|
||||
</ul>
|
||||
{% endif %}
|
||||
|
||||
{% if useInResume|length > 0 %}
|
||||
<h3>{{ 'resume.headers.skills'|trans }}</h3>
|
||||
<ul>
|
||||
{{ macros.list_entry_attribute(useInResume, 'skills') }}
|
||||
</ul>
|
||||
|
||||
<h3>{{ 'resume.headers.achievements'|trans }}</h3>
|
||||
<ul>
|
||||
{{ macros.list_entry_attribute(useInResume, 'achievements') }}
|
||||
</ul>
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
BIN
app/tpl/server/favicon.ico
Normal file
BIN
app/tpl/server/favicon.ico
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 2.2 KiB |
BIN
app/tpl/server/favicon.png
Normal file
BIN
app/tpl/server/favicon.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 1.2 KiB |
1
app/tpl/server/icons/html.base64.txt
Normal file
1
app/tpl/server/icons/html.base64.txt
Normal file
@@ -0,0 +1 @@
|
||||
iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAMAAADzapwJAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAABHVBMVEX////Z7vt+xfFEqusonugpnuhDqut+xPHX7fv2+/55wvE4pepBqeuKyvL5/P7W7PuTzvMuoOl9xPH4/P73+/5ZtO0gmudlue4xoulJrevi8vySzfMqnuhWs+18xPFYs+2NzPPq9f37/f/g8fxetu5ouu9Gq+vY7fsim+c3pOne8Puu2vZqvO+Y0PQ2pOl3wfC33/fV7Prt9/0hmudCqeuRzfPl8/wlnOjQ6vqi1fXL5/m13ffu9/2c0vQqn+hHrOu53/et2vaz3ffm9Pwnnejd8PvK5/lxv/Da7vvS6/qHyfL0+v78/v+84PgjnOfc7/tpu+/9/v9wvvD6/f7P6fqCxvJXs+1nuu94wvG94fhtve9dtu6AxvFUse1/xfE/bvvIAAAAAWJLR0QAiAUdSAAAAAlwSFlzAAAOxAAADsQBlSsOGwAAAAd0SU1FB+IHFREcCLf3d7wAAADsSURBVBjTY2CgImBkYmZhZWPnQBHk5OLm4eXj5BcQFBJGiIqIiolLSPIxMEhJy8iKwIXlxORlFBSVGBiUVVTV5GCi6hpimlpglraOrrKeOlSYSd/AEMwwUhMT0zMWggqbmJpBGAJiIMAGFTa3sLSytgEybMHCdlBhVmElezFuBwYGJUcnVYQwD7+zsZiYi6orkO0mJqYGFWaXZnAH6fYAsj3FxLygwvya3j6yYmL2ILavmJ8/3DsBgUFiEsEgZohYKNyXwmHhES6RIJZ3VHQwIlD4YjRi1ZVE1KW54/hQwpCDndnFhS2OkZqRBQA4TBqQiOWEHQAAACV0RVh0ZGF0ZTpjcmVhdGUAMjAxOC0wNy0yMVQxNToyODowOCswMjowMKEt3m4AAAAldEVYdGRhdGU6bW9kaWZ5ADIwMTgtMDctMjFUMTU6Mjg6MDgrMDI6MDDQcGbSAAAAGXRFWHRTb2Z0d2FyZQB3d3cuaW5rc2NhcGUub3Jnm+48GgAAAABJRU5ErkJggg==
|
||||
BIN
app/tpl/server/icons/html.png
Normal file
BIN
app/tpl/server/icons/html.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 838 B |
1
app/tpl/server/icons/pdf.base64.txt
Normal file
1
app/tpl/server/icons/pdf.base64.txt
Normal file
@@ -0,0 +1 @@
|
||||
iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAMAAADzapwJAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAAw1BMVEX////++/v42dv30tXupqvyu7/0wsbtnaPwsLX54ePWJTL65ef31tjaO0flc3vVIS7xt7vPARD65ufgWmTQBRTPAA/zvsL//v7ldX3YLjryvMDgW2X53uDtnqTZNEDQBBPgWWPzv8PqkpjdSVTUHCnWJzTnf4fRCRfldn7hYmv31df//f34293eUlzXKDX0x8raPEfPAhHfU130xsnjbHXcRlHYMj7toqfeT1nkcnrvqa7smJ7SDhzaOUXcR1L53d/smqDOQe/+AAAAAWJLR0QAiAUdSAAAAAlwSFlzAAAOxAAADsQBlSsOGwAAAAd0SU1FB+IHFREcCLf3d7wAAACSSURBVBjTY2CgEmBkYmbBIszKxsDOgSnMycXNw4tFOR+/gKAQFsOFRUTFsCgXlxCVZMMiLiXKKygtgyEsKyrEKievoKikrKKK5Fg1dXEGBg1RUVFNLW0dhLCuHoO+gaGRsZQJrymSan4zaXlNHXSjzQVFLbQwLLQUFbXCdJ21jaQtFkfbManaYxFmc2AmNg5IAgAkagqCGD9ZrwAAACV0RVh0ZGF0ZTpjcmVhdGUAMjAxOC0wNy0yMVQxNToyODowOCswMjowMKEt3m4AAAAldEVYdGRhdGU6bW9kaWZ5ADIwMTgtMDctMjFUMTU6Mjg6MDgrMDI6MDDQcGbSAAAAGXRFWHRTb2Z0d2FyZQB3d3cuaW5rc2NhcGUub3Jnm+48GgAAAABJRU5ErkJggg==
|
||||
BIN
app/tpl/server/icons/pdf.png
Normal file
BIN
app/tpl/server/icons/pdf.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 658 B |
43
app/tpl/server/index.html.twig
Normal file
43
app/tpl/server/index.html.twig
Normal file
@@ -0,0 +1,43 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="{{ locale }}">
|
||||
<!-- Build with magdev/dossier -->
|
||||
<head>
|
||||
<meta char{{ ('set="'~config('charset')~'"')|raw }}>
|
||||
<meta name="viewport" content="width=device-width,initial-scale=1.0" />
|
||||
{% if favicon %}<link rel="shortcut icon" href="{{ favicon }}">{% endif %}
|
||||
<title>{{ 'server.index.title'|trans }} | {{ person.name }}</title>
|
||||
<style media="screen,print">
|
||||
{{ stylesheet|raw }}
|
||||
</style>
|
||||
</head>
|
||||
<body class="theme-{{ theme }}">
|
||||
<div class="row row-main">
|
||||
<div class="col col-left">
|
||||
<h1>{{ 'server.index.header'|trans }}</h1>
|
||||
<nav>
|
||||
<ul>
|
||||
{% for link in links %}
|
||||
{% set parts = parseFilename(link.filename) %}
|
||||
{% set time = link.getCTime()|unixToDateTime %}
|
||||
<li class="{{ parts.type }}">
|
||||
<a href="/{{ link.filename }}" target="ifm">
|
||||
<h2>{{ parts.name }} <small>({{ parts.theme }}, {{ parts.locale }})</small></h2>
|
||||
</a>
|
||||
<dl>
|
||||
<dt>{{ 'server.index.filesize'|trans }}</dt>
|
||||
<dd>{{ link.size|filesize }}</dd>
|
||||
<dt>{{ 'server.index.filetime'|trans }}</dt>
|
||||
<dd>{{ time.format('d.m.Y H:i:s') }}</dd>
|
||||
</dl>
|
||||
<a href="/{{ link.filename }}" target="_blank">{{ 'server.index.new_window'|trans }}</a>
|
||||
</li>
|
||||
{% endfor %}
|
||||
</ul>
|
||||
</nav>
|
||||
</div>
|
||||
<div class="col col-main">
|
||||
<iframe height="100%" width="100%" name="ifm" src="/{{ first_link.filename }}"></iframe>
|
||||
</div>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
153
app/tpl/server/less/global.less
Normal file
153
app/tpl/server/less/global.less
Normal file
@@ -0,0 +1,153 @@
|
||||
/**
|
||||
* LESS for magdev/resume print theme
|
||||
*/
|
||||
|
||||
// MIXINS:START
|
||||
|
||||
//
|
||||
// Mixins
|
||||
//
|
||||
|
||||
.border-radius(@radius) {
|
||||
-moz-border-radius: @radius;
|
||||
-webkit-border-radius: @radius;
|
||||
border-radius: @radius;
|
||||
}
|
||||
|
||||
// MIXINS:END
|
||||
|
||||
// VARS:START
|
||||
|
||||
//
|
||||
// Variables
|
||||
//
|
||||
|
||||
@base-font-family: Arial, Verdana;
|
||||
@base-font-size: 13px;
|
||||
@base-font-color: #222;
|
||||
@base-background-color: #fff;
|
||||
@base-accent-color: #68d19b;
|
||||
|
||||
@headline-1-size: (@base-font-size * 3);
|
||||
@headline-1-color: #fff;
|
||||
@headline-1-background-color: darken(@base-accent-color, 15%);
|
||||
|
||||
|
||||
@headline-2-color: @base-font-color;
|
||||
@headline-2-color-small: lighten(@headline-2-color, 30%);
|
||||
@headline-2-size: floor(@base-font-size * 1.6);
|
||||
@headline-2-size-small: (@headline-2-size - 5px);
|
||||
|
||||
@leftcol-width: 350px;
|
||||
@leftcol-nav-margin: 10px 10px 0 15px;
|
||||
|
||||
@icon-pdf: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAMAAADzapwJAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAAw1BMVEX////++/v42dv30tXupqvyu7/0wsbtnaPwsLX54ePWJTL65ef31tjaO0flc3vVIS7xt7vPARD65ufgWmTQBRTPAA/zvsL//v7ldX3YLjryvMDgW2X53uDtnqTZNEDQBBPgWWPzv8PqkpjdSVTUHCnWJzTnf4fRCRfldn7hYmv31df//f34293eUlzXKDX0x8raPEfPAhHfU130xsnjbHXcRlHYMj7toqfeT1nkcnrvqa7smJ7SDhzaOUXcR1L53d/smqDOQe/+AAAAAWJLR0QAiAUdSAAAAAlwSFlzAAAOxAAADsQBlSsOGwAAAAd0SU1FB+IHFREcCLf3d7wAAACSSURBVBjTY2CgEmBkYmbBIszKxsDOgSnMycXNw4tFOR+/gKAQFsOFRUTFsCgXlxCVZMMiLiXKKygtgyEsKyrEKievoKikrKKK5Fg1dXEGBg1RUVFNLW0dhLCuHoO+gaGRsZQJrymSan4zaXlNHXSjzQVFLbQwLLQUFbXCdJ21jaQtFkfbManaYxFmc2AmNg5IAgAkagqCGD9ZrwAAACV0RVh0ZGF0ZTpjcmVhdGUAMjAxOC0wNy0yMVQxNToyODowOCswMjowMKEt3m4AAAAldEVYdGRhdGU6bW9kaWZ5ADIwMTgtMDctMjFUMTU6Mjg6MDgrMDI6MDDQcGbSAAAAGXRFWHRTb2Z0d2FyZQB3d3cuaW5rc2NhcGUub3Jnm+48GgAAAABJRU5ErkJggg==');
|
||||
@icon-html: url('data:text/html;base64,iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAMAAADzapwJAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAABHVBMVEX////Z7vt+xfFEqusonugpnuhDqut+xPHX7fv2+/55wvE4pepBqeuKyvL5/P7W7PuTzvMuoOl9xPH4/P73+/5ZtO0gmudlue4xoulJrevi8vySzfMqnuhWs+18xPFYs+2NzPPq9f37/f/g8fxetu5ouu9Gq+vY7fsim+c3pOne8Puu2vZqvO+Y0PQ2pOl3wfC33/fV7Prt9/0hmudCqeuRzfPl8/wlnOjQ6vqi1fXL5/m13ffu9/2c0vQqn+hHrOu53/et2vaz3ffm9Pwnnejd8PvK5/lxv/Da7vvS6/qHyfL0+v78/v+84PgjnOfc7/tpu+/9/v9wvvD6/f7P6fqCxvJXs+1nuu94wvG94fhtve9dtu6AxvFUse1/xfE/bvvIAAAAAWJLR0QAiAUdSAAAAAlwSFlzAAAOxAAADsQBlSsOGwAAAAd0SU1FB+IHFREcCLf3d7wAAADsSURBVBjTY2CgImBkYmZhZWPnQBHk5OLm4eXj5BcQFBJGiIqIiolLSPIxMEhJy8iKwIXlxORlFBSVGBiUVVTV5GCi6hpimlpglraOrrKeOlSYSd/AEMwwUhMT0zMWggqbmJpBGAJiIMAGFTa3sLSytgEybMHCdlBhVmElezFuBwYGJUcnVYQwD7+zsZiYi6orkO0mJqYGFWaXZnAH6fYAsj3FxLygwvya3j6yYmL2ILavmJ8/3DsBgUFiEsEgZohYKNyXwmHhES6RIJZ3VHQwIlD4YjRi1ZVE1KW54/hQwpCDndnFhS2OkZqRBQA4TBqQiOWEHQAAACV0RVh0ZGF0ZTpjcmVhdGUAMjAxOC0wNy0yMVQxNToyODowOCswMjowMKEt3m4AAAAldEVYdGRhdGU6bW9kaWZ5ADIwMTgtMDctMjFUMTU6Mjg6MDgrMDI6MDDQcGbSAAAAGXRFWHRTb2Z0d2FyZQB3d3cuaW5rc2NhcGUub3Jnm+48GgAAAABJRU5ErkJggg==');
|
||||
|
||||
// VARS:END
|
||||
|
||||
|
||||
|
||||
//
|
||||
// Styles
|
||||
//
|
||||
|
||||
|
||||
// Reset
|
||||
* {
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
border: 0;
|
||||
font-weight: normal;
|
||||
font-style: normal;
|
||||
list-style-type: none;
|
||||
}
|
||||
|
||||
// Base elements
|
||||
html, body {
|
||||
background-color: @base-background-color;
|
||||
font-family: @base-font-family;
|
||||
font-size: @base-font-size;
|
||||
color: @base-font-color;
|
||||
}
|
||||
html,body,.row-main,.col-main,.col-left {
|
||||
height: 100%
|
||||
}
|
||||
body {
|
||||
overflow: hidden;
|
||||
}
|
||||
h1 {
|
||||
font-size: @headline-1-size;
|
||||
color: @headline-1-color;
|
||||
font-weight: bold;
|
||||
background-color: @headline-1-background-color;
|
||||
padding: 2px auto;
|
||||
text-transform: uppercase;
|
||||
letter-spacing: 3px;
|
||||
text-align: center;
|
||||
}
|
||||
h2 {
|
||||
font-size: @headline-2-size;
|
||||
color: @headline-2-color;
|
||||
font-weight: bold;
|
||||
|
||||
small {
|
||||
font-size: @headline-2-size-small;
|
||||
color: @headline-2-color-small;
|
||||
font-style: italic;
|
||||
}
|
||||
}
|
||||
a {
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
// Grid
|
||||
.row {
|
||||
display: flex;
|
||||
}
|
||||
.col {
|
||||
flex: 1;
|
||||
}
|
||||
|
||||
.col-golden-narrow { flex: 0 0 38%; }
|
||||
.col-golden-wide { flex: 0 1 62%; }
|
||||
|
||||
.col-left {
|
||||
flex: 0 0 @leftcol-width;
|
||||
background-color: lighten(@base-accent-color, 10%);
|
||||
border-right: 5px solid @headline-1-background-color;
|
||||
|
||||
nav {
|
||||
margin: @leftcol-nav-margin;
|
||||
|
||||
li {
|
||||
margin-bottom: 10px;
|
||||
background-color: @base-background-color;
|
||||
padding: 5px 10px;
|
||||
.border-radius(5px);
|
||||
|
||||
&.html {
|
||||
background: @base-background-color @icon-html no-repeat top right;
|
||||
}
|
||||
&.pdf {
|
||||
background: @base-background-color @icon-pdf no-repeat top right;
|
||||
}
|
||||
|
||||
a:first-child {
|
||||
color: @base-font-color;
|
||||
}
|
||||
|
||||
dt,dd {
|
||||
display: inline-block;
|
||||
}
|
||||
dt {
|
||||
width: 38%;
|
||||
float: left;
|
||||
}
|
||||
dd {
|
||||
width: 62%;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user