Changes between Version 1 and Version 2 of WikiMacros


Ignore:
Timestamp:
Jul 17, 2008 10:45:00 AM (12 years ago)
Author:
trac
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • WikiMacros

    v1 v2  
    88 
    99== Using Macros == 
     10Macro calls are enclosed in two ''square brackets''. Like Python functions, macros can also have arguments, a comma separated list within parentheses.  
    1011 
    11 Macro calls are enclosed in two ''square brackets''. Like Python functions, macros can also have arguments, a comma separated list within parentheses. 
    12  
    13 === Getting Detailed Help === 
    14 The list of available macros and the full help can be obtained using the !MacroList macro, as seen [#AvailableMacros below]. 
    15  
    16 A brief list can be obtained via ![[MacroList(*)]] or ![[?]]. 
    17  
    18 Detailed help on a specific macro can be obtained by passing it as an argument to !MacroList, e.g. ![[MacroList(MacroList)]], or, more conveniently, by appending a question mark (?) to the macro's name, like in ![[MacroList?]]. 
    19  
    20  
     12Trac macros can also be written as TracPlugins. This gives them some capabilities that macros do not have, such as being able to directly access the HTTP request. 
    2113 
    2214=== Example === 
     
    2416A list of 3 most recently changed wiki pages starting with 'Trac': 
    2517 
    26 ||= Wiki Markup =||= Display =|| 
    27 {{{#!td 
    28   {{{ 
    29   [[RecentChanges(Trac,3)]] 
    30   }}} 
     18{{{ 
     19 [[RecentChanges(Trac,3)]] 
    3120}}} 
    32 {{{#!td style="padding-left: 2em;" 
    33 [[RecentChanges(Trac,3)]] 
    34 }}} 
    35 |----------------------------------- 
    36 {{{#!td 
    37   {{{ 
    38   [[RecentChanges?(Trac,3)]] 
    39   }}} 
    40 }}} 
    41 {{{#!td style="padding-left: 2em;" 
    42 [[RecentChanges?(Trac,3)]] 
    43 }}} 
    44 |----------------------------------- 
    45 {{{#!td 
    46   {{{ 
    47   [[?]] 
    48   }}} 
    49 }}} 
    50 {{{#!td style="padding-left: 2em" 
    51 {{{#!html  
    52 <div style="font-size: 80%" class="trac-macrolist"> 
    53 <h3><code>[[Image]]</code></h3>Embed an image in wiki-formatted text. 
    5421 
    55 The first argument is the file … 
    56 <h3><code>[[InterTrac]]</code></h3>Provide a list of known <a class="wiki" href="/wiki/InterTrac">InterTrac</a> prefixes. 
    57 <h3><code>[[InterWiki]]</code></h3>Provide a description list for the known <a class="wiki" href="/wiki/InterWiki">InterWiki</a> prefixes. 
    58 <h3><code>[[KnownMimeTypes]]</code></h3>List all known mime-types which can be used as <a class="wiki" href="/wiki/WikiProcessors">WikiProcessors</a>. 
    59 Can be …</div> 
    60 }}} 
    61 etc. 
    62 }}} 
     22Display: 
     23 [[RecentChanges(Trac,3)]] 
    6324 
    6425== Available Macros == 
     
    7334 
    7435== Developing Custom Macros == 
    75 Macros, like Trac itself, are written in the [http://python.org/ Python programming language] and are developed as part of TracPlugins. 
     36Macros, like Trac itself, are written in the [http://python.org/ Python programming language]. 
    7637 
    77 For more information about developing macros, see the [trac:TracDev development resources] on the main project site. 
     38For more information about developing macros, see the [wiki:TracDev development resources] on the main project site. 
    7839 
    7940 
    80 Here are 2 simple examples showing how to create a Macro with Trac 0.11.  
     41== Implementation == 
    8142 
    82 Also, have a look at [trac:source:tags/trac-0.11/sample-plugins/Timestamp.py Timestamp.py] for an example that shows the difference between old style and new style macros and at the [trac:source:tags/trac-0.11/wiki-macros/README macros/README] which provides a little more insight about the transition. 
     43Here are 2 simple examples on how to create a Macro with [wiki:0.11 Trac 0.11] have a look at source:trunk/sample-plugins/Timestamp.py for an example that shows the difference between old style and new style macros and also source:trunk/wiki-macros/README which provides a little more insight about the transition. 
    8344 
    8445=== Macro without arguments === 
    85 To test the following code, you should saved it in a `timestamp_sample.py` file located in the TracEnvironment's `plugins/` directory. 
     46It should be saved as `TimeStamp.py` as Trac will use the module name as the Macro name 
    8647{{{ 
    8748#!python 
     
    9455from trac.wiki.macros import WikiMacroBase 
    9556 
    96 class TimeStampMacro(WikiMacroBase): 
     57class TimestampMacro(WikiMacroBase): 
    9758    """Inserts the current time (in seconds) into the wiki page.""" 
    9859 
     
    10061    url = "$URL$" 
    10162 
    102     def expand_macro(self, formatter, name, text): 
     63    def expand_macro(self, formatter, name, args): 
    10364        t = datetime.now(utc) 
    10465        return tag.b(format_datetime(t, '%c')) 
     
    10667 
    10768=== Macro with arguments === 
    108 To test the following code, you should saved it in a `helloworld_sample.py` file located in the TracEnvironment's `plugins/` directory. 
     69It should be saved as `HelloWorld.py` (in the plugins/ directory) as Trac will use the module name as the Macro name 
    10970{{{ 
    11071#!python 
    111 from genshi.core import Markup 
    112  
    11372from trac.wiki.macros import WikiMacroBase 
    11473 
     
    12887    url = "$URL$" 
    12988 
    130     def expand_macro(self, formatter, name, text, args): 
     89    def expand_macro(self, formatter, name, args): 
    13190        """Return some output that will be displayed in the Wiki content. 
    13291 
    13392        `name` is the actual name of the macro (no surprise, here it'll be 
    13493        `'HelloWorld'`), 
    135         `text` is the text enclosed in parenthesis at the call of the macro. 
     94        `args` is the text enclosed in parenthesis at the call of the macro. 
    13695          Note that if there are ''no'' parenthesis (like in, e.g. 
    137           [[HelloWorld]]), then `text` is `None`. 
    138         `args` are the arguments passed when HelloWorld is called using a 
    139         `#!HelloWorld` code block. 
     96          [[HelloWorld]]), then `args` is `None`. 
    14097        """ 
    141         return 'Hello World, text = %s, args = %s' % \ 
    142             (Markup.escape(text), Markup.escape(repr(args))) 
    143  
     98        return 'Hello World, args = ' + unicode(args) 
     99     
     100    # Note that there's no need to HTML escape the returned data, 
     101    # as the template engine (Genshi) will do it for us. 
    144102}}} 
    145103 
    146 Note that `expand_macro` optionally takes a 4^th^ parameter ''`args`''. When the macro is called as a [WikiProcessors WikiProcessor], it's also possible to pass `key=value` [WikiProcessors#UsingProcessors processor parameters]. If given, those are stored in a dictionary and passed in this extra `args` parameter. On the contrary, when called as a macro, `args` is  `None`. (''since 0.12''). 
    147104 
    148 For example, when writing: 
    149 {{{ 
    150 {{{#!HelloWorld style="polite" 
    151 <Hello World!> 
    152 }}} 
     105=== {{{expand_macro}}} details === 
     106{{{expand_macro}}} should return either a simple Python string which will be interpreted as HTML, or preferably a Markup object (use {{{from trac.util.html import Markup}}}).  {{{Markup(string)}}} just annotates the string so the renderer will render the HTML string as-is with no escaping. You will also need to import Formatter using {{{from trac.wiki import Formatter}}}. 
    153107 
    154 {{{#!HelloWorld 
    155 <Hello World!> 
    156 }}} 
    157  
    158 [[HelloWorld(<Hello World!>)]] 
    159 }}} 
    160 One should get: 
    161 {{{ 
    162 Hello World, text = <Hello World!> , args = {'style': u'polite'} 
    163 Hello World, text = <Hello World!> , args = {} 
    164 Hello World, text = <Hello World!> , args = None 
    165 }}} 
    166  
    167 Note that the return value of `expand_macro` is '''not''' HTML escaped. Depending on the expected result, you should escape it by yourself (using `return Markup.escape(result)`) or, if this is indeed HTML, wrap it in a Markup object (`return Markup(result)`) with `Markup` coming from Genshi, (`from genshi.core import Markup`).   
    168  
    169 You can also recursively use a wiki Formatter (`from trac.wiki import Formatter`) to process the `text` as wiki markup, for example by doing: 
     108If your macro creates wiki markup instead of HTML, you can convert it to HTML like this: 
    170109 
    171110{{{ 
    172111#!python 
    173 from genshi.core import Markup 
    174 from trac.wiki.macros import WikiMacroBase 
    175 from trac.wiki import Formatter 
    176 import StringIO 
    177  
    178 class HelloWorldMacro(WikiMacroBase): 
    179         def expand_macro(self, formatter, name, text, args): 
    180                 text = "whatever '''wiki''' markup you want, even containing other macros" 
    181                 # Convert Wiki markup to HTML, new style 
    182                 out = StringIO.StringIO() 
    183                 Formatter(self.env, formatter.context).format(text, out) 
    184                 return Markup(out.getvalue()) 
     112  text = "whatever wiki markup you want, even containing other macros" 
     113  # Convert Wiki markup to HTML, new style 
     114  out = StringIO() 
     115  Formatter(self.env, formatter.context).format(text, out) 
     116  return Markup(out.getvalue()) 
    185117}}}