upp
upp copied to clipboard
UPP is a minimalist and generic text preprocessor using Lua macros.
Universal PreProcessor
UPP is a minimalist and generic text preprocessor using Lua macros.
If you need a Pandoc preprocessor, Panda may be a better choice.
Warning: UPP may not be supported in the future
Their is no plan to support UPP from now on. UPP is meant to be replaced by ypp which combines UPP and Panda features.
Open source
UPP is an Open source software. Anybody can contribute on GitHub to:
- suggest or add new features
- report or fix bugs
- improve the documentation
- add some nicer examples
- find new usages
- ...
Installation
Prerequisites
Installation from source
$ git clone https://github.com/CDSoft/luax.git && make -C luax install
$ git clone https://github.com/CDSoft/upp.git
$ cd upp
$ make install # install upp in ~/.local/bin
make install
installs upp
in ~/.local/bin
.
The PREFIX
variable can be defined to install upp
to a different directory
(e.g. make install PREFIX=/usr
to install upp
in /usr/bin
).
Note: upp
can also be installed with makex.
Precompiled binaries
It is recommended to install upp from the sources.
In case you need precompiled binaries (upp
and Luax
interpretor included), the latest binaries are available here: UPP precompiled
binaries
Test
$ make test
Usage
$ upp [options] files
where files
is the list of files (-
for stdin
).
options:
-
-h
: show help -
-l script
: execute a Lua script -
-e expression
: execute a Lua expression -
-o file
: redirect the output tofile
-
-p path
: add a path topackage.path
-
-MT name
: addname
to the target list (see-MD
) -
-MF name
: set the dependency file name -
-MD
: generate a dependency file
Documentation
Lua expressions are embedded in the document to process: $( Lua expression )
or @( Lua expression )
.
Lua chunks can also be embedded in the document to add new definitions: :( Lua chunk )
or @@( Lua chunk )
.
The @
notation has been added as it is more Markdown syntax friendly ($
may
interfere with LaTeX equations).
A macro is just a Lua function. Some macros are predefined by upp
. New macros
can be defined by loading Lua scripts (options -l
and -e
) or embedded as
Lua chunks.
Expression and chunks can return values. These values are formatted according to their types:
-
__tostring
method from a custom metatable: if the value has a__tostring
metamethod, it is used to format the value - arrays (with no
__tostring
metamethod): items are concatenated (withtable.concat
) the separator is the first defined among:- the
sep
field of the table - the global
BLOCK_SEP
variable -
"\\n"
- the
- other types are formatted by the default
tostring
function.
Example
The user's home is $(os.getenv "HOME").
Builtin macros
- All Lua and Luax functions and modules are available as
upp
macros (see https://www.lua.org/manual/ and http://cdelord.fr/luax/#built-in-modules). E.g.:-
require(module)
: import a Lua script (e.g. to define new macros, variables, ...).
-
-
input_files()
: list of the input files given on the command line. -
output_file()
: output file given on the command line. -
upp(Lua_expression)
: evaluate a Lua expression and outputs its result. -
die(msg, errcode)
: printmsg
and exit with the error codeerrcode
. -
include(filename)
: include a file in the currently preprocessed file. -
when(condition)(text)
: processtext
ifcondition
is true. -
map(f, xs)
: return{f(x) | x ∈ xs}
. -
filter(p, xs)
: return{x | x ∈ xs ∧ p(x)}
. -
range(a, b, [step])
: return{a, a+step, ..., b}
. -
concat(l1, l2, ... ln)
: concatenate the listsl1
,l2
, ...ln
into a new single list. -
merge(t1, t2, ... tn)
: merge the fields of the tablest1
,t2
, ...tn
into a new single table. -
dirname(path)
: return the directory part ofpath
. -
basename(path)
: return the filename part ofpath
. -
join(p1, p2, ... pn)
: build a path (p1/p2/.../pn
) from the path componentsp1
,p2
, ...pn
. -
sh(cmd)
: run the shell commandcmd
and return its output (stdout
). -
prefix(p)
: build a function that adds the prefixp
to a string. -
suffix(p)
: build a function that adds the suffixp
to a string. -
atexit(f)
: register the functionf
.f
will be executed before writing the final document. -
emit(filename)(content)
: writecontent
to a new file namedfilename
.
Example
Import a Lua script: :(require "module_name")
Embed a Lua script: :( Lua script )
Evaluate a Lua expression: $( 1 + lua_function(lua_variable) )
Include another document: $(include "other_document_name")
Conditional text: $(when (lang == "fr") [[ Ce texte est écrit en français ! ]])
Additional packages
upp
comes with some packages (already included in the binaries, no external
dependancies are required).
counter
The counter
function generates counters:
-
counter(name, initial_value)
: create a counter namedname
withinitial_value
as the initial value. It returnsinitial_value
. The default initial value is1
. -
counter(name)
: incremental the previous value of the countername
and returns it.
req
The package req
provides basic requirement management tools.
Warning: this package is still experimental and not tested...
License
This file is part of UPP.
UPP is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
UPP is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with UPP. If not, see <https://www.gnu.org/licenses/>.
For further information about UPP you can visit
http://cdelord.fr/upp
Feedback
Your feedback and contributions are welcome. You can contact me at cdelord.fr.