AbstractStringContainer.php 0000644 00000002127 15152100357 0012053 0 ustar 00 <?php
declare(strict_types=1);
/*
* This file is part of the league/commonmark package.
*
* (c) Colin O'Dell <colinodell@gmail.com>
*
* Original code based on the CommonMark JS reference parser (https://bitly.com/commonmark-js)
* - (c) John MacFarlane
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace League\CommonMark\Node\Inline;
use League\CommonMark\Node\StringContainerInterface;
abstract class AbstractStringContainer extends AbstractInline implements StringContainerInterface
{
protected string $literal = '';
/**
* @param array<string, mixed> $data
*/
public function __construct(string $contents = '', array $data = [])
{
parent::__construct();
$this->literal = $contents;
if (\count($data) > 0) {
$this->data->import($data);
}
}
public function getLiteral(): string
{
return $this->literal;
}
public function setLiteral(string $literal): void
{
$this->literal = $literal;
}
}
Newline.php 0000644 00000001641 15152100357 0006657 0 ustar 00 <?php
declare(strict_types=1);
/*
* This file is part of the league/commonmark package.
*
* (c) Colin O'Dell <colinodell@gmail.com>
*
* Original code based on the CommonMark JS reference parser (https://bitly.com/commonmark-js)
* - (c) John MacFarlane
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace League\CommonMark\Node\Inline;
final class Newline extends AbstractInline
{
// Any changes to these constants should be reflected in .phpstorm.meta.php
public const HARDBREAK = 0;
public const SOFTBREAK = 1;
/** @psalm-readonly */
private int $type;
public function __construct(int $breakType = self::HARDBREAK)
{
parent::__construct();
$this->type = $breakType;
}
/** @psalm-immutable */
public function getType(): int
{
return $this->type;
}
}
DelimitedInterface.php 0000644 00000000702 15152100357 0010774 0 ustar 00 <?php
declare(strict_types=1);
/*
* This file is part of the league/commonmark package.
*
* (c) Colin O'Dell <colinodell@gmail.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace League\CommonMark\Node\Inline;
interface DelimitedInterface
{
public function getOpeningDelimiter(): string;
public function getClosingDelimiter(): string;
}
AbstractInline.php 0000644 00000001007 15152100357 0010154 0 ustar 00 <?php
declare(strict_types=1);
/*
* This file is part of the league/commonmark package.
*
* (c) Colin O'Dell <colinodell@gmail.com>
*
* Original code based on the CommonMark JS reference parser (https://bitly.com/commonmark-js)
* - (c) John MacFarlane
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace League\CommonMark\Node\Inline;
use League\CommonMark\Node\Node;
abstract class AbstractInline extends Node
{
}
Text.php 0000644 00000001115 15152100357 0006176 0 ustar 00 <?php
declare(strict_types=1);
/*
* This file is part of the league/commonmark package.
*
* (c) Colin O'Dell <colinodell@gmail.com>
*
* Original code based on the CommonMark JS reference parser (https://bitly.com/commonmark-js)
* - (c) John MacFarlane
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace League\CommonMark\Node\Inline;
final class Text extends AbstractStringContainer
{
public function append(string $literal): void
{
$this->literal .= $literal;
}
}
AdjacentTextMerger.php 0000644 00000005604 15152100357 0011001 0 ustar 00 <?php
declare(strict_types=1);
/*
* This file is part of the league/commonmark package.
*
* (c) Colin O'Dell <colinodell@gmail.com>
*
* Additional emphasis processing code based on commonmark-java (https://github.com/atlassian/commonmark-java)
* - (c) Atlassian Pty Ltd
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace League\CommonMark\Node\Inline;
use League\CommonMark\Node\Node;
/**
* @internal
*/
final class AdjacentTextMerger
{
public static function mergeChildNodes(Node $node): void
{
// No children or just one child node, no need for merging
if ($node->firstChild() === $node->lastChild() || $node->firstChild() === null || $node->lastChild() === null) {
return;
}
/** @psalm-suppress PossiblyNullArgument */
self::mergeTextNodesInclusive($node->firstChild(), $node->lastChild());
}
public static function mergeTextNodesBetweenExclusive(Node $fromNode, Node $toNode): void
{
// No nodes between them
if ($fromNode === $toNode || $fromNode->next() === $toNode || $fromNode->next() === null || $toNode->previous() === null) {
return;
}
/** @psalm-suppress PossiblyNullArgument */
self::mergeTextNodesInclusive($fromNode->next(), $toNode->previous());
}
public static function mergeWithDirectlyAdjacentNodes(Text $node): void
{
$start = ($previous = $node->previous()) instanceof Text ? $previous : $node;
$end = ($next = $node->next()) instanceof Text ? $next : $node;
self::mergeIfNeeded($start, $end);
}
private static function mergeTextNodesInclusive(Node $fromNode, Node $toNode): void
{
$first = null;
$last = null;
$node = $fromNode;
while ($node !== null) {
if ($node instanceof Text) {
if ($first === null) {
$first = $node;
}
$last = $node;
} else {
self::mergeIfNeeded($first, $last);
$first = null;
$last = null;
}
if ($node === $toNode) {
break;
}
$node = $node->next();
}
self::mergeIfNeeded($first, $last);
}
private static function mergeIfNeeded(?Text $first, ?Text $last): void
{
if ($first === null || $last === null || $first === $last) {
// No merging needed
return;
}
$s = $first->getLiteral();
$node = $first->next();
$stop = $last->next();
while ($node !== $stop && $node instanceof Text) {
$s .= $node->getLiteral();
$unlink = $node;
$node = $node->next();
$unlink->detach();
}
$first->setLiteral($s);
}
}
TextRenderer.php 0000644 00000002473 15152100553 0007673 0 ustar 00 <?php
declare(strict_types=1);
/*
* This file is part of the league/commonmark package.
*
* (c) Colin O'Dell <colinodell@gmail.com>
*
* Original code based on the CommonMark JS reference parser (https://bitly.com/commonmark-js)
* - (c) John MacFarlane
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace League\CommonMark\Renderer\Inline;
use League\CommonMark\Node\Inline\Text;
use League\CommonMark\Node\Node;
use League\CommonMark\Renderer\ChildNodeRendererInterface;
use League\CommonMark\Renderer\NodeRendererInterface;
use League\CommonMark\Util\Xml;
use League\CommonMark\Xml\XmlNodeRendererInterface;
final class TextRenderer implements NodeRendererInterface, XmlNodeRendererInterface
{
/**
* @param Text $node
*
* {@inheritDoc}
*
* @psalm-suppress MoreSpecificImplementedParamType
*/
public function render(Node $node, ChildNodeRendererInterface $childRenderer): string
{
Text::assertInstanceOf($node);
return Xml::escape($node->getLiteral());
}
public function getXmlTagName(Node $node): string
{
return 'text';
}
/**
* {@inheritDoc}
*/
public function getXmlAttributes(Node $node): array
{
return [];
}
}
NewlineRenderer.php 0000644 00000003734 15152100553 0010351 0 ustar 00 <?php
declare(strict_types=1);
/*
* This file is part of the league/commonmark package.
*
* (c) Colin O'Dell <colinodell@gmail.com>
*
* Original code based on the CommonMark JS reference parser (https://bitly.com/commonmark-js)
* - (c) John MacFarlane
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace League\CommonMark\Renderer\Inline;
use League\CommonMark\Node\Inline\Newline;
use League\CommonMark\Node\Node;
use League\CommonMark\Renderer\ChildNodeRendererInterface;
use League\CommonMark\Renderer\NodeRendererInterface;
use League\CommonMark\Xml\XmlNodeRendererInterface;
use League\Config\ConfigurationAwareInterface;
use League\Config\ConfigurationInterface;
final class NewlineRenderer implements NodeRendererInterface, XmlNodeRendererInterface, ConfigurationAwareInterface
{
/** @psalm-readonly-allow-private-mutation */
private ConfigurationInterface $config;
public function setConfiguration(ConfigurationInterface $configuration): void
{
$this->config = $configuration;
}
/**
* @param Newline $node
*
* {@inheritDoc}
*
* @psalm-suppress MoreSpecificImplementedParamType
*/
public function render(Node $node, ChildNodeRendererInterface $childRenderer): string
{
Newline::assertInstanceOf($node);
if ($node->getType() === Newline::HARDBREAK) {
return "<br />\n";
}
return $this->config->get('renderer/soft_break');
}
/**
* @param Newline $node
*
* {@inheritDoc}
*
* @psalm-suppress MoreSpecificImplementedParamType
*/
public function getXmlTagName(Node $node): string
{
Newline::assertInstanceOf($node);
return $node->getType() === Newline::SOFTBREAK ? 'softbreak' : 'linebreak';
}
/**
* {@inheritDoc}
*/
public function getXmlAttributes(Node $node): array
{
return [];
}
}