<metapackage xmlns:os="http://opensuse.org/Standards/One_Click_Install" xmlns="http://opensuse.org/Standards/One_Click_Install">
  <group distversion="openSUSE Tumbleweed">
    <repositories>
      <repository recommended="true">
        <name>devel:languages:perl:CPAN-L</name>
        <summary>CPAN modules not in devel:languages:perl</summary>
        <description>This project builds all cpan modules generated by cpanspec without developer interaction. If you want to fix a package,
               copypac it from here and then submit it to devel:languages:perl</description>
        <url>https://download.opensuse.org/repositories/devel:/languages:/perl:/CPAN-L/openSUSE_Tumbleweed/</url>
      </repository>
      <repository recommended="true">
        <name>devel:languages:perl</name>
        <summary>Perl and perl modules</summary>
        <description>++++++++++ Note: We are going to change the version format of the modules. See https://github.com/openSUSE/cpanspec/issues/47 for context ++++++++++

++++++++++ Note 2: Packages are maintained under git as of 2025-08-13:
https://src.opensuse.org/perl
https://en.opensuse.org/openSUSE:OBS_to_Git ++++++++++

Perl and a large number of important perl modules and tools.

Module updates from CPAN are regularly checked (with scripts from https://github.com/openSUSE/autoupdate-perl and https://github.com/openSUSE/cpanspec ) and put into https://build.opensuse.org/project/show/devel:languages:perl:autoupdate .

Please check https://build.opensuse.org/project/show/devel:languages:perl:autoupdate first before doing your own update! An updated version of the module might already be there, just that there is no submit request yet.

How to submit a new module here: https://github.com/openSUSE/cpanspec/wiki/Submit-a-new-Perl-module-to-openSUSE
</description>
        <url>https://download.opensuse.org/repositories/devel:/languages:/perl/openSUSE_Tumbleweed/</url>
      </repository>
      <repository recommended="true">
        <name>openSUSE:Tumbleweed</name>
        <summary>Tumbleweed</summary>
        <description>Tumbleweed is the openSUSE Rolling Release

This OBS Project represents the content of the currently published
snapshot. The newer repository for next publish can be found in openSUSE:Factory standard repository.
</description>
        <url>https://download.opensuse.org/repositories/openSUSE:/Tumbleweed/standard/</url>
      </repository>
      <repository recommended="true">
        <name>openSUSE:Tumbleweed</name>
        <summary>Tumbleweed</summary>
        <description>Tumbleweed is the openSUSE Rolling Release

This OBS Project represents the content of the currently published
snapshot. The newer repository for next publish can be found in openSUSE:Factory standard repository.
</description>
        <url>https://download.opensuse.org/tumbleweed/repo/oss/</url>
      </repository>
      <repository recommended="false">
        <name>openSUSE:Factory</name>
        <summary>The next openSUSE distribution</summary>
        <description>openSUSE Tumbleweed: The Bleeding Edge, Perfected.
Tumbleweed is the ultimate rolling release distribution, providing the latest software as it’s released, built upon a foundation of world-class stability and testing.

* Always Current: Get the newest kernel, IDEs, desktops, and applications automatically.

* Powerfully Stable: Experience the velocity of a rolling release without sacrificing the reliability you depend on.

* Engineered for Professionals: The top choice for Developers, Power Users, and openSUSE Contributors who need the best tools for the job.

If you demand the latest stable software, your choice is Tumbleweed.

Staging dashboard is located at: https://build.opensuse.org/staging_workflows/openSUSE:Factory 

List of known devel projects: https://build.opensuse.org/package/view_file/openSUSE:Factory:Staging/dashboard/devel_projects

Have a look at http://en.opensuse.org/Portal:Factory for more details.</description>
        <url>https://download.opensuse.org/repositories/openSUSE:/Factory/ports/</url>
      </repository>
    </repositories>
    <software>
      <item>
        <name>perl-LaTeX-Replicase</name>
        <summary>Perl extension implementing a minimalistic engine for filling real TeX-L[cut]</summary>
        <description>This module is a Perl 5 extension implementing Replicase subroutines which
processes TeX-LaTeX files, interpreting and executing built-in control
directives (tags) of Replicase.

Replicase can: define and substitute variable values, execute conditional
actions and capture the resulting output into a new document. Replicase was
originally designed for creating programmatically configurable TeX-LaTeX
documents.

Unlike other template engines, here conditionals (logic) and loops are
completely separated from TeX-LaTeX document (they are *hidden in the
properties* of the variable designated _key_ or _index_ for '%%V:' and
'%%VAR:' tags) and are moved to your Perl program using this module. It's
well suited for this and similar tasks, allowing you to dynamically create
PDF or PostScript documents that are consistent with each other, yet easily
customisable.

Replicase is a standalones, safe as a TeX-LaTeX, and fast template engine
with remarkable features. All markup is based on following basic &quot;three
pillars&quot; (directives, tags):

* *
  * '%%V: variable_name' * is a short form of a regular (SCALAR)
  _variable_name_
  which replaces the text located to the left of it, in the line where it
  is located, e.g.

  Before blah, blah, \ldots blah. %%V: myParam

will be replaced by contents of 'myParam' variable. However, if there is
text after this variable (separated by at least one space character, which
is &quot;eaten&quot; and will not be in the output stream), it will be added to the
right of its value:

  Before blah, blah, \ldots blah. %%V: myParam   After blah, \ldots blah.

here '' After blah, \ldots blah.'' will remain to the right of 'myParam'
value in the line.

This construct can be used as an ON or OFF switch, for example by setting
'myParam' to '&quot;~&quot;' (i.e. '&quot; &quot;') or '&quot;%&quot;' the text '' After blah, \ldots
blah.'' will be present or absent in the finished (e.g. compiled by
'pdflatex' or 'latex') PDF or DVI document.

Another trick is to use the magic value '&quot;\x{001}&quot;' (or 'chr(0x01)') at the
very beginning, as a starting sequence for a variable that acts as a
trigger, i.e., output the value to the left of '%%V:' in the template to
the finished document. Such a trigger can work like this:

  Default value %%V: myParam

If 'myParam = &quot;some text&quot;' then that template will lead to the creation of
such a TeX fragment:

  some text

If 'myParam = &quot;\x{001}some text&quot;' or simply 'myParam = &quot;\x{001}&quot;' then
output:

  Default value

This trick can also be performed in a more complex way - without using a
magic '&quot;\x{001}&quot;', but using the '%%ADD:' tag and an additional variable
'phantom', the value of which should be adjusted to the value of 'myParam':

  Default value %%ADD:%
  %%V: phantom%
  %%V: myParam

which, you must admit, is extremely inconvenient :(

Besides, if a 'variable_name' ends in '%' (i.e. 'variable_name%'), a
newline is suppressed. By default, a newline always occurs after value
substitution and 'After blah, \ldots blah.' if it exists.

Also in 'variable_name' you can use the special character &quot;'/'&quot;, which
denotes the &quot;path&quot; to the variable(s) in the passed dataset ('$info')
structure, e.g. '%%V: key/myParam', '%%V: key/index/myParam', etc.

If this &quot;path&quot; to 'variable_name' begins with &quot;'/'&quot;, then it is _absolute_
and the variable is searched for from the root (initial) '$info' structure.
Otherwise, the &quot;path&quot; is determined _relative_ to the current _global
environment_, previously established in the same way.

For example, using this trick, '%%V:/key/subkey', you can move (shift) the
_global environment_ of all subsequent (further down) '%%V:' and '%%VAR:'
variables into the '$info-&gt;{key}{subkey}' area (scope). To return to the
root (initial) '$info' _global environment_ of all variables, call '%%V:
/'.

If this &quot;path&quot; ends with a regular (scalar) variable or a reference to one,
then the _global environment_ is not redefined, e.g. '%%V:
key/index/myParam', here 'key/index' &quot;path&quot; is exclusively the _local
environment_ of 'myParam' variable.

'%%V:' nested within the scope of '%%VAR:' tag do not change the _global
environment_, and the &quot;'/'&quot; character is not a separator in the &quot;path&quot;. It
is a normal character in the 'variable_name'.

CONCLUSION: standalone '%%V:' tag (outside '%%VAR:' scope) can be used to
set the *global variable lookup environment*.

'%%V:' can be nested in an ARRAY or HASH '%%VAR:' tag, but in SCALAR or
REF '%%VAR:' it will not work and will be discarded.

There's a special 'variable_name' = '@', which means to &quot;*use all elements
of an ARRAY*&quot;. Therefore, this only makes sense for ARRAY variables (see
example above).

Using '@' for HASH variables is also acceptable. In this case, it is
assumed that a key with this name exists in the hash, which stores a list
(vector) of the keys of this hash in the order they are inserted into TeX
template.

* *
  * '%%VAR: variable_name' * is start of full form of regular (SCALAR,
  REF.SCALAR) or complex (HASH, ARRAY) 'variable_name',
  preserving preceding TeX up to '%%VAR:' but completely replacing
  everything up to first '%%END:'
  ('%%ENDT:', '%%ENDZ:', or a new '%%VAR:', or '%%TDZ:') tag inclusive.

  Blah, blah, \ldots blah:  %%VAR: myParam
  Blah, blah, \ldots
  \ldots
  Blah, \ldots %%END:

or a template like this with additional internal '%%ADD:' and '%%ADDE:'
tags:

  %%VAR: myParam
  \mbox{ %%ADD:%
  \rule{0mm}{4.5em} %%ADD:
  head \ldots %%ADD:
  ... SPECIFY VALUE of myParam!
  tail \ldots %%ADDE:%
  } %%ADDE:
  %%END:

If 'myParam = 1234567890' (it's SCALAR), then that template will lead to
the creation of such a TeX fragment:

  Blah, blah, \ldots blah: 1234567890

or respectively:

  \mbox{\rule{0mm}{4.5em}
  head \ldots
  1234567890
  tail \ldots}

BTW: if 'myParam = undef' (i.e. *undefined*) and facultative option (see
below) 'def' is set (e.g. 1), then these fragments *will be missing* from
the finished TeX.

Usually HASH and ARRAY _variable_name_ are used in the template to create
(fill) tables.

'%%VAR:' tag is similar to '%%V:' tag, where the variable name can be
used to specify its search &quot;path&quot; using a special symbol, &quot;'/'&quot;. However,
this &quot;path&quot; does not affect the _global environment_. It only sets the
_local environment_ within the scope of '%%VAR:' tag.

Nested '%%VAR:' tags will not work and are treated as '%%END:' tags, i.e.
tags for early termination of the scope.

* *
  There are three options for * '%%ENDx' * tags:

  * 1.
    * '%%END:' * is used to specify the end of '%%VAR:' tag.

BTW: if this tag is omitted and there are no further '%%ENDT:',
'%%ENDZ:', '%%VAR:', and '%%TDZ:' tags, all text to the end of document
will be replaced by 'variable_name' specified in '%%VAR:' tag.

  * 2.
    * '%%ENDZ:' * is used to mark the end of the '%%TDZ:' tag.

'%%TDZ:' marks *The Dead Zone* in the template free from any tag searches.
It can also be used to disable (deactivate) tags.

  * 3.
    * '%%ENDT:' * is used to mark the end of a template.

It is typically applied to the bottom of a document to terminate tag
searches and speed up processing. It can also be used to disable
(deactivate) tags.

*ATTENTION!* Text (and newline) located in line with any '%%END:',
'%%ENDZ:', and '%%ENDT:' tags will be discarded.

* *
  * '%%TDZ:' * marks the start of *The Dead Zone* in the template free
  from any tag searches.
  This tag must start at the very beginning of the line and be single on
  the line.

It can also be used to disable other tags.

The following tags can be located within the block limited by ARRAY and
HASH of '%%VAR:' and any '%%ENDx', '%%TDZ:', or a new '%%VAR:' tags:

* *
  * '%%V: key|index' * with setting of 'key' (in case of HASH '%%VAR:',
  i.e. '%%V: keyA', '%%V:keyB', etc.)
  or 'index' (in case ARRAY '%%VAR:', i.e. '%%V:0', '%%V:1', '%%V:2',
  '%%V:-7', etc.).
  Here 'keys' or 'indexes' are columns (or positions) of the table (filled
  area) being created.

'index' can also be specified as a comma-separated list of numbers (array
indices, e.g., 1, -7, 3, 5, -9), or as a closed (0-7, 4-10), left-open
(-3-), or right-open (0-) range of array indices. In this case, spaces are
also not allowed.

Negative values and left-open range indicate the reverse order of the array
indices, i.e., counting from the end. For example, -1- means from
-1,-2,-3,... to the initial element of the array (vector).

There's '@' - a special name of 'index' which means &quot;*to use all elements
of an ARRAY*&quot;. It's actually short for right-open range: '0-'. Therefore,
this only makes sense for ARRAY variables.

Using '@' for HASH variables is also acceptable. In this case, it is
assumed that a key with this name exists in the hash, which stores a list
(vector) of the keys of this hash in the order they are inserted into TeX
template.

If a 'key|index' ends in '%' (e.g. 'keyA%', '%%V:0%', '%%V:@%', etc. ), a
newline is suppressed. By default, a newline always occurs after value
substitution and additional text to the right of '%%V:' if it exists.

* *
  There are four (4) options for * '%%ADDx' * tags:

  * 1.
    * '%%ADD:' * adds text *before* variable specified in '%%V:' tag.

The added text is taken from the beginning of the line to the beginning of
'%%ADD:' (i.e. text located on the left), e.g.

  Head blah, blah, \ldots blah. %%ADD: Tail blah, blah, \ldots

this text will be added here: 'Head blah, blah, \ldots blah.'

Or, if '%%ADD:' is located at the very beginning of line, then after it to
the end of line (i.e. text located on the right), e.g.

  %%ADD: Tail blah, blah, \ldots

this text will be added here: 'Tail blah, blah, \ldots'.

If the following '%%V:' tag is not present, then the text is output *at
the end of all* 'keys' or 'indexes' (columns) each table (filled area) row.

'%%ADD:' can also be used for SCALAR and REF.SCALAR variable, but without
'%%V:' tag because it is redundant and not supported:

  %%VAR: myParam
  \mbox{ %%ADD:%
  \rule{0mm}{4.5em} %%ADD:
  head \ldots %%ADD:
  ... SPECIFY VALUE of myParam!
  tail \ldots %%ADDE:%
  } %%ADDE:
  %%END:

If 'myParam = 1234567890' (it's SCALAR), then that template will lead to
the creation of such a TeX fragment:

  \mbox{\rule{0mm}{4.5em}
  head \ldots
  1234567890
  tail \ldots}

BTW: By combining auxiliary parameters and the 'def' facultative option
(see below), which specifies discarding (ignoring) 'undefined' values and
their associated '%%ADD:' structures, you can create a logic scheme for
disabling '%%ADD:' tags. For example:

  %%VAR: myTable
  \\  %%ADD:
  % %%V: head

  etc...

  \\  %%ADD:
  \midrule  %%ADD:
  %  %%V: rule

  my $info = {
       myTable =&gt; [
        {head =&gt;'%', ... }, # 'rule' is undefined
        {rule =&gt;'%', ... }, # 'head' is undefined
        ...
       ]
       ...
    };

   my $msg = replication( $file, $info, def =&gt;1 );

  * 2.
    * '%%ADDE:' * is similar to '%%ADD:' (means *Ending* '%%ADD'),
    but it differs in that text is added *after* variable specified in
    '%%V:' tag.

This '%%ADDE:' tag must follow immediately after '%%V:' tag (i.e. there
should not be '%%ADD:' tag before it), otherwise it will also become a
regular '%%ADD:' tag, for example for the next '%%V:'.

'%%ADDE:' can also be used for SCALAR and REF.SCALAR variable, but without
'%%V:' tag because it is redundant and not supported. Here you must
correctly place '%%ADD:' and '%%ADDE:' tags yourself: '%%ADD:' denotes
what will come before the variable value, and '%%ADDE:' - after it (see
above).

  * 3.
    * '%%ADDX:' * is similar to '%%ADD:' for all lines (records)
    *eXcept the first column (0) of first record (0)* or *after the last
    column of last record*.

  * 3.
    * '%%ADDA:' * is similar to '%%ADD:' (means that '%%ADD' is Always
    present),
    but it is not linked to any '%%V:' in the block of '%%VAR:',
    meaning its contents will not depend on the variable's uncertainty of
    '%%V:',
    and its value will be output in any case and in the appropriate order.

  %%VAR: myHash
  \mbox{ %%ADDA:%
  \rule{0mm}{4.5em} %%ADDA:%
  head \ldots %%ADD:
  ... SPECIFY VALUE of myKey! %%V: myKey
  tail \ldots %%ADDE:%
  } %%ADDA:
  ...
  %%END:

If 'myHash = { myKey =&gt; undef, ... }', then that template will lead to the
creation of such a TeX fragment:

  \mbox{  \rule{0mm}{4.5em}  }

If any '%%ADDx:' ends in '%' (e.g. '%%ADD:%', '%%ADDE:%', or '%%ADDX:%'
), a newline is suppressed. (By default, a newline always occurs after
adding text).

Only *ONE tag* can be located on *ONE line* of input document.

Tag names must be in '%%UPPERCASE:'.

Tags can &quot;absorb&quot; one whitespace character around them (left and/or right),
if present.</description>
      </item>
    </software>
  </group>
</metapackage>
