commit 1f065647788890d02bb40d71c9065f6b42a2a5f6 Author: magdev Date: Thu Aug 23 16:44:53 2018 +0200 Initial commit diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..1627966 --- /dev/null +++ b/.gitignore @@ -0,0 +1,14 @@ +# Eclipse specific files +.settings/ +.buildpath +.project + +# OS files +.directory +.DS_Store +Thumbs.db + +# App files +example/ +vendor/ +.env diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..3f266d1 --- /dev/null +++ b/LICENSE @@ -0,0 +1,20 @@ +The MIT License (MIT) +Copyright (c) 2018 Marco Grätsch + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/README.md b/README.md new file mode 100644 index 0000000..a687962 --- /dev/null +++ b/README.md @@ -0,0 +1,29 @@ +# dossier + +Dossier is a commandline-tool to generate personal dossiers from a set of Markdown files. It creates a single print-first HTML-File which can be printed to PDF with your favorite browser. There is also a integration with PDFShift, but it might requires a paid subscription. + + +## Install + +### Dependencies + +Dossier requires PHP 7.2+ and the following extensions enabled: + +* Phar +* SPL +* Date +* fileinfo +* mbstring +* Bz2 + +### Use the Phar-Archive + +The easiest way to install dossier is to download the Phar-Archive from the Releases page and copy it somewhere in your $PATH and make it executable. Open a console and type `dossier.phar` to see a list of available commands. To find out more about a command type `dossier.phar help `. + + +## License + +Copyright (c) 2018 Marco Grätsch +This work is licensed under the MIT-License. + + diff --git a/app/conf/.gitignore b/app/conf/.gitignore new file mode 100644 index 0000000..b2b4a83 --- /dev/null +++ b/app/conf/.gitignore @@ -0,0 +1,2 @@ +/dossier_dev.yaml +/dossier_prod.yaml diff --git a/app/conf/dossier.yaml b/app/conf/dossier.yaml new file mode 100644 index 0000000..21a7868 --- /dev/null +++ b/app/conf/dossier.yaml @@ -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: '' + + \ No newline at end of file diff --git a/app/conf/parameters.yaml b/app/conf/parameters.yaml new file mode 100644 index 0000000..3e5b667 --- /dev/null +++ b/app/conf/parameters.yaml @@ -0,0 +1,2 @@ +parameters: + scss.formatter: "\\Leafo\\ScssPhp\\Formatter\\Crunched" \ No newline at end of file diff --git a/app/conf/services.yaml b/app/conf/services.yaml new file mode 100644 index 0000000..f00dadc --- /dev/null +++ b/app/conf/services.yaml @@ -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'] + + + \ No newline at end of file diff --git a/app/locale/messages.de.yaml b/app/locale/messages.de.yaml new file mode 100644 index 0000000..780dfc4 --- /dev/null +++ b/app/locale/messages.de.yaml @@ -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}}' diff --git a/app/locale/messages.en.yaml b/app/locale/messages.en.yaml new file mode 100644 index 0000000..9b838fc --- /dev/null +++ b/app/locale/messages.en.yaml @@ -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' + + diff --git a/app/tpl/.gitignore b/app/tpl/.gitignore new file mode 100644 index 0000000..c5f75ae --- /dev/null +++ b/app/tpl/.gitignore @@ -0,0 +1 @@ +/latex/ diff --git a/app/tpl/print/document.html.twig b/app/tpl/print/document.html.twig new file mode 100644 index 0000000..85f1fb2 --- /dev/null +++ b/app/tpl/print/document.html.twig @@ -0,0 +1,36 @@ + + + + + + + {% if favicon %}{% endif %} + {{ 'cover.subtitle'|trans }} | {{ person.name }} + + + + {% if is_disabled(disabled.cover) == false %} + {{ include('parts/cover.html.twig') }} + {% endif %} +
+ {% 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 %} +
+ + diff --git a/app/tpl/print/favicon.ico b/app/tpl/print/favicon.ico new file mode 100644 index 0000000..7f7ab54 Binary files /dev/null and b/app/tpl/print/favicon.ico differ diff --git a/app/tpl/print/favicon.png b/app/tpl/print/favicon.png new file mode 100644 index 0000000..71235d5 Binary files /dev/null and b/app/tpl/print/favicon.png differ diff --git a/app/tpl/print/less/global.less b/app/tpl/print/less/global.less new file mode 100644 index 0000000..6fe3eda --- /dev/null +++ b/app/tpl/print/less/global.less @@ -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; + } + } +} diff --git a/app/tpl/print/macros.html.twig b/app/tpl/print/macros.html.twig new file mode 100644 index 0000000..1d189c7 --- /dev/null +++ b/app/tpl/print/macros.html.twig @@ -0,0 +1,50 @@ +{% macro show_quotes(quotes, class) %} +
+ {% for quote in quotes %} +
+ {{ quote.quoteText }} + {% if quote.quoteAuthor %} + {{ quote.quoteAuthor }} + {% endif %} +
+ {% endfor %} +
+{% endmacro %} + + +{% macro list_simple_array(entries, tag) %} + {% set tag = tag|default('li') %} + {% for line in entries %} + <{{ tag }}>{{ line|inlinemd }} + {% endfor %} +{% endmacro %} + + +{% macro list_link_array(entries, tag) %} + {% set tag = tag|default('li') %} + {% for link in entries %} + <{{ tag }}>{{ link }} + {% 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 }} + {% endfor %} + {% endif %} + {% endfor %} +{% endmacro %} + + +{% macro list_references(references) %} + {% for reference in references %} +
  • + +
  • + {% endfor %} +{% endmacro %} + diff --git a/app/tpl/print/parts/certs.html.twig b/app/tpl/print/parts/certs.html.twig new file mode 100644 index 0000000..0c76720 --- /dev/null +++ b/app/tpl/print/parts/certs.html.twig @@ -0,0 +1,16 @@ +
    +

    {{ 'certs.header'|trans }}

    + {% for entry in cv.filterByCertificates() %} + {% for cert in entry.certificates %} +
    +
    +
    +

    {{ entry.position }} {% if cert.type %}- {{ cert.type }}{% endif %} + {{ entry.endDate.format('Y') }} - {{ entry.company }}

    +
    + {{ cert.fileObject.filename }} +
    +
    + {% endfor %} + {% endfor %} +
    \ No newline at end of file diff --git a/app/tpl/print/parts/cover.html.twig b/app/tpl/print/parts/cover.html.twig new file mode 100644 index 0000000..e8d799e --- /dev/null +++ b/app/tpl/print/parts/cover.html.twig @@ -0,0 +1,10 @@ +
    +
    +
     
    +
    +

    {{ person.name }}

    +

    {{ person.tagline|splitmerge|raw }}

    +

    {{ 'cover.subtitle'|trans }}

    +
    +
    +
    diff --git a/app/tpl/print/parts/cv.html.twig b/app/tpl/print/parts/cv.html.twig new file mode 100644 index 0000000..3e16923 --- /dev/null +++ b/app/tpl/print/parts/cv.html.twig @@ -0,0 +1,12 @@ +
    +

    {{ 'cv.header'|trans }}

    + + {% for tag in tags %} +
    +

    {{ ('cv.headers.' ~ tag)|trans }}

    + {% for entry in cv.filterByTag(tag) %} + {{ include('parts/cv/entry.html.twig') }} + {% endfor %} +
    + {% endfor %} +
    \ No newline at end of file diff --git a/app/tpl/print/parts/cv/entry.html.twig b/app/tpl/print/parts/cv/entry.html.twig new file mode 100644 index 0000000..7a7eebd --- /dev/null +++ b/app/tpl/print/parts/cv/entry.html.twig @@ -0,0 +1,32 @@ +
    +
    +

    + {{ entry.startDate.format(config('date.format.short')) }} + {{ 'date.until'|trans }} + {% if is_today(entry.endDate) %} + {{ 'date.today'|trans }} + {% else %} + {{ entry.endDate.format(config('date.format.short')) }} + {% endif %} + +

    +
    +
    +

    {{ entry.position }} {% if entry.industry %}({{ entry.industry }}){% endif %}

    +

    {{ entry.company }}

    + {% if entry.description %} +
    + {{ entry.description|raw }} +
    + {% endif %} + {% if entry.qualification %} +

    {{ 'cv.entry.qualification'|trans }}
    {{ entry.qualification }}

    + {% endif %} + {% if entry.skills|length > 0 %} +

    {{ 'cv.entry.skills'|trans }}
    {{ entry.skills|merge|inlinemd }}

    + {% endif %} + {% if entry.achievements|length > 0 %} +

    {{ 'cv.entry.achievements'|trans }}
    {{ entry.achievements|merge|inlinemd }}

    + {% endif %} +
    +
    \ No newline at end of file diff --git a/app/tpl/print/parts/intro.html.twig b/app/tpl/print/parts/intro.html.twig new file mode 100644 index 0000000..b26a2ee --- /dev/null +++ b/app/tpl/print/parts/intro.html.twig @@ -0,0 +1,37 @@ +
    + {% 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 %} + +
    + {% if intro.headline %}

    {{ intro.headline }}

    {% endif %} + {% if intro.hasPhoto() %} + {{ person.name }} + {% endif %} + {{ intro.content|raw }} +
    + + {% 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 %} +

    {{ 'intro.toc'|trans }}

    +
      + {% if is_disabled(disabled.resume) == false %} +
    • {{ 'toc.resume'|trans }}
    • + {% endif %} + {% if is_disabled(disabled.projects) == false %} +
    • {{ 'toc.projects'|trans }}
    • + {% endif %} + {% if is_disabled(disabled.cv) == false %} +
    • {{ 'toc.cv'|trans }}
    • + {% endif %} + {% if is_disabled(disabled.certs) == false %} +
    • {{ 'toc.certs'|trans }}
    • + {% endif %} +
    + {% endif %} +
    diff --git a/app/tpl/print/parts/pdf/footer.html.twig b/app/tpl/print/parts/pdf/footer.html.twig new file mode 100644 index 0000000..474157e --- /dev/null +++ b/app/tpl/print/parts/pdf/footer.html.twig @@ -0,0 +1,11 @@ +
    +
    + +
    +
    + {{ 'pdf.page.number'|trans|raw }} +
    +
    + +
    +
    \ No newline at end of file diff --git a/app/tpl/print/parts/pdf/header.html.twig b/app/tpl/print/parts/pdf/header.html.twig new file mode 100644 index 0000000..f88ac96 --- /dev/null +++ b/app/tpl/print/parts/pdf/header.html.twig @@ -0,0 +1,8 @@ +
    +
    + {{ 'pdf.page.title'|trans|raw }} +
    +
    + {{ 'pdf.page.date'|trans|raw }} +
    +
    \ No newline at end of file diff --git a/app/tpl/print/parts/projects.html.twig b/app/tpl/print/parts/projects.html.twig new file mode 100644 index 0000000..eb173a7 --- /dev/null +++ b/app/tpl/print/parts/projects.html.twig @@ -0,0 +1,25 @@ +{% if projects|length > 0 %} +
    +

    {{ 'projects.header'|trans }}

    + +
    + {% for project in projects %} +
    +

    {{ project.name }} {% if project.stack %}({{ project.stack }}){% endif %}

    +
    +
    {{ 'projects.fields.status'|trans }}
    +
    +

    {{ ('projects.status.' ~ project.status)|trans }}

    +
    + {% if project.role %} +
    {{ 'projects.fields.role'|trans }}
    +
    {{ project.role }}
    + {% endif %} +
    +

    {{ project.shortDescription }}

    + {{ project.content|raw }} +
    + {% endfor %} +
    +
    +{% endif %} \ No newline at end of file diff --git a/app/tpl/print/parts/resume.html.twig b/app/tpl/print/parts/resume.html.twig new file mode 100644 index 0000000..9a5993e --- /dev/null +++ b/app/tpl/print/parts/resume.html.twig @@ -0,0 +1,139 @@ +{% set useInResume = cv.filterByUseInResume() %} +{% set toolbox = cv.filterByToolbox() %} +{% import "macros.html.twig" as macros %} + +
    +

    {{ 'resume.header'|trans }}

    +
    +
    + + +

    {{ 'resume.headers.personal'|trans }}

    +
    +
    {{ 'resume.personal.name'|trans }}
    +
    {{ person.getName(true) }}
    +
    {{ 'resume.personal.birthdate'|trans }}
    +
    {{ person.birthdate.format(config('date.format.long')) }}
    +
    {{ 'resume.personal.birthplace'|trans }}
    +
    {{ person.birthplace }}
    +
    {{ 'resume.personal.residence'|trans }}
    +
    {{ person.residence }}
    +
    {{ 'resume.personal.status'|trans }}
    +
    {{ person.status }}
    +
    {{ 'resume.personal.nationality'|trans }}
    +
    {{ person.nationality }}
    + {% if person.workLicense %} +
    {{ 'resume.personal.work_license'|trans }}
    +
    {{ person.workLicense }}
    + {% endif %} + {% if person.languages|length > 0 %} +
    {{ 'resume.personal.languages'|trans }}
    +
    +
      + {% for lang in person.languages %} +
    • {{ lang.language }} ({{ ('resume.language.level.' ~ lang.level)|trans }})
    • + {% endfor %} +
    +
    + {% endif %} +
    + + + {% if person.contacts|length > 0 %} +

    {{ 'resume.headers.contact'|trans }}

    +
    + {% 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 %} +
    {{ type }}
    +
    {{ contact.address }}
    + {% endfor %} +
    + {% endif %} + + +

    {{ 'resume.headers.experience'|trans }}

    +
    + {% for industry, length in cv.getExperienceYears() %} +
    {{ industry }}
    +
    {{ length }}
    + {% endfor %} +
    + + + {% if person.content %} +

    {{ 'resume.headers.bio'|trans }}

    +
    {{ person.content|raw }}
    + {% endif %} + + +

    {{ 'resume.headers.qualification'|trans }}

    +
      + {% for entry in cv.qualifications %} +
    • {{ entry.qualification|splitmerge(',', '
    • ') }}
    • + {% endfor %} +
    + + + {% if toolbox|length > 0 %} +

    {{ 'resume.headers.toolbox'|trans }}

    +
      + {% for entry in toolbox %} + {{ macros.list_simple_array(entry.toolbox) }} + {% endfor %} +
    + {% endif %} + + + {% if person.interests|length > 0 %} +

    {{ 'resume.headers.personal_interest'|trans }}

    +
      + {{ macros.list_simple_array(person.interests) }} +
    + {% endif %} +
    + + + +
    + + + + {% if person.links|length > 0 %} +

    {{ 'resume.headers.links'|trans }}

    +
      + {{ macros.list_link_array(person.links) }} +
    + {% endif %} + + + {% if person.references|length > 0 %} +

    {{ 'resume.headers.references'|trans }}

    +
      + {{ macros.list_references(person.references) }} +
    + {% endif %} + + {% if person.projects|length > 0 %} +

    {{ 'resume.headers.current_projects'|trans }}

    +
      + {{ macros.list_simple_array(person.projects) }} +
    + {% endif %} + + {% if useInResume|length > 0 %} +

    {{ 'resume.headers.skills'|trans }}

    +
      + {{ macros.list_entry_attribute(useInResume, 'skills') }} +
    + +

    {{ 'resume.headers.achievements'|trans }}

    +
      + {{ macros.list_entry_attribute(useInResume, 'achievements') }} +
    + {% endif %} +
    +
    +
    diff --git a/app/tpl/server/favicon.ico b/app/tpl/server/favicon.ico new file mode 100644 index 0000000..7f7ab54 Binary files /dev/null and b/app/tpl/server/favicon.ico differ diff --git a/app/tpl/server/favicon.png b/app/tpl/server/favicon.png new file mode 100644 index 0000000..71235d5 Binary files /dev/null and b/app/tpl/server/favicon.png differ diff --git a/app/tpl/server/icons/html.base64.txt b/app/tpl/server/icons/html.base64.txt new file mode 100644 index 0000000..69c0b5c --- /dev/null +++ b/app/tpl/server/icons/html.base64.txt @@ -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== \ No newline at end of file diff --git a/app/tpl/server/icons/html.png b/app/tpl/server/icons/html.png new file mode 100644 index 0000000..a1c7032 Binary files /dev/null and b/app/tpl/server/icons/html.png differ diff --git a/app/tpl/server/icons/pdf.base64.txt b/app/tpl/server/icons/pdf.base64.txt new file mode 100644 index 0000000..be6c8ae --- /dev/null +++ b/app/tpl/server/icons/pdf.base64.txt @@ -0,0 +1 @@ +iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAMAAADzapwJAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAAw1BMVEX////++/v42dv30tXupqvyu7/0wsbtnaPwsLX54ePWJTL65ef31tjaO0flc3vVIS7xt7vPARD65ufgWmTQBRTPAA/zvsL//v7ldX3YLjryvMDgW2X53uDtnqTZNEDQBBPgWWPzv8PqkpjdSVTUHCnWJzTnf4fRCRfldn7hYmv31df//f34293eUlzXKDX0x8raPEfPAhHfU130xsnjbHXcRlHYMj7toqfeT1nkcnrvqa7smJ7SDhzaOUXcR1L53d/smqDOQe/+AAAAAWJLR0QAiAUdSAAAAAlwSFlzAAAOxAAADsQBlSsOGwAAAAd0SU1FB+IHFREcCLf3d7wAAACSSURBVBjTY2CgEmBkYmbBIszKxsDOgSnMycXNw4tFOR+/gKAQFsOFRUTFsCgXlxCVZMMiLiXKKygtgyEsKyrEKievoKikrKKK5Fg1dXEGBg1RUVFNLW0dhLCuHoO+gaGRsZQJrymSan4zaXlNHXSjzQVFLbQwLLQUFbXCdJ21jaQtFkfbManaYxFmc2AmNg5IAgAkagqCGD9ZrwAAACV0RVh0ZGF0ZTpjcmVhdGUAMjAxOC0wNy0yMVQxNToyODowOCswMjowMKEt3m4AAAAldEVYdGRhdGU6bW9kaWZ5ADIwMTgtMDctMjFUMTU6Mjg6MDgrMDI6MDDQcGbSAAAAGXRFWHRTb2Z0d2FyZQB3d3cuaW5rc2NhcGUub3Jnm+48GgAAAABJRU5ErkJggg== \ No newline at end of file diff --git a/app/tpl/server/icons/pdf.png b/app/tpl/server/icons/pdf.png new file mode 100644 index 0000000..3da2de8 Binary files /dev/null and b/app/tpl/server/icons/pdf.png differ diff --git a/app/tpl/server/index.html.twig b/app/tpl/server/index.html.twig new file mode 100644 index 0000000..b524ee6 --- /dev/null +++ b/app/tpl/server/index.html.twig @@ -0,0 +1,43 @@ + + + + + + + {% if favicon %}{% endif %} + {{ 'server.index.title'|trans }} | {{ person.name }} + + + +
    +
    +

    {{ 'server.index.header'|trans }}

    + +
    +
    + +
    +
    + + \ No newline at end of file diff --git a/app/tpl/server/less/global.less b/app/tpl/server/less/global.less new file mode 100644 index 0000000..64a1e9f --- /dev/null +++ b/app/tpl/server/less/global.less @@ -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%; + } + } + } +} + diff --git a/bin/.gitignore b/bin/.gitignore new file mode 100644 index 0000000..d35e948 --- /dev/null +++ b/bin/.gitignore @@ -0,0 +1,4 @@ +*.phar +lessc +pscss +.directory diff --git a/bin/dossier.php b/bin/dossier.php new file mode 100755 index 0000000..fa9d344 --- /dev/null +++ b/bin/dossier.php @@ -0,0 +1,67 @@ +add(new Command\Dossier\DossierBuildCommand()); +$app->add(new Command\Dossier\DossierInitCommand()); +$app->add(new Command\Dossier\DossierStatusCommand()); +$app->add(new Command\Intro\IntroAddCommand()); +$app->add(new Command\Intro\IntroEditCommand()); +$app->add(new Command\Person\PersonAddCommand()); +$app->add(new Command\Person\PersonEditCommand()); +$app->add(new Command\Cv\CvAddCommand()); +$app->add(new Command\Cv\CvEditCommand()); +$app->add(new Command\Config\ConfigShowCommand()); +$app->add(new Command\Config\ConfigGetCommand()); +$app->add(new Command\Config\ConfigSetCommand()); +$app->add(new Command\Config\ConfigUnsetCommand()); +$app->add(new Command\Theme\ThemeListCommand()); +$app->add(new Command\Theme\ThemeDumpCommand()); +$app->add(new Command\Cache\CacheClearCommand()); +$app->add(new Command\Server\ServerStartCommand()); +$app->add(new Command\Dev\PharExtractCommand()); +$app->run(); + + diff --git a/composer.json b/composer.json new file mode 100644 index 0000000..c5693ce --- /dev/null +++ b/composer.json @@ -0,0 +1,68 @@ +{ + "name" : "magdev/dossier", + "type" : "project", + "description" : "Create your dossier from Markdown files", + "license" : "MIT", + "authors" : [{ + "name" : "Marco Grätsch", + "email" : "magdev3.0@gmail.com" + } + ], + "autoload" : { + "psr-4" : { + "Magdev\\Dossier\\" : "src" + } + }, + "require" : { + "php" : "~7.2", + "ext-phar" : "*", + "ext-SPL" : "*", + "ext-date" : "*", + "ext-fileinfo" : "*", + "ext-mbstring" : "*", + "ext-bz2" : "*", + "symfony/console" : "^4.1", + "symfony/translation" : "^4.1", + "symfony/config" : "^4.1", + "symfony/dependency-injection" : "^4.1", + "symfony/event-dispatcher" : "^4.1", + "symfony/process" : "^4.1", + "symfony/dotenv" : "^4.1", + "twig/twig" : "^2.4", + "mnapoli/front-yaml" : "^1.6", + "oyejorge/less.php" : "v1.7.0.14", + "erusev/parsedown-extra" : "^0.7.1", + "zaininnari/html-minifier" : "*", + "leafo/scssphp" : "^0.7.6", + "adbario/php-dot-notation" : "^2.0", + "magdev/console-form" : "^0.0.7", + "monolog/monolog" : "^1.23", + "pdfshift/pdfshift-php" : "~1.0.2" + }, + "config" : { + "bin-dir" : "bin" + }, + "extra" : { + "phar-builder" : { + "compression" : "BZip2", + "name" : "dossier.phar", + "output-dir" : "./bin/", + "entry-point" : "bin/dossier.php", + "include" : [ + "app" + ], + "include-dev" : false, + "events" : { + "command.package.end" : [ + "chmod +x ./bin/dossier.phar" + ] + } + } + }, + "repositories" : [{ + "type" : "git", + "url" : "git@github.com:magdev/console-form.git", + "name" : "magdev/console-form" + } + ] +} \ No newline at end of file diff --git a/composer.lock b/composer.lock new file mode 100644 index 0000000..3b94770 --- /dev/null +++ b/composer.lock @@ -0,0 +1,1638 @@ +{ + "_readme": [ + "This file locks the dependencies of your project to a known state", + "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", + "This file is @generated automatically" + ], + "content-hash": "312b2b3c9454aafe2833c3dfce3d2b2c", + "packages": [ + { + "name": "adbario/php-dot-notation", + "version": "2.1.0", + "source": { + "type": "git", + "url": "https://github.com/adbario/php-dot-notation.git", + "reference": "895fe4bb153ac875c61a6fba658ded45405e73a4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/adbario/php-dot-notation/zipball/895fe4bb153ac875c61a6fba658ded45405e73a4", + "reference": "895fe4bb153ac875c61a6fba658ded45405e73a4", + "shasum": "" + }, + "require": { + "php": ">=5.5" + }, + "require-dev": { + "phpunit/phpunit": "^4.0|^5.0|^6.0", + "squizlabs/php_codesniffer": "^3.0" + }, + "type": "library", + "autoload": { + "files": [ + "src/helpers.php" + ], + "psr-4": { + "Adbar\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Riku Särkinen", + "email": "riku@adbar.io" + } + ], + "description": "PHP dot notation access to arrays", + "homepage": "https://github.com/adbario/php-dot-notation", + "keywords": [ + "ArrayAccess", + "dotnotation" + ], + "time": "2018-07-22T12:33:53+00:00" + }, + { + "name": "erusev/parsedown", + "version": "1.7.1", + "source": { + "type": "git", + "url": "https://github.com/erusev/parsedown.git", + "reference": "92e9c27ba0e74b8b028b111d1b6f956a15c01fc1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/erusev/parsedown/zipball/92e9c27ba0e74b8b028b111d1b6f956a15c01fc1", + "reference": "92e9c27ba0e74b8b028b111d1b6f956a15c01fc1", + "shasum": "" + }, + "require": { + "ext-mbstring": "*", + "php": ">=5.3.0" + }, + "require-dev": { + "phpunit/phpunit": "^4.8.35" + }, + "type": "library", + "autoload": { + "psr-0": { + "Parsedown": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Emanuil Rusev", + "email": "hello@erusev.com", + "homepage": "http://erusev.com" + } + ], + "description": "Parser for Markdown.", + "homepage": "http://parsedown.org", + "keywords": [ + "markdown", + "parser" + ], + "time": "2018-03-08T01:11:30+00:00" + }, + { + "name": "erusev/parsedown-extra", + "version": "0.7.1", + "source": { + "type": "git", + "url": "https://github.com/erusev/parsedown-extra.git", + "reference": "0db5cce7354e4b76f155d092ab5eb3981c21258c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/erusev/parsedown-extra/zipball/0db5cce7354e4b76f155d092ab5eb3981c21258c", + "reference": "0db5cce7354e4b76f155d092ab5eb3981c21258c", + "shasum": "" + }, + "require": { + "erusev/parsedown": "~1.4" + }, + "type": "library", + "autoload": { + "psr-0": { + "ParsedownExtra": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Emanuil Rusev", + "email": "hello@erusev.com", + "homepage": "http://erusev.com" + } + ], + "description": "An extension of Parsedown that adds support for Markdown Extra.", + "homepage": "https://github.com/erusev/parsedown-extra", + "keywords": [ + "markdown", + "markdown extra", + "parsedown", + "parser" + ], + "time": "2015-11-01T10:19:22+00:00" + }, + { + "name": "guzzlehttp/guzzle", + "version": "6.3.3", + "source": { + "type": "git", + "url": "https://github.com/guzzle/guzzle.git", + "reference": "407b0cb880ace85c9b63c5f9551db498cb2d50ba" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/guzzle/zipball/407b0cb880ace85c9b63c5f9551db498cb2d50ba", + "reference": "407b0cb880ace85c9b63c5f9551db498cb2d50ba", + "shasum": "" + }, + "require": { + "guzzlehttp/promises": "^1.0", + "guzzlehttp/psr7": "^1.4", + "php": ">=5.5" + }, + "require-dev": { + "ext-curl": "*", + "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.4 || ^7.0", + "psr/log": "^1.0" + }, + "suggest": { + "psr/log": "Required for using the Log middleware" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "6.3-dev" + } + }, + "autoload": { + "files": [ + "src/functions_include.php" + ], + "psr-4": { + "GuzzleHttp\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + } + ], + "description": "Guzzle is a PHP HTTP client library", + "homepage": "http://guzzlephp.org/", + "keywords": [ + "client", + "curl", + "framework", + "http", + "http client", + "rest", + "web service" + ], + "time": "2018-04-22T15:46:56+00:00" + }, + { + "name": "guzzlehttp/promises", + "version": "v1.3.1", + "source": { + "type": "git", + "url": "https://github.com/guzzle/promises.git", + "reference": "a59da6cf61d80060647ff4d3eb2c03a2bc694646" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/promises/zipball/a59da6cf61d80060647ff4d3eb2c03a2bc694646", + "reference": "a59da6cf61d80060647ff4d3eb2c03a2bc694646", + "shasum": "" + }, + "require": { + "php": ">=5.5.0" + }, + "require-dev": { + "phpunit/phpunit": "^4.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.4-dev" + } + }, + "autoload": { + "psr-4": { + "GuzzleHttp\\Promise\\": "src/" + }, + "files": [ + "src/functions_include.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + } + ], + "description": "Guzzle promises library", + "keywords": [ + "promise" + ], + "time": "2016-12-20T10:07:11+00:00" + }, + { + "name": "guzzlehttp/psr7", + "version": "1.4.2", + "source": { + "type": "git", + "url": "https://github.com/guzzle/psr7.git", + "reference": "f5b8a8512e2b58b0071a7280e39f14f72e05d87c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/psr7/zipball/f5b8a8512e2b58b0071a7280e39f14f72e05d87c", + "reference": "f5b8a8512e2b58b0071a7280e39f14f72e05d87c", + "shasum": "" + }, + "require": { + "php": ">=5.4.0", + "psr/http-message": "~1.0" + }, + "provide": { + "psr/http-message-implementation": "1.0" + }, + "require-dev": { + "phpunit/phpunit": "~4.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.4-dev" + } + }, + "autoload": { + "psr-4": { + "GuzzleHttp\\Psr7\\": "src/" + }, + "files": [ + "src/functions_include.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + }, + { + "name": "Tobias Schultze", + "homepage": "https://github.com/Tobion" + } + ], + "description": "PSR-7 message implementation that also provides common utility methods", + "keywords": [ + "http", + "message", + "request", + "response", + "stream", + "uri", + "url" + ], + "time": "2017-03-20T17:10:46+00:00" + }, + { + "name": "leafo/scssphp", + "version": "v0.7.7", + "source": { + "type": "git", + "url": "https://github.com/leafo/scssphp.git", + "reference": "1d656f8c02a3a69404bba6b28ec4e06edddf0f49" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/leafo/scssphp/zipball/1d656f8c02a3a69404bba6b28ec4e06edddf0f49", + "reference": "1d656f8c02a3a69404bba6b28ec4e06edddf0f49", + "shasum": "" + }, + "require": { + "php": ">=5.4.0" + }, + "require-dev": { + "phpunit/phpunit": "~4.6", + "squizlabs/php_codesniffer": "~2.5" + }, + "bin": [ + "bin/pscss" + ], + "type": "library", + "autoload": { + "psr-4": { + "Leafo\\ScssPhp\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Leaf Corcoran", + "email": "leafot@gmail.com", + "homepage": "http://leafo.net" + } + ], + "description": "scssphp is a compiler for SCSS written in PHP.", + "homepage": "http://leafo.github.io/scssphp/", + "keywords": [ + "css", + "less", + "sass", + "scss", + "stylesheet" + ], + "time": "2018-07-22T01:22:08+00:00" + }, + { + "name": "magdev/console-form", + "version": "0.0.7", + "source": { + "type": "git", + "url": "magdev@localhost:/home/magdev/local/git/console-form/", + "reference": "91ed4ed9296e0024441043be059846a86c72a1b9" + }, + "require": { + "php": ">=5.4", + "symfony/console": "^2.8 || ^3.0 || ^4.0", + "symfony/finder": "^2.8 || ^3.0 || ^4.0" + }, + "require-dev": { + "phpunit/phpunit": "^5.5", + "squizlabs/php_codesniffer": "^2.8" + }, + "type": "library", + "autoload": { + "psr-4": { + "Droath\\ConsoleForm\\": "./src" + } + }, + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Travis Tomka", + "email": "underoathosx@gmail.com" + } + ], + "description": "Symfony console form helper.", + "keywords": [ + "console", + "form" + ], + "time": "2018-07-03T14:31:01+00:00" + }, + { + "name": "mnapoli/front-yaml", + "version": "1.6.0", + "source": { + "type": "git", + "url": "https://github.com/mnapoli/FrontYAML.git", + "reference": "24070ace8b741247bb3161cbb38ecc541268b296" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/mnapoli/FrontYAML/zipball/24070ace8b741247bb3161cbb38ecc541268b296", + "reference": "24070ace8b741247bb3161cbb38ecc541268b296", + "shasum": "" + }, + "require": { + "erusev/parsedown": "~1.0", + "php": ">=5.4.0", + "symfony/yaml": "~2.1|^3.0|^4.0" + }, + "require-dev": { + "league/commonmark": "~0.7", + "phpunit/phpunit": "~4.5" + }, + "type": "library", + "autoload": { + "psr-4": { + "Mni\\FrontYAML\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "time": "2017-10-29T19:29:55+00:00" + }, + { + "name": "monolog/monolog", + "version": "1.23.0", + "source": { + "type": "git", + "url": "https://github.com/Seldaek/monolog.git", + "reference": "fd8c787753b3a2ad11bc60c063cff1358a32a3b4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Seldaek/monolog/zipball/fd8c787753b3a2ad11bc60c063cff1358a32a3b4", + "reference": "fd8c787753b3a2ad11bc60c063cff1358a32a3b4", + "shasum": "" + }, + "require": { + "php": ">=5.3.0", + "psr/log": "~1.0" + }, + "provide": { + "psr/log-implementation": "1.0.0" + }, + "require-dev": { + "aws/aws-sdk-php": "^2.4.9 || ^3.0", + "doctrine/couchdb": "~1.0@dev", + "graylog2/gelf-php": "~1.0", + "jakub-onderka/php-parallel-lint": "0.9", + "php-amqplib/php-amqplib": "~2.4", + "php-console/php-console": "^3.1.3", + "phpunit/phpunit": "~4.5", + "phpunit/phpunit-mock-objects": "2.3.0", + "ruflin/elastica": ">=0.90 <3.0", + "sentry/sentry": "^0.13", + "swiftmailer/swiftmailer": "^5.3|^6.0" + }, + "suggest": { + "aws/aws-sdk-php": "Allow sending log messages to AWS services like DynamoDB", + "doctrine/couchdb": "Allow sending log messages to a CouchDB server", + "ext-amqp": "Allow sending log messages to an AMQP server (1.0+ required)", + "ext-mongo": "Allow sending log messages to a MongoDB server", + "graylog2/gelf-php": "Allow sending log messages to a GrayLog2 server", + "mongodb/mongodb": "Allow sending log messages to a MongoDB server via PHP Driver", + "php-amqplib/php-amqplib": "Allow sending log messages to an AMQP server using php-amqplib", + "php-console/php-console": "Allow sending log messages to Google Chrome", + "rollbar/rollbar": "Allow sending log messages to Rollbar", + "ruflin/elastica": "Allow sending log messages to an Elastic Search server", + "sentry/sentry": "Allow sending log messages to a Sentry server" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Monolog\\": "src/Monolog" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "http://seld.be" + } + ], + "description": "Sends your logs to files, sockets, inboxes, databases and various web services", + "homepage": "http://github.com/Seldaek/monolog", + "keywords": [ + "log", + "logging", + "psr-3" + ], + "time": "2017-06-19T01:22:40+00:00" + }, + { + "name": "oyejorge/less.php", + "version": "v1.7.0.14", + "source": { + "type": "git", + "url": "https://github.com/oyejorge/less.php.git", + "reference": "42925c5a01a07d67ca7e82dfc8fb31814d557bc9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/oyejorge/less.php/zipball/42925c5a01a07d67ca7e82dfc8fb31814d557bc9", + "reference": "42925c5a01a07d67ca7e82dfc8fb31814d557bc9", + "shasum": "" + }, + "require": { + "php": ">=5.3" + }, + "require-dev": { + "phpunit/phpunit": "~4.8.24" + }, + "bin": [ + "bin/lessc" + ], + "type": "library", + "autoload": { + "psr-0": { + "Less": "lib/" + }, + "classmap": [ + "lessc.inc.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Apache-2.0" + ], + "authors": [ + { + "name": "Matt Agar", + "homepage": "https://github.com/agar" + }, + { + "name": "Martin Jantošovič", + "homepage": "https://github.com/Mordred" + }, + { + "name": "Josh Schmidt", + "homepage": "https://github.com/oyejorge" + } + ], + "description": "PHP port of the Javascript version of LESS http://lesscss.org (Originally maintained by Josh Schmidt)", + "homepage": "http://lessphp.gpeasy.com", + "keywords": [ + "css", + "less", + "less.js", + "lesscss", + "php", + "stylesheet" + ], + "time": "2017-03-28T22:19:25+00:00" + }, + { + "name": "pdfshift/pdfshift-php", + "version": "v1.0.2", + "source": { + "type": "git", + "url": "https://github.com/pdfshift/pdfshift-php.git", + "reference": "f0da7c7b8bfab1f27404a34f715dee305c6cf837" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/pdfshift/pdfshift-php/zipball/f0da7c7b8bfab1f27404a34f715dee305c6cf837", + "reference": "f0da7c7b8bfab1f27404a34f715dee305c6cf837", + "shasum": "" + }, + "require": { + "guzzlehttp/guzzle": "~6.3.2", + "php": ">=5.3.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "PDFShift\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Cyril Nicodeme", + "email": "contact@pdfshift.io", + "homepage": "https://pdfshift.io", + "role": "Developer" + } + ], + "description": "Convert HTML documents to PDF using the PDFShift.io API.", + "homepage": "https://github.com/pdfshift/pdfshift-php", + "keywords": [ + "api", + "convert", + "document", + "html", + "pdf", + "pdfshift" + ], + "time": "2018-06-12T13:14:23+00:00" + }, + { + "name": "psr/container", + "version": "1.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/container.git", + "reference": "b7ce3b176482dbbc1245ebf52b181af44c2cf55f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/container/zipball/b7ce3b176482dbbc1245ebf52b181af44c2cf55f", + "reference": "b7ce3b176482dbbc1245ebf52b181af44c2cf55f", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Container\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Common Container Interface (PHP FIG PSR-11)", + "homepage": "https://github.com/php-fig/container", + "keywords": [ + "PSR-11", + "container", + "container-interface", + "container-interop", + "psr" + ], + "time": "2017-02-14T16:28:37+00:00" + }, + { + "name": "psr/http-message", + "version": "1.0.1", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-message.git", + "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-message/zipball/f6561bf28d520154e4b0ec72be95418abe6d9363", + "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Http\\Message\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Common interface for HTTP messages", + "homepage": "https://github.com/php-fig/http-message", + "keywords": [ + "http", + "http-message", + "psr", + "psr-7", + "request", + "response" + ], + "time": "2016-08-06T14:39:51+00:00" + }, + { + "name": "psr/log", + "version": "1.0.2", + "source": { + "type": "git", + "url": "https://github.com/php-fig/log.git", + "reference": "4ebe3a8bf773a19edfe0a84b6585ba3d401b724d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/log/zipball/4ebe3a8bf773a19edfe0a84b6585ba3d401b724d", + "reference": "4ebe3a8bf773a19edfe0a84b6585ba3d401b724d", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Log\\": "Psr/Log/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Common interface for logging libraries", + "homepage": "https://github.com/php-fig/log", + "keywords": [ + "log", + "psr", + "psr-3" + ], + "time": "2016-10-10T12:19:37+00:00" + }, + { + "name": "symfony/config", + "version": "v4.1.3", + "source": { + "type": "git", + "url": "https://github.com/symfony/config.git", + "reference": "c868972ac26e4e19860ce11b300bb74145246ff9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/config/zipball/c868972ac26e4e19860ce11b300bb74145246ff9", + "reference": "c868972ac26e4e19860ce11b300bb74145246ff9", + "shasum": "" + }, + "require": { + "php": "^7.1.3", + "symfony/filesystem": "~3.4|~4.0", + "symfony/polyfill-ctype": "~1.8" + }, + "conflict": { + "symfony/finder": "<3.4" + }, + "require-dev": { + "symfony/dependency-injection": "~3.4|~4.0", + "symfony/event-dispatcher": "~3.4|~4.0", + "symfony/finder": "~3.4|~4.0", + "symfony/yaml": "~3.4|~4.0" + }, + "suggest": { + "symfony/yaml": "To use the yaml reference dumper" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.1-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\Config\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Config Component", + "homepage": "https://symfony.com", + "time": "2018-07-26T11:24:31+00:00" + }, + { + "name": "symfony/console", + "version": "v4.1.3", + "source": { + "type": "git", + "url": "https://github.com/symfony/console.git", + "reference": "ca80b8ced97cf07390078b29773dc384c39eee1f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/console/zipball/ca80b8ced97cf07390078b29773dc384c39eee1f", + "reference": "ca80b8ced97cf07390078b29773dc384c39eee1f", + "shasum": "" + }, + "require": { + "php": "^7.1.3", + "symfony/polyfill-mbstring": "~1.0" + }, + "conflict": { + "symfony/dependency-injection": "<3.4", + "symfony/process": "<3.3" + }, + "require-dev": { + "psr/log": "~1.0", + "symfony/config": "~3.4|~4.0", + "symfony/dependency-injection": "~3.4|~4.0", + "symfony/event-dispatcher": "~3.4|~4.0", + "symfony/lock": "~3.4|~4.0", + "symfony/process": "~3.4|~4.0" + }, + "suggest": { + "psr/log-implementation": "For using the console logger", + "symfony/event-dispatcher": "", + "symfony/lock": "", + "symfony/process": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.1-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\Console\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Console Component", + "homepage": "https://symfony.com", + "time": "2018-07-26T11:24:31+00:00" + }, + { + "name": "symfony/dependency-injection", + "version": "v4.1.3", + "source": { + "type": "git", + "url": "https://github.com/symfony/dependency-injection.git", + "reference": "f4f401fc2766eb8d766fc6043d9e6489b37a41e4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/f4f401fc2766eb8d766fc6043d9e6489b37a41e4", + "reference": "f4f401fc2766eb8d766fc6043d9e6489b37a41e4", + "shasum": "" + }, + "require": { + "php": "^7.1.3", + "psr/container": "^1.0" + }, + "conflict": { + "symfony/config": "<4.1.1", + "symfony/finder": "<3.4", + "symfony/proxy-manager-bridge": "<3.4", + "symfony/yaml": "<3.4" + }, + "provide": { + "psr/container-implementation": "1.0" + }, + "require-dev": { + "symfony/config": "~4.1", + "symfony/expression-language": "~3.4|~4.0", + "symfony/yaml": "~3.4|~4.0" + }, + "suggest": { + "symfony/config": "", + "symfony/expression-language": "For using expressions in service container configuration", + "symfony/finder": "For using double-star glob patterns or when GLOB_BRACE portability is required", + "symfony/proxy-manager-bridge": "Generate service proxies to lazy load them", + "symfony/yaml": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.1-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\DependencyInjection\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony DependencyInjection Component", + "homepage": "https://symfony.com", + "time": "2018-08-01T08:24:03+00:00" + }, + { + "name": "symfony/dotenv", + "version": "v4.1.3", + "source": { + "type": "git", + "url": "https://github.com/symfony/dotenv.git", + "reference": "22ca63c46e252b8a8f37b8f9e6da66bff5b3d3e7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/dotenv/zipball/22ca63c46e252b8a8f37b8f9e6da66bff5b3d3e7", + "reference": "22ca63c46e252b8a8f37b8f9e6da66bff5b3d3e7", + "shasum": "" + }, + "require": { + "php": "^7.1.3" + }, + "require-dev": { + "symfony/process": "~3.4|~4.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.1-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\Dotenv\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Registers environment variables from a .env file", + "homepage": "https://symfony.com", + "keywords": [ + "dotenv", + "env", + "environment" + ], + "time": "2018-07-26T11:24:31+00:00" + }, + { + "name": "symfony/event-dispatcher", + "version": "v4.1.3", + "source": { + "type": "git", + "url": "https://github.com/symfony/event-dispatcher.git", + "reference": "bfb30c2ad377615a463ebbc875eba64a99f6aa3e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/bfb30c2ad377615a463ebbc875eba64a99f6aa3e", + "reference": "bfb30c2ad377615a463ebbc875eba64a99f6aa3e", + "shasum": "" + }, + "require": { + "php": "^7.1.3" + }, + "conflict": { + "symfony/dependency-injection": "<3.4" + }, + "require-dev": { + "psr/log": "~1.0", + "symfony/config": "~3.4|~4.0", + "symfony/dependency-injection": "~3.4|~4.0", + "symfony/expression-language": "~3.4|~4.0", + "symfony/stopwatch": "~3.4|~4.0" + }, + "suggest": { + "symfony/dependency-injection": "", + "symfony/http-kernel": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.1-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\EventDispatcher\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony EventDispatcher Component", + "homepage": "https://symfony.com", + "time": "2018-07-26T09:10:45+00:00" + }, + { + "name": "symfony/filesystem", + "version": "v4.1.3", + "source": { + "type": "git", + "url": "https://github.com/symfony/filesystem.git", + "reference": "2e30335e0aafeaa86645555959572fe7cea22b43" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/filesystem/zipball/2e30335e0aafeaa86645555959572fe7cea22b43", + "reference": "2e30335e0aafeaa86645555959572fe7cea22b43", + "shasum": "" + }, + "require": { + "php": "^7.1.3", + "symfony/polyfill-ctype": "~1.8" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.1-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\Filesystem\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Filesystem Component", + "homepage": "https://symfony.com", + "time": "2018-07-26T11:24:31+00:00" + }, + { + "name": "symfony/finder", + "version": "v4.1.3", + "source": { + "type": "git", + "url": "https://github.com/symfony/finder.git", + "reference": "e162f1df3102d0b7472805a5a9d5db9fcf0a8068" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/finder/zipball/e162f1df3102d0b7472805a5a9d5db9fcf0a8068", + "reference": "e162f1df3102d0b7472805a5a9d5db9fcf0a8068", + "shasum": "" + }, + "require": { + "php": "^7.1.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.1-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\Finder\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Finder Component", + "homepage": "https://symfony.com", + "time": "2018-07-26T11:24:31+00:00" + }, + { + "name": "symfony/polyfill-ctype", + "version": "v1.9.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-ctype.git", + "reference": "e3d826245268269cd66f8326bd8bc066687b4a19" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/e3d826245268269cd66f8326bd8bc066687b4a19", + "reference": "e3d826245268269cd66f8326bd8bc066687b4a19", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "suggest": { + "ext-ctype": "For best performance" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.9-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Ctype\\": "" + }, + "files": [ + "bootstrap.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + }, + { + "name": "Gert de Pagter", + "email": "BackEndTea@gmail.com" + } + ], + "description": "Symfony polyfill for ctype functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "ctype", + "polyfill", + "portable" + ], + "time": "2018-08-06T14:22:27+00:00" + }, + { + "name": "symfony/polyfill-mbstring", + "version": "v1.9.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-mbstring.git", + "reference": "d0cd638f4634c16d8df4508e847f14e9e43168b8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/d0cd638f4634c16d8df4508e847f14e9e43168b8", + "reference": "d0cd638f4634c16d8df4508e847f14e9e43168b8", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "suggest": { + "ext-mbstring": "For best performance" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.9-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Mbstring\\": "" + }, + "files": [ + "bootstrap.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for the Mbstring extension", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "mbstring", + "polyfill", + "portable", + "shim" + ], + "time": "2018-08-06T14:22:27+00:00" + }, + { + "name": "symfony/process", + "version": "v4.1.3", + "source": { + "type": "git", + "url": "https://github.com/symfony/process.git", + "reference": "f01fc7a4493572f7f506c49dcb50ad01fb3a2f56" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/process/zipball/f01fc7a4493572f7f506c49dcb50ad01fb3a2f56", + "reference": "f01fc7a4493572f7f506c49dcb50ad01fb3a2f56", + "shasum": "" + }, + "require": { + "php": "^7.1.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.1-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\Process\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Process Component", + "homepage": "https://symfony.com", + "time": "2018-07-26T11:24:31+00:00" + }, + { + "name": "symfony/translation", + "version": "v4.1.3", + "source": { + "type": "git", + "url": "https://github.com/symfony/translation.git", + "reference": "6fcd1bd44fd6d7181e6ea57a6f4e08a09b29ef65" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/translation/zipball/6fcd1bd44fd6d7181e6ea57a6f4e08a09b29ef65", + "reference": "6fcd1bd44fd6d7181e6ea57a6f4e08a09b29ef65", + "shasum": "" + }, + "require": { + "php": "^7.1.3", + "symfony/polyfill-mbstring": "~1.0" + }, + "conflict": { + "symfony/config": "<3.4", + "symfony/dependency-injection": "<3.4", + "symfony/yaml": "<3.4" + }, + "require-dev": { + "psr/log": "~1.0", + "symfony/config": "~3.4|~4.0", + "symfony/console": "~3.4|~4.0", + "symfony/dependency-injection": "~3.4|~4.0", + "symfony/finder": "~2.8|~3.0|~4.0", + "symfony/intl": "~3.4|~4.0", + "symfony/yaml": "~3.4|~4.0" + }, + "suggest": { + "psr/log-implementation": "To use logging capability in translator", + "symfony/config": "", + "symfony/yaml": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.1-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\Translation\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Translation Component", + "homepage": "https://symfony.com", + "time": "2018-07-26T11:24:31+00:00" + }, + { + "name": "symfony/yaml", + "version": "v4.1.3", + "source": { + "type": "git", + "url": "https://github.com/symfony/yaml.git", + "reference": "46bc69aa91fc4ab78a96ce67873a6b0c148fd48c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/yaml/zipball/46bc69aa91fc4ab78a96ce67873a6b0c148fd48c", + "reference": "46bc69aa91fc4ab78a96ce67873a6b0c148fd48c", + "shasum": "" + }, + "require": { + "php": "^7.1.3", + "symfony/polyfill-ctype": "~1.8" + }, + "conflict": { + "symfony/console": "<3.4" + }, + "require-dev": { + "symfony/console": "~3.4|~4.0" + }, + "suggest": { + "symfony/console": "For validating YAML files using the lint command" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.1-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\Yaml\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Yaml Component", + "homepage": "https://symfony.com", + "time": "2018-07-26T11:24:31+00:00" + }, + { + "name": "twig/twig", + "version": "v2.5.0", + "source": { + "type": "git", + "url": "https://github.com/twigphp/Twig.git", + "reference": "6a5f676b77a90823c2d4eaf76137b771adf31323" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/twigphp/Twig/zipball/6a5f676b77a90823c2d4eaf76137b771adf31323", + "reference": "6a5f676b77a90823c2d4eaf76137b771adf31323", + "shasum": "" + }, + "require": { + "php": "^7.0", + "symfony/polyfill-ctype": "^1.8", + "symfony/polyfill-mbstring": "~1.0" + }, + "require-dev": { + "psr/container": "^1.0", + "symfony/debug": "^2.7", + "symfony/phpunit-bridge": "^3.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.5-dev" + } + }, + "autoload": { + "psr-0": { + "Twig_": "lib/" + }, + "psr-4": { + "Twig\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com", + "homepage": "http://fabien.potencier.org", + "role": "Lead Developer" + }, + { + "name": "Armin Ronacher", + "email": "armin.ronacher@active-4.com", + "role": "Project Founder" + }, + { + "name": "Twig Team", + "homepage": "https://twig.symfony.com/contributors", + "role": "Contributors" + } + ], + "description": "Twig, the flexible, fast, and secure template language for PHP", + "homepage": "https://twig.symfony.com", + "keywords": [ + "templating" + ], + "time": "2018-07-13T07:18:09+00:00" + }, + { + "name": "zaininnari/html-minifier", + "version": "0.4.2", + "source": { + "type": "git", + "url": "https://github.com/zaininnari/html-minifier.git", + "reference": "5b94d85705626f9bb33b7c667bc4400088ed4ece" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/zaininnari/html-minifier/zipball/5b94d85705626f9bb33b7c667bc4400088ed4ece", + "reference": "5b94d85705626f9bb33b7c667bc4400088ed4ece", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "require-dev": { + "satooshi/php-coveralls": "dev-master" + }, + "type": "library", + "autoload": { + "psr-0": { + "zz": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "The BSD 3-Clause License" + ], + "authors": [ + { + "name": "Google inc", + "homepage": "http://www.chromium.org/blink", + "role": "Author" + }, + { + "name": "zaininnari", + "homepage": "https://github.com/zaininnari/", + "role": "Developer" + } + ], + "description": "The Blink HTMLTokenizer ported to PHP.", + "homepage": "https://github.com/zaininnari/html-minifier", + "keywords": [ + "Blink", + "HTML minify", + "php" + ], + "time": "2015-08-18T14:10:55+00:00" + } + ], + "packages-dev": [], + "aliases": [], + "minimum-stability": "stable", + "stability-flags": [], + "prefer-stable": false, + "prefer-lowest": false, + "platform": { + "php": "~7.2", + "ext-phar": "*", + "ext-spl": "*", + "ext-date": "*", + "ext-fileinfo": "*", + "ext-mbstring": "*", + "ext-bz2": "*" + }, + "platform-dev": [] +} diff --git a/src/Analyzer/Base/AnalyzableInterface.php b/src/Analyzer/Base/AnalyzableInterface.php new file mode 100644 index 0000000..1d38f02 --- /dev/null +++ b/src/Analyzer/Base/AnalyzableInterface.php @@ -0,0 +1,47 @@ +getAnalyzerData(); + $base = sizeof($data); + $counter = 0; + + foreach ($data as $key => $value) { + if ($value) { + $counter++; + } + } + + return ceil(($counter * 100) / $base); + } +} + diff --git a/src/Application.php b/src/Application.php new file mode 100644 index 0000000..684ba6c --- /dev/null +++ b/src/Application.php @@ -0,0 +1,132 @@ +container = new ContainerBuilder(); + $loader = new YamlFileLoader($this->container, new FileLocator(DOSSIER_ROOT.'/app/conf')); + $loader->load('services.yaml'); + + $formDiscovery = new FormDiscovery($this->container); + $forms = $formDiscovery->discover(DOSSIER_ROOT.'/src/Form', '\Magdev\Dossier\Form'); + + $helperSet = $this->getHelperSet(); + $helperSet->set(new FormHelper($forms)); + $helperSet->set(new ExportHelper()); + $helperSet->set(new OutputHelper($this->getName(), $this->getVersion())); + $helperSet->set(new SectionManagerHelper($this->container->get('config'))); + + $this->container->get('analyzer') + ->addAnalyzer(new ModelStatusAnalyzer()); + } + + + /** + * Get the service-contianer + * + * @return \Symfony\Component\DependencyInjection\ContainerBuilder + */ + public function getContainer(): ContainerBuilder + { + return $this->container; + } + + + /** + * Get a service by its name + * + * @param string $name + * @param int $invalidBehavior + * @return object|\Symfony\Component\DependencyInjection\Container|mixed|void|unknown + */ + public function getService(string $name, $invalidBehavior = ContainerInterface::EXCEPTION_ON_INVALID_REFERENCE) + { + return $this->getContainer()->get($name, $invalidBehavior); + } + + + /** + * {@inheritDoc} + * @see \Symfony\Component\Console\Application::getLongVersion() + */ + public function getLongVersion() + { + $code = ''.base64_decode(DOSSIER_LOGO).PHP_EOL; + $header = $this->getService('translator')->trans('app.header'); + + if ('UNKNOWN' !== $this->getName()) { + if ('UNKNOWN' !== $this->getVersion()) { + $code .= ' '.$this->getName().' '.$this->getVersion().PHP_EOL; + } else { + $code .= ' '.$this->getName().PHP_EOL; + } + } + $code .= ' '.$header.''; + + return $code; + } +} diff --git a/src/Command/Base/BaseCommand.php b/src/Command/Base/BaseCommand.php new file mode 100644 index 0000000..708cabe --- /dev/null +++ b/src/Command/Base/BaseCommand.php @@ -0,0 +1,174 @@ +getService('output_helper') + ->setOutput($output) + ->writeApplicationHeader(); + return $this; + } + + + /** + * Get a service from the container + * + * @param string $name + * @return mixed + */ + protected function getService(string $name) + { + return $this->getApplication()->getService($name); + } + + + /** + * {@inheritDoc} + * @see \Symfony\Component\Console\Command\Command::configure() + */ + protected function configure() + { + $this->addOption('no-header', 'N', InputOption::VALUE_NONE, 'Suppress header