[ Index ]

PHP Cross Reference of DokuWiki

title

Body

[close]

/inc/Parsing/ParserMode/ -> Acronym.php (source)

   1  <?php
   2  
   3  namespace dokuwiki\Parsing\ParserMode;
   4  
   5  class Acronym extends AbstractMode
   6  {
   7      // A list
   8      protected $acronyms = [];
   9      protected $pattern = '';
  10  
  11      /**
  12       * Acronym constructor.
  13       *
  14       * @param string[] $acronyms
  15       */
  16      public function __construct($acronyms)
  17      {
  18          usort($acronyms, [$this, 'compare']);
  19          $this->acronyms = $acronyms;
  20      }
  21  
  22      /** @inheritdoc */
  23      public function preConnect()
  24      {
  25          if (!count($this->acronyms)) return;
  26  
  27          $bound = '[\x00-\x2f\x3a-\x40\x5b-\x60\x7b-\x7f]';
  28          $acronyms = array_map(['\\dokuwiki\\Parsing\\Lexer\\Lexer', 'escape'], $this->acronyms);
  29          $this->pattern = '(?<=^|' . $bound . ')(?:' . implode('|', $acronyms) . ')(?=' . $bound . ')';
  30      }
  31  
  32      /** @inheritdoc */
  33      public function connectTo($mode)
  34      {
  35          if (!count($this->acronyms)) return;
  36  
  37          if (strlen($this->pattern) > 0) {
  38              $this->Lexer->addSpecialPattern($this->pattern, $mode, 'acronym');
  39          }
  40      }
  41  
  42      /** @inheritdoc */
  43      public function getSort()
  44      {
  45          return 240;
  46      }
  47  
  48      /**
  49       * sort callback to order by string length descending
  50       *
  51       * @param string $a
  52       * @param string $b
  53       *
  54       * @return int
  55       */
  56      protected function compare($a, $b)
  57      {
  58          $a_len = strlen($a);
  59          $b_len = strlen($b);
  60          if ($a_len > $b_len) {
  61              return -1;
  62          } elseif ($a_len < $b_len) {
  63              return 1;
  64          }
  65  
  66          return 0;
  67      }
  68  }