[ Index ]

PHP Cross Reference of DokuWiki

title

Body

[close]

/inc/Parsing/Handler/ -> Quote.php (source)

   1  <?php
   2  
   3  namespace dokuwiki\Parsing\Handler;
   4  
   5  class Quote extends AbstractRewriter
   6  {
   7      protected $quoteCalls = [];
   8  
   9      /** @inheritdoc */
  10      public function finalise()
  11      {
  12          $last_call = end($this->calls);
  13          $this->writeCall(['quote_end', [], $last_call[2]]);
  14  
  15          $this->process();
  16          $this->callWriter->finalise();
  17          unset($this->callWriter);
  18      }
  19  
  20      /** @inheritdoc */
  21      public function process()
  22      {
  23  
  24          $quoteDepth = 1;
  25  
  26          foreach ($this->calls as $call) {
  27              switch ($call[0]) {
  28  
  29                  /** @noinspection PhpMissingBreakStatementInspection */
  30                  case 'quote_start':
  31                      $this->quoteCalls[] = ['quote_open', [], $call[2]];
  32                      // fallthrough
  33                  case 'quote_newline':
  34                      $quoteLength = $this->getDepth($call[1][0]);
  35  
  36                      if ($quoteLength > $quoteDepth) {
  37                          $quoteDiff = $quoteLength - $quoteDepth;
  38                          for ($i = 1; $i <= $quoteDiff; $i++) {
  39                              $this->quoteCalls[] = ['quote_open', [], $call[2]];
  40                          }
  41                      } elseif ($quoteLength < $quoteDepth) {
  42                          $quoteDiff = $quoteDepth - $quoteLength;
  43                          for ($i = 1; $i <= $quoteDiff; $i++) {
  44                              $this->quoteCalls[] = ['quote_close', [], $call[2]];
  45                          }
  46                      } elseif ($call[0] != 'quote_start') {
  47                          $this->quoteCalls[] = ['linebreak', [], $call[2]];
  48                      }
  49  
  50                      $quoteDepth = $quoteLength;
  51  
  52                      break;
  53  
  54                  case 'quote_end':
  55                      if ($quoteDepth > 1) {
  56                          $quoteDiff = $quoteDepth - 1;
  57                          for ($i = 1; $i <= $quoteDiff; $i++) {
  58                              $this->quoteCalls[] = ['quote_close', [], $call[2]];
  59                          }
  60                      }
  61  
  62                      $this->quoteCalls[] = ['quote_close', [], $call[2]];
  63  
  64                      $this->callWriter->writeCalls($this->quoteCalls);
  65                      break;
  66  
  67                  default:
  68                      $this->quoteCalls[] = $call;
  69                      break;
  70              }
  71          }
  72  
  73          return $this->callWriter;
  74      }
  75  
  76      /**
  77       * @param string $marker
  78       * @return int
  79       */
  80      protected function getDepth($marker)
  81      {
  82          preg_match('/>{1,}/', $marker, $matches);
  83          $quoteLength = strlen($matches[0]);
  84          return $quoteLength;
  85      }
  86  }