コード例 #1
0
 public function processDocument(Document $document)
 {
     $walker = $document->walker();
     while ($event = $walker->next()) {
         $node = $event->getNode();
         if ($event->isEntering() || !$node instanceof Attributes) {
             continue;
         }
         list($target, $direction) = $this->findTargetAndDirection($node);
         if ($target) {
             if (($parent = $target->parent()) instanceof ListItem && $parent->parent() instanceof ListBlock && $parent->parent()->isTight()) {
                 $target = $parent;
             }
             if ($direction === self::DIRECTION_SUFFIX) {
                 $attributes = AttributesUtils::merge($target, $node->getAttributes());
             } else {
                 $attributes = AttributesUtils::merge($node->getAttributes(), $target);
             }
             $target->data['attributes'] = $attributes;
         }
         if ($node instanceof AbstractBlock && $node->endsWithBlankLine() && $node->next() && $node->previous()) {
             $node->previous()->setLastLineBlank(true);
         }
         $node->detach();
     }
 }
コード例 #2
0
 private function applyAttributes(AbstractBlock $block)
 {
     $previous = null;
     $prepend = null;
     foreach ($block->getChildren() as $key => $child) {
         if ($child instanceof Attributes) {
             if ($child->isPrepend()) {
                 $prepend = $child;
             } elseif ($child->isAppend()) {
                 $previous->data['attributes'] = AttributesUtils::merge($previous ?: $block, $child->getAttributes());
             }
             $block->removeChild($child);
         } else {
             if (isset($prepend)) {
                 $child->data['attributes'] = AttributesUtils::merge($child, $prepend->getAttributes());
             }
             $prepend = null;
             $this->applyAttributes($child);
             $previous = $child;
         }
     }
     if (isset($prepend)) {
         $block->data['attributes'] = AttributesUtils::merge($block, $prepend->getAttributes());
     }
     return $block;
 }
 public function processInlines(ArrayCollection $inlines, DelimiterStack $delimiterStack, Delimiter $stackBottom = null)
 {
     $previous = null;
     foreach ($inlines as $key => $inline) {
         if (!$inline instanceof InlineAttributes) {
             $previous = $inline;
             continue;
         }
         $inlines->remove($key);
         if (0 === count($inline->getAttributes())) {
             continue;
         }
         $node = null;
         if ($inline->isBlock()) {
             foreach (debug_backtrace(false) as $trace) {
                 if ('League\\CommonMark\\DocParser' === $trace['class'] && 'processInlines' === $trace['function']) {
                     $node = $trace['args'][1];
                     break;
                 }
             }
             if ($node->getParent() instanceof ListItem && $node->getParent()->getParent()->isTight()) {
                 $node = $node->getParent();
             }
         } elseif ($previous) {
             $node = $previous;
         }
         if ($node) {
             $node->data['attributes'] = AttributesUtils::merge($node, $inline->getAttributes());
         }
     }
 }
 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();
     }
 }