Show
Ignore:
Timestamp:
09/22/08 15:40:45 (18 months ago)
Author:
JensDiemer
Message:

add macro function to creole markup

Files:
1 modified

Legend:

Unmodified
Added
Removed
  • trunk/pylucid_project/PyLucid/system/markups/creole2html.py

    r1769 r1771  
    4141""" 
    4242 
    43 import re 
     43import sys, re, traceback 
     44 
    4445from creole import Parser 
     46 
     47import macros 
     48 
     49from PyLucid.tools.utils import escape 
    4550 
    4651class Rules: 
     
    5358        ''' 
    5459 
    55 class Macro(object): 
    56 #    def __init__(self): 
    57     def source_emit(self, node): 
    58         print node 
    59  
    60 from PyLucid.tools.utils import escape 
    6160class HtmlEmitter: 
    6261    """ 
     
    7069        ]), re.X | re.U) # for addresses 
    7170 
    72     def __init__(self, root): 
     71    def __init__(self, root, verbose=1, stderr=sys.stderr): 
    7372        self.root = root 
    74         self.macro = Macro() 
     73        self.verbose = verbose 
     74        self.stderr = stderr 
    7575 
    7676    def get_text(self, node): 
     
    188188 
    189189    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 
    193215 
    194216    def break_emit(self, node): 
     
    206228        return u"<pre>\n%s\n</pre>\n" % self.html_escape(node.content) 
    207229 
    208     def passthrough_block_emit(self, node): 
     230    def pass_block_emit(self, node): 
    209231        """ Pass-through all django template blocktags and html code lines """ 
    210232        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): 
    214237        """ Pass-through all django template tags """ 
    215238        return node.content 
     
    217240    def default_emit(self, node): 
    218241        """Fallback function for emitting unknown nodes.""" 
    219         raise TypeError 
     242        raise NotImplementedError("Node '%s' unknown" % node.kind) 
    220243 
    221244    def emit_children(self, node): 
     
    233256        return self.emit_node(self.root) 
    234257 
     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 
    235273if __name__=="__main__": 
    236274    txt = r"""== a headline 
     
    260298 
    261299END""" 
     300 
     301     
     302    txt = r""" 
     303==== Headline 1 
     304 
     305On {% a tag 1 %} line 
     306line two 
     307 
     308==== Headline 2 
     309 
     310{% a tag 2 %} 
     311 
     312A block: 
     313{% block %} 
     314<Foo:> {{ Bar }} 
     315{% endblock %} 
     316end block 
     317 
     318{% block1 arg="jo" %} 
     319eofjwqp 
     320{% endblock1 %} 
     321 
     322A block without the right end block: 
     323{% block1 %} 
     324111 
     325{% endblock2 %} 
     326BBB 
     327 
     328A block without endblock: 
     329{% block3 %} 
     330222 
     331{% block3 %} 
     332CCC 
     333 
     334the end""" 
    262335 
    263336    print "-"*80