1<?php 2 3/* 4 * This file is part of the league/commonmark package. 5 * 6 * (c) Colin O'Dell <colinodell@gmail.com> 7 * 8 * Original code based on the CommonMark JS reference parser (https://bitly.com/commonmark-js) 9 * - (c) John MacFarlane 10 * 11 * For the full copyright and license information, please view the LICENSE 12 * file that was distributed with this source code. 13 */ 14 15namespace League\CommonMark\Block\Parser; 16 17use League\CommonMark\Block\Element\FencedCode; 18use League\CommonMark\ContextInterface; 19use League\CommonMark\Cursor; 20 21final class FencedCodeParser implements BlockParserInterface 22{ 23 public function parse(ContextInterface $context, Cursor $cursor): bool 24 { 25 if ($cursor->isIndented()) { 26 return false; 27 } 28 29 $c = $cursor->getCharacter(); 30 if ($c !== ' ' && $c !== "\t" && $c !== '`' && $c !== '~') { 31 return false; 32 } 33 34 $indent = $cursor->getIndent(); 35 $fence = $cursor->match('/^[ \t]*(?:`{3,}(?!.*`)|~{3,})/'); 36 if ($fence === null) { 37 return false; 38 } 39 40 // fenced code block 41 $fence = \ltrim($fence, " \t"); 42 $fenceLength = \strlen($fence); 43 $context->addBlock(new FencedCode($fenceLength, $fence[0], $indent)); 44 45 return true; 46 } 47} 48