👨‍💻 about me home CV/Resume 🖊️ Contact Github LinkedIn I’m a Haskeller 🏆 Best of panda upp Haskell abp pp hCalc bl todo pwd TPG

📰 Friday 2. April 2021: upp is a panda companion. It’s is a Lua-scriptable lightweight text preprocessor.
🆕 since December 2020: Playing with the actor model in an embedded multicore context. C imperative components become C stream pure functions with no side effect ➡️ C low level programming with high level pure functional programming properties 🏆
📰 Saturday 30. January 2021: Playing with Pandoc Lua filters in Lua. panda is a lightweight alternative to abp providing a consistent set of Pandoc filters (text substitution, file inclusion, diagragrams, scripts, …).
🆕 Sunday 24. May 2020: Working at EasyMile for more than 4 years. Critical real-time software in C, simulation and monitoring in Haskell ➡️ perfect combo! It’s efficient and funny ;-)
🚌 And we are recruiting! Contact if you are interested in Haskell or embedded softwares (or both).

UPP: Universal PreProcessor

Christophe Delord - http://cdelord.fr/upp

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.

Open source

UPP is an Open source software. Anybody can contribute on GitHub to:



Installation from source

$ git clone https://github.com/CDSoft/upp.git
$ cd upp
$ make install      # install upp in ~/.local/bin


$ make test


$ upp [options] files

where files is the list of files (- for stdin).



Lua expressions are embedded in the document to process: $( Lua expression ).

Lua chunks can also be embedded in the document to add new definitions: :( Lua chunk ).

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.


The user's home is $(os.getenv "HOME").

Builtin macros


Import a Lua script: :(import "script_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 ! ]])


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
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


Your feedback and contributions are welcome. You can contact me at cdelord.fr.