Skip to content

Commit

Permalink
feat(core): implement frontends for all backends
Browse files Browse the repository at this point in the history
  • Loading branch information
PedroTroller committed Oct 16, 2024
1 parent 3ed9af8 commit 6c64dfe
Show file tree
Hide file tree
Showing 21 changed files with 843 additions and 107 deletions.
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,2 +1,4 @@
/composer.lock
/vendor
/.phpunit.result.cache
/.php-cs-fixer.cache
1 change: 0 additions & 1 deletion .phpunit.result.cache

This file was deleted.

4 changes: 2 additions & 2 deletions src/Backend/Dompdf/DompdfAdapter.php
Original file line number Diff line number Diff line change
Expand Up @@ -32,10 +32,10 @@ public function __construct(
$this->options = $options;
}

public function generateFromDOMDocument(DOMDocument $DOMDocument): StreamInterface
public function generateFromDOMDocument(DOMDocument $document): StreamInterface
{
$dompdf = $this->buildDompdf();
$dompdf->loadDOM($DOMDocument);
$dompdf->loadDOM($document);

return $this->createStream($dompdf);
}
Expand Down
13 changes: 13 additions & 0 deletions src/Core/Backend/Adapter/StreamToPdf.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
<?php

declare(strict_types=1);

namespace KNPLabs\Snappy\Core\Backend\Adapter;

use KNPLabs\Snappy\Core\Backend\Adapter;
use Psr\Http\Message\StreamInterface;

interface StreamToPdf extends Adapter
{
public function generateFromStream(StreamInterface $stream): StreamInterface;
}
36 changes: 0 additions & 36 deletions src/Core/Bridge/FromHtmlFileToHtmlToPdf.php

This file was deleted.

39 changes: 0 additions & 39 deletions src/Core/Bridge/FromHtmlToHtmlFileToPdf.php

This file was deleted.

21 changes: 21 additions & 0 deletions src/Core/Filesystem/SplResourceInfo.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
<?php

declare(strict_types=1);

namespace KNPLabs\Snappy\Core\Filesystem;

final class SplResourceInfo extends \SplFileInfo
{
public static function fromTmpFile(): self
{
return new self(tmpfile());
}

/**
* @param resource $resource
*/
public function __construct(public readonly mixed $resource)
{
parent::__construct(stream_get_meta_data($this->resource)['uri']);
}
}
62 changes: 62 additions & 0 deletions src/Core/Frontend/DOMDocumentToPdf.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
<?php

declare(strict_types=1);

namespace KNPLabs\Snappy\Core\Frontend;

use DOMDocument;
use KNPLabs\Snappy\Core\Backend\Adapter;
use KNPLabs\Snappy\Core\Backend\Options;
use KNPLabs\Snappy\Core\Filesystem\SplFileInfo;
use KNPLabs\Snappy\Core\Filesystem\SplResourceInfo;
use KNPLabs\Snappy\Core\Stream\FileStream;
use Psr\Http\Message\StreamFactoryInterface;
use Psr\Http\Message\StreamInterface;

final class DOMDocumentToPdf implements Adapter\DOMDocumentToPdf
{
public function __construct(private readonly Adapter $adapter, private readonly StreamFactoryInterface $streamFactory)
{
}

public function withOptions(Options|callable $options): static
{
return new self(
$this->adapter->withOptions($options),
$this->streamFactory,
);
}

public function generateFromDOMDocument(DOMDocument $document): StreamInterface
{
if ($this->adapter instanceof Adapter\DOMDocumentToPdf) {
return $this->adapter->generateFromDOMDocument($document);
}

$html = $document->saveHTML();

if (false === $html) {
throw new \Exception();
}

if ($this->adapter instanceof Adapter\HtmlToPdf) {
return $this->adapter->generateFromHtml($html);
}

if ($this->adapter instanceof Adapter\StreamToPdf) {
return $this->adapter->generateFromStream(
$this->streamFactory->createStream($html)
);
}

if ($this->adapter instanceof Adapter\HtmlFileToPdf) {
$file = SplResourceInfo::fromTmpFile();

fwrite($file->resource, $html);

return $this->adapter->generateFromHtmlFile($file);
}

throw new \Exception();
}
}
64 changes: 64 additions & 0 deletions src/Core/Frontend/HtmlFileToPdf.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
<?php

declare(strict_types=1);

namespace KNPLabs\Snappy\Core\Frontend;

use DOMDocument;
use KNPLabs\Snappy\Core\Backend\Adapter;
use KNPLabs\Snappy\Core\Backend\Options;
use KNPLabs\Snappy\Core\Stream\FileStream;
use Psr\Http\Message\StreamFactoryInterface;
use Psr\Http\Message\StreamInterface;
use SplFileInfo;

