Add primary support for code highlightning
This commit is contained in:
@@ -21,6 +21,7 @@ class StrictUTF8Writer(codecs.StreamWriter):
|
||||
object = object.replace('>', '>')
|
||||
object = object.replace('"', '"')
|
||||
object = object.replace(''', "'")
|
||||
object = object.replace('&', "&")
|
||||
|
||||
if not type(object) == unicode:
|
||||
self.value = self.value + unicode(object, "utf-8")
|
||||
|
||||
@@ -3,7 +3,7 @@ import datetime
|
||||
import xml
|
||||
from xml.parsers.expat import *
|
||||
from xml.dom.minidom import parse, parseString
|
||||
from dynastie.generators.generator import DynastieGenerator
|
||||
from dynastie.generators.generator import DynastieGenerator, StrictUTF8Writer
|
||||
from django.db import models
|
||||
|
||||
class Index(DynastieGenerator):
|
||||
@@ -83,6 +83,25 @@ class Index(DynastieGenerator):
|
||||
post_content = f.read()
|
||||
f.close()
|
||||
|
||||
while True:
|
||||
start = post_content.find('<dyn:code')
|
||||
end = post_content.find('</dyn:code>')
|
||||
|
||||
if start == -1: break
|
||||
|
||||
if end < start:
|
||||
self.addError('Invalid <dyn:code> tags in ' + filename)
|
||||
break
|
||||
|
||||
try:
|
||||
dom2 = parseString(post_content[start:end+11])
|
||||
except xml.dom.DOMException as e:
|
||||
self.addError('Error parsing ' + filename)
|
||||
break
|
||||
|
||||
res = self.createCode(dom2, dom2.firstChild)
|
||||
post_content = post_content.replace(post_content[start:end+11], res)
|
||||
|
||||
self.simpleTransform(values, dom, post_elem, root)
|
||||
|
||||
content_nodes = post_elem.getElementsByTagName('div')
|
||||
@@ -93,7 +112,6 @@ class Index(DynastieGenerator):
|
||||
continue
|
||||
new_node = dom.createTextNode(post_content)
|
||||
content_node.appendChild(new_node)
|
||||
|
||||
|
||||
def createPosts(self, posts, dom, root, node):
|
||||
posts_elem = self.createElement(dom, 'posts')
|
||||
@@ -177,13 +195,68 @@ class Index(DynastieGenerator):
|
||||
|
||||
return tags_elem
|
||||
|
||||
def createCode(self, dom, node):
|
||||
try:
|
||||
from pygments import highlight
|
||||
from pygments.util import ClassNotFound
|
||||
from pygments.lexers import get_lexer_by_name
|
||||
from pygments.formatters import get_formatter_by_name
|
||||
except ImportError:
|
||||
self.addError('Pygments package is missing, please install it in order to use <dyn:code>')
|
||||
return
|
||||
|
||||
language = node.getAttribute('language')
|
||||
|
||||
if language is None:
|
||||
self.addWarning('No language defined for <dyn:code> assuming C language')
|
||||
language = "c"
|
||||
else:
|
||||
language = language.lower()
|
||||
|
||||
lexer_options = {}
|
||||
try:
|
||||
lexer = get_lexer_by_name(language, **lexer_options)
|
||||
except ClassNotFound:
|
||||
self.addWarning('Language ' + language + ' not supported by current version of pygments')
|
||||
lexer = get_lexer_by_name('c', **lexer_options)
|
||||
|
||||
formatter_options = {'classprefix' : 'color_', 'style' : 'emacs'}
|
||||
|
||||
for k in node.attributes.keys():
|
||||
attr = node.attributes[k]
|
||||
if attr.prefix != '': continue
|
||||
if attr.name == 'language': continue
|
||||
name = attr.name
|
||||
value = attr.value
|
||||
if name == 'colouring': name = style
|
||||
formatter_options[name] = value
|
||||
|
||||
formatter = get_formatter_by_name('html', **formatter_options)
|
||||
|
||||
lexer.encoding = 'utf-8'
|
||||
formatter.encoding = 'utf-8'
|
||||
|
||||
writer = StrictUTF8Writer()
|
||||
node.firstChild.firstChild.writexml(writer)
|
||||
code = writer.getvalue().encode('utf-8')
|
||||
|
||||
r,w = os.pipe()
|
||||
r,w=os.fdopen(r,'r',0), os.fdopen(w,'w',0)
|
||||
highlight(code, lexer, formatter, w)
|
||||
w.close()
|
||||
|
||||
code = r.read()
|
||||
r.close()
|
||||
|
||||
return code
|
||||
|
||||
def generate(self, blog, src, output):
|
||||
from dynastie.models import Post, Blog
|
||||
|
||||
self.hooks = {'posts' : self.createPosts,
|
||||
'navigation' : self.createNavigation,
|
||||
'recents' : self.createRecents,
|
||||
'tags' : self.createTags}
|
||||
'navigation' : self.createNavigation,
|
||||
'recents' : self.createRecents,
|
||||
'tags' : self.createTags}
|
||||
|
||||
if not os.path.exists(src + '/_index.html'):
|
||||
self.addError('No _index.html found, exiting')
|
||||
|
||||
Reference in New Issue
Block a user