mirror of
https://github.com/erusev/parsedown.git
synced 2024-09-19 19:41:29 +02:00
Update Parsedown.php
This commit is contained in:
parent
26cfde9dbf
commit
93ca341f46
307
Parsedown.php
307
Parsedown.php
@ -1,4 +1,5 @@
|
|||||||
<?php
|
<?php
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
#
|
#
|
||||||
#
|
#
|
||||||
@ -21,7 +22,7 @@ class Parsedown
|
|||||||
|
|
||||||
# ~
|
# ~
|
||||||
|
|
||||||
function text($text)
|
function text(string $text) : string
|
||||||
{
|
{
|
||||||
$Elements = $this->textElements($text);
|
$Elements = $this->textElements($text);
|
||||||
|
|
||||||
@ -34,7 +35,7 @@ class Parsedown
|
|||||||
return $markup;
|
return $markup;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected function textElements($text)
|
protected function textElements(string $text) : array
|
||||||
{
|
{
|
||||||
# make sure no definitions are set
|
# make sure no definitions are set
|
||||||
$this->DefinitionData = array();
|
$this->DefinitionData = array();
|
||||||
@ -56,52 +57,53 @@ class Parsedown
|
|||||||
# Setters
|
# Setters
|
||||||
#
|
#
|
||||||
|
|
||||||
function setBreaksEnabled($breaksEnabled)
|
function setBreaksEnabled(bool $breaksEnabled) : Parsedown
|
||||||
{
|
{
|
||||||
$this->breaksEnabled = $breaksEnabled;
|
$this->breaksEnabled = $breaksEnabled;
|
||||||
|
|
||||||
return $this;
|
return $this;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected $breaksEnabled;
|
protected bool $breaksEnabled = false;
|
||||||
|
|
||||||
function setMarkupEscaped($markupEscaped)
|
function setMarkupEscaped(bool $markupEscaped) : Parsedown
|
||||||
{
|
{
|
||||||
$this->markupEscaped = $markupEscaped;
|
$this->markupEscaped = $markupEscaped;
|
||||||
|
|
||||||
return $this;
|
return $this;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected $markupEscaped;
|
protected bool $markupEscaped = false;
|
||||||
|
|
||||||
function setUrlsLinked($urlsLinked)
|
function setUrlsLinked(bool $urlsLinked) : Parsedown
|
||||||
{
|
{
|
||||||
$this->urlsLinked = $urlsLinked;
|
$this->urlsLinked = $urlsLinked;
|
||||||
|
|
||||||
return $this;
|
return $this;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected $urlsLinked = true;
|
protected bool $urlsLinked = true;
|
||||||
|
|
||||||
function setSafeMode($safeMode)
|
function setSafeMode(bool $safeMode) : Parsedown
|
||||||
{
|
{
|
||||||
$this->safeMode = (bool) $safeMode;
|
$this->safeMode = $safeMode;
|
||||||
|
|
||||||
return $this;
|
return $this;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected $safeMode;
|
protected bool $safeMode = false;
|
||||||
|
|
||||||
function setStrictMode($strictMode)
|
function setStrictMode(bool $strictMode) : Parsedown
|
||||||
{
|
{
|
||||||
$this->strictMode = (bool) $strictMode;
|
$this->strictMode = $strictMode;
|
||||||
|
|
||||||
return $this;
|
return $this;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected $strictMode;
|
protected bool $strictMode = false;
|
||||||
|
|
||||||
protected $safeLinksWhitelist = array(
|
/** @var string[] */
|
||||||
|
protected array $safeLinksWhitelist = array(
|
||||||
'http://',
|
'http://',
|
||||||
'https://',
|
'https://',
|
||||||
'ftp://',
|
'ftp://',
|
||||||
@ -123,7 +125,8 @@ class Parsedown
|
|||||||
# Lines
|
# Lines
|
||||||
#
|
#
|
||||||
|
|
||||||
protected $BlockTypes = array(
|
/** @var string[][] */
|
||||||
|
protected array $BlockTypes = array(
|
||||||
'#' => array('Header'),
|
'#' => array('Header'),
|
||||||
'*' => array('Rule', 'List'),
|
'*' => array('Rule', 'List'),
|
||||||
'+' => array('List'),
|
'+' => array('List'),
|
||||||
@ -151,7 +154,8 @@ class Parsedown
|
|||||||
|
|
||||||
# ~
|
# ~
|
||||||
|
|
||||||
protected $unmarkedBlockTypes = array(
|
/** @var string[] */
|
||||||
|
protected array $unmarkedBlockTypes = array(
|
||||||
'Code',
|
'Code',
|
||||||
);
|
);
|
||||||
|
|
||||||
@ -159,19 +163,19 @@ class Parsedown
|
|||||||
# Blocks
|
# Blocks
|
||||||
#
|
#
|
||||||
|
|
||||||
protected function lines(array $lines)
|
protected function lines(array $lines) : string
|
||||||
{
|
{
|
||||||
return $this->elements($this->linesElements($lines));
|
return $this->elements($this->linesElements($lines));
|
||||||
}
|
}
|
||||||
|
|
||||||
protected function linesElements(array $lines)
|
protected function linesElements(array $lines) : array
|
||||||
{
|
{
|
||||||
$Elements = array();
|
$Elements = array();
|
||||||
$CurrentBlock = null;
|
$CurrentBlock = null;
|
||||||
|
|
||||||
foreach ($lines as $line)
|
foreach ($lines as $line)
|
||||||
{
|
{
|
||||||
if (chop($line) === '')
|
if (rtrim($line) === '')
|
||||||
{
|
{
|
||||||
if (isset($CurrentBlock))
|
if (isset($CurrentBlock))
|
||||||
{
|
{
|
||||||
@ -316,7 +320,7 @@ class Parsedown
|
|||||||
return $Elements;
|
return $Elements;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected function extractElement(array $Component)
|
protected function extractElement(array $Component) : array
|
||||||
{
|
{
|
||||||
if ( ! isset($Component['element']))
|
if ( ! isset($Component['element']))
|
||||||
{
|
{
|
||||||
@ -333,12 +337,12 @@ class Parsedown
|
|||||||
return $Component['element'];
|
return $Component['element'];
|
||||||
}
|
}
|
||||||
|
|
||||||
protected function isBlockContinuable($Type)
|
protected function isBlockContinuable(string $Type) : bool
|
||||||
{
|
{
|
||||||
return method_exists($this, 'block' . $Type . 'Continue');
|
return method_exists($this, 'block' . $Type . 'Continue');
|
||||||
}
|
}
|
||||||
|
|
||||||
protected function isBlockCompletable($Type)
|
protected function isBlockCompletable(string $Type) : bool
|
||||||
{
|
{
|
||||||
return method_exists($this, 'block' . $Type . 'Complete');
|
return method_exists($this, 'block' . $Type . 'Complete');
|
||||||
}
|
}
|
||||||
@ -346,11 +350,11 @@ class Parsedown
|
|||||||
#
|
#
|
||||||
# Code
|
# Code
|
||||||
|
|
||||||
protected function blockCode($Line, $Block = null)
|
protected function blockCode(array $Line, ?array $Block = null) : ?array
|
||||||
{
|
{
|
||||||
if (isset($Block) and $Block['type'] === 'Paragraph' and ! isset($Block['interrupted']))
|
if (isset($Block) and $Block['type'] === 'Paragraph' and ! isset($Block['interrupted']))
|
||||||
{
|
{
|
||||||
return;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($Line['indent'] >= 4)
|
if ($Line['indent'] >= 4)
|
||||||
@ -369,9 +373,11 @@ class Parsedown
|
|||||||
|
|
||||||
return $Block;
|
return $Block;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected function blockCodeContinue($Line, $Block)
|
protected function blockCodeContinue(array $Line, array $Block) : ?array
|
||||||
{
|
{
|
||||||
if ($Line['indent'] >= 4)
|
if ($Line['indent'] >= 4)
|
||||||
{
|
{
|
||||||
@ -390,9 +396,11 @@ class Parsedown
|
|||||||
|
|
||||||
return $Block;
|
return $Block;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected function blockCodeComplete($Block)
|
protected function blockCodeComplete(array $Block) : array
|
||||||
{
|
{
|
||||||
return $Block;
|
return $Block;
|
||||||
}
|
}
|
||||||
@ -400,11 +408,11 @@ class Parsedown
|
|||||||
#
|
#
|
||||||
# Comment
|
# Comment
|
||||||
|
|
||||||
protected function blockComment($Line)
|
protected function blockComment(array $Line) : ?array
|
||||||
{
|
{
|
||||||
if ($this->markupEscaped or $this->safeMode)
|
if ($this->markupEscaped or $this->safeMode)
|
||||||
{
|
{
|
||||||
return;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (strpos($Line['text'], '<!--') === 0)
|
if (strpos($Line['text'], '<!--') === 0)
|
||||||
@ -423,13 +431,15 @@ class Parsedown
|
|||||||
|
|
||||||
return $Block;
|
return $Block;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected function blockCommentContinue($Line, array $Block)
|
protected function blockCommentContinue(array $Line, array $Block) : ?array
|
||||||
{
|
{
|
||||||
if (isset($Block['closed']))
|
if (isset($Block['closed']))
|
||||||
{
|
{
|
||||||
return;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
$Block['element']['rawHtml'] .= "\n" . $Line['body'];
|
$Block['element']['rawHtml'] .= "\n" . $Line['body'];
|
||||||
@ -445,7 +455,7 @@ class Parsedown
|
|||||||
#
|
#
|
||||||
# Fenced Code
|
# Fenced Code
|
||||||
|
|
||||||
protected function blockFencedCode($Line)
|
protected function blockFencedCode(array $Line) : ?array
|
||||||
{
|
{
|
||||||
$marker = $Line['text'][0];
|
$marker = $Line['text'][0];
|
||||||
|
|
||||||
@ -453,14 +463,14 @@ class Parsedown
|
|||||||
|
|
||||||
if ($openerLength < 3)
|
if ($openerLength < 3)
|
||||||
{
|
{
|
||||||
return;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
$infostring = trim(substr($Line['text'], $openerLength), "\t ");
|
$infostring = trim(substr($Line['text'], $openerLength), "\t ");
|
||||||
|
|
||||||
if (strpos($infostring, '`') !== false)
|
if (strpos($infostring, '`') !== false)
|
||||||
{
|
{
|
||||||
return;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
$Element = array(
|
$Element = array(
|
||||||
@ -499,11 +509,11 @@ class Parsedown
|
|||||||
return $Block;
|
return $Block;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected function blockFencedCodeContinue($Line, $Block)
|
protected function blockFencedCodeContinue(array $Line, array $Block) : ?array
|
||||||
{
|
{
|
||||||
if (isset($Block['complete']))
|
if (isset($Block['complete']))
|
||||||
{
|
{
|
||||||
return;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (isset($Block['interrupted']))
|
if (isset($Block['interrupted']))
|
||||||
@ -514,7 +524,7 @@ class Parsedown
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (($len = strspn($Line['text'], $Block['char'])) >= $Block['openerLength']
|
if (($len = strspn($Line['text'], $Block['char'])) >= $Block['openerLength']
|
||||||
and chop(substr($Line['text'], $len), ' ') === ''
|
and rtrim(substr($Line['text'], $len), ' ') === ''
|
||||||
) {
|
) {
|
||||||
$Block['element']['element']['text'] = substr($Block['element']['element']['text'], 1);
|
$Block['element']['element']['text'] = substr($Block['element']['element']['text'], 1);
|
||||||
|
|
||||||
@ -528,7 +538,7 @@ class Parsedown
|
|||||||
return $Block;
|
return $Block;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected function blockFencedCodeComplete($Block)
|
protected function blockFencedCodeComplete(array $Block) : array
|
||||||
{
|
{
|
||||||
return $Block;
|
return $Block;
|
||||||
}
|
}
|
||||||
@ -536,20 +546,20 @@ class Parsedown
|
|||||||
#
|
#
|
||||||
# Header
|
# Header
|
||||||
|
|
||||||
protected function blockHeader($Line)
|
protected function blockHeader(array $Line) : ?array
|
||||||
{
|
{
|
||||||
$level = strspn($Line['text'], '#');
|
$level = strspn($Line['text'], '#');
|
||||||
|
|
||||||
if ($level > 6)
|
if ($level > 6)
|
||||||
{
|
{
|
||||||
return;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
$text = trim($Line['text'], '#');
|
$text = trim($Line['text'], '#');
|
||||||
|
|
||||||
if ($this->strictMode and isset($text[0]) and $text[0] !== ' ')
|
if ($this->strictMode and isset($text[0]) and $text[0] !== ' ')
|
||||||
{
|
{
|
||||||
return;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
$text = trim($text, ' ');
|
$text = trim($text, ' ');
|
||||||
@ -571,7 +581,7 @@ class Parsedown
|
|||||||
#
|
#
|
||||||
# List
|
# List
|
||||||
|
|
||||||
protected function blockList($Line, ?array $CurrentBlock = null)
|
protected function blockList(array $Line, ?array $CurrentBlock = null) : ?array
|
||||||
{
|
{
|
||||||
list($name, $pattern) = $Line['text'][0] <= '-' ? array('ul', '[*+-]') : array('ol', '[0-9]{1,9}+[.\)]');
|
list($name, $pattern) = $Line['text'][0] <= '-' ? array('ul', '[*+-]') : array('ol', '[0-9]{1,9}+[.\)]');
|
||||||
|
|
||||||
@ -618,7 +628,7 @@ class Parsedown
|
|||||||
and $CurrentBlock['type'] === 'Paragraph'
|
and $CurrentBlock['type'] === 'Paragraph'
|
||||||
and ! isset($CurrentBlock['interrupted'])
|
and ! isset($CurrentBlock['interrupted'])
|
||||||
) {
|
) {
|
||||||
return;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
$Block['element']['attributes'] = array('start' => $listStart);
|
$Block['element']['attributes'] = array('start' => $listStart);
|
||||||
@ -638,9 +648,11 @@ class Parsedown
|
|||||||
|
|
||||||
return $Block;
|
return $Block;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected function blockListContinue($Line, array $Block)
|
protected function blockListContinue(array $Line, array $Block) : ?array
|
||||||
{
|
{
|
||||||
if (isset($Block['interrupted']) and empty($Block['li']['handler']['argument']))
|
if (isset($Block['interrupted']) and empty($Block['li']['handler']['argument']))
|
||||||
{
|
{
|
||||||
@ -671,7 +683,7 @@ class Parsedown
|
|||||||
|
|
||||||
unset($Block['li']);
|
unset($Block['li']);
|
||||||
|
|
||||||
$text = isset($matches[1]) ? $matches[1] : '';
|
$text = isset($matches) && isset($matches[1]) ? $matches[1] : '';
|
||||||
|
|
||||||
$Block['indent'] = $Line['indent'];
|
$Block['indent'] = $Line['indent'];
|
||||||
|
|
||||||
@ -724,9 +736,11 @@ class Parsedown
|
|||||||
|
|
||||||
return $Block;
|
return $Block;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected function blockListComplete(array $Block)
|
protected function blockListComplete(array $Block) : array
|
||||||
{
|
{
|
||||||
if (isset($Block['loose']))
|
if (isset($Block['loose']))
|
||||||
{
|
{
|
||||||
@ -745,7 +759,7 @@ class Parsedown
|
|||||||
#
|
#
|
||||||
# Quote
|
# Quote
|
||||||
|
|
||||||
protected function blockQuote($Line)
|
protected function blockQuote(array $Line) : ?array
|
||||||
{
|
{
|
||||||
if (preg_match('/^>[ ]?+(.*+)/', $Line['text'], $matches))
|
if (preg_match('/^>[ ]?+(.*+)/', $Line['text'], $matches))
|
||||||
{
|
{
|
||||||
@ -762,13 +776,15 @@ class Parsedown
|
|||||||
|
|
||||||
return $Block;
|
return $Block;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected function blockQuoteContinue($Line, array $Block)
|
protected function blockQuoteContinue(array $Line, array $Block) : ?array
|
||||||
{
|
{
|
||||||
if (isset($Block['interrupted']))
|
if (isset($Block['interrupted']))
|
||||||
{
|
{
|
||||||
return;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($Line['text'][0] === '>' and preg_match('/^>[ ]?+(.*+)/', $Line['text'], $matches))
|
if ($Line['text'][0] === '>' and preg_match('/^>[ ]?+(.*+)/', $Line['text'], $matches))
|
||||||
@ -778,22 +794,19 @@ class Parsedown
|
|||||||
return $Block;
|
return $Block;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( ! isset($Block['interrupted']))
|
$Block['element']['handler']['argument'] []= $Line['text'];
|
||||||
{
|
|
||||||
$Block['element']['handler']['argument'] []= $Line['text'];
|
|
||||||
|
|
||||||
return $Block;
|
return $Block;
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#
|
#
|
||||||
# Rule
|
# Rule
|
||||||
|
|
||||||
protected function blockRule($Line)
|
protected function blockRule(array $Line) : ?array
|
||||||
{
|
{
|
||||||
$marker = $Line['text'][0];
|
$marker = $Line['text'][0];
|
||||||
|
|
||||||
if (substr_count($Line['text'], $marker) >= 3 and chop($Line['text'], " $marker") === '')
|
if (substr_count($Line['text'], $marker) >= 3 and rtrim($Line['text'], " $marker") === '')
|
||||||
{
|
{
|
||||||
$Block = array(
|
$Block = array(
|
||||||
'element' => array(
|
'element' => array(
|
||||||
@ -803,43 +816,47 @@ class Parsedown
|
|||||||
|
|
||||||
return $Block;
|
return $Block;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
#
|
#
|
||||||
# Setext
|
# Setext
|
||||||
|
|
||||||
protected function blockSetextHeader($Line, ?array $Block = null)
|
protected function blockSetextHeader(array $Line, ?array $Block = null) : ?array
|
||||||
{
|
{
|
||||||
if ( ! isset($Block) or $Block['type'] !== 'Paragraph' or isset($Block['interrupted']))
|
if ( ! isset($Block) or $Block['type'] !== 'Paragraph' or isset($Block['interrupted']))
|
||||||
{
|
{
|
||||||
return;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($Line['indent'] < 4 and chop(chop($Line['text'], ' '), $Line['text'][0]) === '')
|
if ($Line['indent'] < 4 and rtrim(rtrim($Line['text'], ' '), $Line['text'][0]) === '')
|
||||||
{
|
{
|
||||||
$Block['element']['name'] = $Line['text'][0] === '=' ? 'h1' : 'h2';
|
$Block['element']['name'] = $Line['text'][0] === '=' ? 'h1' : 'h2';
|
||||||
|
|
||||||
return $Block;
|
return $Block;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
#
|
#
|
||||||
# Markup
|
# Markup
|
||||||
|
|
||||||
protected function blockMarkup($Line)
|
protected function blockMarkup(array $Line) : ?array
|
||||||
{
|
{
|
||||||
if ($this->markupEscaped or $this->safeMode)
|
if ($this->markupEscaped or $this->safeMode)
|
||||||
{
|
{
|
||||||
return;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (preg_match('/^<[\/]?+(\w*)(?:[ ]*+'.$this->regexHtmlAttribute.')*+[ ]*+(\/)?>/', $Line['text'], $matches))
|
if (preg_match('/^<[\/]?+(\w*)(?:[ ]*+'.$this->regexHtmlAttribute.')*+[ ]*+(\/)?>/', $Line['text'], $matches))
|
||||||
{
|
{
|
||||||
$element = strtolower($matches[1]);
|
$element = strtolower($matches[1]);
|
||||||
|
|
||||||
if (in_array($element, $this->textLevelElements))
|
if (in_array($element, $this->textLevelElements, true))
|
||||||
{
|
{
|
||||||
return;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
$Block = array(
|
$Block = array(
|
||||||
@ -852,13 +869,15 @@ class Parsedown
|
|||||||
|
|
||||||
return $Block;
|
return $Block;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected function blockMarkupContinue($Line, array $Block)
|
protected function blockMarkupContinue(array $Line, array $Block) : ?array
|
||||||
{
|
{
|
||||||
if (isset($Block['closed']) or isset($Block['interrupted']))
|
if (isset($Block['closed']) or isset($Block['interrupted']))
|
||||||
{
|
{
|
||||||
return;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
$Block['element']['rawHtml'] .= "\n" . $Line['body'];
|
$Block['element']['rawHtml'] .= "\n" . $Line['body'];
|
||||||
@ -869,7 +888,7 @@ class Parsedown
|
|||||||
#
|
#
|
||||||
# Reference
|
# Reference
|
||||||
|
|
||||||
protected function blockReference($Line)
|
protected function blockReference(array $Line) : ?array
|
||||||
{
|
{
|
||||||
if (strpos($Line['text'], ']') !== false
|
if (strpos($Line['text'], ']') !== false
|
||||||
and preg_match('/^\[(.+?)\]:[ ]*+<?(\S+?)>?(?:[ ]+["\'(](.+)["\')])?[ ]*+$/', $Line['text'], $matches)
|
and preg_match('/^\[(.+?)\]:[ ]*+<?(\S+?)>?(?:[ ]+["\'(](.+)["\')])?[ ]*+$/', $Line['text'], $matches)
|
||||||
@ -889,16 +908,18 @@ class Parsedown
|
|||||||
|
|
||||||
return $Block;
|
return $Block;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
#
|
#
|
||||||
# Table
|
# Table
|
||||||
|
|
||||||
protected function blockTable($Line, ?array $Block = null)
|
protected function blockTable(array $Line, ?array $Block = null) : ?array
|
||||||
{
|
{
|
||||||
if ( ! isset($Block) or $Block['type'] !== 'Paragraph' or isset($Block['interrupted']))
|
if ( ! isset($Block) or $Block['type'] !== 'Paragraph' or isset($Block['interrupted']))
|
||||||
{
|
{
|
||||||
return;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (
|
if (
|
||||||
@ -907,12 +928,12 @@ class Parsedown
|
|||||||
and strpos($Line['text'], ':') === false
|
and strpos($Line['text'], ':') === false
|
||||||
or strpos($Block['element']['handler']['argument'], "\n") !== false
|
or strpos($Block['element']['handler']['argument'], "\n") !== false
|
||||||
) {
|
) {
|
||||||
return;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (chop($Line['text'], ' -:|') !== '')
|
if (rtrim($Line['text'], ' -:|') !== '')
|
||||||
{
|
{
|
||||||
return;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
$alignments = array();
|
$alignments = array();
|
||||||
@ -930,7 +951,7 @@ class Parsedown
|
|||||||
|
|
||||||
if ($dividerCell === '')
|
if ($dividerCell === '')
|
||||||
{
|
{
|
||||||
return;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
$alignment = null;
|
$alignment = null;
|
||||||
@ -961,7 +982,7 @@ class Parsedown
|
|||||||
|
|
||||||
if (count($headerCells) !== count($alignments))
|
if (count($headerCells) !== count($alignments))
|
||||||
{
|
{
|
||||||
return;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
foreach ($headerCells as $index => $headerCell)
|
foreach ($headerCells as $index => $headerCell)
|
||||||
@ -1017,11 +1038,11 @@ class Parsedown
|
|||||||
return $Block;
|
return $Block;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected function blockTableContinue($Line, array $Block)
|
protected function blockTableContinue(array $Line, array $Block) : ?array
|
||||||
{
|
{
|
||||||
if (isset($Block['interrupted']))
|
if (isset($Block['interrupted']))
|
||||||
{
|
{
|
||||||
return;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (count($Block['alignments']) === 1 or $Line['text'][0] === '|' or strpos($Line['text'], '|'))
|
if (count($Block['alignments']) === 1 or $Line['text'][0] === '|' or strpos($Line['text'], '|'))
|
||||||
@ -1069,13 +1090,15 @@ class Parsedown
|
|||||||
|
|
||||||
return $Block;
|
return $Block;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
#
|
#
|
||||||
# ~
|
# ~
|
||||||
#
|
#
|
||||||
|
|
||||||
protected function paragraph($Line)
|
protected function paragraph(array $Line) : array
|
||||||
{
|
{
|
||||||
return array(
|
return array(
|
||||||
'type' => 'Paragraph',
|
'type' => 'Paragraph',
|
||||||
@ -1090,11 +1113,11 @@ class Parsedown
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected function paragraphContinue($Line, array $Block)
|
protected function paragraphContinue(array $Line, array $Block) : ?array
|
||||||
{
|
{
|
||||||
if (isset($Block['interrupted']))
|
if (isset($Block['interrupted']))
|
||||||
{
|
{
|
||||||
return;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
$Block['element']['handler']['argument'] .= "\n".$Line['text'];
|
$Block['element']['handler']['argument'] .= "\n".$Line['text'];
|
||||||
@ -1106,7 +1129,8 @@ class Parsedown
|
|||||||
# Inline Elements
|
# Inline Elements
|
||||||
#
|
#
|
||||||
|
|
||||||
protected $InlineTypes = array(
|
/** @var string[][] */
|
||||||
|
protected array $InlineTypes = array(
|
||||||
'!' => array('Image'),
|
'!' => array('Image'),
|
||||||
'&' => array('SpecialCharacter'),
|
'&' => array('SpecialCharacter'),
|
||||||
'*' => array('Emphasis'),
|
'*' => array('Emphasis'),
|
||||||
@ -1121,18 +1145,18 @@ class Parsedown
|
|||||||
|
|
||||||
# ~
|
# ~
|
||||||
|
|
||||||
protected $inlineMarkerList = '!*_&[:<`~\\';
|
protected string $inlineMarkerList = '!*_&[:<`~\\';
|
||||||
|
|
||||||
#
|
#
|
||||||
# ~
|
# ~
|
||||||
#
|
#
|
||||||
|
|
||||||
public function line($text, $nonNestables = array())
|
public function line(string $text, array $nonNestables = array()) : string
|
||||||
{
|
{
|
||||||
return $this->elements($this->lineElements($text, $nonNestables));
|
return $this->elements($this->lineElements($text, $nonNestables));
|
||||||
}
|
}
|
||||||
|
|
||||||
protected function lineElements($text, $nonNestables = array())
|
protected function lineElements(string $text, array $nonNestables = array()) : array
|
||||||
{
|
{
|
||||||
# standardize line breaks
|
# standardize line breaks
|
||||||
$text = str_replace(array("\r\n", "\r"), "\n", $text);
|
$text = str_replace(array("\r\n", "\r"), "\n", $text);
|
||||||
@ -1236,7 +1260,7 @@ class Parsedown
|
|||||||
# ~
|
# ~
|
||||||
#
|
#
|
||||||
|
|
||||||
protected function inlineText($text)
|
protected function inlineText(string $text) : array
|
||||||
{
|
{
|
||||||
$Inline = array(
|
$Inline = array(
|
||||||
'extent' => strlen($text),
|
'extent' => strlen($text),
|
||||||
@ -1255,7 +1279,7 @@ class Parsedown
|
|||||||
return $Inline;
|
return $Inline;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected function inlineCode($Excerpt)
|
protected function inlineCode(array $Excerpt) : ?array
|
||||||
{
|
{
|
||||||
$marker = $Excerpt['text'][0];
|
$marker = $Excerpt['text'][0];
|
||||||
|
|
||||||
@ -1272,9 +1296,11 @@ class Parsedown
|
|||||||
),
|
),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected function inlineEmailTag($Excerpt)
|
protected function inlineEmailTag(array $Excerpt) : ?array
|
||||||
{
|
{
|
||||||
$hostnameLabel = '[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?';
|
$hostnameLabel = '[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?';
|
||||||
|
|
||||||
@ -1302,13 +1328,15 @@ class Parsedown
|
|||||||
),
|
),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected function inlineEmphasis($Excerpt)
|
protected function inlineEmphasis(array $Excerpt) : ?array
|
||||||
{
|
{
|
||||||
if ( ! isset($Excerpt['text'][1]))
|
if ( ! isset($Excerpt['text'][1]))
|
||||||
{
|
{
|
||||||
return;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
$marker = $Excerpt['text'][0];
|
$marker = $Excerpt['text'][0];
|
||||||
@ -1323,7 +1351,7 @@ class Parsedown
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
return;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
return array(
|
return array(
|
||||||
@ -1339,22 +1367,24 @@ class Parsedown
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected function inlineEscapeSequence($Excerpt)
|
protected function inlineEscapeSequence(array $Excerpt) : ?array
|
||||||
{
|
{
|
||||||
if (isset($Excerpt['text'][1]) and in_array($Excerpt['text'][1], $this->specialCharacters))
|
if (isset($Excerpt['text'][1]) and in_array($Excerpt['text'][1], $this->specialCharacters, true))
|
||||||
{
|
{
|
||||||
return array(
|
return array(
|
||||||
'element' => array('rawHtml' => $Excerpt['text'][1]),
|
'element' => array('rawHtml' => $Excerpt['text'][1]),
|
||||||
'extent' => 2,
|
'extent' => 2,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected function inlineImage($Excerpt)
|
protected function inlineImage(array $Excerpt) : ?array
|
||||||
{
|
{
|
||||||
if ( ! isset($Excerpt['text'][1]) or $Excerpt['text'][1] !== '[')
|
if ( ! isset($Excerpt['text'][1]) or $Excerpt['text'][1] !== '[')
|
||||||
{
|
{
|
||||||
return;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
$Excerpt['text']= substr($Excerpt['text'], 1);
|
$Excerpt['text']= substr($Excerpt['text'], 1);
|
||||||
@ -1363,7 +1393,7 @@ class Parsedown
|
|||||||
|
|
||||||
if ($Link === null)
|
if ($Link === null)
|
||||||
{
|
{
|
||||||
return;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
$Inline = array(
|
$Inline = array(
|
||||||
@ -1385,7 +1415,7 @@ class Parsedown
|
|||||||
return $Inline;
|
return $Inline;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected function inlineLink($Excerpt)
|
protected function inlineLink(array $Excerpt) : ?array
|
||||||
{
|
{
|
||||||
$Element = array(
|
$Element = array(
|
||||||
'name' => 'a',
|
'name' => 'a',
|
||||||
@ -1415,7 +1445,7 @@ class Parsedown
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
return;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (preg_match('/^[(]\s*+((?:[^ ()]++|[(][^ )]+[)])++)(?:[ ]+("[^"]*+"|\'[^\']*+\'))?\s*+[)]/', $remainder, $matches))
|
if (preg_match('/^[(]\s*+((?:[^ ()]++|[(][^ )]+[)])++)(?:[ ]+("[^"]*+"|\'[^\']*+\'))?\s*+[)]/', $remainder, $matches))
|
||||||
@ -1445,7 +1475,7 @@ class Parsedown
|
|||||||
|
|
||||||
if ( ! isset($this->DefinitionData['Reference'][$definition]))
|
if ( ! isset($this->DefinitionData['Reference'][$definition]))
|
||||||
{
|
{
|
||||||
return;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
$Definition = $this->DefinitionData['Reference'][$definition];
|
$Definition = $this->DefinitionData['Reference'][$definition];
|
||||||
@ -1460,11 +1490,11 @@ class Parsedown
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected function inlineMarkup($Excerpt)
|
protected function inlineMarkup(array $Excerpt) : ?array
|
||||||
{
|
{
|
||||||
if ($this->markupEscaped or $this->safeMode or strpos($Excerpt['text'], '>') === false)
|
if ($this->markupEscaped or $this->safeMode or strpos($Excerpt['text'], '>') === false)
|
||||||
{
|
{
|
||||||
return;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($Excerpt['text'][1] === '/' and preg_match('/^<\/\w[\w-]*+[ ]*+>/s', $Excerpt['text'], $matches))
|
if ($Excerpt['text'][1] === '/' and preg_match('/^<\/\w[\w-]*+[ ]*+>/s', $Excerpt['text'], $matches))
|
||||||
@ -1490,9 +1520,11 @@ class Parsedown
|
|||||||
'extent' => strlen($matches[0]),
|
'extent' => strlen($matches[0]),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected function inlineSpecialCharacter($Excerpt)
|
protected function inlineSpecialCharacter(array $Excerpt) : ?array
|
||||||
{
|
{
|
||||||
if (substr($Excerpt['text'], 1, 1) !== ' ' and strpos($Excerpt['text'], ';') !== false
|
if (substr($Excerpt['text'], 1, 1) !== ' ' and strpos($Excerpt['text'], ';') !== false
|
||||||
and preg_match('/^&(#?+[0-9a-zA-Z]++);/', $Excerpt['text'], $matches)
|
and preg_match('/^&(#?+[0-9a-zA-Z]++);/', $Excerpt['text'], $matches)
|
||||||
@ -1503,14 +1535,14 @@ class Parsedown
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
return;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected function inlineStrikethrough($Excerpt)
|
protected function inlineStrikethrough(array $Excerpt) : ?array
|
||||||
{
|
{
|
||||||
if ( ! isset($Excerpt['text'][1]))
|
if ( ! isset($Excerpt['text'][1]))
|
||||||
{
|
{
|
||||||
return;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($Excerpt['text'][1] === '~' and preg_match('/^~~(?=\S)(.+?)(?<=\S)~~/', $Excerpt['text'], $matches))
|
if ($Excerpt['text'][1] === '~' and preg_match('/^~~(?=\S)(.+?)(?<=\S)~~/', $Excerpt['text'], $matches))
|
||||||
@ -1527,13 +1559,15 @@ class Parsedown
|
|||||||
),
|
),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected function inlineUrl($Excerpt)
|
protected function inlineUrl(array $Excerpt) : ?array
|
||||||
{
|
{
|
||||||
if ($this->urlsLinked !== true or ! isset($Excerpt['text'][2]) or $Excerpt['text'][2] !== '/')
|
if ($this->urlsLinked !== true or ! isset($Excerpt['text'][2]) or $Excerpt['text'][2] !== '/')
|
||||||
{
|
{
|
||||||
return;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (strpos($Excerpt['context'], 'http') !== false
|
if (strpos($Excerpt['context'], 'http') !== false
|
||||||
@ -1555,9 +1589,11 @@ class Parsedown
|
|||||||
|
|
||||||
return $Inline;
|
return $Inline;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected function inlineUrlTag($Excerpt)
|
protected function inlineUrlTag(array $Excerpt) : ?array
|
||||||
{
|
{
|
||||||
if (strpos($Excerpt['text'], '>') !== false and preg_match('/^<(\w++:\/{2}[^ >]++)>/i', $Excerpt['text'], $matches))
|
if (strpos($Excerpt['text'], '>') !== false and preg_match('/^<(\w++:\/{2}[^ >]++)>/i', $Excerpt['text'], $matches))
|
||||||
{
|
{
|
||||||
@ -1574,11 +1610,12 @@ class Parsedown
|
|||||||
),
|
),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
# ~
|
# ~
|
||||||
|
|
||||||
protected function unmarkedText($text)
|
protected function unmarkedText(string $text) : string
|
||||||
{
|
{
|
||||||
$Inline = $this->inlineText($text);
|
$Inline = $this->inlineText($text);
|
||||||
return $this->element($Inline['element']);
|
return $this->element($Inline['element']);
|
||||||
@ -1588,7 +1625,7 @@ class Parsedown
|
|||||||
# Handlers
|
# Handlers
|
||||||
#
|
#
|
||||||
|
|
||||||
protected function handle(array $Element)
|
protected function handle(array $Element) : array
|
||||||
{
|
{
|
||||||
if (isset($Element['handler']))
|
if (isset($Element['handler']))
|
||||||
{
|
{
|
||||||
@ -1624,17 +1661,17 @@ class Parsedown
|
|||||||
return $Element;
|
return $Element;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected function handleElementRecursive(array $Element)
|
protected function handleElementRecursive(array $Element) :array
|
||||||
{
|
{
|
||||||
return $this->elementApplyRecursive(array($this, 'handle'), $Element);
|
return $this->elementApplyRecursive(array($this, 'handle'), $Element);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected function handleElementsRecursive(array $Elements)
|
protected function handleElementsRecursive(array $Elements) :array
|
||||||
{
|
{
|
||||||
return $this->elementsApplyRecursive(array($this, 'handle'), $Elements);
|
return $this->elementsApplyRecursive(array($this, 'handle'), $Elements);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected function elementApplyRecursive($closure, array $Element)
|
protected function elementApplyRecursive(callable $closure, array $Element) :array
|
||||||
{
|
{
|
||||||
$Element = call_user_func($closure, $Element);
|
$Element = call_user_func($closure, $Element);
|
||||||
|
|
||||||
@ -1650,7 +1687,7 @@ class Parsedown
|
|||||||
return $Element;
|
return $Element;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected function elementApplyRecursiveDepthFirst($closure, array $Element)
|
protected function elementApplyRecursiveDepthFirst(callable $closure, array $Element) : array
|
||||||
{
|
{
|
||||||
if (isset($Element['elements']))
|
if (isset($Element['elements']))
|
||||||
{
|
{
|
||||||
@ -1666,7 +1703,7 @@ class Parsedown
|
|||||||
return $Element;
|
return $Element;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected function elementsApplyRecursive($closure, array $Elements)
|
protected function elementsApplyRecursive(callable $closure, array $Elements) : array
|
||||||
{
|
{
|
||||||
foreach ($Elements as &$Element)
|
foreach ($Elements as &$Element)
|
||||||
{
|
{
|
||||||
@ -1676,7 +1713,7 @@ class Parsedown
|
|||||||
return $Elements;
|
return $Elements;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected function elementsApplyRecursiveDepthFirst($closure, array $Elements)
|
protected function elementsApplyRecursiveDepthFirst(callable $closure, array $Elements) : array
|
||||||
{
|
{
|
||||||
foreach ($Elements as &$Element)
|
foreach ($Elements as &$Element)
|
||||||
{
|
{
|
||||||
@ -1686,7 +1723,7 @@ class Parsedown
|
|||||||
return $Elements;
|
return $Elements;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected function element(array $Element)
|
protected function element(array $Element) : string
|
||||||
{
|
{
|
||||||
if ($this->safeMode)
|
if ($this->safeMode)
|
||||||
{
|
{
|
||||||
@ -1713,11 +1750,12 @@ class Parsedown
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
$markup .= " $name=\"".self::escape($value).'"';
|
$markup .= " $name=\"".self::escape((string)$value).'"';
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$text = null;
|
||||||
$permitRawHtml = false;
|
$permitRawHtml = false;
|
||||||
|
|
||||||
if (isset($Element['text']))
|
if (isset($Element['text']))
|
||||||
@ -1734,7 +1772,7 @@ class Parsedown
|
|||||||
$permitRawHtml = !$this->safeMode || $allowRawHtmlInSafeMode;
|
$permitRawHtml = !$this->safeMode || $allowRawHtmlInSafeMode;
|
||||||
}
|
}
|
||||||
|
|
||||||
$hasContent = isset($text) || isset($Element['element']) || isset($Element['elements']);
|
$hasContent = $text !== null || isset($Element['element']) || isset($Element['elements']);
|
||||||
|
|
||||||
if ($hasContent)
|
if ($hasContent)
|
||||||
{
|
{
|
||||||
@ -1770,7 +1808,7 @@ class Parsedown
|
|||||||
return $markup;
|
return $markup;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected function elements(array $Elements)
|
protected function elements(array $Elements) : string
|
||||||
{
|
{
|
||||||
$markup = '';
|
$markup = '';
|
||||||
|
|
||||||
@ -1800,11 +1838,11 @@ class Parsedown
|
|||||||
|
|
||||||
# ~
|
# ~
|
||||||
|
|
||||||
protected function li($lines)
|
protected function li(array $lines) : array
|
||||||
{
|
{
|
||||||
$Elements = $this->linesElements($lines);
|
$Elements = $this->linesElements($lines);
|
||||||
|
|
||||||
if ( ! in_array('', $lines)
|
if ( ! in_array('', $lines, true)
|
||||||
and isset($Elements[0]) and isset($Elements[0]['name'])
|
and isset($Elements[0]) and isset($Elements[0]['name'])
|
||||||
and $Elements[0]['name'] === 'p'
|
and $Elements[0]['name'] === 'p'
|
||||||
) {
|
) {
|
||||||
@ -1822,7 +1860,7 @@ class Parsedown
|
|||||||
* Replace occurrences $regexp with $Elements in $text. Return an array of
|
* Replace occurrences $regexp with $Elements in $text. Return an array of
|
||||||
* elements representing the replacement.
|
* elements representing the replacement.
|
||||||
*/
|
*/
|
||||||
protected static function pregReplaceElements($regexp, $Elements, $text)
|
protected static function pregReplaceElements(string $regexp, array $Elements, string $text) : array
|
||||||
{
|
{
|
||||||
$newElements = array();
|
$newElements = array();
|
||||||
|
|
||||||
@ -1851,14 +1889,14 @@ class Parsedown
|
|||||||
# Deprecated Methods
|
# Deprecated Methods
|
||||||
#
|
#
|
||||||
|
|
||||||
function parse($text)
|
function parse(string $text) : string
|
||||||
{
|
{
|
||||||
$markup = $this->text($text);
|
$markup = $this->text($text);
|
||||||
|
|
||||||
return $markup;
|
return $markup;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected function sanitiseElement(array $Element)
|
protected function sanitiseElement(array $Element) : array
|
||||||
{
|
{
|
||||||
static $goodAttribute = '/^[a-zA-Z0-9][a-zA-Z0-9-_]*+$/';
|
static $goodAttribute = '/^[a-zA-Z0-9][a-zA-Z0-9-_]*+$/';
|
||||||
static $safeUrlNameToAtt = array(
|
static $safeUrlNameToAtt = array(
|
||||||
@ -1897,7 +1935,7 @@ class Parsedown
|
|||||||
return $Element;
|
return $Element;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected function filterUnsafeUrlInAttribute(array $Element, $attribute)
|
protected function filterUnsafeUrlInAttribute(array $Element, string $attribute) : array
|
||||||
{
|
{
|
||||||
foreach ($this->safeLinksWhitelist as $scheme)
|
foreach ($this->safeLinksWhitelist as $scheme)
|
||||||
{
|
{
|
||||||
@ -1916,12 +1954,12 @@ class Parsedown
|
|||||||
# Static Methods
|
# Static Methods
|
||||||
#
|
#
|
||||||
|
|
||||||
protected static function escape($text, $allowQuotes = false)
|
protected static function escape(string $text, bool $allowQuotes = false) : string
|
||||||
{
|
{
|
||||||
return htmlspecialchars($text, $allowQuotes ? ENT_NOQUOTES : ENT_QUOTES, 'UTF-8');
|
return htmlspecialchars($text, $allowQuotes ? ENT_NOQUOTES : ENT_QUOTES, 'UTF-8');
|
||||||
}
|
}
|
||||||
|
|
||||||
protected static function striAtStart($string, $needle)
|
protected static function striAtStart(string $string, string $needle) : bool
|
||||||
{
|
{
|
||||||
$len = strlen($needle);
|
$len = strlen($needle);
|
||||||
|
|
||||||
@ -1955,32 +1993,37 @@ class Parsedown
|
|||||||
# Fields
|
# Fields
|
||||||
#
|
#
|
||||||
|
|
||||||
protected $DefinitionData;
|
protected array $DefinitionData = [];
|
||||||
|
|
||||||
#
|
#
|
||||||
# Read-Only
|
# Read-Only
|
||||||
|
|
||||||
protected $specialCharacters = array(
|
/** @var string[] */
|
||||||
|
protected array $specialCharacters = array(
|
||||||
'\\', '`', '*', '_', '{', '}', '[', ']', '(', ')', '>', '#', '+', '-', '.', '!', '|', '~'
|
'\\', '`', '*', '_', '{', '}', '[', ']', '(', ')', '>', '#', '+', '-', '.', '!', '|', '~'
|
||||||
);
|
);
|
||||||
|
|
||||||
protected $StrongRegex = array(
|
/** @var array<string, string> */
|
||||||
|
protected array $StrongRegex = array(
|
||||||
'*' => '/^[*]{2}((?:\\\\\*|[^*]|[*][^*]*+[*])+?)[*]{2}(?![*])/s',
|
'*' => '/^[*]{2}((?:\\\\\*|[^*]|[*][^*]*+[*])+?)[*]{2}(?![*])/s',
|
||||||
'_' => '/^__((?:\\\\_|[^_]|_[^_]*+_)+?)__(?!_)/us',
|
'_' => '/^__((?:\\\\_|[^_]|_[^_]*+_)+?)__(?!_)/us',
|
||||||
);
|
);
|
||||||
|
|
||||||
protected $EmRegex = array(
|
/** @var array<string, string> */
|
||||||
|
protected array $EmRegex = array(
|
||||||
'*' => '/^[*]((?:\\\\\*|[^*]|[*][*][^*]+?[*][*])+?)[*](?![*])/s',
|
'*' => '/^[*]((?:\\\\\*|[^*]|[*][*][^*]+?[*][*])+?)[*](?![*])/s',
|
||||||
'_' => '/^_((?:\\\\_|[^_]|__[^_]*__)+?)_(?!_)\b/us',
|
'_' => '/^_((?:\\\\_|[^_]|__[^_]*__)+?)_(?!_)\b/us',
|
||||||
);
|
);
|
||||||
|
|
||||||
protected $regexHtmlAttribute = '[a-zA-Z_:][\w:.-]*+(?:\s*+=\s*+(?:[^"\'=<>`\s]+|"[^"]*+"|\'[^\']*+\'))?+';
|
protected string $regexHtmlAttribute = '[a-zA-Z_:][\w:.-]*+(?:\s*+=\s*+(?:[^"\'=<>`\s]+|"[^"]*+"|\'[^\']*+\'))?+';
|
||||||
|
|
||||||
protected $voidElements = array(
|
/** @var string[] */
|
||||||
|
protected array $voidElements = array(
|
||||||
'area', 'base', 'br', 'col', 'command', 'embed', 'hr', 'img', 'input', 'link', 'meta', 'param', 'source',
|
'area', 'base', 'br', 'col', 'command', 'embed', 'hr', 'img', 'input', 'link', 'meta', 'param', 'source',
|
||||||
);
|
);
|
||||||
|
|
||||||
protected $textLevelElements = array(
|
/** @var string[] */
|
||||||
|
protected array $textLevelElements = array(
|
||||||
'a', 'br', 'bdo', 'abbr', 'blink', 'nextid', 'acronym', 'basefont',
|
'a', 'br', 'bdo', 'abbr', 'blink', 'nextid', 'acronym', 'basefont',
|
||||||
'b', 'em', 'big', 'cite', 'small', 'spacer', 'listing',
|
'b', 'em', 'big', 'cite', 'small', 'spacer', 'listing',
|
||||||
'i', 'rp', 'del', 'code', 'strike', 'marquee',
|
'i', 'rp', 'del', 'code', 'strike', 'marquee',
|
||||||
|
Loading…
Reference in New Issue
Block a user