summaryrefslogtreecommitdiff
path: root/mtg-pdf.php
diff options
context:
space:
mode:
Diffstat (limited to 'mtg-pdf.php')
-rw-r--r--mtg-pdf.php128
1 files changed, 128 insertions, 0 deletions
diff --git a/mtg-pdf.php b/mtg-pdf.php
new file mode 100644
index 0000000..9b705b0
--- /dev/null
+++ b/mtg-pdf.php
@@ -0,0 +1,128 @@
+<?php
+
+use Gotenberg\Gotenberg;
+use Gotenberg\Stream;
+
+$decklist = $_ENV['DECKLIST'];
+if (empty($decklist)) {
+ die('No decklist provided.');
+}
+
+require_once __DIR__ . '/vendor/autoload.php';
+
+/*
+ * Match cards from input
+ */
+
+preg_match_all("/(\d+) (.+) \(([\w\d]+)\) (\d+\w*) ?([\*\w]*)/", $decklist, $matches);
+$cards = [];
+for ($idx = 0; $idx < count($matches[0]); $idx++) {
+ $cards[] = [
+ 'quantity' => $matches[1][$idx],
+ 'name' => $matches[2][$idx],
+ 'set' => $matches[3][$idx],
+ 'number' => $matches[4][$idx],
+ ];
+}
+
+/*
+ * Select data from DB
+ */
+
+$db = new \PDO('sqlite:AllPrintings.sqlite');
+
+$images = [];
+foreach ($cards as $card) {
+ $query = 'SELECT scryfallId,layout from cardIdentifiers JOIN cards on cardIdentifiers.uuid=cards.uuid WHERE cards.setCode=:setCode AND cards.number=:number';
+ $statement = $db->prepare($query);
+ $statement->execute(['setCode' => $card['set'], 'number' => $card['number']]);
+ $result = $statement->fetch();
+ $id = $result['scryfallId'] ?? '';
+
+ if (empty($id)) {
+ $query = 'SELECT scryfallId,layout from tokenIdentifiers JOIN tokens on tokenIdentifiers.uuid=tokens.uuid WHERE tokens.setCode=:setCode AND tokens.number=:number';
+ $statement = $db->prepare($query);
+ $statement->execute(['setCode' => $card['set'], 'number' => $card['number']]);
+ $result = $statement->fetch();
+ $id = $result['scryfallId'] ?? '';
+
+ if (empty($id)) {
+ echo "$card[name] ($card[set]) $card[number] not found.";
+ continue;
+ }
+ }
+
+ $images[] = [
+ 'quantity' => $card['quantity'],
+ 'src' => "https://cards.scryfall.io/png/front/" . substr($id, 0, 1) . "/" . substr($id, 1, 1) . "/$id.png",
+ 'alt' => $card['name'],
+ ];
+
+ if (in_array($result['layout'] ?? '', ['transform', 'double_faced_token'])) {
+ $images[] = [
+ 'quantity' => $card['quantity'],
+ 'src' => "https://cards.scryfall.io/png/back/" . substr($id, 0, 1) . "/" . substr($id, 1, 1) . "/$id.png",
+ 'alt' => $card['name'],
+ ];
+ }
+}
+
+/*
+ * Build HTML
+ */
+
+$template = <<<HTML
+<html>
+ <head>
+ <style>
+ html, body {
+ padding: 0;
+ margin: 0;
+ }
+
+ img {
+ width: 2.49in;
+ height: 3.48in;
+ display: block;
+ background-color: #16130e;
+ background-color: #000;
+ }
+
+ #bg {
+ display: flex;
+ flex-wrap: wrap;
+ }
+ </style>
+ </head>
+ <body>
+ <div id="bg">{{imgs}}</div>
+ </body>
+</html>
+HTML;
+
+$imgs = array_map(function ($image) {
+ return str_repeat("<img src=\"$image[src]\" alt=\"$image[alt]\">", $image['quantity']);
+}, $images);
+
+$html = str_replace('{{imgs}}', implode('', $imgs), $template);
+
+/*
+ * Build PDF
+ */
+
+$request = Gotenberg::chromium('gotenberg:3000')
+ ->paperSize(8.27, 11.7) # A4
+ ->margins(0, 0, 0, 0)
+ ->outputFilename(date("Ymd_His"))
+ ->html(Stream::string('index.html', $html));
+
+if (php_sapi_name() === 'cli') {
+ @mkdir(__DIR__ . '/output');
+ Gotenberg::save($request, __DIR__ . '/output');
+} else {
+ $response = Gotenberg::send($request);
+
+ header('Content-Type: application/pdf');
+ header('Content-Disposition: attachment; filename="' . date("Ymd_His") . '"');
+ echo $response->getBody();
+}