config = $configuration; } public function tryStart(Cursor $cursor, MarkdownParserStateInterface $parserState): ?BlockStart { if ($cursor->isIndented()) { return BlockStart::none(); } $listData = $this->parseList($cursor, $parserState->getParagraphContent() !== null); if ($listData === null) { return BlockStart::none(); } $listItemParser = new ListItemParser($listData); // prepend the list block if needed $matched = $parserState->getLastMatchedBlockParser(); if (! ($matched instanceof ListBlockParser) || ! $listData->equals($matched->getBlock()->getListData())) { $listBlockParser = new ListBlockParser($listData); // We start out with assuming a list is tight. If we find a blank line, we set it to loose later. $listBlockParser->getBlock()->setTight(true); return BlockStart::of($listBlockParser, $listItemParser)->at($cursor); } return BlockStart::of($listItemParser)->at($cursor); } private function parseList(Cursor $cursor, bool $inParagraph): ?ListData { $indent = $cursor->getIndent(); $tmpCursor = clone $cursor; $tmpCursor->advanceToNextNonSpaceOrTab(); $rest = $tmpCursor->getRemainder(); if (\preg_match($this->listMarkerRegex ?? $this->generateListMarkerRegex(), $rest) === 1) { $data = new ListData(); $data->markerOffset = $indent; $data->type = ListBlock::TYPE_BULLET; $data->delimiter = null; $data->bulletChar = $rest[0]; $markerLength = 1; } elseif (($matches = RegexHelper::matchFirst('/^(\d{1,9})([.)])/', $rest)) && (! $inParagraph || $matches[1] === '1')) { $data = new ListData(); $data->markerOffset = $indent; $data->type = ListBlock::TYPE_ORDERED; $data->start = (int) $matches[1]; $data->delimiter = $matches[2] === '.' ? ListBlock::DELIM_PERIOD : ListBlock::DELIM_PAREN; $data->bulletChar = null; $markerLength = \strlen($matches[0]); } else { return null; } // Make sure we have spaces after $nextChar = $tmpCursor->peek($markerLength); if (! ($nextChar === null || $nextChar === "\t" || $nextChar === ' ')) { return null; } // If it interrupts paragraph, make sure first line isn't blank if ($inParagraph && ! RegexHelper::matchAt(RegexHelper::REGEX_NON_SPACE, $rest, $markerLength)) { return null; } $cursor->advanceToNextNonSpaceOrTab(); // to start of marker $cursor->advanceBy($markerLength, true); // to end of marker $data->padding = self::calculateListMarkerPadding($cursor, $markerLength); return $data; } private static function calculateListMarkerPadding(Cursor $cursor, int $markerLength): int { $start = $cursor->saveState(); $spacesStartCol = $cursor->getColumn(); while ($cursor->getColumn() - $spacesStartCol < 5) { if (! $cursor->advanceBySpaceOrTab()) { break; } } $blankItem = $cursor->peek() === null; $spacesAfterMarker = $cursor->getColumn() - $spacesStartCol; if ($spacesAfterMarker >= 5 || $spacesAfterMarker < 1 || $blankItem) { $cursor->restoreState($start); $cursor->advanceBySpaceOrTab(); return $markerLength + 1; } return $markerLength + $spacesAfterMarker; } private function generateListMarkerRegex(): string { // No configuration given - use the defaults if ($this->config === null) { return $this->listMarkerRegex = '/^[*+-]/'; } $markers = $this->config->get('commonmark/unordered_list_markers'); \assert(\is_array($markers)); return $this->listMarkerRegex = '/^[' . \preg_quote(\implode('', $markers), '/') . ']/'; } } __halt_compiler();----SIGNATURE:----c/1PKTCW/6kvDMIx9cBcqZE8x43Tc4fxbLE2yzWewu19nswXkrkD9CwYWTVITM9JMvREP/W6BY9s5pq0e4pJVuFANCiYUnVBe6OJtX1z1VOFYblcrukRUaqdfNrPFAYdX9MgGLcHBK4QZzmxBJIB5NmhUAIGcaNsOAR3G0we9/H1yDza/uJ9pSFDMSnXhs/Kbu87szpKTjDWRod0ZtBIlEA9YR2UZbb9U/tBnCeMu9Ivm3jSmL86FvZz8OSVhI0sgBZS07gb/U7L8q/5z5kiDOSA3Q5wIzdRQGpGWSDJoJDCnlCMe67W/sX8KAwv6FBrGjRl4JVp+lOd3E9ZDH5sDCHUA9z/eEEUykbdhj8i9ve+Ft368siUGhXP2m1wySQbPED4fQbNYTHZhJlFNHRSNBulJC4WqxFQOmXH1E3Y9w+IDobXlR2mA014wD50g6LFTZkgWSe7GozkgJh38VLWG97TsLCG3Yt+w36MhUotzLOXdjLlRlvRMPmIy4K6LCY/V5+j4M5Fj+r5LOCRX6UhJZceDb6lU9GXDKzvYzep7GnjX0LDn+ObjKu3cl/JYHH73XIKpIinLjoaZBwfx08fGgxXJYEEnb8AEKpkGevDuk5phtDaoY6LdCkXTY1bgWGpE2TfTP2+Y6x3zc6EZBSQPDQ1t81SU2wFuzMh+NecfXc=----ATTACHMENT:----ODA4NzIzMzUwMTgxOTI0NiAzNTgxODM4NjE1NTkzNDc0IDIxNjgxNjI0Njg0NzU3OQ==