|  | 1 | =  Wiki Macros = | 
          
            |  | 2 | Trac macros are plugins to extend the Trac engine with custom 'functions' written in Python. A macro inserts dynamic HTML data in any context supporting WikiFormatting. | 
          
            |  | 3 |  | 
          
            |  | 4 | Another kind of macros are WikiProcessors. They typically deal with alternate markup formats and representation of larger blocks of information (like source code highlighting). See also: WikiProcessors. | 
          
            |  | 5 |  | 
          
            |  | 6 | == Using Macros == | 
          
            |  | 7 | Macro calls are enclosed in two ''square brackets''. Like python functions, macros can also have arguments, a comma separated list within parenthesis. | 
          
            |  | 8 |  | 
          
            |  | 9 | === Examples === | 
          
            |  | 10 |  | 
          
            |  | 11 | {{{ | 
          
            |  | 12 | [[Timestamp]] | 
          
            |  | 13 | }}} | 
          
            |  | 14 | Display: | 
          
            |  | 15 | [[Timestamp]] | 
          
            |  | 16 |  | 
          
            |  | 17 | {{{ | 
          
            |  | 18 | [[HelloWorld(Testing)]] | 
          
            |  | 19 | }}} | 
          
            |  | 20 | Display: | 
          
            |  | 21 | [[HelloWorld(Testing)]] | 
          
            |  | 22 |  | 
          
            |  | 23 |  | 
          
            |  | 24 | == Available Macros == | 
          
            |  | 25 | Macros are still a new feature, and the list of available (and distributed) macros is | 
          
            |  | 26 | admittedly not very impressive. In future Trac releases, we hope to build a library of useful macros, and will of course happily include contributed macros (see below). | 
          
            |  | 27 |  | 
          
            |  | 28 | * '''!HelloWorld''' -- An example macro, useful for learning how to write macros. | 
          
            |  | 29 | * '''Timestamp''' -- Insert the current date and time. | 
          
            |  | 30 |  | 
          
            |  | 31 |  | 
          
            |  | 32 | ---- | 
          
            |  | 33 |  | 
          
            |  | 34 |  | 
          
            |  | 35 | == Macros from around the world == | 
          
            |  | 36 | The [http://projects.edgewall.com/trac/ Trac Project] has a section dedicated to user-contributed macros, [http://projects.edgewall.com/trac/wiki/MacroBazaar MacroBazaar]. If you're looking for new macros, or have written new ones to share with the world, don't hesitate adding it to the [http://projects.edgewall.com/trac/wiki/MacroBazaar MacroBazaar] wiki page. | 
          
            |  | 37 |  | 
          
            |  | 38 | http://projects.edgewall.com/trac/wiki/MacroBazaar | 
          
            |  | 39 |  | 
          
            |  | 40 |  | 
          
            |  | 41 | ---- | 
          
            |  | 42 |  | 
          
            |  | 43 |  | 
          
            |  | 44 | == Developing New Macros == | 
          
            |  | 45 | Macros, like Trac itself, are written in the [http://www.python.org/ Python programming language]. They are very simple modules, identified by the filename and should contain a single ''entry point'' function. Trac will display the returned data inserted into the HTML where the macro was called. | 
          
            |  | 46 |  | 
          
            |  | 47 | It's easiest to learn from an example: | 
          
            |  | 48 | {{{ | 
          
            |  | 49 | # MyMacro.py -- The world's simplest macro | 
          
            |  | 50 |  | 
          
            |  | 51 | def execute(hdf, args, env): | 
          
            |  | 52 | return "Hello World called with args: %s" % args | 
          
            |  | 53 | }}} | 
          
            |  | 54 |  | 
          
            |  | 55 | === Advanced Topics: Template-enabled Macros === | 
          
            |  | 56 | For advanced uses, macros can also render structured output in HDF, to be rendered to HTML using clearsilver templates - like most Trac output. In short, this allows more generic and well-designed advanced macros. | 
          
            |  | 57 |  | 
          
            |  | 58 | Macros gain direct access to the main HDF tree, and are free to manipulate it. | 
          
            |  | 59 |  | 
          
            |  | 60 | Example: | 
          
            |  | 61 | {{{ | 
          
            |  | 62 | def execute(hdf, args, env): | 
          
            |  | 63 | # Currently hdf is set only when the macro is called | 
          
            |  | 64 | # From a wiki page | 
          
            |  | 65 | if hdf: | 
          
            |  | 66 | hdf.setValue('wiki.macro.greeting', 'Hello World') | 
          
            |  | 67 |  | 
          
            |  | 68 | # args will be null if the macro is called without parentesis. | 
          
            |  | 69 | args = args or 'No arguments' | 
          
            |  | 70 | return 'Hello World, args = ' + args | 
          
            |  | 71 | }}} | 
          
            |  | 72 |  | 
          
            |  | 73 | You can also use the environment (env) object to access configuration data. | 
          
            |  | 74 |  | 
          
            |  | 75 | Example. | 
          
            |  | 76 | {{{ | 
          
            |  | 77 | def execute(hdf, txt, env): | 
          
            |  | 78 | return env.get_config('trac', 'repository_dir') | 
          
            |  | 79 | }}} | 
          
            |  | 80 | ---- | 
          
            |  | 81 | See also:  WikiProcessors, WikiFormatting, TracGuide |