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. 😀

Schreibe einen Kommentar

Um Ihnen beim weiteren Kommentieren auf dieser Webseite die erneute Eingabe Ihrer Daten zu ersparen, wird beim Absenden Ihres Kommentars ein Cookie an Ihren Browser gesendet und von diesem gespeichert. Mit dem Absenden eines Kommentars auf dieser Webseite stimmen Sie der Speicherung und Übertragung dieses Cookies explizit zu.

Pflichtfelder sind mit * markiert.