CommonMark Markdown Встроенный парсер всегда возвращает внутри тега `& lt; p & gt;`

я использую лигу Пакет CommonMark, и создать собственное расширение, чтобы показать <img> тег с использованием пользовательского тега уценки, как это @image(image_id),

В уценке есть: @image(image_id)

Результат, который я ожидал:

<figure>
<img src="image_url" alt="image_alt"></img>
</figure>

Вот код, который я пробовал:ImageParser.php

<?php

namespace App\Markdown\Extensions\Image;

use League\CommonMark\Inline\Element\HtmlInline;
use League\CommonMark\Inline\Parser\AbstractInlineParser;
use League\CommonMark\InlineParserContext;
use App\Storage\Image;

class ImageParser extends AbstractInlineParser
{

/**
* @return string[]
*/
public function getCharacters()
{
return ['@'];
}

/**
* @param InlineParserContext $inlineContext
*
* @return bool
*/
public function parse(InlineParserContext $inlineContext)
{
$cursor = $inlineContext->getCursor();

$previous = $cursor->peek(-1);
if ($previous !== null && $previous !== ' ') {
return false;
}

$previousState = $cursor->saveState();
$cursor->advance();

$handle = $cursor->match('/image\((\d+)\)/');
if (empty($handle)) {
$cursor->restoreState($previousState);

return false;
}

$imageId = preg_replace("/image\((\d+)\)/", "$1", $handle);
$image = Image::find($imageId);

if (is_null($image)) {
return false;
}

$inlineContext->getContainer()->appendChild(new HtmlInline($this->render($image)));

return true;
}

/**
* Render the image figure.
*
* @param \PYM\Storage\Image $image
*
* @return string
*/
protected function render(Image $image)
{
$source = empty($image->source) ? null : "<figcaption>{$image->source}</figcaption>";

return '<figure><img src="' . $image->getUrl('wide') . '" alt="' . $image->alt_tag . '">' . $source . '</figure>';
}
}

Тестовый код: ImageExtensionText.php

<?php

namespace Tests\Unit\Markdown;

use Tests\TestCase;

class ImageExtensionTest extends TestCase
{
/** @test */
public function converts_to_a_image_tag()
{
$image = factoryImage();

$string = \Markdown::convertToHtml("First paragraph

@image({$image->id})

Last paragraph");

dd($string);
$expected = '<img src="'.$image->getUrl('wide').'" alt="'.$image->alt_tag.'">';

$this->assertEquals($string, $expected);
}
}

а вот и результат по тестированию:
введите описание изображения здесь

в тестовом файле @image(image_id) всегда возвращайся внутрь <p></p> тег, это не результат, который я ожидал.

1

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector