Initial commit

This commit is contained in:
Alex Thomassen 2023-10-16 15:07:43 +00:00
commit ea391d47ec
Signed by: Alex
GPG Key ID: 10BD786B5F6FF5DE
14 changed files with 787 additions and 0 deletions

2
.docker/entrypoint.sh Executable file
View File

@ -0,0 +1,2 @@
#!/bin/bash
php-fpm -D && nginx -g "daemon off;"

43
.docker/nginx/diplom.conf Normal file
View File

@ -0,0 +1,43 @@
server {
listen 80;
index index.php index.html;
access_log /dev/stdout;
error_log /dev/stderr;
server_name diplom-generator;
root /var/www/html;
# Private IP address ranges
set_real_ip_from 172.16.0.0/12;
set_real_ip_from 192.168.0.0/16;
set_real_ip_from 10.0.0.0/8;
real_ip_header X-Real-IP;
location ~ \.docker {
deny all;
}
location ~* composer\. {
deny all;
}
location /vendor {
deny all;
}
location ~ \.php$ {
try_files $uri =404;
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_path_info;
}
location / {
try_files $uri $uri/ /index.php?$query_string;
gzip_static on;
}
}

3
.dockerignore Normal file
View File

@ -0,0 +1,3 @@
.editorconfig
.git
vendor

13
.editorconfig Normal file
View File

@ -0,0 +1,13 @@
# http://editorconfig.org
root = true
[*.{php,md}]
end_of_line = lf
indent_style = space
indent_size = 4
charset = utf-8
insert_final_newline = true
trim_trailing_whitespace = true
[*.md]
trim_trailing_whitespace = false

1
.env.example Normal file
View File

@ -0,0 +1 @@
FONT_LOCATION=/usr/share/fonts/truetype/msttcorefonts/Comic_Sans_MS.ttf

2
.gitignore vendored Normal file
View File

@ -0,0 +1,2 @@
.env
vendor

30
Dockerfile Normal file
View File

