Pygments - Python Syntax Highlighter

Stellt hier eure Projekte vor.
Internetseiten, Skripte, und alles andere bzgl. Python.
mitsuhiko
User
Beiträge: 1790
Registriert: Donnerstag 28. Oktober 2004, 16:33
Wohnort: Graz, Steiermark - Österreich
Kontaktdaten:

In den letzten eineinhalb Monaten hat das Pocoo Team unter der Leitung von birkenfeld an einem neuen Modul für Python mit dem Namen pygments gearbeitet. Es stellt Lexer zum highlighten von Quellcode für einige Programmier/Markup/Template Sprachen zur Verfügung.

Heute erschien die erste^Wzweite öffentliche Version von pygments.

Verwenden kann man es so:

Code: Alles auswählen

from pygments import highlight
from pygments.lexers import PythonLexer
from pygments.formatters import HtmlFormatter

code = 'print "Hello World"'
print highlight(code, PythonLexer(), HtmlFormatter())
Genauere Informationen gibt es in der Dokumentation und auf der Webseite. Dort gibts auch eine Demo Sektion zum ausprobieren.
Diese aber bitte nicht als pastebin verwenden, dazu gibts http://lodgeit.lucumr.pocoo.org/ und http://paste.e-scribe.com/
Die nutzen beide pygments.

Viel Spaß :D
TUFKAB – the user formerly known as blackbird
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Könnte man eines dieser Pastebins nicht verwenden und die Paste-Einträge im Wiki löschen/umziehen?

PS: Das ich Pygments super finde, weißt du ja sowieso :)
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
mitsuhiko
User
Beiträge: 1790
Registriert: Donnerstag 28. Oktober 2004, 16:33
Wohnort: Graz, Steiermark - Österreich
Kontaktdaten:

Leonidas hat geschrieben:Könnte man eines dieser Pastebins nicht verwenden und die Paste-Einträge im Wiki löschen/umziehen?
Schreib ein script zum übernehmen und ändere den Link :D
TUFKAB – the user formerly known as blackbird
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

blackbird hat geschrieben:Schreib ein script zum übernehmen und ändere den Link :D
Das Skript sollte kein Problem sein, stellt sich nur die Frage ob die Snippets überhaupt noch nötig sind. Meist sind sie ja für den Gebrauch im IRC gedacht gewesen und da ist es dann recht egal ob es sie gibt oder nicht.

Was meinst du?
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Y0Gi
User
Beiträge: 1454
Registriert: Freitag 22. September 2006, 23:05
Wohnort: ja

Habe es noch unter dem Namen PyKleur in meinen Bookmarks für spätere Betrachtung. Momentan verwende ich auf meiner Site den experimentellen Highlighter von Fredrik Lundh, allerdings ist der nur auf Python-Code beschränkt. Eine von JavaScript abhängige Lösung, wie sie die Sites von etwa CherryPy, TurboGears und mit pudge erzeugte Docs verwenden, gefällt mir nicht, da es ohne JS einfach unbrauchbar ist. Von daher kann ich mir gut vorstellen, in naher Zukunft Pygments einzusetzen :) Danke dafür an dieser Stelle.
mitsuhiko
User
Beiträge: 1790
Registriert: Donnerstag 28. Oktober 2004, 16:33
Wohnort: Graz, Steiermark - Österreich
Kontaktdaten:

Y0Gi hat geschrieben:Eine von JavaScript abhängige Lösung, wie sie die Sites von etwa CherryPy, TurboGears und mit pudge erzeugte Docs verwenden, gefällt mir nicht, da es ohne JS einfach unbrauchbar ist.
Der Meinung ist auch Ben von pylons. Er will die pylons docs in Zukunft mit pygments highlighten lassen.
TUFKAB – the user formerly known as blackbird
Y0Gi
User
Beiträge: 1454
Registriert: Freitag 22. September 2006, 23:05
Wohnort: ja

Nach dem Überfliegen der vorhandenen Lexer habe ich keine für folgende Formatierungen gefunden, würde sie aber begrüßen: CSV, JSON, YAML, TCL und Bash/Shell.

Man könnte auch überlegen, Formate wie (etwa Apache-)Logfiles oder iptables-Regeln aufzunehmen.

