]> git.cameronkatri.com Git - cgit.git/blobdiff - filters/syntax-highlighting.py
ui-shared: pass repo object to print_snapshot_links()
[cgit.git] / filters / syntax-highlighting.py
index 72d9097160e0bf69e853f98ad084b77322a906ec..e912594c48a71fce1baffb11149ab9b72cc223d4 100755 (executable)
@@ -1,13 +1,16 @@
 #!/usr/bin/env python3
 
-# This script uses Pygments and Python3. You must have both installed for this to work.
+# This script uses Pygments and Python3. You must have both installed
+# for this to work.
+#
 # http://pygments.org/
 # http://python.org/
 #
-# It may be used with the source-filter or repo.source-filter settings in cgitrc.
+# It may be used with the source-filter or repo.source-filter settings
+# in cgitrc.
 #
-# The following environment variables can be used to retrieve the configuration
-# of the repository for which this script is called:
+# The following environment variables can be used to retrieve the
+# configuration of the repository for which this script is called:
 # CGIT_REPO_URL        ( = repo.url       setting )
 # CGIT_REPO_NAME       ( = repo.name      setting )
 # CGIT_REPO_PATH       ( = repo.path      setting )
 
 
 import sys
-import cgi
-import codecs
-from pygments.lexers import get_lexer_for_filename
+import io
 from pygments import highlight
+from pygments.util import ClassNotFound
+from pygments.lexers import TextLexer
+from pygments.lexers import guess_lexer
+from pygments.lexers import guess_lexer_for_filename
 from pygments.formatters import HtmlFormatter
 
-sys.stdin = codecs.getreader("utf-8")(sys.stdin.detach())
-sys.stdout = codecs.getwriter("utf-8")(sys.stdout.detach())
-doc = sys.stdin.read()
+
+sys.stdin = io.TextIOWrapper(sys.stdin.buffer, encoding='utf-8', errors='replace')
+sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8', errors='replace')
+data = sys.stdin.read()
+filename = sys.argv[1]
+formatter = HtmlFormatter(style='pastie', nobackground=True)
+
 try:
-       lexer = get_lexer_for_filename(sys.argv[1])
-       formatter = HtmlFormatter(style='pastie')
-       sys.stdout.write("<style>")
-       sys.stdout.write(formatter.get_style_defs('.highlight'))
-       sys.stdout.write("</style>")
+       lexer = guess_lexer_for_filename(filename, data)
+except ClassNotFound:
+       # check if there is any shebang
+       if data[0:2] == '#!':
+               lexer = guess_lexer(data)
+       else:
+               lexer = TextLexer()
+except TypeError:
+       lexer = TextLexer()
 
-       highlight(doc, lexer, formatter, sys.stdout)
-except:
-       sys.stdout.write(str(cgi.escape(doc).encode("ascii", "xmlcharrefreplace"), "ascii"))
+# highlight! :-)
+# printout pygments' css definitions as well
+sys.stdout.write('<style>')
+sys.stdout.write(formatter.get_style_defs('.highlight'))
+sys.stdout.write('</style>')
+sys.stdout.write(highlight(data, lexer, formatter, outfile=None))