@ -0,0 +1,30 @@
FROM php:8.1-fpm-bookworm
ARG user
ARG uid
COPY .docker/entrypoint.sh /usr/local/bin/entrypoint.sh
RUN chmod +x /usr/local/bin/entrypoint.sh
ENV DEBIAN_FRONTEND noninteractive
RUN sed -i -e's/ main/ main contrib non-free/g' /etc/apt/sources.list.d/*
RUN apt update
# https://github.com/docker-library/docs/tree/master/php#php-core-extensions
# IDK if this is necessary, but probably doesn't hurt
RUN apt install -y ttf-mscorefonts-installer libfreetype-dev libjpeg62-turbo-dev libpng-dev
RUN apt install -y nginx git
RUN docker-php-ext-configure gd --with-freetype --with-jpeg
RUN docker-php-ext-install gd
COPY .docker/nginx/diplom.conf /etc/nginx/sites-enabled/default
ENV FONT_LOCATION /usr/share/fonts/truetype/msttcorefonts/Comic_Sans_MS.ttf
COPY --from=composer /usr/bin/composer /usr/bin/composer
COPY . /var/www/html
WORKDIR /var/www/html
RUN composer install --no-interaction --no-plugins --no-scripts --prefer-dist
ENTRYPOINT ["/usr/local/bin/entrypoint.sh"]

17
README.md Normal file
View File

@ -0,0 +1,17 @@
# DiplomGenerator
A crappy generator written just because I got tired of having to wait for Photoshop to launch every time.
## Requirements
If you don't want to just `docker-compose up -d` and be done with it, you'll need:
- php 8.1
- Probably works on 8.0 and 7.4 too, but idk haven't tested
- `gd` extension for PHP, as [required by Imagine](https://github.com/php-imagine/Imagine#requirements)
- [composer](https://getcomposer.org/)
- A font location. By default we use Comic Sans MS, which needs to be installed on your system.
- On Debian/Ubuntu: Install the `ttf-mscorefonts-installer` package
- Note that on Debian at least, you may need to enable `contrib` in your sources.list
Then simply run: `composer install` and point your PHP-configured web server to the same directory as `index.html`.

6
composer.json Normal file
View File

@ -0,0 +1,6 @@
{
"require": {
"imagine/imagine": "^1.3",
"vlucas/phpdotenv": "^5.5"
}
}

550
composer.lock generated Normal file
View File

@ -0,0 +1,550 @@
{
"_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": "9a39f86b47189b243fea2c42da11356c",
"packages": [
{
"name": "graham-campbell/result-type",
"version": "v1.1.1",
"source": {
"type": "git",
"url": "https://github.com/GrahamCampbell/Result-Type.git",
"reference": "672eff8cf1d6fe1ef09ca0f89c4b287d6a3eb831"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/GrahamCampbell/Result-Type/zipball/672eff8cf1d6fe1ef09ca0f89c4b287d6a3eb831",
"reference": "672eff8cf1d6fe1ef09ca0f89c4b287d6a3eb831",
"shasum": ""
},
"require": {
"php": "^7.2.5 || ^8.0",
"phpoption/phpoption": "^1.9.1"
},
"require-dev": {
"phpunit/phpunit": "^8.5.32 || ^9.6.3 || ^10.0.12"
},
"type": "library",
"autoload": {
"psr-4": {
"GrahamCampbell\\ResultType\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Graham Campbell",
"email": "hello@gjcampbell.co.uk",
"homepage": "https://github.com/GrahamCampbell"
}
],
"description": "An Implementation Of The Result Type",
"keywords": [
"Graham Campbell",
"GrahamCampbell",
"Result Type",
"Result-Type",
"result"
],
"support": {
"issues": "https://github.com/GrahamCampbell/Result-Type/issues",
"source": "https://github.com/GrahamCampbell/Result-Type/tree/v1.1.1"
},
"funding": [
{
"url": "https://github.com/GrahamCampbell",
"type": "github"
},
{
"url": "https://tidelift.com/funding/github/packagist/graham-campbell/result-type",
"type": "tidelift"
}
],
"time": "2023-02-25T20:23:15+00:00"
},
{
"name": "imagine/imagine",
"version": "1.3.5",
"source": {
"type": "git",
"url": "https://github.com/php-imagine/Imagine.git",
"reference": "7151d553edec4dc2bbac60419f7a74ff34700e7f"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/php-imagine/Imagine/zipball/7151d553edec4dc2bbac60419f7a74ff34700e7f",
"reference": "7151d553edec4dc2bbac60419f7a74ff34700e7f",
"shasum": ""
},
"require": {
"php": ">=5.5"
},
"require-dev": {
"phpunit/phpunit": "^4.8 || ^5.7 || ^6.5 || ^7.5 || ^8.4 || ^9.3"
},
"suggest": {
"ext-exif": "to read EXIF metadata",
"ext-gd": "to use the GD implementation",
"ext-gmagick": "to use the Gmagick implementation",
"ext-imagick": "to use the Imagick implementation"
},
"type": "library",
"extra": {
"branch-alias": {
"dev-develop": "1.x-dev"
}
},
"autoload": {
"psr-4": {
"Imagine\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Bulat Shakirzyanov",
"email": "mallluhuct@gmail.com",
"homepage": "http://avalanche123.com"
}
],
"description": "Image processing for PHP 5.3",
"homepage": "http://imagine.readthedocs.org/",
"keywords": [
"drawing",
"graphics",
"image manipulation",
"image processing"
],
"support": {
"issues": "https://github.com/php-imagine/Imagine/issues",
"source": "https://github.com/php-imagine/Imagine/tree/1.3.5"
},
"time": "2023-06-07T14:49:52+00:00"
},
{
"name": "phpoption/phpoption",
"version": "1.9.1",
"source": {
"type": "git",
"url": "https://github.com/schmittjoh/php-option.git",
"reference": "dd3a383e599f49777d8b628dadbb90cae435b87e"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/schmittjoh/php-option/zipball/dd3a383e599f49777d8b628dadbb90cae435b87e",
"reference": "dd3a383e599f49777d8b628dadbb90cae435b87e",
"shasum": ""
},
"require": {
"php": "^7.2.5 || ^8.0"
},
"require-dev": {
"bamarni/composer-bin-plugin": "^1.8.2",
"phpunit/phpunit": "^8.5.32 || ^9.6.3 || ^10.0.12"
},
"type": "library",
"extra": {
"bamarni-bin": {
"bin-links": true,
"forward-command": true
},
"branch-alias": {
"dev-master": "1.9-dev"
}
},
"autoload": {
"psr-4": {
"PhpOption\\": "src/PhpOption/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"Apache-2.0"
],
"authors": [
{
"name": "Johannes M. Schmitt",
"email": "schmittjoh@gmail.com",
"homepage": "https://github.com/schmittjoh"
},
{
"name": "Graham Campbell",
"email": "hello@gjcampbell.co.uk",
"homepage": "https://github.com/GrahamCampbell"
}
],
"description": "Option Type for PHP",
"keywords": [
"language",
"option",
"php",
"type"
],
"support": {
"issues": "https://github.com/schmittjoh/php-option/issues",
"source": "https://github.com/schmittjoh/php-option/tree/1.9.1"
},
"funding": [
{
"url": "https://github.com/GrahamCampbell",
"type": "github"
},
{
"url": "https://tidelift.com/funding/github/packagist/phpoption/phpoption",
"type": "tidelift"
}
],
"time": "2023-02-25T19:38:58+00:00"
},
{
"name": "symfony/polyfill-ctype",
"version": "v1.28.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/polyfill-ctype.git",
"reference": "ea208ce43cbb04af6867b4fdddb1bdbf84cc28cb"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/ea208ce43cbb04af6867b4fdddb1bdbf84cc28cb",
"reference": "ea208ce43cbb04af6867b4fdddb1bdbf84cc28cb",
"shasum": ""
},
"require": {
"php": ">=7.1"
},
"provide": {
"ext-ctype": "*"
},
"suggest": {
"ext-ctype": "For best performance"
},
"type": "library",
"extra": {
"branch-alias": {
"dev-main": "1.28-dev"
},
"thanks": {
"name": "symfony/polyfill",
"url": "https://github.com/symfony/polyfill"
}
},
"autoload": {
"files": [
"bootstrap.php"
],
"psr-4": {
"Symfony\\Polyfill\\Ctype\\": ""
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Gert de Pagter",
"email": "BackEndTea@gmail.com"
},
{
"name": "Symfony Community",
"homepage": "https://symfony.com/contributors"
}
],
"description": "Symfony polyfill for ctype functions",
"homepage": "https://symfony.com",
"keywords": [
"compatibility",
"ctype",
"polyfill",
"portable"
],
"support": {
"source": "https://github.com/symfony/polyfill-ctype/tree/v1.28.0"
},
"funding": [
{
"url": "https://symfony.com/sponsor",
"type": "custom"
},
{
"url": "https://github.com/fabpot",
"type": "github"
},
{
"url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
"type": "tidelift"
}
],
"time": "2023-01-26T09:26:14+00:00"
},
{
"name": "symfony/polyfill-mbstring",
"version": "v1.28.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/polyfill-mbstring.git",
"reference": "42292d99c55abe617799667f454222c54c60e229"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/42292d99c55abe617799667f454222c54c60e229",
"reference": "42292d99c55abe617799667f454222c54c60e229",
"shasum": ""
},
"require": {
"php": ">=7.1"
},
"provide": {
"ext-mbstring": "*"
},
"suggest": {
"ext-mbstring": "For best performance"
},
"type": "library",
"extra": {
"branch-alias": {
"dev-main": "1.28-dev"
},
"thanks": {
"name": "symfony/polyfill",
"url": "https://github.com/symfony/polyfill"
}
},
"autoload": {
"files": [
"bootstrap.php"
],
"psr-4": {
"Symfony\\Polyfill\\Mbstring\\": ""
}
},
"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"
],
"support": {
"source": "https://github.com/symfony/polyfill-mbstring/tree/v1.28.0"
},
"funding": [
{
"url": "https://symfony.com/sponsor",
"type": "custom"
},
{
"url": "https://github.com/fabpot",
"type": "github"
},
{
"url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
"type": "tidelift"
}
],
"time": "2023-07-28T09:04:16+00:00"
},
{
"name": "symfony/polyfill-php80",
"version": "v1.28.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/polyfill-php80.git",
"reference": "6caa57379c4aec19c0a12a38b59b26487dcfe4b5"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/6caa57379c4aec19c0a12a38b59b26487dcfe4b5",
"reference": "6caa57379c4aec19c0a12a38b59b26487dcfe4b5",
"shasum": ""
},
"require": {
"php": ">=7.1"
},
"type": "library",
"extra": {
"branch-alias": {
"dev-main": "1.28-dev"
},
"thanks": {
"name": "symfony/polyfill",
"url": "https://github.com/symfony/polyfill"
}
},
"autoload": {
"files": [
"bootstrap.php"
],
"psr-4": {
"Symfony\\Polyfill\\Php80\\": ""
},
"classmap": [
"Resources/stubs"
]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Ion Bazan",
"email": "ion.bazan@gmail.com"
},
{
"name": "Nicolas Grekas",
"email": "p@tchwork.com"
},
{
"name": "Symfony Community",
"homepage": "https://symfony.com/contributors"
}
],
"description": "Symfony polyfill backporting some PHP 8.0+ features to lower PHP versions",
"homepage": "https://symfony.com",
"keywords": [
"compatibility",
"polyfill",
"portable",
"shim"
],
"support": {
"source": "https://github.com/symfony/polyfill-php80/tree/v1.28.0"
},
"funding": [
{
"url": "https://symfony.com/sponsor",
"type": "custom"
},
{
"url": "https://github.com/fabpot",
"type": "github"
},
{
"url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
"type": "tidelift"
}
],
"time": "2023-01-26T09:26:14+00:00"
},
{
"name": "vlucas/phpdotenv",
"version": "v5.5.0",
"source": {
"type": "git",
"url": "https://github.com/vlucas/phpdotenv.git",
"reference": "1a7ea2afc49c3ee6d87061f5a233e3a035d0eae7"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/vlucas/phpdotenv/zipball/1a7ea2afc49c3ee6d87061f5a233e3a035d0eae7",
"reference": "1a7ea2afc49c3ee6d87061f5a233e3a035d0eae7",
"shasum": ""
},
"require": {
"ext-pcre": "*",
"graham-campbell/result-type": "^1.0.2",
"php": "^7.1.3 || ^8.0",
"phpoption/phpoption": "^1.8",
"symfony/polyfill-ctype": "^1.23",
"symfony/polyfill-mbstring": "^1.23.1",
"symfony/polyfill-php80": "^1.23.1"
},
"require-dev": {
"bamarni/composer-bin-plugin": "^1.4.1",
"ext-filter": "*",
"phpunit/phpunit": "^7.5.20 || ^8.5.30 || ^9.5.25"
},
"suggest": {
"ext-filter": "Required to use the boolean validator."
},
"type": "library",
"extra": {
"bamarni-bin": {
"bin-links": true,
"forward-command": true
},
"branch-alias": {
"dev-master": "5.5-dev"
}
},
"autoload": {
"psr-4": {
"Dotenv\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"BSD-3-Clause"
],
"authors": [
{
"name": "Graham Campbell",
"email": "hello@gjcampbell.co.uk",
"homepage": "https://github.com/GrahamCampbell"
},
{
"name": "Vance Lucas",
"email": "vance@vancelucas.com",
"homepage": "https://github.com/vlucas"
}
],
"description": "Loads environment variables from `.env` to `getenv()`, `$_ENV` and `$_SERVER` automagically.",
"keywords": [
"dotenv",
"env",
"environment"
],
"support": {
"issues": "https://github.com/vlucas/phpdotenv/issues",
"source": "https://github.com/vlucas/phpdotenv/tree/v5.5.0"
},
"funding": [
{
"url": "https://github.com/GrahamCampbell",
"type": "github"
},
{
"url": "https://tidelift.com/funding/github/packagist/vlucas/phpdotenv",
"type": "tidelift"
}
],
"time": "2022-10-16T01:01:54+00:00"
}
],
"packages-dev": [],
"aliases": [],
"minimum-stability": "stable",
"stability-flags": [],
"prefer-stable": false,
"prefer-lowest": false,
"platform": [],
"platform-dev": [],
"plugin-api-version": "2.3.0"
}

16
docker-compose.yml Normal file
View File

@ -0,0 +1,16 @@
version: '3'
services:
app:
build:
context: ./
dockerfile: Dockerfile
args:
user: diplom
uid: 1000
container_name: diplom-app
restart: unless-stopped
ports:
- "127.0.0.1:8008:80"
volumes:
- ./:/var/www/html

50
generate.php Normal file
View File

@ -0,0 +1,50 @@
<?php
require_once __DIR__ . '/vendor/autoload.php';
use Imagine\Gd\Font;
use Imagine\Gd\Imagine;
use Imagine\Image\Palette\RGB;
use Imagine\Image\Point;
$templatesDirectory = __DIR__ . '/templates';
$validFiles = [
'diplom-1.png' => [
'positions' => [
'top' => ['x' => 125, 'y' => 270, 'maxWidth' => 262],
'bottom' => ['x' => 150, 'y' => 350, 'maxWidth' => 216],
],
],
];
$template = $_GET['template'] ?? '';
$topText = $_GET['top'] ?? '';
$bottomText = $_GET['bottom'] ?? '';
if (!isset($validFiles[$template]) || !file_exists(sprintf('%s/%s', $templatesDirectory, $template))) {
die('Invalid template');
}
if (empty($topText) || empty($bottomText)) {
die('Invalid text');
}
$templateFile = sprintf('%s/%s', $templatesDirectory, $template);
$positions = $validFiles[$template]['positions'];
$imagine = new Imagine();
$palette = new RGB();
$colorBlack = $palette->color('#000000', 100);
$image = $imagine->open($templateFile);
$font = new Font($_ENV['FONT_LOCATION'], 12, $colorBlack);
$top = $positions['top'];
$bottom = $positions['bottom'];
$topPosition = new Point($top['x'], $top['y']);
$bottomPosition = new Point($bottom['x'], $bottom['y']);
$image->draw()->text($topText, $font, $topPosition, 0, $top['maxWidth'] ?? null);
$image->draw()->text($bottomText, $font, $bottomPosition, 0, $bottom['maxWidth'] ?? null);
$image->show('png');

54
index.html Normal file
View File

@ -0,0 +1,54 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Diplom Generator</title>
<link rel="stylesheet" href="https://decicus-cdn.b-cdn.net/water.css/v2.1.1/dark.min.css" integrity="sha384-cJBdsSYaB37lARFjqUmJVoGdRQaQndlSkVAOB0QSVMzFhBAQ6Aymcu3PIkS8CkWl" crossorigin="anonymous">
<style type="text/css">
body {
max-width: 85%;
}
.hidden {
display: none;
}
</style>
</head>
<h1>Diplom Generator</h1>
<form id="form">
<input type="hidden" name="template" value="diplom-1.png">
<label for="top">Top text:</label>
<input type="text" name="top" placeholder="Name">
<label for="bottom">Bottom text:</label>
<input type="text" name="bottom" placeholder="Text">
<button type="submit" id="submit">Generate</button>
</form>
<img class="hidden" id="preview" src="">
<script>
const form = document.getElementById('form');
form.addEventListener('submit', function(e) {
e.preventDefault();
});
const submit = document.getElementById('submit');
const preview = document.getElementById('preview');
submit.addEventListener('click', function() {
const url = new URL(window.location.href);
url.pathname = 'generate.php';
url.searchParams.set('template', form.elements.template.value);
url.searchParams.set('top', form.elements.top.value);
url.searchParams.set('bottom', form.elements.bottom.value);
preview.src = url.href;
preview.classList.remove('hidden');
});
</script>
</html>

BIN
templates/diplom-1.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 146 KiB