/** * @param string $mediaType * @return mixed */ protected function getElementParts($mediaType) { $label = trim($this->cursor->match('/^\\[(?:[^\\\\\\[\\]]|\\\\[\\[\\]]){0,750}\\]/'), '[]'); $url = trim(LinkParserHelper::parseLinkDestination($this->cursor), '()'); if ($label === null || $url === null) { return $this->cancel(); } return $this->getElement($mediaType, $label, $url); }
/** * Attempt to parse link title (sans quotes) * * @param Cursor $cursor * * @return null|string The string, or null if no match */ public static function parseLinkTitle(Cursor $cursor) { if ($title = $cursor->match(RegexHelper::getInstance()->getLinkTitleRegex())) { // Chop off quotes from title and unescape return RegexHelper::unescape(substr($title, 1, strlen($title) - 2)); } }
public function parse(ContextInterface $context, Cursor $cursor) { $inlineParserContext = new InlineParserContext($cursor); while (($character = $cursor->getCharacter()) !== null) { if ($matchingParsers = $this->environment->getInlineParsersForCharacter($character)) { foreach ($matchingParsers as $parser) { if ($parser->parse($context, $inlineParserContext)) { continue 2; } } } // We reach here if none of the parsers can handle the input // Attempt to match multiple non-special characters at once $text = $cursor->match($this->environment->getInlineParserCharacterRegex()); // This might fail if we're currently at a special character which wasn't parsed; if so, just add that character if ($text === null) { $cursor->advance(); $text = $character; } $lastInline = $inlineParserContext->getInlines()->last(); if ($lastInline instanceof Text && !isset($lastInline->data['delim'])) { $lastInline->append($text); } else { $inlineParserContext->getInlines()->add(new Text($text)); } } foreach ($this->environment->getInlineProcessors() as $inlineProcessor) { $inlineProcessor->processInlines($inlineParserContext->getInlines(), $inlineParserContext->getDelimiterStack()); } return $inlineParserContext->getInlines(); }
/** * @param ContextInterface $context * @param Cursor $cursor * * @return bool */ public function parse(ContextInterface $context, Cursor $cursor) { $previousState = $cursor->saveState(); $indent = $cursor->advanceToFirstNonSpace(); $fence = $cursor->match('/^`{3,}(?!.*`)|^~{3,}(?!.*~)/'); if (!$fence) { $cursor->restoreState($previousState); return false; } // fenced code block $fenceLength = strlen($fence); $context->addBlock(new FencedCode($fenceLength, $fence[0], $indent)); return true; }
public static function parse(Cursor $cursor) { if (null === self::$regexp) { $regex = RegexHelper::getInstance(); self::$regexp = sprintf('/^\\s*([.#][_a-z0-9-]+|%s%s)(?<!})\\s*/i', $regex->getPartialRegex(RegexHelper::ATTRIBUTENAME), $regex->getPartialRegex(RegexHelper::ATTRIBUTEVALUESPEC)); } $state = $cursor->saveState(); $cursor->advanceToFirstNonSpace(); if ('{' !== $cursor->getCharacter()) { $cursor->restoreState($state); return []; } $cursor->advanceBy(1); if (':' === $cursor->getCharacter()) { $cursor->advanceBy(1); } $attributes = []; while ($attribute = trim($cursor->match(self::$regexp))) { if ('#' === $attribute[0]) { $attributes['id'] = substr($attribute, 1); continue; } if ('.' === $attribute[0]) { $attributes['class'][] = substr($attribute, 1); continue; } list($name, $value) = explode('=', $attribute, 2); $first = $value[0]; $last = substr($value, -1); if (('"' === $first && '"' === $last || "'" === $first && "'" === $last) && strlen($value) > 1) { $value = substr($value, 1, -1); } if ('class' === strtolower(trim($name))) { foreach (array_filter(explode(' ', trim($value))) as $class) { $attributes['class'][] = $class; } } else { $attributes[trim($name)] = trim($value); } } if (0 === $cursor->advanceWhileMatches('}')) { $cursor->restoreState($state); return []; } if (isset($attributes['class'])) { $attributes['class'] = implode(' ', $attributes['class']); } return $attributes; }
/** * @param ContextInterface $context * @param Cursor $cursor * * @return bool */ public function parse(ContextInterface $context, Cursor $cursor) { if ($cursor->isIndented()) { return false; } $previousState = $cursor->saveState(); $cursor->advanceToFirstNonSpace(); $fence = $cursor->match('/^\\[TOC\\]/'); if (is_null($fence)) { $cursor->restoreState($previousState); return false; } $context->addBlock(new TableOfContents()); return true; }
/** * @param ContextInterface $context * @param Cursor $cursor */ public function handleRemainingContents(ContextInterface $context, Cursor $cursor) { $context->getTip()->addLine($cursor->getRemainder()); // Check for end condition if ($this->type >= self::TYPE_1_CODE_CONTAINER && $this->type <= self::TYPE_5_CDATA) { if ($cursor->match(RegexHelper::getHtmlBlockCloseRegex($this->type)) !== null) { $this->finalize($context, $context->getLineNumber()); } } }