Changes between Version 2 and Version 3 of WikiMacros
- Timestamp:
- Feb 8, 2017, 4:40:58 PM (9 years ago)
Legend:
- Unmodified
- Added
- Removed
- Modified
-
WikiMacros
v2 v3 1 = Trac Macros =1 = Trac Macros 2 2 3 [[PageOutline]] 3 [[PageOutline(2-5,Contents,pullout)]] 4 4 5 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.5 '''Trac macros''' extend the Trac engine with custom functionality. Macros are a special type of plugin and are written in Python. A macro inserts dynamic HTML data in any context supporting WikiFormatting. 6 6 7 Another kind of macros are WikiProcessors. They typically deal with alternate markup formats and representation of larger blocks of information (like source code highlighting).7 The macro syntax is `[[macro-name(optional-arguments)]]`. 8 8 9 == Using Macros == 9 '''WikiProcessors''' are another kind of macros. They are typically used for source code highlighting, such as `!#python` or `!#apache` and when the source code spans multiple lines, such as: 10 10 11 Macro calls are enclosed in two ''square brackets''. Like Python functions, macros can also have arguments, a comma separated list within parentheses. 11 {{{ 12 {{{#!wiki-processor-name 13 ... 14 }}} 15 }}} 12 16 13 === Getting Detailed Help === 17 == Using Macros 18 19 Macro calls are enclosed in double-square brackets `[[..]]`. Like Python functions, macros can have arguments, which is then a comma separated list within parentheses `[[..(,)]]`. 20 21 === Getting Detailed Help 22 14 23 The list of available macros and the full help can be obtained using the !MacroList macro, as seen [#AvailableMacros below]. 15 24 … … 18 27 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 28 29 === Example 20 30 21 22 === Example === 23 24 A list of 3 most recently changed wiki pages starting with 'Trac': 31 A list of the 3 most recently changed wiki pages starting with 'Trac': 25 32 26 33 ||= Wiki Markup =||= Display =|| … … 50 57 {{{#!td style="padding-left: 2em" 51 58 {{{#!html 52 <div style="font-size: 80%"class="trac-macrolist">59 <div class="trac-macrolist"> 53 60 <h3><code>[[Image]]</code></h3>Embed an image in wiki-formatted text. 54 61 55 The first argument is the file …62 The first argument is the file, as in <code>[[Image(filename.png)]]</code> 56 63 <h3><code>[[InterTrac]]</code></h3>Provide a list of known <a class="wiki" href="/wiki/InterTrac">InterTrac</a> prefixes. 57 64 <h3><code>[[InterWiki]]</code></h3>Provide a description list for the known <a class="wiki" href="/wiki/InterWiki">InterWiki</a> prefixes. 58 65 <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>66 </div> 60 67 }}} 61 68 etc. 62 69 }}} 63 70 64 == Available Macros ==71 == Available Macros 65 72 66 73 ''Note that the following list will only contain the macro documentation if you've not enabled `-OO` optimizations, or not set the `PythonOptimize` option for [wiki:TracModPython mod_python].'' … … 68 75 [[MacroList]] 69 76 70 == Macros from around the world ==77 == Macros from around the world 71 78 72 The [http://trac-hacks.org/ Trac Hacks] site provides a wide collection of macros and other Trac [TracPlugins plugins] contributed by the Trac community. If you 're looking for new macros, or have written one that you'd like to share with the world, pleasedon't hesitate tovisit that site.79 The [http://trac-hacks.org/ Trac Hacks] site provides a wide collection of macros and other Trac [TracPlugins plugins] contributed by the Trac community. If you are looking for new macros, or have written one that you would like to share, please visit that site. 73 80 74 == Developing Custom Macros == 81 == Developing Custom Macros 82 75 83 Macros, like Trac itself, are written in the [http://python.org/ Python programming language] and are developed as part of TracPlugins. 76 84 77 85 For more information about developing macros, see the [trac:TracDev development resources] on the main project site. 78 86 87 Here are 2 simple examples showing how to create a Macro. Also, have a look at [trac:source:tags/trac-1.0.2/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 more insight about the transition. 79 88 80 Here are 2 simple examples showing how to create aMacro withTrac 0.11.89 === Macro without arguments 81 90 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.91 To test the following code, save it in a `timestamp_sample.py` file located in the TracEnvironment's `plugins/` directory. 83 92 84 === 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. 86 {{{ 87 #!python 93 {{{#!python 88 94 from datetime import datetime 89 95 # Note: since Trac 0.11, datetime objects are used internally … … 102 108 def expand_macro(self, formatter, name, text): 103 109 t = datetime.now(utc) 104 return tag. b(format_datetime(t, '%c'))110 return tag.strong(format_datetime(t, '%c')) 105 111 }}} 106 112 107 === 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. 109 {{{ 110 #!python 113 === Macro with arguments 114 115 To test the following code, save it in a `helloworld_sample.py` file located in the TracEnvironment's `plugins/` directory. 116 117 {{{#!python 111 118 from genshi.core import Markup 112 119 … … 144 151 }}} 145 152 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'').153 Note that `expand_macro` optionally takes a 4^th^ parameter ''`args`''. When the macro is called as a [WikiProcessors WikiProcessor], it is 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. In the other case, when called as a macro, `args` is `None`. (''since 0.12''). 147 154 148 155 For example, when writing: … … 158 165 [[HelloWorld(<Hello World!>)]] 159 166 }}} 167 160 168 One should get: 161 169 {{{ 162 Hello World, text = <Hello World!> , args = {'style': u'polite', 'silent': False, 'verbose': True}163 Hello World, text = <Hello World!> , args = {}164 Hello World, text = <Hello World!> , args = None170 Hello World, text = <Hello World!>, args = {'style': u'polite', 'silent': False, 'verbose': True} 171 Hello World, text = <Hello World!>, args = {} 172 Hello World, text = <Hello World!>, args = None 165 173 }}} 166 174 167 Note that the return value of `expand_macro` is '''not''' HTML escaped. Depending on the expected result, you should escape it byyourself (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`).175 Note that the return value of `expand_macro` is '''not''' HTML escaped. Depending on the expected result, you should escape it 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 176 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:177 You can also recursively use a wiki Formatter (`from trac.wiki import Formatter`) to process the `text` as wiki markup: 170 178 171 {{{ 172 #!python 179 {{{#!python 173 180 from genshi.core import Markup 174 181 from trac.wiki.macros import WikiMacroBase … … 177 184 178 185 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 style182 out = StringIO.StringIO()183 Formatter(self.env, formatter.context).format(text, out)184 return Markup(out.getvalue())186 def expand_macro(self, formatter, name, text, args): 187 text = "whatever '''wiki''' markup you want, even containing other macros" 188 # Convert Wiki markup to HTML, new style 189 out = StringIO.StringIO() 190 Formatter(self.env, formatter.context).format(text, out) 191 return Markup(out.getvalue()) 185 192 }}}
