1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
|
Substitution Expressions (subex)
================================
A *subex* (*Substitution Expression*) represents an advanced string
substitution. In contrast to a `regex`:idx: which deals with string analysis, a
*subex* deals with string synthesis.
Thanks to its conditional construct ``$[0|1|2|else]`` it supports
`internationalization`:idx: of format string literals quite well.
===================== =====================================================
Notation meaning
===================== =====================================================
``$#`` use first or next argument
``$name`` use named argument, you can wrap the named argument
in curly braces (e.g. ``${name}``) to separate it from
the next characters.
``$$`` produces a single ``$``
``$1`` use first argument
``$-1`` use last argument
``${1..3}`` use arguments 1 to 3
``${..}`` use all arguments
``$*`` use all arguments (same as ``${..}``)
``${#..}`` use all remaining arguments
``${..-2}`` use all arguments except the last argument
``${$1}`` use argument X where ``X = parseInt(arg[1])``
``${$1..$2}`` use arguments X to Y where ``X = parseInt(arg[1])``
and ``Y = parseInt(arg[2])``
``$','{1..3}`` use arguments 1 to 3 and join them with ','
``$','80c'\n'{..}`` use all arguments, join them with ','. Insert '\\n'
before the resulting string exceeds 80 chars.
``$','8i'\n'{..}`` use all arguments, join them with ','. Insert '\\n'
after every 8th item.
``$' '~{1..3}`` use arguments 1 to 3 with a leading space if the
concatenation of ``1..3`` is not the empty string
``$[zero|one|def]1`` use ``X = parseInt(arg[1])`` to determine which
branch to use. If ``X == 0`` the 'zero' branch is
selected, if ``X == 1`` the 'one' branch is
selected, etc. Otherwise the 'def' branch is
selected. ``$x`` is interpreted in branches too.
If a branch needs to contain ``|``, ``]`` put
them in single quotes. To produce a verbatim single
quote, use ``''``.
===================== =====================================================
Examples
========
.. code-block:: nim
subex"$1($', '{2..})" % ["f", "a", "b", "c"] == "f(a, b, c)"
subex"$1 $[files|file|files]{1} copied" % ["1"] == "1 file copied"
subex"$['''|'|''''|']']#" % "0" == "'|"
subex("type\n TEnum = enum\n $', '40c'\n '{..}") % [
"fieldNameA", "fieldNameB", "fieldNameC", "fieldNameD"]
|