mirror of
https://github.com/erusev/parsedown.git
synced 2023-08-10 21:13:06 +03:00
Implement Image
This commit is contained in:
parent
dad0088adb
commit
5e8905c455
81
src/Components/Inlines/Image.php
Normal file
81
src/Components/Inlines/Image.php
Normal file
@ -0,0 +1,81 @@
|
||||
<?php
|
||||
|
||||
namespace Erusev\Parsedown\Components\Inlines;
|
||||
|
||||
use Erusev\Parsedown\AST\Handler;
|
||||
use Erusev\Parsedown\AST\StateRenderable;
|
||||
use Erusev\Parsedown\Components\Inline;
|
||||
use Erusev\Parsedown\Configurables\SafeMode;
|
||||
use Erusev\Parsedown\Html\Renderables\Element;
|
||||
use Erusev\Parsedown\Html\Renderables\Text;
|
||||
use Erusev\Parsedown\Parsedown;
|
||||
use Erusev\Parsedown\Parsing\Excerpt;
|
||||
use Erusev\Parsedown\State;
|
||||
|
||||
/** @psalm-type _Metadata=array{href: string, title?: string} */
|
||||
final class Image implements Inline
|
||||
{
|
||||
use WidthTrait, DefaultBeginPosition;
|
||||
|
||||
/** @var Link */
|
||||
private $Link;
|
||||
|
||||
/**
|
||||
* @param Link $Link
|
||||
*/
|
||||
public function __construct(Link $Link)
|
||||
{
|
||||
$this->Link = $Link;
|
||||
$this->width = $Link->width() + 1;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param Excerpt $Excerpt
|
||||
* @param State $State
|
||||
* @return static|null
|
||||
*/
|
||||
public static function build(Excerpt $Excerpt, State $State)
|
||||
{
|
||||
if (\substr($Excerpt->text(), 0, 1) !== '!') {
|
||||
return null;
|
||||
}
|
||||
|
||||
$Excerpt = $Excerpt->addingToOffset(1);
|
||||
|
||||
$Link = Link::build($Excerpt, $State);
|
||||
|
||||
if (! isset($Link)) {
|
||||
return null;
|
||||
}
|
||||
|
||||
return new self($Link);
|
||||
}
|
||||
|
||||
/**
|
||||
* @return Handler<Element|Text>
|
||||
*/
|
||||
public function stateRenderable(Parsedown $Parsedown)
|
||||
{
|
||||
return new Handler(
|
||||
/** @return Element|Text */
|
||||
function (State $State) use ($Parsedown) {
|
||||
$linkAttributes = $this->Link->attributes();
|
||||
|
||||
$attributes = [
|
||||
'src' => $linkAttributes['href'],
|
||||
'alt' => $this->Link->label(),
|
||||
];
|
||||
|
||||
if (isset($linkAttributes['title'])) {
|
||||
$attributes['title'] = $linkAttributes['title'];
|
||||
}
|
||||
|
||||
if ($State->getOrDefault(SafeMode::class)->enabled()) {
|
||||
$attributes['src'] = Element::filterUnsafeUrl($attributes['src']);
|
||||
}
|
||||
|
||||
return Element::selfClosing('img', $attributes);
|
||||
}
|
||||
);
|
||||
}
|
||||
}
|
@ -411,39 +411,6 @@ class Parsedown
|
||||
return $Elements;
|
||||
}
|
||||
|
||||
protected function inlineImage($Excerpt)
|
||||
{
|
||||
if (! isset($Excerpt['text'][1]) or $Excerpt['text'][1] !== '[') {
|
||||
return;
|
||||
}
|
||||
|
||||
$Excerpt['text']= \substr($Excerpt['text'], 1);
|
||||
|
||||
$Link = $this->inlineLink($Excerpt);
|
||||
|
||||
if ($Link === null) {
|
||||
return;
|
||||
}
|
||||
|
||||
$Inline = [
|
||||
'extent' => $Link['extent'] + 1,
|
||||
'element' => [
|
||||
'name' => 'img',
|
||||
'attributes' => [
|
||||
'src' => $Link['element']['attributes']['href'],
|
||||
'alt' => $Link['element']['handler']['argument'],
|
||||
],
|
||||
'autobreak' => true,
|
||||
],
|
||||
];
|
||||
|
||||
$Inline['element']['attributes'] += $Link['element']['attributes'];
|
||||
|
||||
unset($Inline['element']['attributes']['href']);
|
||||
|
||||
return $Inline;
|
||||
}
|
||||
|
||||
protected function inlineMarkup($Excerpt)
|
||||
{
|
||||
if ($this->markupEscaped or $this->safeMode or \strpos($Excerpt['text'], '>') === false) {
|
||||
|
Loading…
Reference in New Issue
Block a user