3140
Comment: Replace references to #variable# with {variable} as #variable# templates are no longer supported
|
5867
Minor updates to examples, URL parameter descriptions.
|
Deletions are marked like this. | Additions are marked like this. |
Line 1: | Line 1: |
= Theming = |
|
Line 3: | Line 5: |
{{{#!wiki note Note that internally in the code, the term "style" may be used, but for the sake of avoiding confusion with other meanings of this word, the term "theme" is used in this document to describe the resources that change the hgweb interface's appearance. }}} |
|
Line 8: | Line 14: |
The hgweb engine looks up templates in a file named templates/map (or templates/map-<style> if a style is specified). It looks something like this: | The hgweb engine looks up themes in the `templates` directory, typically residing within the `mercurial` package when installed, although some operating system distributions may link `mercurial/templates` to another location (such as `/usr/share/mercurial/templates`). A theme may have its own directory with a file named `map`, or it may place a file in the `templates` directory with a name of the form `map-<theme>`, and this map file will look something like this: |
Line 11: | Line 17: |
default = "changelog" | default = 'shortlog' mimetype = 'text/html; charset={encoding}' |
Line 16: | Line 23: |
naventry = "<a href="?cmd=changelog;rev={rev}">{label}</a> " filedifflink = "<a href="?cmd=filediff;node={node};file={file}">{file}</a> " filenodelink = "<a href="?cmd=file;filenode={filenode};file=[file}">{file}</a> " |
shortlog = shortlog.tmpl shortlogentry = shortlogentry.tmpl naventry = '<a href="{url}log/{node|short}{sessionvars%urlparameter}">{label|escape}</a> ' |
Line 22: | Line 29: |
This maps a template name to either a file (for example 'header' is found in header.tmpl) or a simple quoted string (eg naventry). The latter is used for small templates where a separate file would be awkward. | This maps a template name to either a file (for example, the content for `header` is found in the `header.tmpl` file) or a simple quoted string (such as `naventry`). The latter is used for small templates where a separate file would be awkward. |
Line 24: | Line 31: |
A style is simply a separate map file and possibly some additional template files. Mercurial comes with a few styles already, including the default HTML style, an XML style for RSS feeds, and a 'raw' style that allows getting patches and source files as plain text, as well as a gitweb-lookalike style | A theme is simply a separate map file and possibly some additional template files. Mercurial comes with a few themes already, including the default HTML style (called `paper`), an XML style for Atom and RSS feeds, and a `raw` theme that allows getting patches and source files as plain text, as well as a gitweb-lookalike theme. In version 1.5 there are also `coal`, `monoblue` and `spartan` themes. Themes (known also as styles) can be switched by appending the `style=name` URL parameter, preceding it with `?` or `&` as appropriate. |
Line 28: | Line 37: |
Each template is simply a file or string with a number of tags of the form {variable} that get replaced with the appropriate text when the template gets processed. For example, here's the template for the tags page in the default theme: | Each template is simply a file or string with a number of tags of the form `{variable}` that get replaced with the appropriate text when the template gets processed. For example, here's the template for the tags page in the former default theme: |
Line 50: | Line 59: |
== Substitutions == Although the above definition of a template would imply that arbitrary substitutions can be defined, in practice only a selection of variables are defined. In the above example, `{repo}` causes the predefined variable of that name to yield its value such that it is substituted into the output. Similarly, `{header}` and `{footer}` respectively cause the contents of the header and footer definitions to be substituted into the output. As of Mercurial 1.5.3, it is not possible to define arbitrary substitutions in the map file and then reference them in the unconditional form described above. For example, defining the following in the map file... {{{ logo = '<img src="/images/mercurial.png" alt="Mercurial logo" />' }}} ...and then inserting the reference `{logo}` in a template will not cause the substitution to occur. |
|
Line 52: | Line 73: |
Note the {{{{entries%tagentry}}}} line above. The entries variable is actually a list of variable mappings, and the % syntax instructs the template engine to apply the tagentry format to each of them. | Consider the {{{{entries%tagentry}}}} line in the above example. The `entries` variable is actually a list of variable mappings, and the `%` syntax instructs the template engine to apply the `tagentry` format to each of them. Note that the `tagentry` definition is successfully referenced here, and its contents applied to each entry in the `entries` collection, precisely because an interpolation is being performed. Thus, the limitation described above (where an unconditional `{tagentry}` reference would fail) does not apply here. |
Line 62: | Line 85: |
This applies the 'escape' filter to the 'repo' variable and the 'short' filter to the node variable. | This applies the `escape` filter to the `repo` variable and the `short` filter to the `node` variable. |
Line 72: | Line 95: |
* age: print a date in 'x days ago' format * date: print a date in default format * rfc822date: print a date in rfc822 format |
* age: print a date in 'x days ago' format (e.g. {{{{date|age} }}}gives {{{15 hours ago}}}) * date: print a date in default format (e.g. {{{{date|date} }}}gives {{{Mon Mar 29 15:16:05 2010 -0500}}}) * rfc822date: print a date in rfc822 format (e.g. {{{{date|rfc822date} }}}gives {{{Mon, 29 Mar 2010 15:16:05 -0500}}}) * rfc3339date: print a date in rfc3339 format (e.g. {{{{date|rfc3339date} }}}gives {{{2010-03-29T15:16:05-05:00}}}) * localdate: print a date in the local timezone (e.g. {{{{date|localdate|rfc822date} }}}gives {{{Mon, 29 Mar 2010 21:16:05 +0100}}}) * shortdate: print a date in short format (e.g. {{{{date|shortdate} }}}gives {{{2010-03-29}}}) |
Line 83: | Line 109: |
Now that you know how the templates work, creating your own theme is simply a matter of copying the stock map file to map-mytheme, modifying it, and copying any template files you modify. Then you can add the following to your .hg/hgrc file: | Now that you know how the templates work, creating your own theme is simply a matter of copying the stock map file to `map-mytheme`, modifying it, and copying any template files you modify. Then you can add the following to your `.hg/hgrc` file: |
Line 89: | Line 115: |
Alternatively, you can use the `style=mytheme` URL parameter definition to specifically request your theme. |
Theming
The hgweb interface is completely themable. All output is generated from templates, nothing is hardcoded. Here's how it works:
Note that internally in the code, the term "style" may be used, but for the sake of avoiding confusion with other meanings of this word, the term "theme" is used in this document to describe the resources that change the hgweb interface's appearance.
Contents
The Map File
The hgweb engine looks up themes in the templates directory, typically residing within the mercurial package when installed, although some operating system distributions may link mercurial/templates to another location (such as /usr/share/mercurial/templates). A theme may have its own directory with a file named map, or it may place a file in the templates directory with a name of the form map-<theme>, and this map file will look something like this:
default = 'shortlog' mimetype = 'text/html; charset={encoding}' header = header.tmpl footer = footer.tmpl search = search.tmpl changelog = changelog.tmpl shortlog = shortlog.tmpl shortlogentry = shortlogentry.tmpl naventry = '<a href="{url}log/{node|short}{sessionvars%urlparameter}">{label|escape}</a> ' ...
This maps a template name to either a file (for example, the content for header is found in the header.tmpl file) or a simple quoted string (such as naventry). The latter is used for small templates where a separate file would be awkward.
A theme is simply a separate map file and possibly some additional template files. Mercurial comes with a few themes already, including the default HTML style (called paper), an XML style for Atom and RSS feeds, and a raw theme that allows getting patches and source files as plain text, as well as a gitweb-lookalike theme. In version 1.5 there are also coal, monoblue and spartan themes.
Themes (known also as styles) can be switched by appending the style=name URL parameter, preceding it with ? or & as appropriate.
Templates
Each template is simply a file or string with a number of tags of the form {variable} that get replaced with the appropriate text when the template gets processed. For example, here's the template for the tags page in the former default theme:
{header} <title>{repo}: tags</title> </head> <body> <div class="buttons"> <a href="?cmd=changelog;rev={rev}">changelog</a> <a href="?cmd=manifest;manifest={manifest};path=/">manifest</a> </div> <h2>tags:</h2> <ul id="tagEntries"> {entries%tagentry} </ul> {footer}
Substitutions
Although the above definition of a template would imply that arbitrary substitutions can be defined, in practice only a selection of variables are defined. In the above example, {repo} causes the predefined variable of that name to yield its value such that it is substituted into the output. Similarly, {header} and {footer} respectively cause the contents of the header and footer definitions to be substituted into the output.
As of Mercurial 1.5.3, it is not possible to define arbitrary substitutions in the map file and then reference them in the unconditional form described above. For example, defining the following in the map file...
logo = '<img src="/images/mercurial.png" alt="Mercurial logo" />'
...and then inserting the reference {logo} in a template will not cause the substitution to occur.
Interpolations
Consider the {entries%tagentry} line in the above example. The entries variable is actually a list of variable mappings, and the % syntax instructs the template engine to apply the tagentry format to each of them.
Note that the tagentry definition is successfully referenced here, and its contents applied to each entry in the entries collection, precisely because an interpolation is being performed. Thus, the limitation described above (where an unconditional {tagentry} reference would fail) does not apply here.
Filters
There is also a set of filters that can be applied to replacements, for example:
<title>{repo|escape}: changeset {node|short}</title>
This applies the escape filter to the repo variable and the short filter to the node variable. Multiple filters can be applied to a single variable:
<h2>changeset: {repo|escape|firstline}</h2>
The available filters include:
- escape: escape HTML
age: print a date in 'x days ago' format (e.g. {date|age} gives 15 hours ago)
date: print a date in default format (e.g. {date|date} gives Mon Mar 29 15:16:05 2010 -0500)
rfc822date: print a date in rfc822 format (e.g. {date|rfc822date} gives Mon, 29 Mar 2010 15:16:05 -0500)
rfc3339date: print a date in rfc3339 format (e.g. {date|rfc3339date} gives 2010-03-29T15:16:05-05:00)
localdate: print a date in the local timezone (e.g. {date|localdate|rfc822date} gives Mon, 29 Mar 2010 21:16:05 +0100)
shortdate: print a date in short format (e.g. {date|shortdate} gives 2010-03-29)
addbreaks: insert <br> tags for newlines
- obfuscate: disguise email addresses
- short: print node ids in short form
- firstline: print the first line of a multiline string
- permissions: convert a permission code to ls-style formatting
Creating your own theme
Now that you know how the templates work, creating your own theme is simply a matter of copying the stock map file to map-mytheme, modifying it, and copying any template files you modify. Then you can add the following to your .hg/hgrc file:
[web] style = mytheme
Alternatively, you can use the style=mytheme URL parameter definition to specifically request your theme.