|
@@ -21,6 +21,14 @@ try:
|
|
|
except ImportError:
|
|
|
creole = False
|
|
|
|
|
|
+try:
|
|
|
+ from pygments import lexers
|
|
|
+ from pygments.formatters import HtmlFormatter
|
|
|
+ from pygments import highlight
|
|
|
+ PYGMENTS = True
|
|
|
+except:
|
|
|
+ PYGMENTS = False
|
|
|
+
|
|
|
class CreoleReader(readers.BaseReader):
|
|
|
enabled = creole
|
|
|
|
|
@@ -39,6 +47,42 @@ class CreoleReader(readers.BaseReader):
|
|
|
self._metadata[name] = self.process_metadata(name, value)
|
|
|
return u''
|
|
|
|
|
|
+ def _no_highlight(self, text):
|
|
|
+ html = u'\n<pre><code>{}</code></pre>\n'.format(text)
|
|
|
+ return html
|
|
|
+
|
|
|
+ def _get_lexer(self, source_type, code):
|
|
|
+ try:
|
|
|
+ return lexers.get_lexer_by_name(source_type)
|
|
|
+ except:
|
|
|
+ return lexers.guess_lexer(code)
|
|
|
+
|
|
|
+ def _get_formatter(self):
|
|
|
+ formatter = HtmlFormatter(lineos = True, encoding='utf-8',
|
|
|
+ style='colorful', outencoding='utf-8',
|
|
|
+ cssclass='pygments')
|
|
|
+ return formatter
|
|
|
+
|
|
|
+ def _parse_code_macro(self, ext, text):
|
|
|
+ if not PYGMENTS:
|
|
|
+ return self._no_highlight(text)
|
|
|
+
|
|
|
+ try:
|
|
|
+ source_type = ''
|
|
|
+ if '.' in ext:
|
|
|
+ source_type = ext.strip().split('.')[1]
|
|
|
+ else:
|
|
|
+ source_type = ext.strip()
|
|
|
+ except IndexError:
|
|
|
+ source_type = ''
|
|
|
+ lexer = self._get_lexer(source_type, text)
|
|
|
+ formatter = self._get_formatter()
|
|
|
+
|
|
|
+ try:
|
|
|
+ return highlight(text, lexer, formatter).decode('utf-8')
|
|
|
+ except:
|
|
|
+ return self._no_highlight(text)
|
|
|
+
|
|
|
# You need to have a read method, which takes a filename and returns
|
|
|
# some content and the associated metadata.
|
|
|
def read(self, source_path):
|
|
@@ -46,7 +90,8 @@ class CreoleReader(readers.BaseReader):
|
|
|
|
|
|
self._metadata = {}
|
|
|
with pelican_open(source_path) as text:
|
|
|
- content = creole2html(text, macros={'header': self._parse_header_macro})
|
|
|
+ content = creole2html(text, macros={'header': self._parse_header_macro,
|
|
|
+ 'code': self._parse_code_macro})
|
|
|
return content, self._metadata
|
|
|
|
|
|
def add_reader(readers):
|