public function processInlines(ArrayCollection $inlines, DelimiterStack $delimiterStack, Delimiter $stackBottom = null) { $callback = function (Delimiter $opener, Delimiter $closer, DelimiterStack $stack) use($inlines) { // Calculate actual number of delimiters used from this closer if ($closer->getNumDelims() < 3 || $opener->getNumDelims() < 3) { $useDelims = $closer->getNumDelims() <= $opener->getNumDelims() ? $closer->getNumDelims() : $opener->getNumDelims(); } else { $useDelims = $closer->getNumDelims() % 2 === 0 ? 2 : 1; } /** @var Text $openerInline */ $openerInline = $inlines->get($opener->getPos()); /** @var Text $closerInline */ $closerInline = $inlines->get($closer->getPos()); // Remove used delimiters from stack elts and inlines $opener->setNumDelims($opener->getNumDelims() - $useDelims); $closer->setNumDelims($closer->getNumDelims() - $useDelims); $openerInline->setContent(substr($openerInline->getContent(), 0, -$useDelims)); $closerInline->setContent(substr($closerInline->getContent(), 0, -$useDelims)); // Build contents for new emph element $start = $opener->getPos() + 1; $contents = $inlines->slice($start, $closer->getPos() - $start); $contents = array_filter($contents); if ($useDelims === 1) { $emph = new Emphasis($contents); } else { $emph = new Strong($contents); } // Insert into list of inlines $inlines->set($opener->getPos() + 1, $emph); for ($i = $opener->getPos() + 2; $i < $closer->getPos(); $i++) { $inlines->set($i, null); } // Remove elts btw opener and closer in delimiters stack $tempStack = $closer->getPrevious(); while ($tempStack !== null && $tempStack !== $opener) { $nextStack = $tempStack->getPrevious(); $stack->removeDelimiter($tempStack); $tempStack = $nextStack; } // If opener has 0 delims, remove it and the inline if ($opener->getNumDelims() === 0) { $inlines->set($opener->getPos(), null); $stack->removeDelimiter($opener); } if ($closer->getNumDelims() === 0) { $inlines->set($closer->getPos(), null); $tempStack = $closer->getNext(); $stack->removeDelimiter($closer); return $tempStack; } return $closer; }; // Process the emphasis characters $delimiterStack->iterateByCharacters(['_', '*'], $callback, $stackBottom); // Remove gaps $inlines->removeGaps(); // Remove all delimiters $delimiterStack->removeAll($stackBottom); }
public function processInlines(DelimiterStack $delimiterStack, Delimiter $stackBottom = null) { $callback = function (Delimiter $opener, Delimiter $closer, DelimiterStack $stack) { // Calculate actual number of delimiters used from this closer if ($closer->getNumDelims() < 3 || $opener->getNumDelims() < 3) { $useDelims = $closer->getNumDelims() <= $opener->getNumDelims() ? $closer->getNumDelims() : $opener->getNumDelims(); } else { $useDelims = $closer->getNumDelims() % 2 === 0 ? 2 : 1; } /** @var Text $openerInline */ $openerInline = $opener->getInlineNode(); /** @var Text $closerInline */ $closerInline = $closer->getInlineNode(); // Remove used delimiters from stack elts and inlines $opener->setNumDelims($opener->getNumDelims() - $useDelims); $closer->setNumDelims($closer->getNumDelims() - $useDelims); $openerInline->setContent(substr($openerInline->getContent(), 0, -$useDelims)); $closerInline->setContent(substr($closerInline->getContent(), 0, -$useDelims)); // Build contents for new emph element if ($useDelims === 1 && $openerInline->data['emphasis_config']->getConfig('enable_em')) { $emph = new Emphasis(); } elseif ($useDelims > 1 && $openerInline->data['emphasis_config']->getConfig('enable_strong')) { $emph = new Strong(); } else { return $closer->getNext(); } $openerInline->insertAfter($emph); while (($node = $emph->next()) !== $closerInline) { $emph->appendChild($node); } // Remove elts btw opener and closer in delimiters stack $tempStack = $closer->getPrevious(); while ($tempStack !== null && $tempStack !== $opener) { $nextStack = $tempStack->getPrevious(); $stack->removeDelimiter($tempStack); $tempStack = $nextStack; } // If opener has 0 delims, remove it and the inline if ($opener->getNumDelims() === 0) { $openerInline->detach(); $stack->removeDelimiter($opener); } if ($closer->getNumDelims() === 0) { $closerInline->detach(); $tempStack = $closer->getNext(); $stack->removeDelimiter($closer); return $tempStack; } return $closer; }; // Process the emphasis characters $delimiterStack->iterateByCharacters(['_', '*'], $callback, $stackBottom); }
public function processInlines(DelimiterStack $delimiterStack, Delimiter $stackBottom = null) { $callback = function (Delimiter $opener, Delimiter $closer) { // Open quote $openerInline = $opener->getInlineNode(); $openerInline->setContent($openerInline->getContent() === '“' ? '“' : '‘'); // Close quote $closerInline = $closer->getInlineNode(); $closerInline->setContent($closerInline->getContent() === '“' ? '”' : '’'); return $closer->getNext(); }; // Process the emphasis characters $delimiterStack->iterateByCharacters(['“', '’'], $callback, $stackBottom); }
public function processInlines(DelimiterStack $delimiterStack, Delimiter $stackBottom = null) { $delimiter = $delimiterStack->getTop(); while ($delimiter !== null) { $node = $delimiter->getInlineNode(); if (!$node instanceof InlineAttributes) { $delimiter = $delimiter->getPrevious(); continue; } if ($node->isBlock()) { $target = $node->parent(); if (($parent = $target->parent()) instanceof ListItem && $parent->parent() instanceof ListBlock && $parent->parent()->isTight()) { $target = $parent; } } else { $target = $node->previous(); } $target->data['attributes'] = AttributesUtils::merge($node->getAttributes(), $target); $node->detach(); $delimiter = $delimiter->getPrevious(); } }