Vielleicht kann man sich auch von den vorhandenen Lexern inspirieren lassen, die SciTE mitliefert.

P.S.: Ist der Output vom HtmlFormatter auch XHTML-konform?
Y0Gi
User
Beiträge: 1454
Registriert: Freitag 22. September 2006, 23:05
Wohnort: ja

Update: Ich habe die Integration von Pygments in meine Site nun so gut wie abgeschlossen. Mich stören einige Punkte (insbesondere im Vergleich zum code colorizer von Fredrik Lundh, den ich bisher benutzte und der nur Python-Code highlighten kann):
- Es wird kein Gebrauch vom <code>-Element gemacht, obwohl es hier definitiv angebracht ist.
- Werden Zeilennummern angefordert, wird unschönerweise eine Tabelle (aber dann sematisch falsch, weil die Zeilennummern alle in einer Zelle stecken) ausgegeben; das geht auch ohne.
- Das helle Lila für Keywords geht mal gar nicht :wink:

Ansonsten: Gute Arbeit, auch sehr schöne API.

Update: Und noch eines, aber das ist wirklich gravierend: Die Leerzeilen im Inhalt (also nicht die davor und dahinter), mit Ausnahme solcher in Python-Multiline-Strings, sind verschwunden! Damit wird der Code unleserlich, das geht so nicht :x

Update 2: An den Lexern liegt es nicht und auch alle Formatter bis auf den HtmlFormatter berücksichtigen die Leerzeilen.

Update 3: Scheinbar liegt es auch nicht am HtmlFormatter, Debug-Ausgaben in selbigem haben das nicht bestätigt. Vielmehr ist Genshi der Übeltäter. Das Problem ist seit etwa drei Wochen bekannt (bzw. existiert ein Ticket). Dazu habe ich einen Kommentar hinzugefügt. Sorry für den falschen Alarm.
Benutzeravatar
birkenfeld
Python-Forum Veteran
Beiträge: 1603
Registriert: Montag 20. März 2006, 15:29
Wohnort: Die aufstrebende Universitätsstadt bei München

Y0Gi hat geschrieben:Update: Ich habe die Integration von Pygments in meine Site nun so gut wie abgeschlossen. Mich stören einige Punkte (insbesondere im Vergleich zum code colorizer von Fredrik Lundh, den ich bisher benutzte und der nur Python-Code highlighten kann):
- Es wird kein Gebrauch vom <code>-Element gemacht, obwohl es hier definitiv angebracht ist.
Welchen Vorteil hat <code> vor <pre>? Ja, es ist semantisch vielleicht richtiger, aber das wars auch.
- Werden Zeilennummern angefordert, wird unschönerweise eine Tabelle (aber dann sematisch falsch, weil die Zeilennummern alle in einer Zelle stecken) ausgegeben; das geht auch ohne.
Dein Vorschlag wäre? (nein, ein float geht z.B. nicht, genausowenig, die Zeilennummern direkt in das <pre> zu setzen, denn damit ist copy-and-paste im Eimer, genauso wie bei Einzelzellen für jede Zeile.)
- Das helle Lila für Keywords geht mal gar nicht :wink:
man styles.

Übrigens: Bugreports und Verbesserungsvorschläge gehören nicht (nur) in ein Forum, sondern ins Pocoo-Trac http://trac.pocoo.org, denn da lese ich sie auch sicher.

Ansonsten danke fürs Feedback!
Benutzeravatar
Rebecca
User
Beiträge: 1662
Registriert: Freitag 3. Februar 2006, 12:28
Wohnort: DN, Heimat: HB
Kontaktdaten:

birkenfeld hat geschrieben:Welchen Vorteil hat <code> vor <pre>? Ja, es ist semantisch vielleicht richtiger, aber das wars auch.
Fuer Screenreader ist die "richtige" Verwendung der Tags durchaus wichtig.
Y0Gi
User
Beiträge: 1454
Registriert: Freitag 22. September 2006, 23:05
Wohnort: ja

