Create single-page HTML output, prepares the terrain for PDF/ePub output
This commit is contained in:
82
libs/Format/Base/EmbedImages.php
Normal file
82
libs/Format/Base/EmbedImages.php
Normal file
@ -0,0 +1,82 @@
|
||||
<?php
|
||||
/**
|
||||
* Created by IntelliJ IDEA.
|
||||
* User: onigoetz
|
||||
* Date: 06/11/15
|
||||
* Time: 20:27
|
||||
*/
|
||||
|
||||
namespace Todaymade\Daux\Format\Base;
|
||||
|
||||
use DOMDocument;
|
||||
use Todaymade\Daux\DauxHelper;
|
||||
use Todaymade\Daux\Tree\Content;
|
||||
use Todaymade\Daux\Tree\Root;
|
||||
|
||||
class EmbedImages
|
||||
{
|
||||
|
||||
protected $tree;
|
||||
|
||||
public function __construct(Root $tree)
|
||||
{
|
||||
$this->tree = $tree;
|
||||
}
|
||||
|
||||
public function embed($page, Content $file, $callback)
|
||||
{
|
||||
return preg_replace_callback(
|
||||
"/<img\\s+[^>]*src=['\"]([^\"]*)['\"][^>]*>/",
|
||||
function ($matches) use ($file, $callback) {
|
||||
|
||||
if ($result = $this->findImage($matches[1], $matches[0], $file, $callback)) {
|
||||
return $result;
|
||||
}
|
||||
|
||||
return $matches[0];
|
||||
},
|
||||
$page
|
||||
);
|
||||
}
|
||||
|
||||
private function getAttributes($tag)
|
||||
{
|
||||
$dom = new DOMDocument();
|
||||
$dom->loadHTML($tag);
|
||||
|
||||
$img = $dom->getElementsByTagName('img')->item(0);
|
||||
|
||||
$attributes = ['align', 'class', 'title', 'style', 'alt', 'height', 'width'];
|
||||
$used = [];
|
||||
foreach ($attributes as $attr) {
|
||||
if ($img->attributes->getNamedItem($attr)) {
|
||||
$used[$attr] = $img->attributes->getNamedItem($attr)->value;
|
||||
}
|
||||
}
|
||||
|
||||
return $used;
|
||||
}
|
||||
|
||||
private function findImage($src, $tag, Content $file, $callback)
|
||||
{
|
||||
//for protocol relative or http requests : keep the original one
|
||||
if (substr($src, 0, strlen("http")) === "http" || substr($src, 0, strlen("//")) === "//") {
|
||||
return $src;
|
||||
}
|
||||
|
||||
//Get the path to the file, relative to the root of the documentation
|
||||
$url = DauxHelper::getCleanPath(dirname($file->getUrl()) . '/' . $src);
|
||||
|
||||
//Get any file corresponding to the right one
|
||||
$file = DauxHelper::getFile($this->tree, $url);
|
||||
|
||||
|
||||
if ($file === false) {
|
||||
return false;
|
||||
}
|
||||
|
||||
$result = $callback($src, $this->getAttributes($tag), $file);
|
||||
|
||||
return $result ?: $src;
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user