Edgewall Software

Ticket #655: patch_655.diff

File patch_655.diff, 7.1 KB (added by tonib, 4 years ago)

Added check that docutils >= 0.3.3 is used. Also added verilog processor to wikiformatting

  • trac/WikiFormatter.py

     
    255255        return env.mimeview.display(text, 'text/x-sql') 
    256256    def xml_processor(hdf, text, env): 
    257257        return env.mimeview.display(text, 'text/xml') 
     258    def verilog_processor(hdf, text, env): 
     259        return env.mimeview.display(text, 'text/x-verilog') 
    258260 
    259261    def html_processor(hdf, text, env): 
    260262        if Formatter._htmlproc_disallow_rule.search(text): 
     
    278280                           'ruby': ruby_processor, 
    279281                           'sql': sql_processor, 
    280282                           'xml': xml_processor, 
     283                           'verilog': verilog_processor, 
    281284                           'default': default_processor} 
    282285 
    283286    def load_macro(self, name): 
  • trac/wikimacros/rst.py

     
    3232from docutils import nodes 
    3333from docutils.core import publish_string 
    3434from docutils.parsers import rst 
     35from docutils.__init__ import __version__ 
    3536 
     37docutils_required = '0.3.3' 
     38if __version__ < docutils_required: 
     39    raise EnvironmentError, 'Docutils version >= "%s" is required you have "%s" installed' % (docutils_required, __version__) 
     40 
    3641from trac.Href import Href 
    3742 
    3843__docformat__ = 'reStructuredText' 
    3944 
    40 WIKI_LINK = re.compile(r'(?:wiki:)?(?P<w>(^|(?<=[^A-Za-z]))[!]?[A-Z][a-z/]+(?:[A-Z][a-z/]+)+)') 
     45WIKI_LINK = re.compile(r'(?:wiki:)?(?P<w>[A-Za-z][\w\#\?]*[^\w\#\?]*)') # Links must begin with Letters, \# ? so we can link inside pages. 
     46#WIKI_LINK = re.compile(r'(?:wiki:)?(?P<w>(^|(?<=[^A-Za-z]))[!]?[A-Z][a-z/]+(?:[A-Z][a-z/]+)+)') 
    4147TICKET_LINK = re.compile(r'(?:#(\d+))|(?:ticket:(\d+))') 
    4248REPORT_LINK = re.compile(r'(?:{(\d+)})|(?:report:(\d+))') 
    4349CHANGESET_LINK = re.compile(r'(?:\[(\d+)\])|(?:changeset:(\d+))') 
     
    6773         (CHANGESET_LINK, _changeset), 
    6874         (FILE_LINK, _browser)] 
    6975 
    70 def trac(href, name, arguments, options, content, lineno, 
     76 
     77def trac_get_reference(env, rawtext, text): 
     78    for (pattern, function) in LINKS: 
     79        m = pattern.match(text) 
     80        if m: 
     81            g = filter(None, m.groups()) 
     82            missing = False 
     83            if pattern == WIKI_LINK: 
     84                if not (env._wiki_pages.has_key(g[0])): 
     85                        missing = True 
     86                        text = text + "?" 
     87            uri = function(env.href, g) 
     88            reference = nodes.reference(rawtext, text) 
     89            reference['refuri']= uri 
     90            if missing: 
     91                reference.set_class('missing') 
     92            return reference 
     93    return None 
     94 
     95def trac(env, name, arguments, options, content, lineno, 
    7196         content_offset, block_text, state, state_machine): 
    7297    """Inserts a `reference` node into the document  
    7398    for a given `TracLink`_, based on the content  
     
    90115 
    91116    .. _TracLink: http://projects.edgewall.com/trac/wiki/TracLinks 
    92117    """ 
    93     for (pattern, function) in LINKS: 
    94         m = pattern.match(arguments[0]) 
    95         if m: 
    96             text = arguments[int(len(arguments) == 2)] 
    97             g = filter(None, m.groups()) 
    98             uri = function(href, g) 
    99             reference = nodes.reference(block_text, text) 
    100             reference['refuri']= uri 
    101             return reference 
    102  
     118    text = arguments[int(len(arguments) == 2)] 
     119    reference = trac_get_reference(env, block_text, text) 
     120    if reference: 
     121        return reference 
    103122    # didn't find a match (invalid TracLink), 
    104123    # report a warning 
    105124    warning = state_machine.reporter.warning( 
     
    108127            line=lineno) 
    109128    return [warning] 
    110129 
    111 def trac_role(href, name, rawtext, text, lineno): 
    112     for (pattern, function) in LINKS: 
    113         m = pattern.match(text) 
    114         if m: 
    115             g = filter(None, m.groups()) 
    116             uri = function(href, g) 
    117             return [nodes.reference(rawtext, text, refuri=uri)], [] 
     130 
     131def trac_role(env, name, rawtext, text, lineno, inliner, options={}, content=[]): 
     132    reference = trac_get_reference(env, rawtext, text) 
     133    if reference: 
     134        return [reference], [] 
    118135    warning = nodes.warning(None, 
    119136                            nodes.literal_block(text, 
    120137                               'WARNING: %s is not a valid TracLink' % rawtext)) 
    121138    return warning, [] 
     139     
    122140 
    123141def execute(hdf, text, env): 
    124142    def do_trac(name, arguments, options, content, lineno, 
    125143                content_offset, block_text, state, state_machine): 
    126         return trac(env.href, name, arguments, options, content, lineno, 
     144        return trac(env, name, arguments, options, content, lineno, 
    127145                    content_offset, block_text, state, state_machine) 
    128146 
    129     def do_trac_role(name, rawtext, text, lineno): 
    130         return trac_role(env.href, name, rawtext, text, lineno) 
     147    def do_trac_role(name, rawtext, text, lineno, inliner, options={}, content=[]): 
     148        return trac_role(env, name, rawtext, text, lineno, inliner, options, content) 
    131149 
    132150    # 1 required arg, 1 optional arg, spaces allowed in last arg 
    133151    do_trac.arguments = (1,1,1) 
    134152    do_trac.options = None 
    135153    do_trac.content = None 
    136154    rst.directives.register_directive('trac', do_trac) 
    137     local_roles = {'trac': do_trac_role} 
     155    rst.roles.register_local_role('trac', do_trac_role) 
    138156 
    139     _inliner = rst.states.Inliner(roles = local_roles) 
     157    # The code_block could is taken from the leo plugin rst2 
     158    def code_block(name,arguments,options,content,lineno,content_offset,block_text,state,state_machine): 
     159 
     160        """Create a code-block directive for docutils. 
     161 
     162        Usage: .. code-block:: language 
     163 
     164        If the language can be syntax highlighted it will be.""" 
     165 
     166 
     167         
     168        from trac.WikiFormatter import Formatter 
     169         
     170        language = arguments[0] 
     171 
     172        code_processor = None 
     173        if  Formatter.builtin_processors.has_key(language): 
     174            code_processor = Formatter.builtin_processors[language] 
     175        else: 
     176            code_processor = Formatter.builtin_processors['default'] 
     177 
     178 
     179        html = code_processor(hdf, '\n'.join(content), env)         
     180        raw = nodes.raw('',html, format='html') #(self, rawsource='', text='', *children, **attributes): 
     181        return [raw] 
     182 
     183    # These are documented at http://docutils.sourceforge.net/spec/howto/rst-directives.html. 
     184    code_block.arguments = ( 
     185        1, # Number of required arguments. 
     186        0, # Number of optional arguments. 
     187        0) # True if final argument may contain whitespace. 
     188     
     189     
     190    # A mapping from option name to conversion function. 
     191    code_block.options = { 
     192        'language' : 
     193        rst.directives.unchanged # Return the text argument, unchanged 
     194        } 
     195    code_block.content = 1 # True if content is allowed. 
     196    # Register the directive with docutils. 
     197    rst.directives.register_directive('code-block',code_block) 
     198     
     199     
     200 
     201    _inliner = rst.states.Inliner() 
    140202    _parser = rst.Parser(inliner = _inliner) 
    141203 
    142204    html = publish_string(text, writer_name = 'html', parser = _parser,