Warum erkennt Rouge bestimmte neuere Programmiersprachen nicht und wie fügt man einen Lexer hinzu?
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?
- 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.
- 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.
- Fehlender Alias: Manchmal kennt Rouge die Sprache, aber nicht unter dem Kürzel, das du verwendest (z.B.
rsstattrust).
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.
- Erstelle einen Ordner
_pluginsin deinem Jekyll-Verzeichnis. - 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_pluginsbeim Start automatisch.
4. Offizieller Beitrag (Pull Request)
Wenn du möchtest, dass die Sprache dauerhaft und für alle verfügbar ist:
- Forke das Rouge Repository auf GitHub.
- Schau dir vorhandene Lexer im Ordner
lib/rouge/lexers/an, um dich an deren Struktur zu orientieren. - Füge deinen Lexer hinzu.
- Schreibe einen Testfall in
spec/lexers/.... - Erstelle einen Pull Request.
Zusammenfassung: Was tun?
- Prüfen: Führe
gem update rougeaus, um zu sehen, ob die Sprache in der neuesten Version (aktuell meist v4.x) bereits existiert. - Liste einsehen: Mit
rougify listauf 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.
cfür eine Sprache, die C-ähnlich aussieht).