final class HtmlFileToPdf implements Adapter\HtmlFileToPdf
{
public function __construct(private readonly Adapter $adapter, private readonly StreamFactoryInterface $streamFactory)
{

}

public function withOptions(Options|callable $options): static
{
return new self(
$this->adapter->withOptions($options),
$this->streamFactory
);
}

public function generateFromHtmlFile(SplFileInfo $file): StreamInterface
{
if ($this->adapter instanceof Adapter\HtmlFileToPdf) {
return $this->adapter->generateFromHtmlFile($file);
}

if ($this->adapter instanceof Adapter\StreamToPdf) {
return $this->adapter->generateFromStream(
new FileStream(
$file,
$this->streamFactory->createStreamFromFile($file->getPathname()),
),
);
}

if ($this->adapter instanceof Adapter\HtmlToPdf) {
$html = file_get_contents($file->getPathname());

if (false === $html) {
throw new \Exception("Unable to read content of {$file->getPathname()}.");
}

return $this->adapter->generateFromHtml($html);
}

if ($this->adapter instanceof Adapter\DOMDocumentToPdf) {
$document = new \DOMDocument();
$document->loadHTMLFile($file->getPathname());

return $this->adapter->generateFromDOMDocument($document);
}

throw new \Exception();
}
}
60 changes: 60 additions & 0 deletions src/Core/Frontend/HtmlToPdf.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
<?php

declare(strict_types=1);

namespace KNPLabs\Snappy\Core\Frontend;

use DOMDocument;
use KNPLabs\Snappy\Core\Backend\Adapter;
use KNPLabs\Snappy\Core\Backend\Options;
use KNPLabs\Snappy\Core\Filesystem\SplResourceInfo;
use KNPLabs\Snappy\Core\Stream\FileStream;
use Psr\Http\Message\StreamFactoryInterface;
use Psr\Http\Message\StreamInterface;

final class HtmlToPdf implements Adapter\HtmlToPdf
{
public function __construct(private readonly Adapter $adapter, private readonly StreamFactoryInterface $streamFactory)
{

}

public function withOptions(Options|callable $options): static
{
return new self(
$this->adapter->withOptions($options),
$this->streamFactory
);
}

public function generateFromHtml(string $html): StreamInterface
{
if ($this->adapter instanceof Adapter\HtmlToPdf) {
return $this->adapter->generateFromHtml($html);
}

if ($this->adapter instanceof Adapter\DOMDocumentToPdf) {
$document = new \DOMDocument();
$document->loadHTML($html);

return $this->adapter->generateFromDOMDocument($document);
}

if ($this->adapter instanceof Adapter\StreamToPdf) {
return $this->adapter->generateFromStream(
$this->streamFactory->createStream($html),
);
}

if ($this->adapter instanceof Adapter\HtmlFileToPdf) {
$file = SplResourceInfo::fromTmpFile();

fwrite($file->resource, $html);

return $this->adapter->generateFromHtmlFile($file);
}

throw new \Exception();
}

}
64 changes: 64 additions & 0 deletions src/Core/Frontend/StreamToPdf.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
<?php

declare(strict_types=1);

namespace KNPLabs\Snappy\Core\Frontend;

use DOMDocument;
use KNPLabs\Snappy\Core\Backend\Adapter;
use KNPLabs\Snappy\Core\Backend\Options;
use KNPLabs\Snappy\Core\Filesystem\SplResourceInfo;
use KNPLabs\Snappy\Core\Stream\FileStream;
use Psr\Http\Message\StreamFactoryInterface;
use Psr\Http\Message\StreamInterface;
use SplFileInfo;

final class StreamToPdf implements Adapter\StreamToPdf
{
public function __construct(private readonly Adapter $adapter, private readonly StreamFactoryInterface $streamFactory)
{

}

public function withOptions(Options|callable $options): static
{
return new self(
$this->adapter->withOptions($options),
$this->streamFactory
);
}

public function generateFromStream(StreamInterface $stream): StreamInterface
{
if ($this->adapter instanceof Adapter\StreamToPdf) {
return $this->adapter->generateFromStream($stream);
}

if ($this->adapter instanceof Adapter\HtmlToPdf) {
return $this->adapter->generateFromHtml((string) $stream);
}

if ($this->adapter instanceof Adapter\HtmlFileToPdf) {
$file = SplResourceInfo::fromTmpFile();

$input = $stream->detach();

if (null === $input) {
throw new \Exception('Unable to get resource from stream.');
}

stream_copy_to_stream($input, $file->resource);

return $this->adapter->generateFromHtmlFile($file);
}

if ($this->adapter instanceof Adapter\DOMDocumentToPdf) {
$document = new \DOMDocument();
$document->loadHTML((string) $stream);

return $this->adapter->generateFromDOMDocument($document);
}

throw new \Exception();
}
}
Loading

0 comments on commit 6c64dfe

Please sign in to comment.