getParagraphContent(); if ($paragraph === null || \strpos($paragraph, '|') === false) { return BlockStart::none(); } $columns = self::parseSeparator($cursor); if (\count($columns) === 0) { return BlockStart::none(); } $lines = \explode("\n", $paragraph); $lastLine = \array_pop($lines); $headerCells = TableParser::split($lastLine); if (\count($headerCells) > \count($columns)) { return BlockStart::none(); } $cursor->advanceToEnd(); $parsers = []; if (\count($lines) > 0) { $p = new ParagraphParser(); $p->addLine(\implode("\n", $lines)); $parsers[] = $p; } $parsers[] = new TableParser($columns, $headerCells); return BlockStart::of(...$parsers) ->at($cursor) ->replaceActiveBlockParser(); } /** * @return array * * @psalm-return array * * @phpstan-return array */ private static function parseSeparator(Cursor $cursor): array { $columns = []; $pipes = 0; $valid = false; while (! $cursor->isAtEnd()) { switch ($c = $cursor->getCurrentCharacter()) { case '|': $cursor->advanceBy(1); $pipes++; if ($pipes > 1) { // More than one adjacent pipe not allowed return []; } // Need at least one pipe, even for a one-column table $valid = true; break; case '-': case ':': if ($pipes === 0 && \count($columns) > 0) { // Need a pipe after the first column (first column doesn't need to start with one) return []; } $left = false; $right = false; if ($c === ':') { $left = true; $cursor->advanceBy(1); } if ($cursor->match('/^-+/') === null) { // Need at least one dash return []; } if ($cursor->getCurrentCharacter() === ':') { $right = true; $cursor->advanceBy(1); } $columns[] = self::getAlignment($left, $right); // Next, need another pipe $pipes = 0; break; case ' ': case "\t": // White space is allowed between pipes and columns $cursor->advanceToNextNonSpaceOrTab(); break; default: // Any other character is invalid return []; } } if (! $valid) { return []; } return $columns; } /** * @psalm-return TableCell::ALIGN_*|null * * @phpstan-return TableCell::ALIGN_*|null * * @psalm-pure */ private static function getAlignment(bool $left, bool $right): ?string { if ($left && $right) { return TableCell::ALIGN_CENTER; } if ($left) { return TableCell::ALIGN_LEFT; } if ($right) { return TableCell::ALIGN_RIGHT; } return null; } } __halt_compiler();----SIGNATURE:----KAfF9UqPJaGJXCV9fyXIbiCeLAxb/eZkfu9b0KL24Z/Lv0SRpg53ExlBg2wrMsC6N2OsELlb3hPqcVW8nrLKkX35z3gdFRS6zvQvFRXKaWvTuvBlzqSI8HiIXfFe4TgSeP9VFSR5ZrmUOg2O41e2EvMwwuGVXGNDPAYUBQAl9Bq4+Psx/TFHpxc5is+VOIyg7TF7BKAxsSHdQaLrA9Y+IjpsiyKQ5x9VWCEl007snMqddvupAHeuOE57zCIu9AGIgY/qspmef4uvFhYjq4HPqa8v4g696Nl5CkBOvN5nxNWphW7Yjz35FGGoEZs9WK0y7x3nc7dvAcwT+qRdMilvW7SUJiPTytmg6oEIF+lCa8EX3TdcaGjbCWSVCRBVy/rNJMJJf3Ev0+nbD6mvDa8769NMK5wxMUDq4Q0HVkFwHlo8oratGTju+t+v8sQNzk72PIlGrvsmdwyB1ubWgH62cw7ctvcxBEvEQsmX9eLLQi3ktnrgYlq9i5Frl9MzyJtnT5I83I4BcXTHVuXWZPv103iMOjWzh+O8JxziqIRW0QCoOJRxMBc3KmjK7ctMlDng0pe1AGxg8eLy55HZCnqYa1VNdmgzLHWLgwcf4zPbDtiH0WKGfSStCIxzXR4BCa1HESNIJCwTUkvItL6iWaKpw60dkeYP28uPhCsUsfPV/Rc=----ATTACHMENT:----Mzg1ODI4NDM5NTkyMDM2MyA1MTYzNDY4MTk4NjA5MDg0IDkzNTY0NTY0NzY3OTAxOTY=