view ja/template.tex @ 362:df4ac9043db0

a bit more template.tex
author Yoshiki Yazawa <yaz@honeyplanet.jp>
date Tue, 23 Sep 2008 02:21:24 +0900
parents 96437101a088
children bc92b28fc970
line wrap: on
line source

%\chapter{Customising the output of Mercurial}
\chapter{Mercurial$B$N=PNO$N%+%9%?%^%$%:(B}
\label{chap:template}

%Mercurial provides a powerful mechanism to let you control how it
%displays information.  The mechanism is based on templates.  You can
%use templates to generate specific output for a single command, or to
%customise the entire appearance of the built-in web interface.

Mercurial$B$K$O>pJs$NI=<($r%3%s%H%m!<%k$9$k$?$a$N6/NO$J5!9=$,$"$k!%$3$N5!9=(B
$B$O%F%s%W%l!<%H$r%Y!<%9$H$7$F$$$k!%%F%s%W%l!<%H$K$h$C$F$"$k%3%^%s%I$+$iFC(B
$BJL$N=PNO$r9T$C$?$j!$FbB"$N%&%'%V%$%s%?%U%'!<%9$N8+$?L\$r%+%9%?%^%$%:$9$k(B
$B$3$H$,$G$-$k!%(B

%\section{Using precanned output styles}
\section{$BMQ0U$5$l$?=PNO%9%?%$%k$NMxMQ(B}
\label{sec:style}

%Packaged with Mercurial are some output styles that you can use
%immediately.  A style is simply a precanned template that someone
%wrote and installed somewhere that Mercurial can find.

$B$9$0$K;H$&$3$H$N$G$-$k$$$/$D$+$N%9%?%$%k$,(BMercurial$B$KF1:-$5$l$F$$$k!%%9%?(B
$B%$%k$H$O4L5M$5$l$?%F%s%W%l!<%H$G$"$j!$(B Mercurial$B$N%$%s%9%H!<%k$5$l$?$I$3(B
$B$+$N%^%7%s$GC/$+$,=q$$$F%$%s%9%H!<%k$7$?$b$N$G$"$k!%(B

%Before we take a look at Mercurial's bundled styles, let's review its
%normal output.

Mercurial$BF1:-$N%9%?%$%k$r8+$kA0$K!$DL>o$N=PNO$r8+$F$_$h$&!%(B

\interaction{template.simple.normal}

%This is somewhat informative, but it takes up a lot of space---five
%lines of output per changeset.  The \texttt{compact} style reduces
%this to three lines, presented in a sparse manner.

$B$3$N=PNO$K$OM-1W$J>pJs$,4^$^$l$F$$$k$,!$(B1$B$D$N%A%'%s%8%;%C%HKh$K(B5$B9T$r;H$&(B
$B$J$I!$B?$/$N%9%Z!<%9$rHq$d$9!%(B\texttt{compact}$B%9%?%$%k$OAB$i$JJ}K!$r;H$&(B
$B$3$H$G$3$l$r(B3$B9T$K8:$i$9!%(B

\interaction{template.simple.compact}

%The \texttt{changelog} style hints at the expressive power of
%Mercurial's templating engine.  This style attempts to follow the GNU
%Project's changelog guidelines\cite{web:changelog}.

\texttt{changelog}$B%9%?%$%k$O(BMercurial$B$N%F%s%W%l!<%H%(%s%8%s$N0RNO$rCN$k$$(B
$B$$Nc$G$"$k!%$3$N%9%?%$%k$O(BGNU$B%W%m%8%'%/%H$N(Bchangelog$B%,%$%I%i%$%s(B
\cite{web:changelog}$B$K=>$*$&$H$9$k!%(B

\interaction{template.simple.changelog}

%You will not be shocked to learn that Mercurial's default output style
%is named \texttt{default}.

Mercurial$B$N%G%U%)%k%H=PNO%9%?%$%k$,(B\texttt{default}$B$HL>IU$1$i$l$F$$$k$N(B
$B$O6C$/$KCM$7$J$$!%(B

%\subsection{Setting a default style}
\subsection{$B%G%U%)%k%H%9%?%$%k$N@_Dj(B}

%You can modify the output style that Mercurial will use for every
%command by editing your \hgrc file, naming the style you would
%prefer to use.

Mercurial$B$NA4$F$N%3%^%s%I$GMQ$$$i$l$k=PNO%9%?%$%k$O(B \hgrc $B%U%!%$%k$rJT=8(B
$B$9$k$3$H$G@_Dj$G$-!$9%$-$JL>A0$rIU$1$k$3$H$,$G$-$k!%(B

\begin{codesample2}
  [ui]
  style = compact
\end{codesample2}

%If you write a style of your own, you can use it by either providing
%the path to your style file, or copying your style file into a
%location where Mercurial can find it (typically the \texttt{templates}
%subdirectory of your Mercurial install directory).

$B<+J,$G%9%?%$%k$r=q$$$?$H$-$O!$%9%?%$%k%U%!%$%k$N%Q%9$rDI2C$7$?$j!$%U%!%$(B
$B%k$r(BMercurial$B$,H/8+$G$-$k>l=j(B($BE57?E*$K$O!$(BMercurial$B$N%$%s%9%H!<%k%G%#%l%/(B
$B%H%j$N(B\texttt{templates}$B%5%V%G%#%l%/%H%j(B)$B$K%3%T!<$9$k$3$H$GMxMQ2DG=$K$J(B
$B$k!%(B

%\section{Commands that support styles and templates}
\section{$B%9%?%$%k$H%F%s%W%l!<%H$r%5%]!<%H$9$k%3%^%s%I(B}

%All of Mercurial's ``\texttt{log}-like'' commands let you use styles
%and templates: \hgcmd{incoming}, \hgcmd{log}, \hgcmd{outgoing}, and
%\hgcmd{tip}.

Mercurial$B$N(B``\texttt{log}$B7O(B''$B$NA4$F$N%3%^%s%I(B: \hgcmd{incoming},
\hgcmd{log}, \hgcmd{outgoing}, $B$*$h$S(B\hgcmd{tip}$B$O%9%?%$%k$H%F%s%W%l!<%H(B
$B$rMxMQ$7$F$$$k!%(B

%As I write this manual, these are so far the only commands that
%support styles and templates.  Since these are the most important
%commands that need customisable output, there has been little pressure
%from the Mercurial user community to add style and template support to
%other commands.

$B$3$N%^%K%e%"%k$G=q$$$F$$$k$h$&$K!$$3$l$^$G$N$H$3$m!$$3$l$i$N%3%^%s%I$@$1(B
$B$,%9%?%$%k$H%F%s%W%l!<%H$r%5%]!<%H$7$F$$$k!%$3$l$i$,%+%9%?%^%$%:2DG=$J=P(B
$BNO$,I,MW$J:G$b=EMW$J%3%^%s%I$G$"$k$?$a!$(B Mercurial$B$N%f!<%6%3%_%e%K%F%#$+(B
$B$iB>$N%3%^%s%I$K%9%?%$%k$H%F%s%W%l!<%H%5%]!<%H$rE,MQ$+$N$&$K$;$h$H$$$&%W(B
$B%l%C%7%c!<$O$[$H$s$I$J$$!%(B

%\section{The basics of templating}
\section{$B%F%s%W%l!<%H$N4pK\(B}

%At its simplest, a Mercurial template is a piece of text.  Some of the
%text never changes, while other parts are \emph{expanded}, or replaced
%with new text, when necessary.

$B:G$bC1=c$J(BMercurial$B%F%s%W%l!<%H$O%F%-%9%HJR$G$"$k!%%F%-%9%H$N$"$kItJ,$OIT(B
$BJQ$G!$B>$NItJ,$OI,MW$K1~$8$F(B\emph{$BE83+(B}$B$5$l$k$?$j?7$7$$%F%-%9%H$KCV49$5$l(B
$B$k!%(B

%Before we continue, let's look again at a simple example of
%Mercurial's normal output.

$B$5$i$KB3$1$kA0$K(BMercurial$BI8=`=PNO$NNc$r$b$&0lEY8+$F$_$h$&!%(B

\interaction{template.simple.normal}

%Now, let's run the same command, but using a template to change its
%output.

$B$3$3$GF1$8%3%^%s%I$r=PNO$rJQ2=$5$;$k$?$a$K%F%s%W%l!<%H$r;H$C$F$_$h$&!%(B

\interaction{template.simple.simplest}

%The example above illustrates the simplest possible template; it's
%just a piece of static text, printed once for each changeset.  The
%\hgopt{log}{--template} option to the \hgcmd{log} command tells
%Mercurial to use the given text as the template when printing each
%changeset.

$B>e$NNc$O:G$bC1=c$J%F%s%W%l!<%H$r<($7$?(B; $B@EE*$J%F%-%9%H$@$1$+$i$J$j!$3F%A%'(B
$B%s%8%;%C%H$K$D$$$F0lEY$@$1=PNO$r9T$&!%(B\hgcmd{log}$B%3%^%s%I$K(B
\hgopt{log}{--template}$B%*%W%7%g%s$r;H$&$H(BMercurial$B$O3F!9$N%A%'%s%8%;%C%H(B
$B$r=PNO$9$k$H$-$K!$M?$($i$l$?%F%-%9%H$r%F%s%W%l!<%H$H$7$FMQ$$$k!%(B

%Notice that the template string above ends with the text
%``\Verb+\n+''.  This is an \emph{escape sequence}, telling Mercurial
%to print a newline at the end of each template item.  If you omit this
%newline, Mercurial will run each piece of output together.  See
%section~\ref{sec:template:escape} for more details of escape sequences.

$B%F%s%W%l!<%HJ8;zNs$O(B``\Verb+\n+''$B$G=*$k$3$H$KCm0U!%$3$l$O(BMercurial$B$K%F%s(B
$B%W%l!<%H$N3FMWAG$NKvHx$K2~9T$r=PNO$9$k$h$&;X<($9$k(B\emph{$B%(%9%1!<%W%7!<%1(B
$B%s%9(B}$B$G$"$k!%$3$N2~9T$r>JN,$9$k$H(BMercurial$B$O3FMWAG$r7R$2$F=PNO$9$k!%%(%9(B
$B%1!<%W%7!<%1%s%9$N$h$j>\:Y$J@bL@$K$D$$$F$O(B~\ref{sec:template:escape}$B@a$r(B
$B;2>H$N$3$H!%(B

%A template that prints a fixed string of text all the time isn't very
%useful; let's try something a bit more complex.

$B>o$K8GDjJ8;zNs$r=PNO$9$k%F%s%W%l!<%H$O$"$^$jM-MQ$G$"$k$H$O8@$($J$$!%$b$&(B
$B>/$79~$_F~$C$?%F%s%W%l!<%H$r;n$=$&!%(B

\interaction{template.simple.simplesub}

%As you can see, the string ``\Verb+{desc}+'' in the template has been
%replaced in the output with the description of each changeset.  Every
%time Mercurial finds text enclosed in curly braces (``\texttt{\{}''
%and ``\texttt{\}}''), it will try to replace the braces and text with
%the expansion of whatever is inside.  To print a literal curly brace,
%you must escape it, as described in section~\ref{sec:template:escape}.

$B%F%s%W%l!<%HFb$N(B``\Verb+{desc}+''$B$H$$$&J8;zNs$O=PNO$G$O!$3F!9$N%A%'%s%8%;%C(B
$B%H$N@bL@$KCV49$5$l$k!%(BMercurial$B$OCf3g8L(B(``\texttt{\{}''$B$H(B
``\texttt{\}}'')$B$G0O$^$l$?%F%-%9%H$r8+$D$1$k$HCf3g8L$H%F%-%9%H$rFbIt$N%F(B
$B%-%9%H$rE83+$7$?$b$N$KCV49$7$h$&$H;n$_$k!%J8;z$H$7$FCf3g8L$r0u;z$7$?$$>l(B
$B9g$O(B~\ref{sec:template:escape}$B@a$G<($9$h$&$K%(%9%1!<%W$9$kI,MW$,$"$k!%(B

%\section{Common template keywords}
\section{$B%F%s%W%l!<%H$N6&DL%-!<%o!<%I(B}
\label{sec:template:keyword}

%You can start writing simple templates immediately using the keywords
%below.

$BC1=c$J%F%s%W%l!<%H$O0J2<$N$h$&$J%-!<%o!<%I$r;H$C$FD>$A$K=q$/$3$H$,$G$-$k!%(B

\begin{itemize}
%\item[\tplkword{author}] String.  The unmodified author of the changeset.
\item[\tplkword{author}] $BJ8;zNs!%%A%'%s%8%;%C%H$NCx<T$,$=$N$b$N!%(B
%\item[\tplkword{branches}] String.  The name of the branch on which
%  the changeset was committed.  Will be empty if the branch name was
%  \texttt{default}.
\item[\tplkword{branches}] $BJ8;zNs!%%A%'%s%8%;%C%H$,%3%_%C%H$5$l$?%V%i%s(B
			 $B%A$NL>A0!%%V%i%s%AL>$,(B\texttt{default}$B$N>l9g$O(B
			 $B6uMs$H$J$k!%(B
%\item[\tplkword{date}] Date information.  The date when the changeset
%  was committed.  This is \emph{not} human-readable; you must pass it
%  through a filter that will render it appropriately.  See
%  section~\ref{sec:template:filter} for more information on filters.
%  The date is expressed as a pair of numbers.  The first number is a
%  Unix UTC timestamp (seconds since January 1, 1970); the second is
%  the offset of the committer's timezone from UTC, in seconds.
\item[\tplkword{date}] $BF|;~>pJs!%%A%'%s%8%;%C%H$,%3%_%C%H$5$l$?F|;~!%$3$l(B
			 $B$O?M4V$N2DFI$J7A<0$G$O(B\emph{$B$J$$(B}$B!%I,$:E,@Z$J%U%#(B
			 $B%k%?$r8F$S=P$7$FJQ49$9$kI,MW$,$"$k!%%U%#%k%?$K4X(B
			 $B$9$k$h$j>\:Y$J@bL@$O(B~\ref{sec:template:filter}
			 $B@a$r;2>H$N$3$H!%F|;~$O(B2$B$D$N?t;z$NAH$_9g$o$;$GI=(B
			 $B$5$l$k!%:G=i$N?t;z$O(BUTC$B$G$N(BUnix$B%?%$%`%9%?%s%W(B
			 (1970$BG/(B1$B7n(B1$BF|$+$i$NIC?t(B)$B$G!$(B2$BHVL\$N?t;z$O%3%_%C(B
			 $B%?$N%?%$%`%>!<%s$N(BUTC$B$+$i$N;~:9$rIC?t$GI=$7$?$b(B
			 $B$N$G$"$k!%(B
%\item[\tplkword{desc}] String.  The text of the changeset description.
\item[\tplkword{desc}] $BJ8;zNs!%%A%'%s%8%;%C%H$N@bL@J8!%(B

%\item[\tplkword{files}] List of strings.  All files modified, added, or
%  removed by this changeset.
\item[\tplkword{files}] $BJ8;zNs$N%j%9%H!%$3$N%A%'%s%8%;%C%H$GJQ99!$DI2C!$(B
			 $B:o=|$5$l$?A4$F$N%U%!%$%k$NL>A0!%(B

%\item[\tplkword{file\_adds}] List of strings.  Files added by this
%  changeset.
\item[\tplkword{file\_adds}] $BJ8;zNs$N%j%9%H!%$3$N%A%'%s%8%;%C%H$GDI2C$5(B
			 $B$l$?%U%!%$%k$NL>A0!%(B

%\item[\tplkword{file\_dels}] List of strings.  Files removed by this
%  changeset.
\item[\tplkword{file\_dels}] $BJ8;zNs$N%j%9%H!%$3$N%A%'%s%8%;%C%H$G:o=|$5(B
			 $B$l$?%U%!%$%k$NL>A0!%(B

%\item[\tplkword{node}] String.  The changeset identification hash, as a
%  40-character hexadecimal string.
\item[\tplkword{node}] $BJ8;zNs!%%A%'%s%8%;%C%H$N<1JL%O%C%7%e$r(B40$BJ8;z$N(B16
			 $B?J?t$G<($7$?$b$N!%(B

%\item[\tplkword{parents}] List of strings.  The parents of the
%  changeset.
\item[\tplkword{parents}] $BJ8;zNs$N%j%9%H!%%A%'%s%8%;%C%H$N?F!%(B

%\item[\tplkword{rev}] Integer.  The repository-local changeset revision
%  number.
\item[\tplkword{rev}] $B@0?t!%%j%]%8%H%j%m!<%+%k$N%A%'%s%8%;%C%H%j%S%8%g%s(B
			 $BHV9f!%(B

%\item[\tplkword{tags}] List of strings.  Any tags associated with the
%  changeset.
\item[\tplkword{tags}] $BJ8;zNs$N%j%9%H!%%A%'%s%8%;%C%H$K4XO"$E$1$i$l$?G$(B
			 $B0U$N%?%0!%(B
\end{itemize}

%A few simple experiments will show us what to expect when we use these
%keywords; you can see the results in
%figure~\ref{fig:template:keywords}.

$B$$$/$D$+;n$7$F$_$l$P$3$l$i$N%-!<%o!<%I$K$I$N$h$&$J8z2L$,$"$k$N$+$rCN$k$3(B
$B$H$,$G$-$k!%7k2L$r?^(B~\ref{fig:template:keywords}$B$K<($9!%(B

\begin{figure}
  \interaction{template.simple.keywords}
%  \caption{Template keywords in use}
  \caption{$B%F%s%W%l!<%H%-!<%o!<%I$N;HMQ(B}
  \label{fig:template:keywords}
\end{figure}

%As we noted above, the date keyword does not produce human-readable
%output, so we must treat it specially.  This involves using a
%\emph{filter}, about which more in section~\ref{sec:template:filter}.

$B4{$K=R$Y$?$h$&$K!$(Bdate$B%-!<%o!<%I$O2DFI$J=PNO$r9T$o$J$$$?$a!$FCJL$J<h$j07(B
$B$$$,I,MW$G$"$k!%$=$NL\E*$G(B\emph{filter}$B$r;HMQ$9$k$,!$$h$j>\:Y$K(B
$B$O(B~\ref{sec:template:filter}$B@a$G<h$j07$&!%(B

\interaction{template.simple.datekeyword}

%\section{Escape sequences}
\section{$B%(%9%1!<%W%7!<%1%s%9(B}
\label{sec:template:escape}

%Mercurial's templating engine recognises the most commonly used escape
%sequences in strings.  When it sees a backslash (``\Verb+\+'')
%character, it looks at the following character and substitutes the two
%characters with a single replacement, as described below.

Mercurial$B$N%F%s%W%l!<%H%(%s%8%s$OJ8;zNs$G:G$b$h$/;HMQ$5$l$k%(%9%1!<%W%7!<(B
$B%1%s%9$rG'<1$9$k!%%(%s%8%s$O%P%C%/%9%i%C%7%e(B(``\Verb+\+'')$B$r8+$D$1$k$H8e(B
$BB3$NJ8;z$r4^$`(B2$BJ8;z$r0J2<$N$h$&$J(B1$BJ8;z$GCV49$9$k!%(B

\begin{itemize}
%\item[\Verb+\textbackslash\textbackslash+] Backslash, ``\Verb+\+'',
%  ASCII~134.
%\item[\Verb+\textbackslash n+] Newline, ASCII~12.
%\item[\Verb+\textbackslash r+] Carriage return, ASCII~15.
%\item[\Verb+\textbackslash t+] Tab, ASCII~11.
%\item[\Verb+\textbackslash v+] Vertical tab, ASCII~13.
%\item[\Verb+\textbackslash \{+] Open curly brace, ``\Verb+{+'', ASCII~173.
%\item[\Verb+\textbackslash \}+] Close curly brace, ``\Verb+}+'', ASCII~175.
\item[\Verb+\textbackslash\textbackslash+] $B%P%C%/%9%i%C%7%e(B, ``\Verb+\+'',
  ASCII~134.
\item[\Verb+\textbackslash n+] $B2~9T(B, ASCII~12.
\item[\Verb+\textbackslash r+] $BI|5"(B, ASCII~15.
\item[\Verb+\textbackslash t+] $B%?%V(B, ASCII~11.
\item[\Verb+\textbackslash v+] $B?bD>%?%V(B, ASCII~13.
\item[\Verb+\textbackslash \{+] $B3+$-Cf3g8L(B, ``\Verb+{+'', ASCII~173.
\item[\Verb+\textbackslash \}+] $BJD$8Cf3g8L(B, ``\Verb+}+'', ASCII~175.
\end{itemize}

%As indicated above, if you want the expansion of a template to contain
%a literal ``\Verb+\+'', ``\Verb+{+'', or ``\Verb+{+'' character, you
%must escape it.

$B>e$K<($7$?$h$&$K!$%F%s%W%l!<%H$NE83+$N:]$KJ8;z(B
``\Verb+\+'', ``\Verb+{+'', $B$^$?$O(B``\Verb+{+''$B$rF~$l$?$$>l9g$O%(%9%1!<%W(B
$B$9$k$3$H$,I,MW$G$"$k!%(B

%\section{Filtering keywords to change their results}
\section{$B7k2L$r2~JQ$9$k%U%#%k%?%-!<%o!<%I(B}
\label{sec:template:filter}

%Some of the results of template expansion are not immediately easy to
%use.  Mercurial lets you specify an optional chain of \emph{filters}
%to modify the result of expanding a keyword.  You have already seen a
%common filter, \tplkwfilt{date}{isodate}, in action above, to make a
%date readable.

$B%F%s%W%l!<%HE83+$N7k2L$N$&$A!$$$$/$D$+$O$?$d$9$/MxMQ$G$-$k$b$N$G$O$J$$!%(B
Mercurial$B$OE83+$5$l$k%-!<%o!<%I$rJQ99$9$k$?$a$N0lO"$N(B\emph{filters}$B%*%W%7%g(B
$B%s$rDs6!$7$F$$$k!%F|;~$r2DFI$K$9$k$?$a$K$h$/MQ$$$i$l$k(B
\tplkwfilt{date}{isodate}$B%U%#%k%?$NF0:nNc$K$D$$$F$O4{$K8+$F$-$?!%(B

%Below is a list of the most commonly used filters that Mercurial
%supports.  While some filters can be applied to any text, others can
%only be used in specific circumstances.  The name of each filter is
%followed first by an indication of where it can be used, then a
%description of its effect.

$B0J2<$K<($9$N$O(BMercurial$B$,%5%]!<%H$9$k%U%#%k%?$NCf$G:G$b$h$/;H$o$l$k$b$N$G(B
$B$"$k!%$$$/$D$+$N%U%#%k%?$OG$0U$NJ8;zNs$KBP$7$FE,MQ2DG=$J0lJ}!$B>$N$b$N$O(B
$BFCDj$N>u67$K$*$$$F$N$_MxMQ2DG=$G$"$k!%3F!9$N%U%#%k%?$NL>A0$O!$MxMQ2DG=$J(B
$B>u67$r<($9I=<($G;O$^$j!$F@$i$l$k8z2L$N@bL@$,B3$/!%(B

\begin{itemize}
%\item[\tplfilter{addbreaks}] Any text. Add an XHTML ``\Verb+<br/>+''
%  tag before the end of every line except the last.  For example,
%  ``\Verb+foo\nbar+'' becomes ``\Verb+foo<br/>\nbar+''.

\item[\tplfilter{addbreaks}] $BG$0U$N%F%-%9%H!%(BXHTML$B%?%0(B``\Verb+<br/>+''
$B$r:G=*9T0J30$N3F9T$NKvHx$KDI2C$9$k!%Nc$($P(B``\Verb+foo\nbar+''$B$O(B
			     ``\Verb+foo<br/>\nbar+''$B$H$J$k!%(B

%\item[\tplkwfilt{date}{age}] \tplkword{date} keyword.  Render the
%  age of the date, relative to the current time.  Yields a string like
%  ``\Verb+10 minutes+''.

\item[\tplkwfilt{date}{age}] \tplkword{date}$B%-!<%o!<%I!%F|;~$N7P2a;~4V$r(B
			     $B8=:_$r5/E@$K@07A$9$k!%7k2L$O(B
			     ``\Verb+10 minutes+''$B$N$h$&$K$J$k(B

%\item[\tplfilter{basename}] Any text, but most useful for the
%  \tplkword{files} keyword and its relatives.  Treat the text as a
%  path, and return the basename. For example, ``\Verb+foo/bar/baz+''
%  becomes ``\Verb+baz+''.

\item[\tplfilter{basename}] $BG$0U$N%F%-%9%H$@$,!$(B\tplkword{files}$B%-!<%o!<(B
			     $B%I$d$=$N4XO"%-!<%o!<%I$KBP$7$F:G$bM-MQ$G$"(B
			     $B$k!%%F%-%9%H$r%Q%9$H$7$F07$$!$%Y!<%9%M!<%`$r(B
			     $BJV$9!%Nc$($P(B``\Verb+foo/bar/baz+''$B$O(B
			     ``\Verb+baz+''$B$H$J$k!%(B

%\item[\tplkwfilt{date}{date}] \tplkword{date} keyword.  Render a date
%  in a similar format to the Unix \tplkword{date} command, but with
%  timezone included.  Yields a string like
%  ``\Verb+Mon Sep 04 15:13:13 2006 -0700+''.

\item[\tplkwfilt{date}{date}] \tplkword{date}$B%-!<%o!<%I!%F|;~$r(BUnix$B$N(B
			     \tplkword{date}$B%3%^%s%I$N=PNO$K%?%$%`%>!<%s(B
			     $B>pJs$rDI2C$7$?7A<0$K@07A$9$k!%7k2L$O(B
			     ``\Verb+Mon Sep 04 15:13:13 2006 -0700+''$B$N(B
			     $B$h$&$K$J$k!%(B

%\item[\tplkwfilt{author}{domain}] Any text, but most useful for the
%  \tplkword{author} keyword.  Finds the first string that looks like
%  an email address, and extract just the domain component.  For
%  example, ``\Verb+Bryan O'Sullivan <bos@serpentine.com>+'' becomes
%  ``\Verb+serpentine.com+''.

\item[\tplkwfilt{author}{domain}] $BG$0U$N%F%-%9%H!%(B\tplkword{author}$B%-!<%o!<(B
			     $B%I$G$N;HMQ$K:G$bM-MQ!%:G=i$K8=$l$k(Bemail$B%"%I(B
			     $B%l%97A<0$NJ8;zNs$r8+$D$1!$%I%a%$%sItJ,$@$1$r(B
			     $BH4$-=P$9!%Nc$($P(B
			     ``\Verb+Bryan O'Sullivan <bos@serpentine.com>+''
			     $B$O(B``\Verb+serpentine.com+''$B$H$J$k!%(B

%\item[\tplkwfilt{author}{email}] Any text, but most useful for the
%  \tplkword{author} keyword.  Extract the first string that looks like
%  an email address.  For example,
%  ``\Verb+Bryan O'Sullivan <bos@serpentine.com>+'' becomes
%  ``\Verb+bos@serpentine.com+''.

\item[\tplkwfilt{author}{email}] $BG$0U$N%F%-%9%H!%(B\tplkword{author}$B%-!<%o!<(B
			     $B%I$G:G$bM-MQ!%:G=i$K8=$l$k(Bemail$B%"%I%l%97A<0(B
			     $B$NJ8;zNs$rH4$-=P$9!%Nc$($P(B
			     ``\Verb+Bryan O'Sullivan <bos@serpentine.com>+''
			     $B$O(B``\Verb+bos@serpentine.com+''$B$H$J$k!%(B

%\item[\tplfilter{escape}] Any text.  Replace the special XML/XHTML
%  characters ``\Verb+&+'', ``\Verb+<+'' and ``\Verb+>+'' with
%  XML entities.

\item[\tplfilter{escape}] $BG$0U$N%F%-%9%H!%(BXML/XHTML$BJ8;z(B
			     ``\Verb+&+'', ``\Verb+<+''$B$*$h$S(B
			     ``\Verb+>+''$B$r(BXML$B%(%s%F%#%F%#$GCV49$9$k!%(B

%\item[\tplfilter{fill68}] Any text.  Wrap the text to fit in 68
%  columns.  This is useful before you pass text through the
%  \tplfilter{tabindent} filter, and still want it to fit in an
%  80-column fixed-font window.

\item[\tplfilter{fill68}] $BG$0U$N%F%-%9%H!%%F%-%9%H$r(B68$B7e$K<}$^$k$h$&$K@0(B
			     $B7A$9$k!%$3$l$O(B80$B7e$K8GDj$5$l$?C<Kv$G$NI=<(MQ(B
			     $B$K(B\tplfilter{tabindent}$B%U%#%k%?$r;H$&:]$KJX(B
			     $BMx$G$"$k!%(B

%\item[\tplfilter{fill76}] Any text.  Wrap the text to fit in 76
%  columns.

\item[\tplfilter{fill76}] $BG$0U$N%F%-%9%H!%(B76$B7e$K<}$^$k$h$&$K@07A$9$k!%(B

%\item[\tplfilter{firstline}] Any text.  Yield the first line of text,
%  without any trailing newlines.

\item[\tplfilter{firstline}] $BG$0U$N%F%-%9%H:G=i$N9T$@$1$r=PNO$7!$8eB3$N(B
			     $B9T$O0l@Z=PNO$7$J$$!%(B

%\item[\tplkwfilt{date}{hgdate}] \tplkword{date} keyword.  Render the
%  date as a pair of readable numbers.  Yields a string like
%  ``\Verb+1157407993 25200+''.

\item[\tplkwfilt{date}{hgdate}] \tplkword{date}$B%-!<%o!<%I!%F|;~$r2DFI$J(B
			     $B?t;z$N%Z%"$K@07A$9$k!%(B``\Verb+115740799325200+''$B$N$h$&$JJ8;zNs$r=PNO$9$k!%(B

%\item[\tplkwfilt{date}{isodate}] \tplkword{date} keyword.  Render the
%  date as a text string in ISO~8601 format.  Yields a string like
%  ``\Verb+2006-09-04 15:13:13 -0700+''.

\item[\tplkwfilt{date}{isodate}] \tplkword{date}$B%-!<%o!<%I!%F|;~$r(B
			     ISO~8601$B%U%)!<%^%C%H$K@07A$9$k!%=PNO$O(B
			     ``\Verb+2006-09-04 15:13:13 -0700+''$B$N$h$&$K(B
			     $B$J$k!%(B

%\item[\tplfilter{obfuscate}] Any text, but most useful for the
%  \tplkword{author} keyword.  Yield the input text rendered as a
%  sequence of XML entities.  This helps to defeat some particularly
%  stupid screen-scraping email harvesting spambots.

\item[\tplfilter{obfuscate}]$BG$0U$N%F%-%9%H!%(B\tplkword{author}$B%-!<%o!<%I$H(B
			     $BJ;$;$FMxMQ$9$k>l9g:G$bM-MQ!%F~NO$5$l$?%F%-%9(B
			     $B%H$r(BXML$B%(%s%F%#%F%#$N%7!<%1%s%9$H$7$F=PNO$9(B
			     $B$k!%$3$l$O2hLL$r%9%/%l%$%T%s%0$9$k4VH4$1$J%9(B
			     $B%Q%`%\%C%H$rHr$1$kF/$-$,$"$k!%(B

%\item[\tplkwfilt{author}{person}] Any text, but most useful for the
%  \tplkword{author} keyword.  Yield the text before an email address.
%  For example, ``\Verb+Bryan O'Sullivan <bos@serpentine.com>+''
%  becomes ``\Verb+Bryan O'Sullivan+''.

\item[\tplkwfilt{author}{person}] $BG$0U$N%F%-%9%H!%(B\tplkword{author}$B%-!<(B
	     $B%o!<%I$H9g$o$;$F;H$&>l9g$b$C$H$bM-MQ!%(Bemail$B%"%I%l%9$NA0$N%F(B
	     $B%-%9%H$rCj=P$9$k!%Nc$($P(B``\Verb+Bryan O'Sullivan
	     <bos@serpentine.com>+''$B$O(B``\Verb+Bryan O'Sullivan+''$B$H$J$k!%(B

%\item[\tplkwfilt{date}{rfc822date}] \tplkword{date} keyword.  Render a
%  date using the same format used in email headers.  Yields a string
%  like ``\Verb+Mon, 04 Sep 2006 15:13:13 -0700+''.

\item[\tplkwfilt{date}{rfc822date}] \tplkword{date}$B%-!<%o!<%I!%F|;~$r(B
	     email$B%X%C%@$HF1$87A<0$G@07A$9$k!%(B``\Verb+Mon, 04 Sep 2006
	     15:13:13 -0700+''$B$N$h$&$JJ8;zNs$r@8@.$9$k!%(B

%\item[\tplkwfilt{node}{short}] Changeset hash.  Yield the short form
%  of a changeset hash, i.e.~a 12-byte hexadecimal string.

\item[\tplkwfilt{node}{short}] $B%A%'%s%8%;%C%H%O%C%7%e!%C;7A<0$N%A%'%s%8(B
	     $B%;%C%H%O%C%7%e!$$9$J$o$A(B12$B%P%$%H$N(B16$B?J?tJ8;zNs$r@8@.$9$k!%(B

%\item[\tplkwfilt{date}{shortdate}] \tplkword{date} keyword.  Render
%  the year, month, and day of the date.  Yields a string like
%  ``\Verb+2006-09-04+''.

\item[\tplkwfilt{date}{shortdate}] \tplkword{date}$B%-!<%o!<%I!%G/7nF|$r@0(B
	     $B7A$9$k!%(B``\Verb+2006-09-04+''$B$N$h$&$JJ8;zNs$r@8@.$9$k!%(B

%\item[\tplfilter{strip}] Any text.  Strip all leading and trailing
%  whitespace from the string.

\item[\tplfilter{strip}] $BG$0U$N%F%-%9%H!%J8;zNs$NA08e$N6uGrItJ,$r=|5n$9(B
	     $B$k!%(B

%\item[\tplfilter{tabindent}] Any text.  Yield the text, with every line
%  except the first starting with a tab character.

\item[\tplfilter{tabindent}] $BG$0U$N%F%-%9%H!%%?%VJ8;z$G;O$^$i$J$$9T$9$Y(B
	     $B$F$r=PNO$9$k!%(B

%\item[\tplfilter{urlescape}] Any text.  Escape all characters that are
%  considered ``special'' by URL parsers.  For example, \Verb+foo bar+
%  becomes \Verb+foo%20bar+.

\item[\tplfilter{urlescape}] $BG$0U$N%F%-%9%H!%(BURL$B%Q!<%5$+$i8+$F(B``$BFCJL(B''$B$J(B
	     $BJ8;z$N%(%9%1!<%W$r9T$&!%Nc$($P(B \Verb+foo bar+ $B$O(B
	     \Verb+foo\%20bar+ $B$H$J$k!%(B

%\item[\tplkwfilt{author}{user}] Any text, but most useful for the
%  \tplkword{author} keyword.  Return the ``user'' portion of an email
%  address.  For example,
%  ``\Verb+Bryan O'Sullivan <bos@serpentine.com>+'' becomes
%  ``\Verb+bos+''.

\item[\tplkwfilt{author}{user}] $BG$0U$N%F%-%9%H!%(B\tplkword{author}$B%-!<%o!<(B
	     $B%I$H6&$K;H$C$?>l9g$K:G$bM-MQ!%(Bemail$B%"%I%l%9$+$i%f!<%6L>$NIt(B
	     $BJ,$rH4$-=P$9!%Nc$($P(B``\Verb+Bryan O'Sullivan
	     <bos@serpentine.com>+''$B$O(B``\Verb+bos+''$B$H$J$k!%(B
\end{itemize}

\begin{figure}
  \interaction{template.simple.manyfilters}
%  \caption{Template filters in action}
  \caption{$B%F%s%W%l!<%H%U%#%k%?$NF0:n(B}
  \label{fig:template:filters}
\end{figure}

\begin{note}
%  If you try to apply a filter to a piece of data that it cannot
%  process, Mercurial will fail and print a Python exception.  For
%  example, trying to run the output of the \tplkword{desc} keyword
%  into the \tplkwfilt{date}{isodate} filter is not a good idea.
$B%U%#%k%?$rE,MQITG=$J%G!<%?$KBP$7$F;H$*$&$H$9$k$H(BMercurial$B$O%(%i!<$r5/$3(B
 $B$7!$(BPython$B$+$i$NNc30$r=PNO$9$k!%Nc$($P(B\tplkword{desc}$B%-!<%o!<%I$N=PNO$K(B
 \tplkwfilt{date}{isodate}$B%U%#%k%?$rE,MQ$9$k$N$O$$$$9M$($H$O8@$($J$$!%(B

\end{note}

%\subsection{Combining filters}
\subsection{$BAH$_9g$o$;%U%#%k%?(B}

%It is easy to combine filters to yield output in the form you would
%like.  The following chain of filters tidies up a description, then
%makes sure that it fits cleanly into 68 columns, then indents it by a
%further 8~characters (at least on Unix-like systems, where a tab is
%conventionally 8~characters wide).

$BK>$_$N=PNO$r$($k$?$a$KJ#?t$N%U%#%k%?$rAH$_9g$o$;$k$N$O$?$d$9$$!%0J2<$N0l(B
$BO"$N%U%#%k%?$O@bL@J8$r@0M}$7!$$-$l$$$K(B68$B7e$K<}$^$k$h$&$K@07A$7!$(B8$BJ8;z$N(B
$B%$%s%G%s%H$r9T$&!%!J(BUNIX$B%7%9%F%`$G$O%?%V$O=,47E*$K(B8$B7eJ,$NI}$r;}$D!%!K(B

\interaction{template.simple.combine}

%Note the use of ``\Verb+\t+'' (a tab character) in the template to
%force the first line to be indented; this is necessary since
%\tplkword{tabindent} indents all lines \emph{except} the first.

$B%F%s%W%l!<%H$G:G=i$N9T$r%$%s%G%s%H$9$k$?$a$K$O(B``\Verb+\t+''$B!J%?%VJ8;z!K$r(B
$B;H$&I,MW$,$"$k!%$J$<$J$i(B\tplkword{tabindent}$B$O:G=i$N9T(B\emph{$B0J30(B}$B$N%$%s(B
$B%G%s%H$r9T$&$+$i$G$"$k!%(B

%Keep in mind that the order of filters in a chain is significant.  The
%first filter is applied to the result of the keyword; the second to
%the result of the first filter; and so on.  For example, using
%\Verb+fill68|tabindent+ gives very different results from
%\Verb+tabindent|fill68+.

$B%U%#%k%?$rAH$_9g$o$;$k;~%U%#%k%?$N=g=x$,=EMW$G$"$k$3$H$rF,$KCV$$$F$*$/I,(B
$BMW$,$"$k!%:G=i$N%U%#%k%?$O%-!<%o!<%I$N7k2L$KBP$7$FE,MQ$5$l!$(B2$BHVL\$N%U%#%k(B
$B%?$O:G=i$N%U%#%k%?$N7k2L$KBP$7$FE,MQ$5$l$k!%Nc$r5s$2$k(B
$B$H!$(B\Verb+fill68|tabindent+ $B$H(B \Verb+tabindent|fill68+ $B$N7k2L$OA4$/0c$&(B
$B$b$N$G$"$k!%(B

%\section{From templates to styles}
\section{$B%F%s%W%l!<%H$+$i%9%?%$%k$X(B}

%A command line template provides a quick and simple way to format some
%output.  Templates can become verbose, though, and it's useful to be
%able to give a template a name.  A style file is a template with a
%name, stored in a file.

$B%3%^%s%I%i%$%s%F%s%W%l!<%H$O=PNO$r%U%)!<%^%C%H$9$k$?$a$NAGAa$/C1=c$JJ}K!(B
$B$rDs6!$9$k!%%F%s%W%l!<%H$O%a%C%;!<%8$rB?$/=PNO$9$k$h$&$K$b$G$-$k$,!$%F%s(B
$B%W%l!<%H$KL>A0$rIU$1$k$N$OM-1W$G$"$k!%%9%?%$%k%U%!%$%k$O!$%U%!%$%k$KJ]B8(B
$B$5$l$?L>A0$rIU$1$i$l$?%F%s%W%l!<%H$G$"$k!%(B

%More than that, using a style file unlocks the power of Mercurial's
%templating engine in ways that are not possible using the command line
%\hgopt{log}{--template} option.

$B$5$i$K!$%9%?%$%k%U%!%$%k$r;H$&$3$H$G!$(BMercurial$B$N%F%s%W%l!<%H%(%s%8%s$N%3(B
$B%^%s%I%i%$%s(B\hgopt{log}{--template}$B%*%W%7%g%s$+$i$G$OMxMQ$G$-$J$$NO$r:GBg(B
$B8B$K0z$-=P$9$3$H$,$G$-$k!%(B

%\subsection{The simplest of style files}
\subsection{$B:G$bC1=c$J%9%?%$%k%U%!%$%k(B}

Our simple style file contains just one line:

\interaction{template.simple.rev}

This tells Mercurial, ``if you're printing a changeset, use the text
on the right as the template''.

%\subsection{Style file syntax}
\subsection{$B%9%?%$%k%U%!%$%k$NJ8K!(B}

The syntax rules for a style file are simple.

\begin{itemize}
\item The file is processed one line at a time.

\item Leading and trailing white space are ignored.

\item Empty lines are skipped.

\item If a line starts with either of the characters ``\texttt{\#}'' or
  ``\texttt{;}'', the entire line is treated as a comment, and skipped
  as if empty.

\item A line starts with a keyword.  This must start with an
  alphabetic character or underscore, and can subsequently contain any
  alphanumeric character or underscore.  (In regexp notation, a
  keyword must match \Verb+[A-Za-z_][A-Za-z0-9_]*+.)

\item The next element must be an ``\texttt{=}'' character, which can
  be preceded or followed by an arbitrary amount of white space.

\item If the rest of the line starts and ends with matching quote
  characters (either single or double quote), it is treated as a
  template body.

\item If the rest of the line \emph{does not} start with a quote
  character, it is treated as the name of a file; the contents of this
  file will be read and used as a template body.
\end{itemize}

%\section{Style files by example}
\section{$B%9%?%$%k%U%!%$%k$NNc(B}

To illustrate how to write a style file, we will construct a few by
example.  Rather than provide a complete style file and walk through
it, we'll mirror the usual process of developing a style file by
starting with something very simple, and walking through a series of
successively more complete examples.

%\subsection{Identifying mistakes in style files}
\subsection{$B%9%?%$%k%U%!%$%k$G$N8m$j$rFCDj$9$k(B}

If Mercurial encounters a problem in a style file you are working on,
it prints a terse error message that, once you figure out what it
means, is actually quite useful.

\interaction{template.svnstyle.syntax.input}

Notice that \filename{broken.style} attempts to define a
\texttt{changeset} keyword, but forgets to give any content for it.
When instructed to use this style file, Mercurial promptly complains.

\interaction{template.svnstyle.syntax.error}

This error message looks intimidating, but it is not too hard to
follow.

\begin{itemize}
\item The first component is simply Mercurial's way of saying ``I am
  giving up''.
  \begin{codesample4}
    \textbf{abort:} broken.style:1: parse error
  \end{codesample4}

\item Next comes the name of the style file that contains the error.
  \begin{codesample4}
    abort: \textbf{broken.style}:1: parse error
  \end{codesample4}

\item Following the file name is the line number where the error was
  encountered.
  \begin{codesample4}
    abort: broken.style:\textbf{1}: parse error
  \end{codesample4}

\item Finally, a description of what went wrong.
  \begin{codesample4}
    abort: broken.style:1: \textbf{parse error}
  \end{codesample4}
  The description of the problem is not always clear (as in this
  case), but even when it is cryptic, it is almost always trivial to
  visually inspect the offending line in the style file and see what
  is wrong.
\end{itemize}

%\subsection{Uniquely identifying a repository}
\subsection{$B%j%]%8%H%j$NFCDj(B}

If you would like to be able to identify a Mercurial repository
``fairly uniquely'' using a short string as an identifier, you can
use the first revision in the repository.
\interaction{template.svnstyle.id} 
This is not guaranteed to be unique, but it is nevertheless useful in
many cases.
\begin{itemize}
\item It will not work in a completely empty repository, because such
  a repository does not have a revision~zero.
\item Neither will it work in the (extremely rare) case where a
  repository is a merge of two or more formerly independent
  repositories, and you still have those repositories around.
\end{itemize}
Here are some uses to which you could put this identifier:
\begin{itemize}
\item As a key into a table for a database that manages repositories
  on a server.
\item As half of a \{\emph{repository~ID}, \emph{revision~ID}\} tuple.
  Save this information away when you run an automated build or other
  activity, so that you can ``replay'' the build later if necessary.
\end{itemize}

%\subsection{Mimicking Subversion's output}
\subsection{Subversion$B=PNO$NLOJo(B}

%Let's try to emulate the default output format used by another
%revision control tool, Subversion.
%\interaction{template.svnstyle.short}

$BJL$N%P!<%8%g%s4IM}%D!<%k$G$"$k(BSubversion$B$N=PNO$r%(%_%e%l!<%H$7$F$_$h$&!%(B
\interaction{template.svnstyle.short}

%Since Subversion's output style is fairly simple, it is easy to
%copy-and-paste a hunk of its output into a file, and replace the text
%produced above by Subversion with the template values we'd like to see
%expanded.

Subversion$B$N=PNO%9%?%$%k$O$+$J$jC1=c$J$N$G!$=PNO$+$i%U%!%$%k$X(Bhunk$B$r%3%T!<(B
$B!u%Z!<%9%H$7!$(BSubversion$B$,@8@.$7$?%F%-%9%H$r%F%s%W%l!<%H$K$h$C$FCV49$9$k(B
$B$N$O4JC1$G$"$k!%(B \interaction{template.svnstyle.template}

%There are a few small ways in which this template deviates from the
%output produced by Subversion.

\begin{itemize}
\item Subversion prints a ``readable'' date (the ``\texttt{Wed, 27 Sep
    2006}'' in the example output above) in parentheses.  Mercurial's
  templating engine does not provide a way to display a date in this
  format without also printing the time and time zone.
\item We emulate Subversion's printing of ``separator'' lines full of
  ``\texttt{-}'' characters by ending the template with such a line.
  We use the templating engine's \tplkword{header} keyword to print a
  separator line as the first line of output (see below), thus
  achieving similar output to Subversion.
\item Subversion's output includes a count in the header of the number
  of lines in the commit message.  We cannot replicate this in
  Mercurial; the templating engine does not currently provide a filter
  that counts the number of items it is passed.
\end{itemize}
It took me no more than a minute or two of work to replace literal
text from an example of Subversion's output with some keywords and
filters to give the template above.  The style file simply refers to
the template.
\interaction{template.svnstyle.style}

We could have included the text of the template file directly in the
style file by enclosing it in quotes and replacing the newlines with
``\texttt{\\n}'' sequences, but it would have made the style file too
difficult to read.  Readability is a good guide when you're trying to
decide whether some text belongs in a style file, or in a template
file that the style file points to.  If the style file will look too
big or cluttered if you insert a literal piece of text, drop it into a
template instead.

%%% Local Variables:
%%% mode: yatex
%%% TeX-master: "00book"
%%% End: