diff --git a/.php_cs.dist b/.php_cs.dist new file mode 100644 index 0000000..9184af0 --- /dev/null +++ b/.php_cs.dist @@ -0,0 +1,34 @@ +in(__DIR__ . '/src/') + ->in(__DIR__ . '/tests/') +; +$rules = [ + '@PSR2' => true, + 'array_syntax' => [ + 'syntax' => 'short', + ], + 'braces' => [ + 'allow_single_line_closure' => true, + ], + 'native_constant_invocation' => [ + 'fix_built_in' => true, + ], + 'native_function_invocation' => [ + 'include' => ['@all'], + ], + 'no_unused_imports' => true, + 'ordered_imports' => [ + 'sort_algorithm' => 'alpha', + ], + 'strict_comparison' => true, + 'strict_param' => true, +]; +return Config::create() + ->setRules($rules) + ->setFinder($finder) + ->setUsingCache(false) + ->setRiskyAllowed(true) +; \ No newline at end of file diff --git a/composer.json b/composer.json index 301a6f6..f59e7b7 100644 --- a/composer.json +++ b/composer.json @@ -17,7 +17,8 @@ "ext-mbstring": "*" }, "require-dev": { - "phpunit/phpunit": "^4.8.35" + "phpunit/phpunit": "^4.8.35", + "friendsofphp/php-cs-fixer": "^2.13" }, "autoload": { "psr-4": {"Erusev\\Parsedown\\": "src/"} diff --git a/src/Html/Renderable.php b/src/Html/Renderable.php index 033e878..d51c554 100644 --- a/src/Html/Renderable.php +++ b/src/Html/Renderable.php @@ -1,4 +1,4 @@ -textElements($text); @@ -31,7 +31,7 @@ class Parsedown $markup = $this->elements($Elements); # trim line breaks - $markup = trim($markup, "\n"); + $markup = \trim($markup, "\n"); return $markup; } @@ -39,16 +39,16 @@ class Parsedown protected function textElements($text) { # make sure no definitions are set - $this->DefinitionData = array(); + $this->DefinitionData = []; # standardize line breaks - $text = str_replace(array("\r\n", "\r"), "\n", $text); + $text = \str_replace(["\r\n", "\r"], "\n", $text); # remove surrounding line breaks - $text = trim($text, "\n"); + $text = \trim($text, "\n"); # split text into lines - $lines = explode("\n", $text); + $lines = \explode("\n", $text); # iterate through lines to identify blocks return $this->linesElements($lines); @@ -58,7 +58,7 @@ class Parsedown # Setters # - function setBreaksEnabled($breaksEnabled) + public function setBreaksEnabled($breaksEnabled) { $this->breaksEnabled = $breaksEnabled; @@ -67,7 +67,7 @@ class Parsedown protected $breaksEnabled; - function setMarkupEscaped($markupEscaped) + public function setMarkupEscaped($markupEscaped) { $this->markupEscaped = $markupEscaped; @@ -76,7 +76,7 @@ class Parsedown protected $markupEscaped; - function setUrlsLinked($urlsLinked) + public function setUrlsLinked($urlsLinked) { $this->urlsLinked = $urlsLinked; @@ -85,7 +85,7 @@ class Parsedown protected $urlsLinked = true; - function setSafeMode($safeMode) + public function setSafeMode($safeMode) { $this->safeMode = (bool) $safeMode; @@ -94,7 +94,7 @@ class Parsedown protected $safeMode; - function setStrictMode($strictMode) + public function setStrictMode($strictMode) { $this->strictMode = (bool) $strictMode; @@ -103,7 +103,7 @@ class Parsedown protected $strictMode; - protected $safeLinksWhitelist = array( + protected $safeLinksWhitelist = [ 'http://', 'https://', 'ftp://', @@ -119,43 +119,43 @@ class Parsedown 'ssh:', 'news:', 'steam:', - ); + ]; # # Lines # - protected $BlockTypes = array( - '#' => array('Header'), - '*' => array('Rule', 'List'), - '+' => array('List'), - '-' => array('SetextHeader', 'Table', 'Rule', 'List'), - '0' => array('List'), - '1' => array('List'), - '2' => array('List'), - '3' => array('List'), - '4' => array('List'), - '5' => array('List'), - '6' => array('List'), - '7' => array('List'), - '8' => array('List'), - '9' => array('List'), - ':' => array('Table'), - '<' => array('Comment', 'Markup'), - '=' => array('SetextHeader'), - '>' => array('Quote'), - '[' => array('Reference'), - '_' => array('Rule'), - '`' => array('FencedCode'), - '|' => array('Table'), - '~' => array('FencedCode'), - ); + protected $BlockTypes = [ + '#' => ['Header'], + '*' => ['Rule', 'List'], + '+' => ['List'], + '-' => ['SetextHeader', 'Table', 'Rule', 'List'], + '0' => ['List'], + '1' => ['List'], + '2' => ['List'], + '3' => ['List'], + '4' => ['List'], + '5' => ['List'], + '6' => ['List'], + '7' => ['List'], + '8' => ['List'], + '9' => ['List'], + ':' => ['Table'], + '<' => ['Comment', 'Markup'], + '=' => ['SetextHeader'], + '>' => ['Quote'], + '[' => ['Reference'], + '_' => ['Rule'], + '`' => ['FencedCode'], + '|' => ['Table'], + '~' => ['FencedCode'], + ]; # ~ - protected $unmarkedBlockTypes = array( + protected $unmarkedBlockTypes = [ 'Code', - ); + ]; # # Blocks @@ -168,16 +168,14 @@ class Parsedown protected function linesElements(array $lines) { - $Elements = array(); + $Elements = []; $CurrentBlock = null; - foreach ($lines as $line) - { - if (chop($line) === '') - { - if (isset($CurrentBlock)) - { - $CurrentBlock['interrupted'] = (isset($CurrentBlock['interrupted']) + foreach ($lines as $line) { + if (\chop($line) === '') { + if (isset($CurrentBlock)) { + $CurrentBlock['interrupted'] = ( + isset($CurrentBlock['interrupted']) ? $CurrentBlock['interrupted'] + 1 : 1 ); } @@ -185,41 +183,35 @@ class Parsedown continue; } - while (($beforeTab = strstr($line, "\t", true)) !== false) - { - $shortage = 4 - mb_strlen($beforeTab, 'utf-8') % 4; + while (($beforeTab = \strstr($line, "\t", true)) !== false) { + $shortage = 4 - \mb_strlen($beforeTab, 'utf-8') % 4; $line = $beforeTab - . str_repeat(' ', $shortage) - . substr($line, strlen($beforeTab) + 1) + . \str_repeat(' ', $shortage) + . \substr($line, \strlen($beforeTab) + 1) ; } - $indent = strspn($line, ' '); + $indent = \strspn($line, ' '); - $text = $indent > 0 ? substr($line, $indent) : $line; + $text = $indent > 0 ? \substr($line, $indent) : $line; # ~ - $Line = array('body' => $line, 'indent' => $indent, 'text' => $text); + $Line = ['body' => $line, 'indent' => $indent, 'text' => $text]; # ~ - if (isset($CurrentBlock['continuable'])) - { + if (isset($CurrentBlock['continuable'])) { $methodName = 'block' . $CurrentBlock['type'] . 'Continue'; $Block = $this->$methodName($Line, $CurrentBlock); - if (isset($Block)) - { + if (isset($Block)) { $CurrentBlock = $Block; continue; - } - else - { - if ($this->isBlockCompletable($CurrentBlock['type'])) - { + } else { + if ($this->isBlockCompletable($CurrentBlock['type'])) { $methodName = 'block' . $CurrentBlock['type'] . 'Complete'; $CurrentBlock = $this->$methodName($CurrentBlock); } @@ -234,10 +226,8 @@ class Parsedown $blockTypes = $this->unmarkedBlockTypes; - if (isset($this->BlockTypes[$marker])) - { - foreach ($this->BlockTypes[$marker] as $blockType) - { + if (isset($this->BlockTypes[$marker])) { + foreach ($this->BlockTypes[$marker] as $blockType) { $blockTypes []= $blockType; } } @@ -245,26 +235,21 @@ class Parsedown # # ~ - foreach ($blockTypes as $blockType) - { + foreach ($blockTypes as $blockType) { $Block = $this->{"block$blockType"}($Line, $CurrentBlock); - if (isset($Block)) - { + if (isset($Block)) { $Block['type'] = $blockType; - if ( ! isset($Block['identified'])) - { - if (isset($CurrentBlock)) - { + if (! isset($Block['identified'])) { + if (isset($CurrentBlock)) { $Elements[] = $this->extractElement($CurrentBlock); } $Block['identified'] = true; } - if ($this->isBlockContinuable($blockType)) - { + if ($this->isBlockContinuable($blockType)) { $Block['continuable'] = true; } @@ -276,19 +261,14 @@ class Parsedown # ~ - if (isset($CurrentBlock) and $CurrentBlock['type'] === 'Paragraph') - { + if (isset($CurrentBlock) and $CurrentBlock['type'] === 'Paragraph') { $Block = $this->paragraphContinue($Line, $CurrentBlock); } - if (isset($Block)) - { + if (isset($Block)) { $CurrentBlock = $Block; - } - else - { - if (isset($CurrentBlock)) - { + } else { + if (isset($CurrentBlock)) { $Elements[] = $this->extractElement($CurrentBlock); } @@ -300,16 +280,14 @@ class Parsedown # ~ - if (isset($CurrentBlock['continuable']) and $this->isBlockCompletable($CurrentBlock['type'])) - { + if (isset($CurrentBlock['continuable']) and $this->isBlockCompletable($CurrentBlock['type'])) { $methodName = 'block' . $CurrentBlock['type'] . 'Complete'; $CurrentBlock = $this->$methodName($CurrentBlock); } # ~ - if (isset($CurrentBlock)) - { + if (isset($CurrentBlock)) { $Elements[] = $this->extractElement($CurrentBlock); } @@ -320,15 +298,11 @@ class Parsedown protected function extractElement(array $Component) { - if ( ! isset($Component['element'])) - { - if (isset($Component['markup'])) - { - $Component['element'] = array('rawHtml' => $Component['markup']); - } - elseif (isset($Component['hidden'])) - { - $Component['element'] = array(); + if (! isset($Component['element'])) { + if (isset($Component['markup'])) { + $Component['element'] = ['rawHtml' => $Component['markup']]; + } elseif (isset($Component['hidden'])) { + $Component['element'] = []; } } @@ -337,12 +311,12 @@ class Parsedown protected function isBlockContinuable($Type) { - return method_exists($this, 'block' . $Type . 'Continue'); + return \method_exists($this, 'block' . $Type . 'Continue'); } protected function isBlockCompletable($Type) { - return method_exists($this, 'block' . $Type . 'Complete'); + return \method_exists($this, 'block' . $Type . 'Complete'); } # @@ -350,24 +324,22 @@ class Parsedown protected function blockCode($Line, $Block = null) { - if (isset($Block) and $Block['type'] === 'Paragraph' and ! isset($Block['interrupted'])) - { + if (isset($Block) and $Block['type'] === 'Paragraph' and ! isset($Block['interrupted'])) { return; } - if ($Line['indent'] >= 4) - { - $text = substr($Line['body'], 4); + if ($Line['indent'] >= 4) { + $text = \substr($Line['body'], 4); - $Block = array( - 'element' => array( + $Block = [ + 'element' => [ 'name' => 'pre', - 'element' => array( + 'element' => [ 'name' => 'code', 'text' => $text, - ), - ), - ); + ], + ], + ]; return $Block; } @@ -375,18 +347,16 @@ class Parsedown protected function blockCodeContinue($Line, $Block) { - if ($Line['indent'] >= 4) - { - if (isset($Block['interrupted'])) - { - $Block['element']['element']['text'] .= str_repeat("\n", $Block['interrupted']); + if ($Line['indent'] >= 4) { + if (isset($Block['interrupted'])) { + $Block['element']['element']['text'] .= \str_repeat("\n", $Block['interrupted']); unset($Block['interrupted']); } $Block['element']['element']['text'] .= "\n"; - $text = substr($Line['body'], 4); + $text = \substr($Line['body'], 4); $Block['element']['element']['text'] .= $text; @@ -404,22 +374,19 @@ class Parsedown protected function blockComment($Line) { - if ($this->markupEscaped or $this->safeMode) - { + if ($this->markupEscaped or $this->safeMode) { return; } - if (strpos($Line['text'], '') !== false) - { + if (\strpos($Line['text'], '-->') !== false) { $Block['closed'] = true; } @@ -429,15 +396,13 @@ class Parsedown protected function blockCommentContinue($Line, array $Block) { - if (isset($Block['closed'])) - { + if (isset($Block['closed'])) { return; } $Block['element']['rawHtml'] .= "\n" . $Line['body']; - if (strpos($Line['text'], '-->') !== false) - { + if (\strpos($Line['text'], '-->') !== false) { $Block['closed'] = true; } @@ -451,74 +416,55 @@ class Parsedown { $marker = $Line['text'][0]; - $openerLength = strspn($Line['text'], $marker); + $openerLength = \strspn($Line['text'], $marker); - if ($openerLength < 3) - { + if ($openerLength < 3) { return; } - $infostring = trim(substr($Line['text'], $openerLength), "\t "); + $infostring = \trim(\substr($Line['text'], $openerLength), "\t "); - if (strpos($infostring, '`') !== false) - { + if (\strpos($infostring, '`') !== false) { return; } - $Element = array( + $Element = [ 'name' => 'code', 'text' => '', - ); + ]; - if ($infostring !== '') - { - /** - * https://www.w3.org/TR/2011/WD-html5-20110525/elements.html#classes - * Every HTML element may have a class attribute specified. - * The attribute, if specified, must have a value that is a set - * of space-separated tokens representing the various classes - * that the element belongs to. - * [...] - * The space characters, for the purposes of this specification, - * are U+0020 SPACE, U+0009 CHARACTER TABULATION (tab), - * U+000A LINE FEED (LF), U+000C FORM FEED (FF), and - * U+000D CARRIAGE RETURN (CR). - */ - $language = substr($infostring, 0, strcspn($infostring, " \t\n\f\r")); - - $Element['attributes'] = array('class' => "language-$language"); + if ($infostring !== '') { + $Element['attributes'] = ['class' => "language-$infostring"]; } - $Block = array( + $Block = [ 'char' => $marker, 'openerLength' => $openerLength, - 'element' => array( + 'element' => [ 'name' => 'pre', 'element' => $Element, - ), - ); + ], + ]; return $Block; } protected function blockFencedCodeContinue($Line, $Block) { - if (isset($Block['complete'])) - { + if (isset($Block['complete'])) { return; } - if (isset($Block['interrupted'])) - { - $Block['element']['element']['text'] .= str_repeat("\n", $Block['interrupted']); + if (isset($Block['interrupted'])) { + $Block['element']['element']['text'] .= \str_repeat("\n", $Block['interrupted']); unset($Block['interrupted']); } - if (($len = strspn($Line['text'], $Block['char'])) >= $Block['openerLength'] - and chop(substr($Line['text'], $len), ' ') === '' + if (($len = \strspn($Line['text'], $Block['char'])) >= $Block['openerLength'] + and \chop(\substr($Line['text'], $len), ' ') === '' ) { - $Block['element']['element']['text'] = substr($Block['element']['element']['text'], 1); + $Block['element']['element']['text'] = \substr($Block['element']['element']['text'], 1); $Block['complete'] = true; @@ -540,32 +486,30 @@ class Parsedown protected function blockHeader($Line) { - $level = strspn($Line['text'], '#'); + $level = \strspn($Line['text'], '#'); - if ($level > 6) - { + if ($level > 6) { return; } - $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; } - $text = trim($text, ' '); + $text = \trim($text, ' '); - $Block = array( - 'element' => array( + $Block = [ + 'element' => [ 'name' => 'h' . $level, - 'handler' => array( + 'handler' => [ 'function' => 'lineElements', 'argument' => $text, 'destination' => 'elements', - ) - ), - ); + ] + ], + ]; return $Block; } @@ -575,46 +519,40 @@ class Parsedown protected function blockList($Line, array $CurrentBlock = null) { - list($name, $pattern) = $Line['text'][0] <= '-' ? array('ul', '[*+-]') : array('ol', '[0-9]{1,9}+[.\)]'); + list($name, $pattern) = $Line['text'][0] <= '-' ? ['ul', '[*+-]'] : ['ol', '[0-9]{1,9}+[.\)]']; - if (preg_match('/^('.$pattern.'([ ]++|$))(.*+)/', $Line['text'], $matches)) - { - $contentIndent = strlen($matches[2]); + if (\preg_match('/^('.$pattern.'([ ]++|$))(.*+)/', $Line['text'], $matches)) { + $contentIndent = \strlen($matches[2]); - if ($contentIndent >= 5) - { + if ($contentIndent >= 5) { $contentIndent -= 1; - $matches[1] = substr($matches[1], 0, -$contentIndent); - $matches[3] = str_repeat(' ', $contentIndent) . $matches[3]; - } - elseif ($contentIndent === 0) - { + $matches[1] = \substr($matches[1], 0, -$contentIndent); + $matches[3] = \str_repeat(' ', $contentIndent) . $matches[3]; + } elseif ($contentIndent === 0) { $matches[1] .= ' '; } - $markerWithoutWhitespace = strstr($matches[1], ' ', true); + $markerWithoutWhitespace = \strstr($matches[1], ' ', true); - $Block = array( + $Block = [ 'indent' => $Line['indent'], 'pattern' => $pattern, - 'data' => array( + 'data' => [ 'type' => $name, 'marker' => $matches[1], - 'markerType' => ($name === 'ul' ? $markerWithoutWhitespace : substr($markerWithoutWhitespace, -1)), - ), - 'element' => array( + 'markerType' => ($name === 'ul' ? $markerWithoutWhitespace : \substr($markerWithoutWhitespace, -1)), + ], + 'element' => [ 'name' => $name, - 'elements' => array(), - ), - ); - $Block['data']['markerTypeRegex'] = preg_quote($Block['data']['markerType'], '/'); + 'elements' => [], + ], + ]; + $Block['data']['markerTypeRegex'] = \preg_quote($Block['data']['markerType'], '/'); - if ($name === 'ol') - { - $listStart = ltrim(strstr($matches[1], $Block['data']['markerType'], true), '0') ?: '0'; + if ($name === 'ol') { + $listStart = \ltrim(\strstr($matches[1], $Block['data']['markerType'], true), '0') ?: '0'; - if ($listStart !== '1') - { + if ($listStart !== '1') { if ( isset($CurrentBlock) and $CurrentBlock['type'] === 'Paragraph' @@ -623,18 +561,18 @@ class Parsedown return; } - $Block['element']['attributes'] = array('start' => $listStart); + $Block['element']['attributes'] = ['start' => $listStart]; } } - $Block['li'] = array( + $Block['li'] = [ 'name' => 'li', - 'handler' => array( + 'handler' => [ 'function' => 'li', - 'argument' => !empty($matches[3]) ? array($matches[3]) : array(), + 'argument' => !empty($matches[3]) ? [$matches[3]] : [], 'destination' => 'elements' - ) - ); + ] + ]; $Block['element']['elements'] []= & $Block['li']; @@ -644,26 +582,24 @@ class Parsedown protected function blockListContinue($Line, array $Block) { - if (isset($Block['interrupted']) and empty($Block['li']['handler']['argument'])) - { + if (isset($Block['interrupted']) and empty($Block['li']['handler']['argument'])) { return null; } - $requiredIndent = ($Block['indent'] + strlen($Block['data']['marker'])); + $requiredIndent = ($Block['indent'] + \strlen($Block['data']['marker'])); if ($Line['indent'] < $requiredIndent and ( ( $Block['data']['type'] === 'ol' - and preg_match('/^[0-9]++'.$Block['data']['markerTypeRegex'].'(?:[ ]++(.*)|$)/', $Line['text'], $matches) + and \preg_match('/^[0-9]++'.$Block['data']['markerTypeRegex'].'(?:[ ]++(.*)|$)/', $Line['text'], $matches) ) or ( $Block['data']['type'] === 'ul' - and preg_match('/^'.$Block['data']['markerTypeRegex'].'(?:[ ]++(.*)|$)/', $Line['text'], $matches) + and \preg_match('/^'.$Block['data']['markerTypeRegex'].'(?:[ ]++(.*)|$)/', $Line['text'], $matches) ) ) ) { - if (isset($Block['interrupted'])) - { + if (isset($Block['interrupted'])) { $Block['li']['handler']['argument'] []= ''; $Block['loose'] = true; @@ -677,33 +613,28 @@ class Parsedown $Block['indent'] = $Line['indent']; - $Block['li'] = array( + $Block['li'] = [ 'name' => 'li', - 'handler' => array( + 'handler' => [ 'function' => 'li', - 'argument' => array($text), + 'argument' => [$text], 'destination' => 'elements' - ) - ); + ] + ]; $Block['element']['elements'] []= & $Block['li']; return $Block; - } - elseif ($Line['indent'] < $requiredIndent and $this->blockList($Line)) - { + } elseif ($Line['indent'] < $requiredIndent and $this->blockList($Line)) { return null; } - if ($Line['text'][0] === '[' and $this->blockReference($Line)) - { + if ($Line['text'][0] === '[' and $this->blockReference($Line)) { return $Block; } - if ($Line['indent'] >= $requiredIndent) - { - if (isset($Block['interrupted'])) - { + if ($Line['indent'] >= $requiredIndent) { + if (isset($Block['interrupted'])) { $Block['li']['handler']['argument'] []= ''; $Block['loose'] = true; @@ -711,16 +642,15 @@ class Parsedown unset($Block['interrupted']); } - $text = substr($Line['body'], $requiredIndent); + $text = \substr($Line['body'], $requiredIndent); $Block['li']['handler']['argument'] []= $text; return $Block; } - if ( ! isset($Block['interrupted'])) - { - $text = preg_replace('/^[ ]{0,'.$requiredIndent.'}+/', '', $Line['body']); + if (! isset($Block['interrupted'])) { + $text = \preg_replace('/^[ ]{0,'.$requiredIndent.'}+/', '', $Line['body']); $Block['li']['handler']['argument'] []= $text; @@ -730,12 +660,9 @@ class Parsedown protected function blockListComplete(array $Block) { - if (isset($Block['loose'])) - { - foreach ($Block['element']['elements'] as &$li) - { - if (end($li['handler']['argument']) !== '') - { + if (isset($Block['loose'])) { + foreach ($Block['element']['elements'] as &$li) { + if (\end($li['handler']['argument']) !== '') { $li['handler']['argument'] []= ''; } } @@ -749,18 +676,17 @@ class Parsedown protected function blockQuote($Line) { - if (preg_match('/^>[ ]?+(.*+)/', $Line['text'], $matches)) - { - $Block = array( - 'element' => array( + if (\preg_match('/^>[ ]?+(.*+)/', $Line['text'], $matches)) { + $Block = [ + 'element' => [ 'name' => 'blockquote', - 'handler' => array( + 'handler' => [ 'function' => 'linesElements', 'argument' => (array) $matches[1], 'destination' => 'elements', - ) - ), - ); + ] + ], + ]; return $Block; } @@ -768,20 +694,17 @@ class Parsedown protected function blockQuoteContinue($Line, array $Block) { - if (isset($Block['interrupted'])) - { + if (isset($Block['interrupted'])) { return; } - if ($Line['text'][0] === '>' and preg_match('/^>[ ]?+(.*+)/', $Line['text'], $matches)) - { + if ($Line['text'][0] === '>' and \preg_match('/^>[ ]?+(.*+)/', $Line['text'], $matches)) { $Block['element']['handler']['argument'] []= $matches[1]; return $Block; } - if ( ! isset($Block['interrupted'])) - { + if (! isset($Block['interrupted'])) { $Block['element']['handler']['argument'] []= $Line['text']; return $Block; @@ -795,13 +718,12 @@ class Parsedown { $marker = $Line['text'][0]; - if (substr_count($Line['text'], $marker) >= 3 and chop($Line['text'], " $marker") === '') - { - $Block = array( - 'element' => array( + if (\substr_count($Line['text'], $marker) >= 3 and \chop($Line['text'], " $marker") === '') { + $Block = [ + 'element' => [ 'name' => 'hr', - ), - ); + ], + ]; return $Block; } @@ -812,13 +734,11 @@ class Parsedown protected function blockSetextHeader($Line, array $Block = null) { - if ( ! isset($Block) or $Block['type'] !== 'Paragraph' or isset($Block['interrupted'])) - { + if (! isset($Block) or $Block['type'] !== 'Paragraph' or isset($Block['interrupted'])) { return; } - if ($Line['indent'] < 4 and chop(chop($Line['text'], ' '), $Line['text'][0]) === '') - { + if ($Line['indent'] < 4 and \chop(\chop($Line['text'], ' '), $Line['text'][0]) === '') { $Block['element']['name'] = $Line['text'][0] === '=' ? 'h1' : 'h2'; return $Block; @@ -830,27 +750,24 @@ class Parsedown protected function blockMarkup($Line) { - if ($this->markupEscaped or $this->safeMode) - { + if ($this->markupEscaped or $this->safeMode) { return; } - if (preg_match('/^<[\/]?+(\w*)(?:[ ]*+'.$this->regexHtmlAttribute.')*+[ ]*+(\/)?>/', $Line['text'], $matches)) - { - $element = strtolower($matches[1]); + if (\preg_match('/^<[\/]?+(\w*)(?:[ ]*+'.$this->regexHtmlAttribute.')*+[ ]*+(\/)?>/', $Line['text'], $matches)) { + $element = \strtolower($matches[1]); - if (in_array($element, $this->textLevelElements)) - { + if (\in_array($element, $this->textLevelElements, true)) { return; } - $Block = array( + $Block = [ 'name' => $matches[1], - 'element' => array( + 'element' => [ 'rawHtml' => $Line['text'], 'autobreak' => true, - ), - ); + ], + ]; return $Block; } @@ -858,8 +775,7 @@ class Parsedown protected function blockMarkupContinue($Line, array $Block) { - if (isset($Block['closed']) or isset($Block['interrupted'])) - { + if (isset($Block['closed']) or isset($Block['interrupted'])) { return; } @@ -873,21 +789,21 @@ class Parsedown protected function blockReference($Line) { - if (strpos($Line['text'], ']') !== false - and preg_match('/^\[(.+?)\]:[ ]*+(\S+?)>?(?:[ ]+["\'(](.+)["\')])?[ ]*+$/', $Line['text'], $matches) + if (\strpos($Line['text'], ']') !== false + and \preg_match('/^\[(.+?)\]:[ ]*+(\S+?)>?(?:[ ]+["\'(](.+)["\')])?[ ]*+$/', $Line['text'], $matches) ) { - $id = strtolower($matches[1]); + $id = \strtolower($matches[1]); - $Data = array( + $Data = [ 'url' => $matches[2], 'title' => isset($matches[3]) ? $matches[3] : null, - ); + ]; $this->DefinitionData['Reference'][$id] = $Data; - $Block = array( - 'element' => array(), - ); + $Block = [ + 'element' => [], + ]; return $Block; } @@ -898,52 +814,46 @@ class Parsedown protected function blockTable($Line, array $Block = null) { - if ( ! isset($Block) or $Block['type'] !== 'Paragraph' or isset($Block['interrupted'])) - { + if (! isset($Block) or $Block['type'] !== 'Paragraph' or isset($Block['interrupted'])) { return; } if ( - strpos($Block['element']['handler']['argument'], '|') === false - and strpos($Line['text'], '|') === false - and strpos($Line['text'], ':') === false - or strpos($Block['element']['handler']['argument'], "\n") !== false + \strpos($Block['element']['handler']['argument'], '|') === false + and \strpos($Line['text'], '|') === false + and \strpos($Line['text'], ':') === false + or \strpos($Block['element']['handler']['argument'], "\n") !== false ) { return; } - if (chop($Line['text'], ' -:|') !== '') - { + if (\chop($Line['text'], ' -:|') !== '') { return; } - $alignments = array(); + $alignments = []; $divider = $Line['text']; - $divider = trim($divider); - $divider = trim($divider, '|'); + $divider = \trim($divider); + $divider = \trim($divider, '|'); - $dividerCells = explode('|', $divider); + $dividerCells = \explode('|', $divider); - foreach ($dividerCells as $dividerCell) - { - $dividerCell = trim($dividerCell); + foreach ($dividerCells as $dividerCell) { + $dividerCell = \trim($dividerCell); - if ($dividerCell === '') - { + if ($dividerCell === '') { return; } $alignment = null; - if ($dividerCell[0] === ':') - { + if ($dividerCell[0] === ':') { $alignment = 'left'; } - if (substr($dividerCell, - 1) === ':') - { + if (\substr($dividerCell, - 1) === ':') { $alignment = $alignment === 'left' ? 'center' : 'right'; } @@ -952,40 +862,37 @@ class Parsedown # ~ - $HeaderElements = array(); + $HeaderElements = []; $header = $Block['element']['handler']['argument']; - $header = trim($header); - $header = trim($header, '|'); + $header = \trim($header); + $header = \trim($header, '|'); - $headerCells = explode('|', $header); + $headerCells = \explode('|', $header); - if (count($headerCells) !== count($alignments)) - { + if (\count($headerCells) !== \count($alignments)) { return; } - foreach ($headerCells as $index => $headerCell) - { - $headerCell = trim($headerCell); + foreach ($headerCells as $index => $headerCell) { + $headerCell = \trim($headerCell); - $HeaderElement = array( + $HeaderElement = [ 'name' => 'th', - 'handler' => array( + 'handler' => [ 'function' => 'lineElements', 'argument' => $headerCell, 'destination' => 'elements', - ) - ); + ] + ]; - if (isset($alignments[$index])) - { + if (isset($alignments[$index])) { $alignment = $alignments[$index]; - $HeaderElement['attributes'] = array( + $HeaderElement['attributes'] = [ 'style' => "text-align: $alignment;", - ); + ]; } $HeaderElements []= $HeaderElement; @@ -993,79 +900,75 @@ class Parsedown # ~ - $Block = array( + $Block = [ 'alignments' => $alignments, 'identified' => true, - 'element' => array( + 'element' => [ 'name' => 'table', - 'elements' => array(), - ), - ); + 'elements' => [], + ], + ]; - $Block['element']['elements'] []= array( + $Block['element']['elements'] []= [ 'name' => 'thead', - ); + ]; - $Block['element']['elements'] []= array( + $Block['element']['elements'] []= [ 'name' => 'tbody', - 'elements' => array(), - ); + 'elements' => [], + ]; - $Block['element']['elements'][0]['elements'] []= array( + $Block['element']['elements'][0]['elements'] []= [ 'name' => 'tr', 'elements' => $HeaderElements, - ); + ]; return $Block; } protected function blockTableContinue($Line, array $Block) { - if (isset($Block['interrupted'])) - { + if (isset($Block['interrupted'])) { return; } - if (count($Block['alignments']) === 1 or $Line['text'][0] === '|' or strpos($Line['text'], '|')) - { - $Elements = array(); + if (\count($Block['alignments']) === 1 or $Line['text'][0] === '|' or \strpos($Line['text'], '|')) { + $Elements = []; $row = $Line['text']; - $row = trim($row); - $row = trim($row, '|'); + $row = \trim($row); + $row = \trim($row, '|'); - preg_match_all('/(?:(\\\\[|])|[^|`]|`[^`]++`|`)++/', $row, $matches); + \preg_match_all('/(?:(\\\\[|])|[^|`]|`[^`]++`|`)++/', $row, $matches); - $cells = array_slice($matches[0], 0, count($Block['alignments'])); + $cells = \array_slice($matches[0], 0, \count($Block['alignments'])); - foreach ($cells as $index => $cell) - { - $cell = trim($cell); + foreach ($cells as $index => $cell) { + $cell = \trim($cell); - $Element = array( + $Element = [ 'name' => 'td', - 'handler' => array( + 'handler' => [ 'function' => 'lineElements', 'argument' => $cell, 'destination' => 'elements', - ) - ); + ] + ]; - if (isset($Block['alignments'][$index])) - { - $Element['attributes'] = array( + if (isset($Block['alignments'][$index])) { + $Element['attributes'] = [ 'style' => 'text-align: ' . $Block['alignments'][$index] . ';', - ); + ]; } $Elements []= $Element; } - $Element = array( + $Element = [ 'name' => 'tr', 'elements' => $Elements, - ); + ]; $Block['element']['elements'][1]['elements'] []= $Element; @@ -1079,23 +982,22 @@ class Parsedown protected function paragraph($Line) { - return array( + return [ 'type' => 'Paragraph', - 'element' => array( + 'element' => [ 'name' => 'p', - 'handler' => array( + 'handler' => [ 'function' => 'lineElements', 'argument' => $Line['text'], 'destination' => 'elements', - ), - ), - ); + ], + ], + ]; } protected function paragraphContinue($Line, array $Block) { - if (isset($Block['interrupted'])) - { + if (isset($Block['interrupted'])) { return; } @@ -1108,18 +1010,18 @@ class Parsedown # Inline Elements # - protected $InlineTypes = array( - '!' => array('Image'), - '&' => array('SpecialCharacter'), - '*' => array('Emphasis'), - ':' => array('Url'), - '<' => array('UrlTag', 'EmailTag', 'Markup'), - '[' => array('Link'), - '_' => array('Emphasis'), - '`' => array('Code'), - '~' => array('Strikethrough'), - '\\' => array('EscapeSequence'), - ); + protected $InlineTypes = [ + '!' => ['Image'], + '&' => ['SpecialCharacter'], + '*' => ['Emphasis'], + ':' => ['Url'], + '<' => ['UrlTag', 'EmailTag', 'Markup'], + '[' => ['Link'], + '_' => ['Emphasis'], + '`' => ['Code'], + '~' => ['Strikethrough'], + '\\' => ['EscapeSequence'], + ]; # ~ @@ -1129,60 +1031,55 @@ class Parsedown # ~ # - public function line($text, $nonNestables = array()) + public function line($text, $nonNestables = []) { return $this->elements($this->lineElements($text, $nonNestables)); } - protected function lineElements($text, $nonNestables = array()) + protected function lineElements($text, $nonNestables = []) { # standardize line breaks - $text = str_replace(array("\r\n", "\r"), "\n", $text); + $text = \str_replace(["\r\n", "\r"], "\n", $text); - $Elements = array(); + $Elements = []; - $nonNestables = (empty($nonNestables) - ? array() - : array_combine($nonNestables, $nonNestables) + $nonNestables = ( + empty($nonNestables) + ? [] + : \array_combine($nonNestables, $nonNestables) ); # $excerpt is based on the first occurrence of a marker - while ($excerpt = strpbrk($text, $this->inlineMarkerList)) - { + while ($excerpt = \strpbrk($text, $this->inlineMarkerList)) { $marker = $excerpt[0]; - $markerPosition = strlen($text) - strlen($excerpt); + $markerPosition = \strlen($text) - \strlen($excerpt); - $Excerpt = array('text' => $excerpt, 'context' => $text); + $Excerpt = ['text' => $excerpt, 'context' => $text]; - foreach ($this->InlineTypes[$marker] as $inlineType) - { + foreach ($this->InlineTypes[$marker] as $inlineType) { # check to see if the current inline type is nestable in the current context - if (isset($nonNestables[$inlineType])) - { + if (isset($nonNestables[$inlineType])) { continue; } $Inline = $this->{"inline$inlineType"}($Excerpt); - if ( ! isset($Inline)) - { + if (! isset($Inline)) { continue; } # makes sure that the inline belongs to "our" marker - if (isset($Inline['position']) and $Inline['position'] > $markerPosition) - { + if (isset($Inline['position']) and $Inline['position'] > $markerPosition) { continue; } # sets a default inline position - if ( ! isset($Inline['position'])) - { + if (! isset($Inline['position'])) { $Inline['position'] = $markerPosition; } @@ -1190,12 +1087,12 @@ class Parsedown $Inline['element']['nonNestables'] = isset($Inline['element']['nonNestables']) - ? array_merge($Inline['element']['nonNestables'], $nonNestables) + ? \array_merge($Inline['element']['nonNestables'], $nonNestables) : $nonNestables ; # the text that comes before the inline - $unmarkedText = substr($text, 0, $Inline['position']); + $unmarkedText = \substr($text, 0, $Inline['position']); # compile the unmarked text $InlineText = $this->inlineText($unmarkedText); @@ -1205,28 +1102,26 @@ class Parsedown $Elements[] = $this->extractElement($Inline); # remove the examined text - $text = substr($text, $Inline['position'] + $Inline['extent']); + $text = \substr($text, $Inline['position'] + $Inline['extent']); continue 2; } # the marker does not belong to an inline - $unmarkedText = substr($text, 0, $markerPosition + 1); + $unmarkedText = \substr($text, 0, $markerPosition + 1); $InlineText = $this->inlineText($unmarkedText); $Elements[] = $InlineText['element']; - $text = substr($text, $markerPosition + 1); + $text = \substr($text, $markerPosition + 1); } $InlineText = $this->inlineText($text); $Elements[] = $InlineText['element']; - foreach ($Elements as &$Element) - { - if ( ! isset($Element['autobreak'])) - { + foreach ($Elements as &$Element) { + if (! isset($Element['autobreak'])) { $Element['autobreak'] = false; } } @@ -1240,17 +1135,17 @@ class Parsedown protected function inlineText($text) { - $Inline = array( - 'extent' => strlen($text), - 'element' => array(), - ); + $Inline = [ + 'extent' => \strlen($text), + 'element' => [], + ]; $Inline['element']['elements'] = self::pregReplaceElements( $this->breaksEnabled ? '/[ ]*+\n/' : '/(?:[ ]*+\\\\|[ ]{2,}+)\n/', - array( - array('name' => 'br'), - array('text' => "\n"), - ), + [ + ['name' => 'br'], + ['text' => "\n"], + ], $text ); @@ -1261,18 +1156,17 @@ class Parsedown { $marker = $Excerpt['text'][0]; - if (preg_match('/^(['.$marker.']++)[ ]*+(.+?)[ ]*+(? strlen($matches[0]), - 'element' => array( + return [ + 'extent' => \strlen($matches[0]), + 'element' => [ 'name' => 'code', 'text' => $text, - ), - ); + ], + ]; } } @@ -1283,102 +1177,92 @@ class Parsedown $commonMarkEmail = '[a-zA-Z0-9.!#$%&\'*+\/=?^_`{|}~-]++@' . $hostnameLabel . '(?:\.' . $hostnameLabel . ')*'; - if (strpos($Excerpt['text'], '>') !== false - and preg_match("/^<((mailto:)?$commonMarkEmail)>/i", $Excerpt['text'], $matches) - ){ + if (\strpos($Excerpt['text'], '>') !== false + and \preg_match("/^<((mailto:)?$commonMarkEmail)>/i", $Excerpt['text'], $matches) + ) { $url = $matches[1]; - if ( ! isset($matches[2])) - { + if (! isset($matches[2])) { $url = "mailto:$url"; } - return array( - 'extent' => strlen($matches[0]), - 'element' => array( + return [ + 'extent' => \strlen($matches[0]), + 'element' => [ 'name' => 'a', 'text' => $matches[1], - 'attributes' => array( + 'attributes' => [ 'href' => $url, - ), - ), - ); + ], + ], + ]; } } protected function inlineEmphasis($Excerpt) { - if ( ! isset($Excerpt['text'][1])) - { + if (! isset($Excerpt['text'][1])) { return; } $marker = $Excerpt['text'][0]; - if ($Excerpt['text'][1] === $marker and preg_match($this->StrongRegex[$marker], $Excerpt['text'], $matches)) - { + if ($Excerpt['text'][1] === $marker and \preg_match($this->StrongRegex[$marker], $Excerpt['text'], $matches)) { $emphasis = 'strong'; - } - elseif (preg_match($this->EmRegex[$marker], $Excerpt['text'], $matches)) - { + } elseif (\preg_match($this->EmRegex[$marker], $Excerpt['text'], $matches)) { $emphasis = 'em'; - } - else - { + } else { return; } - return array( - 'extent' => strlen($matches[0]), - 'element' => array( + return [ + 'extent' => \strlen($matches[0]), + 'element' => [ 'name' => $emphasis, - 'handler' => array( + 'handler' => [ 'function' => 'lineElements', 'argument' => $matches[1], 'destination' => 'elements', - ) - ), - ); + ] + ], + ]; } protected function inlineEscapeSequence($Excerpt) { - if (isset($Excerpt['text'][1]) and in_array($Excerpt['text'][1], $this->specialCharacters)) - { - return array( - 'element' => array('rawHtml' => $Excerpt['text'][1]), + if (isset($Excerpt['text'][1]) and \in_array($Excerpt['text'][1], $this->specialCharacters, true)) { + return [ + 'element' => ['rawHtml' => $Excerpt['text'][1]], 'extent' => 2, - ); + ]; } } protected function inlineImage($Excerpt) { - if ( ! isset($Excerpt['text'][1]) or $Excerpt['text'][1] !== '[') - { + if (! isset($Excerpt['text'][1]) or $Excerpt['text'][1] !== '[') { return; } - $Excerpt['text']= substr($Excerpt['text'], 1); + $Excerpt['text']= \substr($Excerpt['text'], 1); $Link = $this->inlineLink($Excerpt); - if ($Link === null) - { + if ($Link === null) { return; } - $Inline = array( + $Inline = [ 'extent' => $Link['extent'] + 1, - 'element' => array( + 'element' => [ 'name' => 'img', - 'attributes' => array( + 'attributes' => [ 'src' => $Link['element']['attributes']['href'], 'alt' => $Link['element']['handler']['argument'], - ), + ], 'autobreak' => true, - ), - ); + ], + ]; $Inline['element']['attributes'] += $Link['element']['attributes']; @@ -1389,64 +1273,53 @@ class Parsedown protected function inlineLink($Excerpt) { - $Element = array( + $Element = [ 'name' => 'a', - 'handler' => array( + 'handler' => [ 'function' => 'lineElements', 'argument' => null, 'destination' => 'elements', - ), - 'nonNestables' => array('Url', 'Link'), - 'attributes' => array( + ], + 'nonNestables' => ['Url', 'Link'], + 'attributes' => [ 'href' => null, 'title' => null, - ), - ); + ], + ]; $extent = 0; $remainder = $Excerpt['text']; - if (preg_match('/\[((?:[^][]++|(?R))*+)\]/', $remainder, $matches)) - { + if (\preg_match('/\[((?:[^][]++|(?R))*+)\]/', $remainder, $matches)) { $Element['handler']['argument'] = $matches[1]; - $extent += strlen($matches[0]); + $extent += \strlen($matches[0]); - $remainder = substr($remainder, $extent); - } - else - { + $remainder = \substr($remainder, $extent); + } else { return; } - if (preg_match('/^[(]\s*+((?:[^ ()]++|[(][^ )]+[)])++)(?:[ ]+("[^"]*+"|\'[^\']*+\'))?\s*+[)]/', $remainder, $matches)) - { + if (\preg_match('/^[(]\s*+((?:[^ ()]++|[(][^ )]+[)])++)(?:[ ]+("[^"]*+"|\'[^\']*+\'))?\s*+[)]/', $remainder, $matches)) { $Element['attributes']['href'] = $matches[1]; - if (isset($matches[2])) - { - $Element['attributes']['title'] = substr($matches[2], 1, - 1); + if (isset($matches[2])) { + $Element['attributes']['title'] = \substr($matches[2], 1, - 1); } - $extent += strlen($matches[0]); - } - else - { - if (preg_match('/^\s*\[(.*?)\]/', $remainder, $matches)) - { - $definition = strlen($matches[1]) ? $matches[1] : $Element['handler']['argument']; - $definition = strtolower($definition); + $extent += \strlen($matches[0]); + } else { + if (\preg_match('/^\s*\[(.*?)\]/', $remainder, $matches)) { + $definition = \strlen($matches[1]) ? $matches[1] : $Element['handler']['argument']; + $definition = \strtolower($definition); - $extent += strlen($matches[0]); - } - else - { - $definition = strtolower($Element['handler']['argument']); + $extent += \strlen($matches[0]); + } else { + $definition = \strtolower($Element['handler']['argument']); } - if ( ! isset($this->DefinitionData['Reference'][$definition])) - { + if (! isset($this->DefinitionData['Reference'][$definition])) { return; } @@ -1456,53 +1329,49 @@ class Parsedown $Element['attributes']['title'] = $Definition['title']; } - return array( + return [ 'extent' => $extent, 'element' => $Element, - ); + ]; } protected function inlineMarkup($Excerpt) { - if ($this->markupEscaped or $this->safeMode or strpos($Excerpt['text'], '>') === false) - { + if ($this->markupEscaped or $this->safeMode or \strpos($Excerpt['text'], '>') === false) { return; } - if ($Excerpt['text'][1] === '/' and preg_match('/^<\/\w[\w-]*+[ ]*+>/s', $Excerpt['text'], $matches)) - { - return array( - 'element' => array('rawHtml' => $matches[0]), - 'extent' => strlen($matches[0]), - ); + if ($Excerpt['text'][1] === '/' and \preg_match('/^<\/\w[\w-]*+[ ]*+>/s', $Excerpt['text'], $matches)) { + return [ + 'element' => ['rawHtml' => $matches[0]], + 'extent' => \strlen($matches[0]), + ]; } - if ($Excerpt['text'][1] === '!' and preg_match('/^/s', $Excerpt['text'], $matches)) - { - return array( - 'element' => array('rawHtml' => $matches[0]), - 'extent' => strlen($matches[0]), - ); + if ($Excerpt['text'][1] === '!' and \preg_match('/^/s', $Excerpt['text'], $matches)) { + return [ + 'element' => ['rawHtml' => $matches[0]], + 'extent' => \strlen($matches[0]), + ]; } - if ($Excerpt['text'][1] !== ' ' and preg_match('/^<\w[\w-]*+(?:[ ]*+'.$this->regexHtmlAttribute.')*+[ ]*+\/?>/s', $Excerpt['text'], $matches)) - { - return array( - 'element' => array('rawHtml' => $matches[0]), - 'extent' => strlen($matches[0]), - ); + if ($Excerpt['text'][1] !== ' ' and \preg_match('/^<\w[\w-]*+(?:[ ]*+'.$this->regexHtmlAttribute.')*+[ ]*+\/?>/s', $Excerpt['text'], $matches)) { + return [ + 'element' => ['rawHtml' => $matches[0]], + 'extent' => \strlen($matches[0]), + ]; } } protected function inlineSpecialCharacter($Excerpt) { - if (substr($Excerpt['text'], 1, 1) !== ' ' and strpos($Excerpt['text'], ';') !== false - and preg_match('/^&(#?+[0-9a-zA-Z]++);/', $Excerpt['text'], $matches) + if (\substr($Excerpt['text'], 1, 1) !== ' ' and \strpos($Excerpt['text'], ';') !== false + and \preg_match('/^&(#?+[0-9a-zA-Z]++);/', $Excerpt['text'], $matches) ) { - return array( - 'element' => array('rawHtml' => '&' . $matches[1] . ';'), - 'extent' => strlen($matches[0]), - ); + return [ + 'element' => ['rawHtml' => '&' . $matches[1] . ';'], + 'extent' => \strlen($matches[0]), + ]; } return; @@ -1510,50 +1379,47 @@ class Parsedown protected function inlineStrikethrough($Excerpt) { - if ( ! isset($Excerpt['text'][1])) - { + if (! isset($Excerpt['text'][1])) { return; } - if ($Excerpt['text'][1] === '~' and preg_match('/^~~(?=\S)(.+?)(?<=\S)~~/', $Excerpt['text'], $matches)) - { - return array( - 'extent' => strlen($matches[0]), - 'element' => array( + if ($Excerpt['text'][1] === '~' and \preg_match('/^~~(?=\S)(.+?)(?<=\S)~~/', $Excerpt['text'], $matches)) { + return [ + 'extent' => \strlen($matches[0]), + 'element' => [ 'name' => 'del', - 'handler' => array( + 'handler' => [ 'function' => 'lineElements', 'argument' => $matches[1], 'destination' => 'elements', - ) - ), - ); + ] + ], + ]; } } protected function inlineUrl($Excerpt) { - 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; } - if (strpos($Excerpt['context'], 'http') !== false - and preg_match('/\bhttps?+:[\/]{2}[^\s<]+\b\/*+/ui', $Excerpt['context'], $matches, PREG_OFFSET_CAPTURE) + if (\strpos($Excerpt['context'], 'http') !== false + and \preg_match('/\bhttps?+:[\/]{2}[^\s<]+\b\/*+/ui', $Excerpt['context'], $matches, \PREG_OFFSET_CAPTURE) ) { $url = $matches[0][0]; - $Inline = array( - 'extent' => strlen($matches[0][0]), + $Inline = [ + 'extent' => \strlen($matches[0][0]), 'position' => $matches[0][1], - 'element' => array( + 'element' => [ 'name' => 'a', 'text' => $url, - 'attributes' => array( + 'attributes' => [ 'href' => $url, - ), - ), - ); + ], + ], + ]; return $Inline; } @@ -1561,20 +1427,19 @@ class Parsedown protected function inlineUrlTag($Excerpt) { - 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)) { $url = $matches[1]; - return array( - 'extent' => strlen($matches[0]), - 'element' => array( + return [ + 'extent' => \strlen($matches[0]), + 'element' => [ 'name' => 'a', 'text' => $url, - 'attributes' => array( + 'attributes' => [ 'href' => $url, - ), - ), - ); + ], + ], + ]; } } @@ -1592,22 +1457,17 @@ class Parsedown protected function handle(array $Element) { - if (isset($Element['handler'])) - { - if (!isset($Element['nonNestables'])) - { - $Element['nonNestables'] = array(); + if (isset($Element['handler'])) { + if (!isset($Element['nonNestables'])) { + $Element['nonNestables'] = []; } - if (is_string($Element['handler'])) - { + if (\is_string($Element['handler'])) { $function = $Element['handler']; $argument = $Element['text']; unset($Element['text']); $destination = 'rawHtml'; - } - else - { + } else { $function = $Element['handler']['function']; $argument = $Element['handler']['argument']; $destination = $Element['handler']['destination']; @@ -1615,8 +1475,7 @@ class Parsedown $Element[$destination] = $this->{$function}($argument, $Element['nonNestables']); - if ($destination === 'handler') - { + if ($destination === 'handler') { $Element = $this->handle($Element); } @@ -1628,24 +1487,21 @@ class Parsedown protected function handleElementRecursive(array $Element) { - return $this->elementApplyRecursive(array($this, 'handle'), $Element); + return $this->elementApplyRecursive([$this, 'handle'], $Element); } protected function handleElementsRecursive(array $Elements) { - return $this->elementsApplyRecursive(array($this, 'handle'), $Elements); + return $this->elementsApplyRecursive([$this, 'handle'], $Elements); } protected function elementApplyRecursive($closure, array $Element) { - $Element = call_user_func($closure, $Element); + $Element = \call_user_func($closure, $Element); - if (isset($Element['elements'])) - { + if (isset($Element['elements'])) { $Element['elements'] = $this->elementsApplyRecursive($closure, $Element['elements']); - } - elseif (isset($Element['element'])) - { + } elseif (isset($Element['element'])) { $Element['element'] = $this->elementApplyRecursive($closure, $Element['element']); } @@ -1654,24 +1510,20 @@ class Parsedown protected function elementApplyRecursiveDepthFirst($closure, array $Element) { - if (isset($Element['elements'])) - { + if (isset($Element['elements'])) { $Element['elements'] = $this->elementsApplyRecursiveDepthFirst($closure, $Element['elements']); - } - elseif (isset($Element['element'])) - { + } elseif (isset($Element['element'])) { $Element['element'] = $this->elementsApplyRecursiveDepthFirst($closure, $Element['element']); } - $Element = call_user_func($closure, $Element); + $Element = \call_user_func($closure, $Element); return $Element; } protected function elementsApplyRecursive($closure, array $Elements) { - foreach ($Elements as &$Element) - { + foreach ($Elements as &$Element) { $Element = $this->elementApplyRecursive($closure, $Element); } @@ -1680,8 +1532,7 @@ class Parsedown protected function elementsApplyRecursiveDepthFirst($closure, array $Elements) { - foreach ($Elements as &$Element) - { + foreach ($Elements as &$Element) { $Element = $this->elementApplyRecursiveDepthFirst($closure, $Element); } @@ -1690,8 +1541,7 @@ class Parsedown protected function element(array $Element) { - if ($this->safeMode) - { + if ($this->safeMode) { $Element = $this->sanitiseElement($Element); } @@ -1702,16 +1552,12 @@ class Parsedown $markup = ''; - if ($hasName) - { + if ($hasName) { $markup .= '<' . $Element['name']; - if (isset($Element['attributes'])) - { - foreach ($Element['attributes'] as $name => $value) - { - if ($value === null) - { + if (isset($Element['attributes'])) { + foreach ($Element['attributes'] as $name => $value) { + if ($value === null) { continue; } @@ -1722,14 +1568,12 @@ class Parsedown $permitRawHtml = false; - if (isset($Element['text'])) - { + if (isset($Element['text'])) { $text = $Element['text']; } // very strongly consider an alternative if you're writing an // extension - elseif (isset($Element['rawHtml'])) - { + elseif (isset($Element['rawHtml'])) { $text = $Element['rawHtml']; $allowRawHtmlInSafeMode = isset($Element['allowRawHtmlInSafeMode']) && $Element['allowRawHtmlInSafeMode']; @@ -1738,34 +1582,23 @@ class Parsedown $hasContent = isset($text) || isset($Element['element']) || isset($Element['elements']); - if ($hasContent) - { + if ($hasContent) { $markup .= $hasName ? '>' : ''; - if (isset($Element['elements'])) - { + if (isset($Element['elements'])) { $markup .= $this->elements($Element['elements']); - } - elseif (isset($Element['element'])) - { + } elseif (isset($Element['element'])) { $markup .= $this->element($Element['element']); - } - else - { - if (!$permitRawHtml) - { + } else { + if (!$permitRawHtml) { $markup .= self::escape($text, true); - } - else - { + } else { $markup .= $text; } } $markup .= $hasName ? '' . $Element['name'] . '>' : ''; - } - elseif ($hasName) - { + } elseif ($hasName) { $markup .= ' />'; } @@ -1778,14 +1611,13 @@ class Parsedown $autoBreak = true; - foreach ($Elements as $Element) - { - if (empty($Element)) - { + foreach ($Elements as $Element) { + if (empty($Element)) { continue; } - $autoBreakNext = (isset($Element['autobreak']) + $autoBreakNext = ( + isset($Element['autobreak']) ? $Element['autobreak'] : isset($Element['name']) ); // (autobreak === false) covers both sides of an element @@ -1806,7 +1638,7 @@ class Parsedown { $Elements = $this->linesElements($lines); - if ( ! in_array('', $lines) + if (! \in_array('', $lines, true) and isset($Elements[0]) and isset($Elements[0]['name']) and $Elements[0]['name'] === 'p' ) { @@ -1826,25 +1658,23 @@ class Parsedown */ protected static function pregReplaceElements($regexp, $Elements, $text) { - $newElements = array(); + $newElements = []; - while (preg_match($regexp, $text, $matches, PREG_OFFSET_CAPTURE)) - { + while (\preg_match($regexp, $text, $matches, \PREG_OFFSET_CAPTURE)) { $offset = $matches[0][1]; - $before = substr($text, 0, $offset); - $after = substr($text, $offset + strlen($matches[0][0])); + $before = \substr($text, 0, $offset); + $after = \substr($text, $offset + \strlen($matches[0][0])); - $newElements[] = array('text' => $before); + $newElements[] = ['text' => $before]; - foreach ($Elements as $Element) - { + foreach ($Elements as $Element) { $newElements[] = $Element; } $text = $after; } - $newElements[] = array('text' => $text); + $newElements[] = ['text' => $text]; return $newElements; } @@ -1853,7 +1683,7 @@ class Parsedown # Deprecated Methods # - function parse($text) + public function parse($text) { $markup = $this->text($text); @@ -1863,34 +1693,28 @@ class Parsedown protected function sanitiseElement(array $Element) { static $goodAttribute = '/^[a-zA-Z0-9][a-zA-Z0-9-_]*+$/'; - static $safeUrlNameToAtt = array( + static $safeUrlNameToAtt = [ 'a' => 'href', 'img' => 'src', - ); + ]; - if ( ! isset($Element['name'])) - { + if (! isset($Element['name'])) { unset($Element['attributes']); return $Element; } - if (isset($safeUrlNameToAtt[$Element['name']])) - { + if (isset($safeUrlNameToAtt[$Element['name']])) { $Element = $this->filterUnsafeUrlInAttribute($Element, $safeUrlNameToAtt[$Element['name']]); } - if ( ! empty($Element['attributes'])) - { - foreach ($Element['attributes'] as $att => $val) - { + if (! empty($Element['attributes'])) { + foreach ($Element['attributes'] as $att => $val) { # filter out badly parsed attribute - if ( ! preg_match($goodAttribute, $att)) - { + if (! \preg_match($goodAttribute, $att)) { unset($Element['attributes'][$att]); } # dump onevent attribute - elseif (self::striAtStart($att, 'on')) - { + elseif (self::striAtStart($att, 'on')) { unset($Element['attributes'][$att]); } } @@ -1901,15 +1725,13 @@ class Parsedown protected function filterUnsafeUrlInAttribute(array $Element, $attribute) { - foreach ($this->safeLinksWhitelist as $scheme) - { - if (self::striAtStart($Element['attributes'][$attribute], $scheme)) - { + foreach ($this->safeLinksWhitelist as $scheme) { + if (self::striAtStart($Element['attributes'][$attribute], $scheme)) { return $Element; } } - $Element['attributes'][$attribute] = str_replace(':', '%3A', $Element['attributes'][$attribute]); + $Element['attributes'][$attribute] = \str_replace(':', '%3A', $Element['attributes'][$attribute]); return $Element; } @@ -1920,27 +1742,23 @@ class Parsedown protected static function escape($text, $allowQuotes = false) { - 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) { - $len = strlen($needle); + $len = \strlen($needle); - if ($len > strlen($string)) - { + if ($len > \strlen($string)) { return false; - } - else - { - return strtolower(substr($string, 0, $len)) === strtolower($needle); + } else { + return \strtolower(\substr($string, 0, $len)) === \strtolower($needle); } } - static function instance($name = 'default') + public static function instance($name = 'default') { - if (isset(self::$instances[$name])) - { + if (isset(self::$instances[$name])) { return self::$instances[$name]; } @@ -1951,7 +1769,7 @@ class Parsedown return $instance; } - private static $instances = array(); + private static $instances = []; # # Fields @@ -1962,27 +1780,27 @@ class Parsedown # # Read-Only - protected $specialCharacters = array( + protected $specialCharacters = [ '\\', '`', '*', '_', '{', '}', '[', ']', '(', ')', '>', '#', '+', '-', '.', '!', '|', '~' - ); + ]; - protected $StrongRegex = array( + protected $StrongRegex = [ '*' => '/^[*]{2}((?:\\\\\*|[^*]|[*][^*]*+[*])+?)[*]{2}(?![*])/s', '_' => '/^__((?:\\\\_|[^_]|_[^_]*+_)+?)__(?!_)/us', - ); + ]; - protected $EmRegex = array( + protected $EmRegex = [ '*' => '/^[*]((?:\\\\\*|[^*]|[*][*][^*]+?[*][*])+?)[*](?![*])/s', '_' => '/^_((?:\\\\_|[^_]|__[^_]*__)+?)_(?!_)\b/us', - ); + ]; protected $regexHtmlAttribute = '[a-zA-Z_:][\w:.-]*+(?:\s*+=\s*+(?:[^"\'=<>`\s]+|"[^"]*+"|\'[^\']*+\'))?+'; - protected $voidElements = array( + protected $voidElements = [ 'area', 'base', 'br', 'col', 'command', 'embed', 'hr', 'img', 'input', 'link', 'meta', 'param', 'source', - ); + ]; - protected $textLevelElements = array( + protected $textLevelElements = [ 'a', 'br', 'bdo', 'abbr', 'blink', 'nextid', 'acronym', 'basefont', 'b', 'em', 'big', 'cite', 'small', 'spacer', 'listing', 'i', 'rp', 'del', 'code', 'strike', 'marquee', @@ -1992,5 +1810,5 @@ class Parsedown 'sup', 'ruby', 'var', 'span', 'wbr', 'time', - ); + ]; } diff --git a/tests/CommonMarkTestStrict.php b/tests/CommonMarkTestStrict.php index b4536b9..c1bddc6 100644 --- a/tests/CommonMarkTestStrict.php +++ b/tests/CommonMarkTestStrict.php @@ -37,18 +37,18 @@ class CommonMarkTestStrict extends PHPUnit_Framework_TestCase */ public function data() { - $spec = file_get_contents(self::SPEC_URL); + $spec = \file_get_contents(self::SPEC_URL); if ($spec === false) { $this->fail('Unable to load CommonMark spec from ' . self::SPEC_URL); } - $spec = str_replace("\r\n", "\n", $spec); - $spec = strstr($spec, '', true); + $spec = \str_replace("\r\n", "\n", $spec); + $spec = \strstr($spec, '', true); - $matches = array(); - preg_match_all('/^`{32} example\n((?s).*?)\n\.\n(?:|((?s).*?)\n)`{32}$|^#{1,6} *(.*?)$/m', $spec, $matches, PREG_SET_ORDER); + $matches = []; + \preg_match_all('/^`{32} example\n((?s).*?)\n\.\n(?:|((?s).*?)\n)`{32}$|^#{1,6} *(.*?)$/m', $spec, $matches, \PREG_SET_ORDER); - $data = array(); + $data = []; $currentId = 0; $currentSection = ''; foreach ($matches as $match) { @@ -56,15 +56,15 @@ class CommonMarkTestStrict extends PHPUnit_Framework_TestCase $currentSection = $match[3]; } else { $currentId++; - $markdown = str_replace('→', "\t", $match[1]); - $expectedHtml = isset($match[2]) ? str_replace('→', "\t", $match[2]) : ''; + $markdown = \str_replace('→', "\t", $match[1]); + $expectedHtml = isset($match[2]) ? \str_replace('→', "\t", $match[2]) : ''; - $data[$currentId] = array( + $data[$currentId] = [ 'id' => $currentId, 'section' => $currentSection, 'markdown' => $markdown, 'expectedHtml' => $expectedHtml - ); + ]; } } diff --git a/tests/CommonMarkTestWeak.php b/tests/CommonMarkTestWeak.php index 1d17ac3..961fd65 100644 --- a/tests/CommonMarkTestWeak.php +++ b/tests/CommonMarkTestWeak.php @@ -23,10 +23,10 @@ class CommonMarkTestWeak extends CommonMarkTestStrict parent::setUp(); $textLevelElements = $this->parsedown->getTextLevelElements(); - array_walk($textLevelElements, function (&$element) { - $element = preg_quote($element, '/'); + \array_walk($textLevelElements, function (&$element) { + $element = \preg_quote($element, '/'); }); - $this->textLevelElementRegex = '\b(?:' . implode('|', $textLevelElements) . ')\b'; + $this->textLevelElementRegex = '\b(?:' . \implode('|', $textLevelElements) . ')\b'; } /** @@ -50,11 +50,11 @@ class CommonMarkTestWeak extends CommonMarkTestStrict { // invisible whitespaces at the beginning and end of block elements // however, whitespaces at the beginning of
elements do matter - $markup = preg_replace( - array( + $markup = \preg_replace( + [ '/(<(?!(?:' . $this->textLevelElementRegex . '|\bpre\b))\w+\b[^>]*>(?:<' . $this->textLevelElementRegex . '[^>]*>)*)\s+/s', '/\s+((?:<\/' . $this->textLevelElementRegex . '>)*<\/(?!' . $this->textLevelElementRegex . ')\w+\b>)/s' - ), + ], '$1', $markup ); diff --git a/tests/ParsedownTest.php b/tests/ParsedownTest.php index 8a0bfe7..72f824d 100755 --- a/tests/ParsedownTest.php +++ b/tests/ParsedownTest.php @@ -2,12 +2,12 @@ namespace Erusev\Parsedown\Tests; -use PHPUnit\Framework\TestCase; use Erusev\Parsedown\Parsedown; +use PHPUnit\Framework\TestCase; class ParsedownTest extends TestCase { - final function __construct($name = null, array $data = array(), $dataName = '') + final public function __construct($name = null, array $data = [], $dataName = '') { $this->dirs = $this->initDirs(); $this->Parsedown = $this->initParsedown(); @@ -23,7 +23,7 @@ class ParsedownTest extends TestCase */ protected function initDirs() { - $dirs []= dirname(__FILE__).'/data/'; + $dirs []= \dirname(__FILE__).'/data/'; return $dirs; } @@ -43,24 +43,24 @@ class ParsedownTest extends TestCase * @param $test * @param $dir */ - function test_($test, $dir) + public function test_($test, $dir) { - $markdown = file_get_contents($dir . $test . '.md'); + $markdown = \file_get_contents($dir . $test . '.md'); - $expectedMarkup = file_get_contents($dir . $test . '.html'); + $expectedMarkup = \file_get_contents($dir . $test . '.html'); - $expectedMarkup = str_replace("\r\n", "\n", $expectedMarkup); - $expectedMarkup = str_replace("\r", "\n", $expectedMarkup); + $expectedMarkup = \str_replace("\r\n", "\n", $expectedMarkup); + $expectedMarkup = \str_replace("\r", "\n", $expectedMarkup); - $this->Parsedown->setSafeMode(substr($test, 0, 3) === 'xss'); - $this->Parsedown->setStrictMode(substr($test, 0, 6) === 'strict'); + $this->Parsedown->setSafeMode(\substr($test, 0, 3) === 'xss'); + $this->Parsedown->setStrictMode(\substr($test, 0, 6) === 'strict'); $actualMarkup = $this->Parsedown->text($markdown); $this->assertEquals($expectedMarkup, $actualMarkup); } - function testRawHtml() + public function testRawHtml() { $markdown = "```php\nfoobar\n```"; $expectedMarkup = ''; @@ -77,7 +77,7 @@ class ParsedownTest extends TestCase $this->assertEquals($expectedSafeMarkup, $actualSafeMarkup); } - function testTrustDelegatedRawHtml() + public function testTrustDelegatedRawHtml() { $markdown = "```php\nfoobar\n```"; $expectedMarkup = '
foobar
'; @@ -94,37 +94,32 @@ class ParsedownTest extends TestCase $this->assertEquals($expectedSafeMarkup, $actualSafeMarkup); } - function data() + public function data() { - $data = array(); + $data = []; - foreach ($this->dirs as $dir) - { + foreach ($this->dirs as $dir) { $Folder = new \DirectoryIterator($dir); - foreach ($Folder as $File) - { + foreach ($Folder as $File) { /** @var $File DirectoryIterator */ - if ( ! $File->isFile()) - { + if (! $File->isFile()) { continue; } $filename = $File->getFilename(); - $extension = pathinfo($filename, PATHINFO_EXTENSION); + $extension = \pathinfo($filename, \PATHINFO_EXTENSION); - if ($extension !== 'md') - { + if ($extension !== 'md') { continue; } $basename = $File->getBasename('.md'); - if (file_exists($dir . $basename . '.html')) - { - $data []= array($basename, $dir); + if (\file_exists($dir . $basename . '.html')) { + $data []= [$basename, $dir]; } } }
foobar