[Imported from Trac: page TracWikiMacros, version 1]
parent
ab1ca27961
commit
98ca42850f
114
TracWikiMacros.md
Normal file
114
TracWikiMacros.md
Normal file
|
@ -0,0 +1,114 @@
|
||||||
|
# Trac Macros
|
||||||
|
|
||||||
|
[PageOutline](PageOutline)
|
||||||
|
|
||||||
|
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](WikiFormatting).
|
||||||
|
|
||||||
|
Another kind of macros are [WikiProcessors](WikiProcessors). They typically deal with alternate markup formats and representation of larger blocks of information (like source code highlighting).
|
||||||
|
|
||||||
|
## Using Macros
|
||||||
|
Macro calls are enclosed in two *square brackets*. Like Python functions, macros can also have arguments, a comma separated list within parentheses.
|
||||||
|
|
||||||
|
Trac macros can also be written as [TracPlugins](TracPlugins). This gives them some capabilities that macros do not have, such as being able to directly access the HTTP request.
|
||||||
|
|
||||||
|
### Example
|
||||||
|
|
||||||
|
A list of 3 most recently changed wiki pages starting with 'Trac':
|
||||||
|
|
||||||
|
```
|
||||||
|
[[RecentChanges(Trac,3)]]
|
||||||
|
```
|
||||||
|
|
||||||
|
Display:
|
||||||
|
[RecentChanges](RecentChanges)(Trac,3)
|
||||||
|
|
||||||
|
## Available Macros
|
||||||
|
|
||||||
|
*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 [mod_python](TracModPython).*
|
||||||
|
|
||||||
|
[MacroList](MacroList)
|
||||||
|
|
||||||
|
## Macros from around the world
|
||||||
|
|
||||||
|
The [Trac Hacks](http://trac-hacks.org/) site provides a wide collection of macros and other Trac [plugins](TracPlugins) 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, please don't hesitate to visit that site.
|
||||||
|
|
||||||
|
## Developing Custom Macros
|
||||||
|
Macros, like Trac itself, are written in the [Python programming language](http://python.org/).
|
||||||
|
|
||||||
|
For more information about developing macros, see the [development resources](TracDev) on the main project site.
|
||||||
|
|
||||||
|
|
||||||
|
## Implementation
|
||||||
|
|
||||||
|
Here are 2 simple examples on how to create a Macro with [Trac 0.11](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.
|
||||||
|
|
||||||
|
### Macro without arguments
|
||||||
|
It should be saved as `TimeStamp.py` as Trac will use the module name as the Macro name
|
||||||
|
```#!python
|
||||||
|
from datetime import datetime
|
||||||
|
# Note: since Trac 0.11, datetime objects are used internally
|
||||||
|
|
||||||
|
from genshi.builder import tag
|
||||||
|
|
||||||
|
from trac.util.datefmt import format_datetime, utc
|
||||||
|
from trac.wiki.macros import WikiMacroBase
|
||||||
|
|
||||||
|
class TimestampMacro(WikiMacroBase):
|
||||||
|
"""Inserts the current time (in seconds) into the wiki page."""
|
||||||
|
|
||||||
|
revision = "$Rev$"
|
||||||
|
url = "$URL$"
|
||||||
|
|
||||||
|
def expand_macro(self, formatter, name, args):
|
||||||
|
t = datetime.now(utc)
|
||||||
|
return tag.b(format_datetime(t, '%c'))
|
||||||
|
```
|
||||||
|
|
||||||
|
### Macro with arguments
|
||||||
|
It should be saved as `HelloWorld.py` (in the plugins/ directory) as Trac will use the module name as the Macro name
|
||||||
|
```#!python
|
||||||
|
from trac.wiki.macros import WikiMacroBase
|
||||||
|
|
||||||
|
class HelloWorldMacro(WikiMacroBase):
|
||||||
|
"""Simple HelloWorld macro.
|
||||||
|
|
||||||
|
Note that the name of the class is meaningful:
|
||||||
|
- it must end with "Macro"
|
||||||
|
- what comes before "Macro" ends up being the macro name
|
||||||
|
|
||||||
|
The documentation of the class (i.e. what you're reading)
|
||||||
|
will become the documentation of the macro, as shown by
|
||||||
|
the !MacroList macro (usually used in the TracWikiMacros page).
|
||||||
|
"""
|
||||||
|
|
||||||
|
revision = "$Rev$"
|
||||||
|
url = "$URL$"
|
||||||
|
|
||||||
|
def expand_macro(self, formatter, name, args):
|
||||||
|
"""Return some output that will be displayed in the Wiki content.
|
||||||
|
|
||||||
|
`name` is the actual name of the macro (no surprise, here it'll be
|
||||||
|
`'HelloWorld'`),
|
||||||
|
`args` is the text enclosed in parenthesis at the call of the macro.
|
||||||
|
Note that if there are ''no'' parenthesis (like in, e.g.
|
||||||
|
[[HelloWorld]]), then `args` is `None`.
|
||||||
|
"""
|
||||||
|
return 'Hello World, args = ' + unicode(args)
|
||||||
|
|
||||||
|
# Note that there's no need to HTML escape the returned data,
|
||||||
|
# as the template engine (Genshi) will do it for us.
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
### `expand_macro` details
|
||||||
|
`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.
|
||||||
|
|
||||||
|
If your macro creates wiki markup instead of HTML, you can convert it to HTML like this:
|
||||||
|
|
||||||
|
```#!python
|
||||||
|
text = "whatever wiki markup you want, even containing other macros"
|
||||||
|
# Convert Wiki markup to HTML, new style
|
||||||
|
out = StringIO()
|
||||||
|
Formatter(formatter.context).format(text, out)
|
||||||
|
return Markup(out.getvalue())
|
||||||
|
```
|
Loading…
Reference in a new issue