CodeColorer Plugin unter PHP 7 nutzen

Mit dem Wechsel von PHP 5.6 auf PHP 7 sind leider auch ein paar altgediente Plugins bei mir kaputt gegangen. Eines davon ist das CodeColorer-Plugin, das ich für das Syntax-Highlighting im Blog verwende.

Um das Plugin unter PHP 7 wieder lauffähig zu bekommen, gehen wir in die Datei "./codecolorer-core.php". Dort müssen drei kleinere Änderungen vorgenommen werden, da das Plugin noch den "/e"-Modificator in preg_replace()-Aufrufen verwendet, der inzwischen entfernt worden ist.

Als erstes suchen wir die Funktion "BeforeHighlightCodeBlock" und ersetzen sie durch diese neue Fassung:

1
2
3
4
5
6
  function BeforeHighlightCodeBlock($content) {
    $content = preg_replace_callback('#(\s*)\[cc([^\s\]_]*(?:_[^\s\]]*)?)([^\]]*)\](.*?)\[/cc\2\](\s*)#si', function ($params) { return $this->PerformHighlightCodeBlock($params[4], $params[3], $content, $params[2], $params[1], $params[5]); }, $content);
    $content = preg_replace_callback('#(\s*)\<code(.*?)\>(.*?)\</code\>(\s*)#si', function ($params) { return $this->PerformHighlightCodeBlock($params[3], $params[2], $content, '', $params[1], $params[4]); }, $content);

    return $content;
  }

Als nächstes suchen wir die Funktion "BeforeProtectComment" und ersetzen diese durch folgende neue Fassung:

1
2
3
4
5
6
  function BeforeProtectComment($content) {
    $content = preg_replace_callback('#(\s*)(\[cc[^\s\]_]*(?:_[^\s\]]*)?[^\]]*\].*?\[/cc\1\])(\s*)#si', function ($params) { return $this->PerformProtectComment($params[2], $content, $params[1], $params[3]); }, $content);
    $content = preg_replace_callback('#(\s*)(\<code.*?\>.*?\</code\>)(\s*)#si', function ($params) { return $this->PerformProtectComment($params[2], $content, $params[1], $params[3]); }, $content);

    return $content;
  }

Abschließend gehen wir noch in die Funktion "PerformHighlightCodeBlock". Hier ersetzen wir einen einzelnen if-Block durch eine neue Fassung:

1
2
3
4
5
6
7
8
9
    // ...

    if ($options['escaped']) {
      $text = html_entity_decode($text, ENT_QUOTES);
      $text = preg_replace_callback('~&#x0*([0-9a-f]+);~i', function ($params) { return chr(hexdec($params[1])); }, $text);
      $text = preg_replace_callback('~&#0*([0-9]+);~', function ($params) { return chr($params[1]); }, $text);
    }

    // ...

Voila! Schon sollte das Plugin auch unter PHP 7 wieder funktionieren, wie am ersten Tag.

Reparierte Grüße, Kenny

P.S.: Ja, mir ist bekannt, dass das Plugin inzwischen bereits ziemlich outdated ist. Da ich allerdings aktuell an einem größeren Umbau werkele, lohnt sich ein Wechsel auf ein neues Syntax-Highlighting-Plugin im Moment einfach nicht. :D