-#!/usr/bin/env ruby
-
-require 'linguist'
-require 'pygments'
-
-stdin = ARGF.file
-
-filename = stdin.readline.strip # Read first line (filename).
-contents = stdin.read # Read rest (code).
-
-class FakeBlob < Linguist::FileBlob
- def initialize(path, content, base_bath=nil)
- super(path, base_bath)
- @content = content
- end
-
- def data
- @content
- end
-
- def size
- @content.bytesize
- end
-end
-
-blob = FakeBlob.new(filename, contents)
-detected = if blob.language
- blob.language.name
- else
- "Text only"
- end
-
-# Debugging
-#puts "File #{filename}"
-#puts "Code:
-#{contents}"
-#print "Language: "
-#pp detected
-
-html = Pygments.highlight(contents,
- :lexer => detected,
- :formatter => 'html',
- :options => {
- :encoding => 'utf-8',
- :linenos => 'table',
- :lineanchors => 'loc',
- :anchorlinenos => true})
-
-puts html
+#!/usr/bin/env python3
+
+import pygments
+from pygments import highlight
+from pygments.formatters import HtmlFormatter
+from pygments.lexers import guess_lexer, guess_lexer_for_filename
+
+from sys import stdin, stderr
+
+filename = stdin.readline().strip()
+contents = stdin.read()
+
+lexer=None
+
+try:
+ lexer = guess_lexer_for_filename(filename, contents)
+except pygments.util.ClassNotFound:
+ try:
+ lexer = guess_lexer(contents)
+ except pygments.util.ClassNotFound:
+ pass
+
+if lexer is None:
+ from pygments.lexers import TextLexer
+ lexer = TextLexer()
+
+rendered = None
+if lexer.__class__ is pygments.lexers.MarkdownLexer:
+ from markdown import markdown
+ rendered = markdown(contents, extensions=[
+ 'codehilite',
+ 'extra',
+ 'sane_lists',
+ 'smarty',
+ 'pymdownx.tasklist'
+ ])
+
+FORMAT = HtmlFormatter(
+ style='murphy',
+ cssclass='highlight',
+ linenos='table',
+ lineanchors='loc',
+ anchorlinenos=True)
+
+if rendered:
+ print('<article class="markup markdown">')
+ print(rendered)
+ print('</article>')
+print('<div id="blob">')
+print(highlight(contents, lexer, FORMAT))
+print('</div>')
+print('<style>')
+print(FORMAT.get_style_defs(''))
+print('</style>')
+
+print("Filename: {}; Lexer: {}.".format(filename, lexer), file=stderr)
+if rendered:
+ print("Markdown was rendered in addition.", file=stderr)