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