birkenfeld hat geschrieben:Welchen Vorteil hat <code> vor <pre>? Ja, es ist semantisch vielleicht richtiger, aber das wars auch.
Nicht anstelle von <pre> - das hat ja durch seine standardmäßige Formatierung in Browsern seine Berechtigung (auch wenn die CSS-Eigenschaft "white-space: pre;" das nachbilden kann) - sondern anstelle des <div>.
birkenfeld hat geschrieben:Dein Vorschlag wäre? (nein, ein float geht z.B. nicht, genausowenig, die Zeilennummern direkt in das <pre> zu setzen, denn damit ist copy-and-paste im Eimer, genauso wie bei Einzelzellen für jede Zeile.)
So wie das hier es eben löst. Eine weitere Möglichkeit wäre die Art, in der pudge Code formatiert.
birkenfeld hat geschrieben:Übrigens: Bugreports und Verbesserungsvorschläge gehören nicht (nur) in ein Forum, sondern ins Pocoo-Trac http://trac.pocoo.org, denn da lese ich sie auch sicher.
Ich habe es vorgezogen, zunächst hier die Diskussion anzustoßen - wo hier schon mal ein Thread extra für Pygments erstellt wurde.
Benutzeravatar
birkenfeld
Python-Forum Veteran
Beiträge: 1603
Registriert: Montag 20. März 2006, 15:29
Wohnort: Die aufstrebende Universitätsstadt bei München

Y0Gi hat geschrieben:
birkenfeld hat geschrieben:Welchen Vorteil hat <code> vor <pre>? Ja, es ist semantisch vielleicht richtiger, aber das wars auch.
Nicht anstelle von <pre> - das hat ja durch seine standardmäßige Formatierung in Browsern seine Berechtigung (auch wenn die CSS-Eigenschaft "white-space: pre;" das nachbilden kann) - sondern anstelle des <div>.
Ist <code> eigentlich nicht ein Inline-Tag?
birkenfeld hat geschrieben:Dein Vorschlag wäre? (nein, ein float geht z.B. nicht, genausowenig, die Zeilennummern direkt in das <pre> zu setzen, denn damit ist copy-and-paste im Eimer, genauso wie bei Einzelzellen für jede Zeile.)
So wie das hier es eben löst. Eine weitere Möglichkeit wäre die Art, in der pudge Code formatiert.
Kannst du das vielleicht auch näher ausführen? Ich habe keine Lust, mich durch den Code zu wühlen.
Zuletzt geändert von birkenfeld am Donnerstag 2. November 2006, 17:26, insgesamt 1-mal geändert.
mitsuhiko
User
Beiträge: 1790
Registriert: Donnerstag 28. Oktober 2004, 16:33
Wohnort: Graz, Steiermark - Österreich
Kontaktdaten:

Y0Gi hat geschrieben: - Es wird kein Gebrauch vom <code>-Element gemacht, obwohl es hier definitiv angebracht ist.
<code> ist inline, <pre> ist ein Block. Wenn dann schon <listing>, aber das ist deprecated.
- Werden Zeilennummern angefordert, wird unschönerweise eine Tabelle (aber dann sematisch falsch, weil die Zeilennummern alle in einer Zelle stecken) ausgegeben; das geht auch ohne.
nicht ohne copy/paste zu ruinieren.
- Das helle Lila für Keywords geht mal gar nicht :wink:
http://pygments.pocoo.org/docs/styles/
TUFKAB – the user formerly known as blackbird
mitsuhiko
User
Beiträge: 1790
Registriert: Donnerstag 28. Oktober 2004, 16:33
Wohnort: Graz, Steiermark - Österreich
Kontaktdaten:

