Commit 054f8fd1 authored by Fred Drake's avatar Fred Drake

Wrapped some long lines.

Added trailing "()" for function and method names.

Added index entries for referenced modules.
parent 74947ac4
\section{Built-in Module \sectcode{regex}} \section{Built-in Module \sectcode{regex}}
\label{module-regex} \label{module-regex}
\bimodindex{regex} \bimodindex{regex}
This module provides regular expression matching operations similar to This module provides regular expression matching operations similar to
those found in Emacs. those found in Emacs.
\strong{Obsolescence note:} \strong{Obsolescence note:}
This module is obsolete as of Python version 1.5; it is still being This module is obsolete as of Python version 1.5; it is still being
maintained because much existing code still uses it. All new code in maintained because much existing code still uses it. All new code in
need of regular expressions should use the new \code{re} module, which need of regular expressions should use the new
supports the more powerful and regular Perl-style regular expressions. \code{re}\refstmodindex{re} module, which supports the more powerful
Existing code should be converted. The standard library module and regular Perl-style regular expressions. Existing code should be
\code{reconvert} helps in converting \code{regex} style regular converted. The standard library module
expressions to \code{re} style regular expressions. (For more \code{reconvert}\refstmodindex{reconvert} helps in converting
conversion help, see the URL \code{regex} style regular expressions to \code{re}\refstmodindex{re}
style regular expressions. (For more conversion help, see the URL
\file{http://starship.skyport.net/crew/amk/regex/regex-to-re.html}.) \file{http://starship.skyport.net/crew/amk/regex/regex-to-re.html}.)
By default the patterns are Emacs-style regular expressions By default the patterns are Emacs-style regular expressions
...@@ -154,7 +155,8 @@ whitespace or a non-alphanumeric character. ...@@ -154,7 +155,8 @@ whitespace or a non-alphanumeric character.
beginning or end of a word. beginning or end of a word.
% %
\item[\code{\e v}] Must be followed by a two digit decimal number, and \item[\code{\e v}] Must be followed by a two digit decimal number, and
matches the contents of the group of the same number. The group number must be between 1 and 99, inclusive. matches the contents of the group of the same number. The group
number must be between 1 and 99, inclusive.
% %
\item[\code{\e w}]Matches any alphanumeric character; this is \item[\code{\e w}]Matches any alphanumeric character; this is
equivalent to the set \code{[a-zA-Z0-9]}. equivalent to the set \code{[a-zA-Z0-9]}.
...@@ -174,8 +176,8 @@ word. ...@@ -174,8 +176,8 @@ word.
% Python they seem to be synonyms for ^$. % Python they seem to be synonyms for ^$.
\item[\code{\e `}] Like \code{\^}, this only matches at the start of the \item[\code{\e `}] Like \code{\^}, this only matches at the start of the
string. string.
\item[\code{\e \e '}] Like \code{\$}, this only matches at the end of the \item[\code{\e \e '}] Like \code{\$}, this only matches at the end of
string. the string.
% end of buffer % end of buffer
\end{itemize} \end{itemize}
...@@ -201,13 +203,13 @@ The module defines these functions, and an exception: ...@@ -201,13 +203,13 @@ The module defines these functions, and an exception:
\begin{funcdesc}{compile}{pattern\optional{\, translate}} \begin{funcdesc}{compile}{pattern\optional{\, translate}}
Compile a regular expression pattern into a regular expression Compile a regular expression pattern into a regular expression
object, which can be used for matching using its \code{match} and object, which can be used for matching using its \code{match()} and
\code{search} methods, described below. The optional argument \code{search()} methods, described below. The optional argument
\var{translate}, if present, must be a 256-character string \var{translate}, if present, must be a 256-character string
indicating how characters (both of the pattern and of the strings to indicating how characters (both of the pattern and of the strings to
be matched) are translated before comparing them; the \code{i}-th be matched) are translated before comparing them; the \var{i}-th
element of the string gives the translation for the character with element of the string gives the translation for the character with
\ASCII{} code \code{i}. This can be used to implement \ASCII{} code \var{i}. This can be used to implement
case-insensitive matching; see the \code{casefold} data item below. case-insensitive matching; see the \code{casefold} data item below.
The sequence The sequence
...@@ -222,7 +224,7 @@ is equivalent to ...@@ -222,7 +224,7 @@ is equivalent to
\bcode\begin{verbatim} \bcode\begin{verbatim}
result = regex.match(pat, str) result = regex.match(pat, str)
\end{verbatim}\ecode \end{verbatim}\ecode
%
but the version using \code{compile()} is more efficient when multiple but the version using \code{compile()} is more efficient when multiple
regular expressions are used concurrently in a single program. (The regular expressions are used concurrently in a single program. (The
compiled version of the last pattern passed to \code{regex.match()} or compiled version of the last pattern passed to \code{regex.match()} or
...@@ -232,13 +234,13 @@ expressions.) ...@@ -232,13 +234,13 @@ expressions.)
\end{funcdesc} \end{funcdesc}
\begin{funcdesc}{set_syntax}{flags} \begin{funcdesc}{set_syntax}{flags}
Set the syntax to be used by future calls to \code{compile}, Set the syntax to be used by future calls to \code{compile()},
\code{match} and \code{search}. (Already compiled expression objects \code{match()} and \code{search()}. (Already compiled expression
are not affected.) The argument is an integer which is the OR of objects are not affected.) The argument is an integer which is the
several flag bits. The return value is the previous value of OR of several flag bits. The return value is the previous value of
the syntax flags. Names for the flags are defined in the standard the syntax flags. Names for the flags are defined in the standard
module \code{regex_syntax}; read the file \file{regex_syntax.py} for module \code{regex_syntax}\refstmodindex{regex_syntax}; read the
more information. file \file{regex_syntax.py} for more information.
\end{funcdesc} \end{funcdesc}
\begin{funcdesc}{get_syntax}{} \begin{funcdesc}{get_syntax}{}
...@@ -246,10 +248,10 @@ expressions.) ...@@ -246,10 +248,10 @@ expressions.)
\end{funcdesc} \end{funcdesc}
\begin{funcdesc}{symcomp}{pattern\optional{\, translate}} \begin{funcdesc}{symcomp}{pattern\optional{\, translate}}
This is like \code{compile}, but supports symbolic group names: if a This is like \code{compile()}, but supports symbolic group names: if a
parenthesis-enclosed group begins with a group name in angular parenthesis-enclosed group begins with a group name in angular
brackets, e.g. \code{'\e(<id>[a-z][a-z0-9]*\e)'}, the group can brackets, e.g. \code{'\e(<id>[a-z][a-z0-9]*\e)'}, the group can
be referenced by its name in arguments to the \code{group} method of be referenced by its name in arguments to the \code{group()} method of
the resulting compiled regular expression object, like this: the resulting compiled regular expression object, like this:
\code{p.group('id')}. Group names may contain alphanumeric characters \code{p.group('id')}. Group names may contain alphanumeric characters
and \code{'_'} only. and \code{'_'} only.
...@@ -263,8 +265,8 @@ and \code{'_'} only. ...@@ -263,8 +265,8 @@ and \code{'_'} only.
\end{excdesc} \end{excdesc}
\begin{datadesc}{casefold} \begin{datadesc}{casefold}
A string suitable to pass as \var{translate} argument to A string suitable to pass as the \var{translate} argument to
\code{compile} to map all upper case characters to their lowercase \code{compile()} to map all upper case characters to their lowercase
equivalents. equivalents.
\end{datadesc} \end{datadesc}
...@@ -278,7 +280,7 @@ Compiled regular expression objects support these methods: ...@@ -278,7 +280,7 @@ Compiled regular expression objects support these methods:
does not match the pattern (this is different from a zero-length does not match the pattern (this is different from a zero-length
match!). match!).
The optional second parameter \var{pos} gives an index in the string The optional second parameter, \var{pos}, gives an index in the string
where the search is to start; it defaults to \code{0}. This is not where the search is to start; it defaults to \code{0}. This is not
completely equivalent to slicing the string; the \code{'\^'} pattern completely equivalent to slicing the string; the \code{'\^'} pattern
character matches at the real begin of the string and at positions character matches at the real begin of the string and at positions
...@@ -293,12 +295,12 @@ Compiled regular expression objects support these methods: ...@@ -293,12 +295,12 @@ Compiled regular expression objects support these methods:
match anywhere!). match anywhere!).
The optional second parameter has the same meaning as for the The optional second parameter has the same meaning as for the
\code{match} method. \code{match()} method.
\end{funcdesc} \end{funcdesc}
\begin{funcdesc}{group}{index\, index\, ...} \begin{funcdesc}{group}{index\, index\, ...}
This method is only valid when the last call to the \code{match} This method is only valid when the last call to the \code{match()}
or \code{search} method found a match. It returns one or more or \code{search()} method found a match. It returns one or more
groups of the match. If there is a single \var{index} argument, groups of the match. If there is a single \var{index} argument,
the result is a single string; if there are multiple arguments, the the result is a single string; if there are multiple arguments, the
result is a tuple with one item per argument. If the \var{index} is result is a tuple with one item per argument. If the \var{index} is
...@@ -308,8 +310,8 @@ the corresponding parenthesized group (using the default syntax, ...@@ -308,8 +310,8 @@ the corresponding parenthesized group (using the default syntax,
groups are parenthesized using \code{{\e}(} and \code{{\e})}). If no groups are parenthesized using \code{{\e}(} and \code{{\e})}). If no
such group exists, the corresponding result is \code{None}. such group exists, the corresponding result is \code{None}.
If the regular expression was compiled by \code{symcomp} instead of If the regular expression was compiled by \code{symcomp()} instead of
\code{compile}, the \var{index} arguments may also be strings \code{compile()}, the \var{index} arguments may also be strings
identifying groups by their group name. identifying groups by their group name.
\end{funcdesc} \end{funcdesc}
...@@ -319,41 +321,41 @@ Compiled regular expressions support these data attributes: ...@@ -319,41 +321,41 @@ Compiled regular expressions support these data attributes:
\renewcommand{\indexsubitem}{(regex attribute)} \renewcommand{\indexsubitem}{(regex attribute)}
\begin{datadesc}{regs} \begin{datadesc}{regs}
When the last call to the \code{match} or \code{search} method found a When the last call to the \code{match()} or \code{search()} method found a
match, this is a tuple of pairs of indices corresponding to the match, this is a tuple of pairs of indexes corresponding to the
beginning and end of all parenthesized groups in the pattern. Indices beginning and end of all parenthesized groups in the pattern. Indices
are relative to the string argument passed to \code{match} or are relative to the string argument passed to \code{match()} or
\code{search}. The 0-th tuple gives the beginning and end or the \code{search()}. The 0-th tuple gives the beginning and end or the
whole pattern. When the last match or search failed, this is whole pattern. When the last match or search failed, this is
\code{None}. \code{None}.
\end{datadesc} \end{datadesc}
\begin{datadesc}{last} \begin{datadesc}{last}
When the last call to the \code{match} or \code{search} method found a When the last call to the \code{match()} or \code{search()} method found a
match, this is the string argument passed to that method. When the match, this is the string argument passed to that method. When the
last match or search failed, this is \code{None}. last match or search failed, this is \code{None}.
\end{datadesc} \end{datadesc}
\begin{datadesc}{translate} \begin{datadesc}{translate}
This is the value of the \var{translate} argument to This is the value of the \var{translate} argument to
\code{regex.compile} that created this regular expression object. If \code{regex.compile()} that created this regular expression object. If
the \var{translate} argument was omitted in the \code{regex.compile} the \var{translate} argument was omitted in the \code{regex.compile()}
call, this is \code{None}. call, this is \code{None}.
\end{datadesc} \end{datadesc}
\begin{datadesc}{givenpat} \begin{datadesc}{givenpat}
The regular expression pattern as passed to \code{compile} or The regular expression pattern as passed to \code{compile()} or
\code{symcomp}. \code{symcomp()}.
\end{datadesc} \end{datadesc}
\begin{datadesc}{realpat} \begin{datadesc}{realpat}
The regular expression after stripping the group names for regular The regular expression after stripping the group names for regular
expressions compiled with \code{symcomp}. Same as \code{givenpat} expressions compiled with \code{symcomp()}. Same as \code{givenpat}
otherwise. otherwise.
\end{datadesc} \end{datadesc}
\begin{datadesc}{groupindex} \begin{datadesc}{groupindex}
A dictionary giving the mapping from symbolic group names to numerical A dictionary giving the mapping from symbolic group names to numerical
group indices for regular expressions compiled with \code{symcomp}. group indexes for regular expressions compiled with \code{symcomp()}.
\code{None} otherwise. \code{None} otherwise.
\end{datadesc} \end{datadesc}
\section{Built-in Module \sectcode{regex}} \section{Built-in Module \sectcode{regex}}
\label{module-regex} \label{module-regex}
\bimodindex{regex} \bimodindex{regex}
This module provides regular expression matching operations similar to This module provides regular expression matching operations similar to
those found in Emacs. those found in Emacs.
\strong{Obsolescence note:} \strong{Obsolescence note:}
This module is obsolete as of Python version 1.5; it is still being This module is obsolete as of Python version 1.5; it is still being
maintained because much existing code still uses it. All new code in maintained because much existing code still uses it. All new code in
need of regular expressions should use the new \code{re} module, which need of regular expressions should use the new
supports the more powerful and regular Perl-style regular expressions. \code{re}\refstmodindex{re} module, which supports the more powerful
Existing code should be converted. The standard library module and regular Perl-style regular expressions. Existing code should be
\code{reconvert} helps in converting \code{regex} style regular converted. The standard library module
expressions to \code{re} style regular expressions. (For more \code{reconvert}\refstmodindex{reconvert} helps in converting
conversion help, see the URL \code{regex} style regular expressions to \code{re}\refstmodindex{re}
style regular expressions. (For more conversion help, see the URL
\file{http://starship.skyport.net/crew/amk/regex/regex-to-re.html}.) \file{http://starship.skyport.net/crew/amk/regex/regex-to-re.html}.)
By default the patterns are Emacs-style regular expressions By default the patterns are Emacs-style regular expressions
...@@ -154,7 +155,8 @@ whitespace or a non-alphanumeric character. ...@@ -154,7 +155,8 @@ whitespace or a non-alphanumeric character.
beginning or end of a word. beginning or end of a word.
% %
\item[\code{\e v}] Must be followed by a two digit decimal number, and \item[\code{\e v}] Must be followed by a two digit decimal number, and
matches the contents of the group of the same number. The group number must be between 1 and 99, inclusive. matches the contents of the group of the same number. The group
number must be between 1 and 99, inclusive.
% %
\item[\code{\e w}]Matches any alphanumeric character; this is \item[\code{\e w}]Matches any alphanumeric character; this is
equivalent to the set \code{[a-zA-Z0-9]}. equivalent to the set \code{[a-zA-Z0-9]}.
...@@ -174,8 +176,8 @@ word. ...@@ -174,8 +176,8 @@ word.
% Python they seem to be synonyms for ^$. % Python they seem to be synonyms for ^$.
\item[\code{\e `}] Like \code{\^}, this only matches at the start of the \item[\code{\e `}] Like \code{\^}, this only matches at the start of the
string. string.
\item[\code{\e \e '}] Like \code{\$}, this only matches at the end of the \item[\code{\e \e '}] Like \code{\$}, this only matches at the end of
string. the string.
% end of buffer % end of buffer
\end{itemize} \end{itemize}
...@@ -201,13 +203,13 @@ The module defines these functions, and an exception: ...@@ -201,13 +203,13 @@ The module defines these functions, and an exception:
\begin{funcdesc}{compile}{pattern\optional{\, translate}} \begin{funcdesc}{compile}{pattern\optional{\, translate}}
Compile a regular expression pattern into a regular expression Compile a regular expression pattern into a regular expression
object, which can be used for matching using its \code{match} and object, which can be used for matching using its \code{match()} and
\code{search} methods, described below. The optional argument \code{search()} methods, described below. The optional argument
\var{translate}, if present, must be a 256-character string \var{translate}, if present, must be a 256-character string
indicating how characters (both of the pattern and of the strings to indicating how characters (both of the pattern and of the strings to
be matched) are translated before comparing them; the \code{i}-th be matched) are translated before comparing them; the \var{i}-th
element of the string gives the translation for the character with element of the string gives the translation for the character with
\ASCII{} code \code{i}. This can be used to implement \ASCII{} code \var{i}. This can be used to implement
case-insensitive matching; see the \code{casefold} data item below. case-insensitive matching; see the \code{casefold} data item below.
The sequence The sequence
...@@ -222,7 +224,7 @@ is equivalent to ...@@ -222,7 +224,7 @@ is equivalent to
\bcode\begin{verbatim} \bcode\begin{verbatim}
result = regex.match(pat, str) result = regex.match(pat, str)
\end{verbatim}\ecode \end{verbatim}\ecode
%
but the version using \code{compile()} is more efficient when multiple but the version using \code{compile()} is more efficient when multiple
regular expressions are used concurrently in a single program. (The regular expressions are used concurrently in a single program. (The
compiled version of the last pattern passed to \code{regex.match()} or compiled version of the last pattern passed to \code{regex.match()} or
...@@ -232,13 +234,13 @@ expressions.) ...@@ -232,13 +234,13 @@ expressions.)
\end{funcdesc} \end{funcdesc}
\begin{funcdesc}{set_syntax}{flags} \begin{funcdesc}{set_syntax}{flags}
Set the syntax to be used by future calls to \code{compile}, Set the syntax to be used by future calls to \code{compile()},
\code{match} and \code{search}. (Already compiled expression objects \code{match()} and \code{search()}. (Already compiled expression
are not affected.) The argument is an integer which is the OR of objects are not affected.) The argument is an integer which is the
several flag bits. The return value is the previous value of OR of several flag bits. The return value is the previous value of
the syntax flags. Names for the flags are defined in the standard the syntax flags. Names for the flags are defined in the standard
module \code{regex_syntax}; read the file \file{regex_syntax.py} for module \code{regex_syntax}\refstmodindex{regex_syntax}; read the
more information. file \file{regex_syntax.py} for more information.
\end{funcdesc} \end{funcdesc}
\begin{funcdesc}{get_syntax}{} \begin{funcdesc}{get_syntax}{}
...@@ -246,10 +248,10 @@ expressions.) ...@@ -246,10 +248,10 @@ expressions.)
\end{funcdesc} \end{funcdesc}
\begin{funcdesc}{symcomp}{pattern\optional{\, translate}} \begin{funcdesc}{symcomp}{pattern\optional{\, translate}}
This is like \code{compile}, but supports symbolic group names: if a This is like \code{compile()}, but supports symbolic group names: if a
parenthesis-enclosed group begins with a group name in angular parenthesis-enclosed group begins with a group name in angular
brackets, e.g. \code{'\e(<id>[a-z][a-z0-9]*\e)'}, the group can brackets, e.g. \code{'\e(<id>[a-z][a-z0-9]*\e)'}, the group can
be referenced by its name in arguments to the \code{group} method of be referenced by its name in arguments to the \code{group()} method of
the resulting compiled regular expression object, like this: the resulting compiled regular expression object, like this:
\code{p.group('id')}. Group names may contain alphanumeric characters \code{p.group('id')}. Group names may contain alphanumeric characters
and \code{'_'} only. and \code{'_'} only.
...@@ -263,8 +265,8 @@ and \code{'_'} only. ...@@ -263,8 +265,8 @@ and \code{'_'} only.
\end{excdesc} \end{excdesc}
\begin{datadesc}{casefold} \begin{datadesc}{casefold}
A string suitable to pass as \var{translate} argument to A string suitable to pass as the \var{translate} argument to
\code{compile} to map all upper case characters to their lowercase \code{compile()} to map all upper case characters to their lowercase
equivalents. equivalents.
\end{datadesc} \end{datadesc}
...@@ -278,7 +280,7 @@ Compiled regular expression objects support these methods: ...@@ -278,7 +280,7 @@ Compiled regular expression objects support these methods:
does not match the pattern (this is different from a zero-length does not match the pattern (this is different from a zero-length
match!). match!).
The optional second parameter \var{pos} gives an index in the string The optional second parameter, \var{pos}, gives an index in the string
where the search is to start; it defaults to \code{0}. This is not where the search is to start; it defaults to \code{0}. This is not
completely equivalent to slicing the string; the \code{'\^'} pattern completely equivalent to slicing the string; the \code{'\^'} pattern
character matches at the real begin of the string and at positions character matches at the real begin of the string and at positions
...@@ -293,12 +295,12 @@ Compiled regular expression objects support these methods: ...@@ -293,12 +295,12 @@ Compiled regular expression objects support these methods:
match anywhere!). match anywhere!).
The optional second parameter has the same meaning as for the The optional second parameter has the same meaning as for the
\code{match} method. \code{match()} method.
\end{funcdesc} \end{funcdesc}
\begin{funcdesc}{group}{index\, index\, ...} \begin{funcdesc}{group}{index\, index\, ...}
This method is only valid when the last call to the \code{match} This method is only valid when the last call to the \code{match()}
or \code{search} method found a match. It returns one or more or \code{search()} method found a match. It returns one or more
groups of the match. If there is a single \var{index} argument, groups of the match. If there is a single \var{index} argument,
the result is a single string; if there are multiple arguments, the the result is a single string; if there are multiple arguments, the
result is a tuple with one item per argument. If the \var{index} is result is a tuple with one item per argument. If the \var{index} is
...@@ -308,8 +310,8 @@ the corresponding parenthesized group (using the default syntax, ...@@ -308,8 +310,8 @@ the corresponding parenthesized group (using the default syntax,
groups are parenthesized using \code{{\e}(} and \code{{\e})}). If no groups are parenthesized using \code{{\e}(} and \code{{\e})}). If no
such group exists, the corresponding result is \code{None}. such group exists, the corresponding result is \code{None}.
If the regular expression was compiled by \code{symcomp} instead of If the regular expression was compiled by \code{symcomp()} instead of
\code{compile}, the \var{index} arguments may also be strings \code{compile()}, the \var{index} arguments may also be strings
identifying groups by their group name. identifying groups by their group name.
\end{funcdesc} \end{funcdesc}
...@@ -319,41 +321,41 @@ Compiled regular expressions support these data attributes: ...@@ -319,41 +321,41 @@ Compiled regular expressions support these data attributes:
\renewcommand{\indexsubitem}{(regex attribute)} \renewcommand{\indexsubitem}{(regex attribute)}
\begin{datadesc}{regs} \begin{datadesc}{regs}
When the last call to the \code{match} or \code{search} method found a When the last call to the \code{match()} or \code{search()} method found a
match, this is a tuple of pairs of indices corresponding to the match, this is a tuple of pairs of indexes corresponding to the
beginning and end of all parenthesized groups in the pattern. Indices beginning and end of all parenthesized groups in the pattern. Indices
are relative to the string argument passed to \code{match} or are relative to the string argument passed to \code{match()} or
\code{search}. The 0-th tuple gives the beginning and end or the \code{search()}. The 0-th tuple gives the beginning and end or the
whole pattern. When the last match or search failed, this is whole pattern. When the last match or search failed, this is
\code{None}. \code{None}.
\end{datadesc} \end{datadesc}
\begin{datadesc}{last} \begin{datadesc}{last}
When the last call to the \code{match} or \code{search} method found a When the last call to the \code{match()} or \code{search()} method found a
match, this is the string argument passed to that method. When the match, this is the string argument passed to that method. When the
last match or search failed, this is \code{None}. last match or search failed, this is \code{None}.
\end{datadesc} \end{datadesc}
\begin{datadesc}{translate} \begin{datadesc}{translate}
This is the value of the \var{translate} argument to This is the value of the \var{translate} argument to
\code{regex.compile} that created this regular expression object. If \code{regex.compile()} that created this regular expression object. If
the \var{translate} argument was omitted in the \code{regex.compile} the \var{translate} argument was omitted in the \code{regex.compile()}
call, this is \code{None}. call, this is \code{None}.
\end{datadesc} \end{datadesc}
\begin{datadesc}{givenpat} \begin{datadesc}{givenpat}
The regular expression pattern as passed to \code{compile} or The regular expression pattern as passed to \code{compile()} or
\code{symcomp}. \code{symcomp()}.
\end{datadesc} \end{datadesc}
\begin{datadesc}{realpat} \begin{datadesc}{realpat}
The regular expression after stripping the group names for regular The regular expression after stripping the group names for regular
expressions compiled with \code{symcomp}. Same as \code{givenpat} expressions compiled with \code{symcomp()}. Same as \code{givenpat}
otherwise. otherwise.
\end{datadesc} \end{datadesc}
\begin{datadesc}{groupindex} \begin{datadesc}{groupindex}
A dictionary giving the mapping from symbolic group names to numerical A dictionary giving the mapping from symbolic group names to numerical
group indices for regular expressions compiled with \code{symcomp}. group indexes for regular expressions compiled with \code{symcomp()}.
\code{None} otherwise. \code{None} otherwise.
\end{datadesc} \end{datadesc}
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment