- Timestamp:
- 09/22/08 15:40:45 (18 months ago)
- Files:
-
- 1 modified
Legend:
- Unmodified
- Added
- Removed
-
trunk/pylucid_project/PyLucid/system/markups/creole2html.py
r1769 r1771 41 41 """ 42 42 43 import re 43 import sys, re, traceback 44 44 45 from creole import Parser 46 47 import macros 48 49 from PyLucid.tools.utils import escape 45 50 46 51 class Rules: … … 53 58 ''' 54 59 55 class Macro(object):56 # def __init__(self):57 def source_emit(self, node):58 print node59 60 from PyLucid.tools.utils import escape61 60 class HtmlEmitter: 62 61 """ … … 70 69 ]), re.X | re.U) # for addresses 71 70 72 def __init__(self, root ):71 def __init__(self, root, verbose=1, stderr=sys.stderr): 73 72 self.root = root 74 self.macro = Macro() 73 self.verbose = verbose 74 self.stderr = stderr 75 75 76 76 def get_text(self, node): … … 188 188 189 189 def macro_emit(self, node): 190 # try: 191 # return getattr(self.macro, 192 raise NotImplementedError("Node: %r" % node.content) 190 #print node.debug() 191 macro_name = node.macro_name 192 try: 193 macro = getattr(macros, macro_name) 194 except AttributeError, e: 195 return self.error( 196 u"Macro '%s' doesn't exist" % macro_name, 197 handle_traceback = True 198 ) 199 200 try: 201 result = macro(args=node.macro_args, text=node.content) 202 except Exception, err: 203 return self.error( 204 u"Macro '%s' error: %s" % (macro_name, err), 205 handle_traceback = True 206 ) 207 208 if not isinstance(result, unicode): 209 msg = u"Macro '%s' doesn't return a unicode string!" % macro_name 210 if self.verbose>1: 211 msg += " - returns: %r, type %r" % (result, type(result)) 212 return self.error(msg) 213 214 return result 193 215 194 216 def break_emit(self, node): … … 206 228 return u"<pre>\n%s\n</pre>\n" % self.html_escape(node.content) 207 229 208 def pass through_block_emit(self, node):230 def pass_block_emit(self, node): 209 231 """ Pass-through all django template blocktags and html code lines """ 210 232 return node.content + "\n" 211 html_emit = passthrough_block_emit 212 213 def passthrough_line_emit(self, node): 233 pass_line_emit = pass_block_emit 234 html_emit = pass_block_emit 235 236 def pass_inline_emit(self, node): 214 237 """ Pass-through all django template tags """ 215 238 return node.content … … 217 240 def default_emit(self, node): 218 241 """Fallback function for emitting unknown nodes.""" 219 raise TypeError242 raise NotImplementedError("Node '%s' unknown" % node.kind) 220 243 221 244 def emit_children(self, node): … … 233 256 return self.emit_node(self.root) 234 257 258 def error(self, text, handle_traceback=False): 259 """ 260 Error Handling. 261 """ 262 if self.verbose>1 and handle_traceback: 263 self.stderr.write( 264 "<pre>%s</pre>" % traceback.format_exc() 265 ) 266 267 if self.verbose>0: 268 return u"[Error: %s]" % text 269 else: 270 # No error output 271 return u"" 272 235 273 if __name__=="__main__": 236 274 txt = r"""== a headline … … 260 298 261 299 END""" 300 301 302 txt = r""" 303 ==== Headline 1 304 305 On {% a tag 1 %} line 306 line two 307 308 ==== Headline 2 309 310 {% a tag 2 %} 311 312 A block: 313 {% block %} 314 <Foo:> {{ Bar }} 315 {% endblock %} 316 end block 317 318 {% block1 arg="jo" %} 319 eofjwqp 320 {% endblock1 %} 321 322 A block without the right end block: 323 {% block1 %} 324 111 325 {% endblock2 %} 326 BBB 327 328 A block without endblock: 329 {% block3 %} 330 222 331 {% block3 %} 332 CCC 333 334 the end""" 262 335 263 336 print "-"*80