Y0Gi hat geschrieben:
birkenfeld hat geschrieben:Welchen Vorteil hat <code> vor <pre>? Ja, es ist semantisch vielleicht richtiger, aber das wars auch.
Nicht anstelle von <pre> - das hat ja durch seine standardmäßige Formatierung in Browsern seine Berechtigung (auch wenn die CSS-Eigenschaft "white-space: pre;" das nachbilden kann) - sondern anstelle des <div>.
Uuuuuh. Ganz böse. Innerhalb von <code> dürfen nur inline Elemente vorkommen, weder <pre> noch <table> sind das.
birkenfeld hat geschrieben:Dein Vorschlag wäre? (nein, ein float geht z.B. nicht, genausowenig, die Zeilennummern direkt in das <pre> zu setzen, denn damit ist copy-and-paste im Eimer, genauso wie bei Einzelzellen für jede Zeile.)
So wie das hier es eben löst. Eine weitere Möglichkeit wäre die Art, in der pudge Code formatiert.
Das macht copy/paste kaputt.
TUFKAB – the user formerly known as blackbird
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Y0Gi hat geschrieben:
birkenfeld hat geschrieben:Welchen Vorteil hat <code> vor <pre>? Ja, es ist semantisch vielleicht richtiger, aber das wars auch.
Nicht anstelle von <pre> - das hat ja durch seine standardmäßige Formatierung in Browsern seine Berechtigung (auch wenn die CSS-Eigenschaft "white-space: pre;" das nachbilden kann) - sondern anstelle des <div>.
Kann es sein, das "white-space: pre;" oder auch irgendwas mit nowrap nicht im IE 6 geht?
Irgend so ein Problem ist beim PyLucid's altem Python-Only-Syntaxhightligter vorgekommen...

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Y0Gi
User
Beiträge: 1454
Registriert: Freitag 22. September 2006, 23:05
Wohnort: ja

blackbird hat geschrieben:<code> ist inline, <pre> ist ein Block. Wenn dann schon <listing>, aber das ist deprecated.
blackbird hat geschrieben:Uuuuuh. Ganz böse. Innerhalb von <code> dürfen nur inline Elemente vorkommen, weder <pre> noch <table> sind das.
Bleiben immer noch mindestens zwei Optionen:
- <code> mit "white-space: pre;"
- <code> innerhalb von <pre> (und nicht umgekehrt, was ich aber auch nicht meinte), was erlaubt ist

Was <table> angeht: Da Pygments AFAIK nur eine Zeile und zwei Zellen verwendet, lässt sich der Inhalt der zweiten Zelle in <code> einschließen. Würde natürlich nicht mehr funktionieren, wenn man der Semantik halbwegs Respekt zollt und jede Codezeile in einer eigenen Tabellenzeile unterbringt, aber dann dürfte im Folgenden genanntes Copy/Paste auch nicht mehr funktionieren.
blackbird hat geschrieben:nicht ohne copy/paste zu ruinieren.
Ok, das ist ein Grund, der dagegen wiegt, aber eben genannte Einschränkungen erfordert.

jens: Im IE geht so einiges nicht. Wenn ich für jede solche Erfahrung in meinem Leben eine Mark bekommen hätte, könnte ich mir auch bald einen Flug ins Weltall leisten.
mitsuhiko
User
Beiträge: 1790
Registriert: Donnerstag 28. Oktober 2004, 16:33
Wohnort: Graz, Steiermark - Österreich
Kontaktdaten:

Sodale. Seit gestern ist Pygments 0.6 codename Zimtstern zum Download erhältlich :D
TUFKAB – the user formerly known as blackbird
sape
User
Beiträge: 1157
Registriert: Sonntag 3. September 2006, 12:52

Zimtstern? Wie Zimt und Stern? :D

Ist das eigentlich auch als "offline" Tool benutzbar bzw. generiert es nur ausschließlich HTML Output oder lässt sich das ganze anpassen das auch anderer Output als HTML generiert wird?

lg
rafael
User
Beiträge: 189
Registriert: Mittwoch 26. Juli 2006, 16:13

sape hat geschrieben:Zimtstern? Wie Zimt und Stern? :D

Ist das eigentlich auch als "offline" Tool benutzbar bzw. generiert es nur ausschließlich HTML Output oder lässt sich das ganze anpassen das auch anderer Output als HTML generiert wird?

lg
Ja, man kann das auch per "pygmentize" in der Konsole laufen lassen und man kriegt dann halt dort den Output.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

rafael hat geschrieben:Ja, man kann das auch per "pygmentize" in der Konsole laufen lassen und man kriegt dann halt dort den Output.
Mann kann sich den Output auch in eine Datei schreiben lassen und außerdem kann man als Ausgabeformat auch LaTeX, RTF, ANSI-Kontrollsequenzen wählen.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Antworten