Warum erkennt Rouge bestimmte neuere Programmiersprachen nicht und wie fügt man einen Lexer hinzu?

Melden

Rouge ist ein in Ruby geschriebener Syntax-Highlighter, der häufig in statischen Seitengeneratoren wie Jekyll (für GitHub Pages) oder in GitLab verwendet wird.

Dass Rouge bestimmte neuere Programmiersprachen nicht erkennt, liegt meist an einem der folgenden Gründe:

Warum erkennt Rouge eine Sprache nicht?

  1. Entwicklungszyklus: Rouge ist ein Community-Projekt. Neue Sprachen müssen von Freiwilligen manuell als „Lexer“ implementiert werden. Wenn eine Sprache sehr neu oder wenig verbreitet ist, hat sich schlichtweg noch niemand gefunden, der den Lexer geschrieben hat.
  2. Veraltete Version: Möglicherweise ist die Sprache in der neuesten Version von Rouge bereits enthalten, aber deine lokale Umgebung (oder die Umgebung deines Hosters wie GitHub Pages) verwendet eine ältere Version des Ruby-Gems.
  3. Fehlender Alias: Manchmal kennt Rouge die Sprache, aber nicht unter dem Kürzel, das du verwendest (z.B. rs statt rust).

Wie fügt man einen Lexer hinzu?

Wenn du eine Sprache vermisst, hast du zwei Möglichkeiten: Einen Lexer lokal in deinem Projekt hinzufügen oder ihn offiziell zum Rouge-Repository beisteuern.

Hier ist die technische Anleitung, wie man einen Lexer erstellt:

1. Die Grundstruktur eines Lexers

Ein Lexer in Rouge ist eine Ruby-Klasse, die von Rouge::RegexLexer erbt. Er verwendet reguläre Ausdrücke, um den Text in Tokens (Schlüsselwörter, Strings, Kommentare etc.) zu zerlegen.

Erstelle eine Datei, z. B. my_new_lang.rb:

require 'rouge'

module Rouge
  module Lexers
    class MyNewLang < RegexLexer
      title "MyNewLang"
      desc "Beschreibung meiner neuen Sprache"
      tag 'mynewlang' # Das ist das Kürzel für die Code-Blocks (z.B. ```mynewlang)
      filenames '*.mnl'
      mimetypes 'text/x-mynewlang'

      # Definition der Tokens
      state :root do
        rule %r/\s+/, Text
        rule %r/(\/\/|#).*/, Comment::Single
        rule %r/[a-zA-Z_][a-zA-Z0-9_]*/ do |m|
          if %w(if else for return).include?(m[0])
            token Keyword
          else
            token Name
          end
        end
        rule %r/\d+/, Num::Integer
        rule %r/"/, Str, :string
      end

      state :string do
        rule %r/[^"]+/, Str
        rule %r/"/, Str, :pop!
      end
    end
  end
end

2. Den Lexer registrieren

Damit Rouge den Lexer erkennt, muss er registriert werden. Wenn du Rouge als Bibliothek in einem Ruby-Skript nutzt, musst du die Datei einfach requiren.

require_relative 'my_new_lang'
# Jetzt kannst du ihn nutzen:
lexer = Rouge::Lexers::MyNewLang.new

3. Integration in Jekyll (falls zutreffend)

Wenn du Jekyll nutzt, ist es etwas schwieriger, da Jekyll die Gems intern lädt.

  1. Erstelle einen Ordner _plugins in deinem Jekyll-Verzeichnis.
  2. Lege dort eine Ruby-Datei (z.B. custom_lexer.rb) ab und füge den oben genannten Code ein. Jekyll lädt alle Dateien in _plugins beim Start automatisch.

4. Offizieller Beitrag (Pull Request)

Wenn du möchtest, dass die Sprache dauerhaft und für alle verfügbar ist:

  1. Forke das Rouge Repository auf GitHub.
  2. Schau dir vorhandene Lexer im Ordner lib/rouge/lexers/ an, um dich an deren Struktur zu orientieren.
  3. Füge deinen Lexer hinzu.
  4. Schreibe einen Testfall in spec/lexers/....
  5. Erstelle einen Pull Request.

Zusammenfassung: Was tun?

  • Prüfen: Führe gem update rouge aus, um zu sehen, ob die Sprache in der neuesten Version (aktuell meist v4.x) bereits existiert.
  • Liste einsehen: Mit rougify list auf der Kommandozeile siehst du alle unterstützten Sprachen deiner installierten Version.
  • Workaround: Wenn du nicht selbst programmieren willst, kannst du für neuere Sprachen oft einen Lexer einer ähnlichen Sprache als Alias verwenden (z.B. c für eine Sprache, die C-ähnlich aussieht).
0