CDSoft / pp

PP - Generic preprocessor (with pandoc in mind) - macros, literate programming, diagrams, scripts...
http://cdelord.fr/pp
GNU General Public License v3.0
252 stars 21 forks source link

`!flushlit` fails when path doesn't exist #86

Closed ngirard closed 6 months ago

ngirard commented 4 years ago

I'm experimenting with Pp's literate programming capabilities, and took parts of test/pp-test.md into the following test.md file:

Literate programming
====================

Lets write and test a useful library:

!lit{stack-work/mylib.h}
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// This is a C library
@functionDeclarations
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

!lit{stack-work/mylib.c}
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// This is a C library
@functionImplementations
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

The `fib` function computes Fibonacci's numbers:

!lit{@functionDeclarations}{C}
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
int fib(int n);
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

!lit{@functionImplementations}{C}
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
int fib(int n)
{
    return (n < 2) ? 1 : fib(n-1) + fib(n-2);
}
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

The `fact` function computes factorial numbers:

!lit{@functionDeclarations}{int fact(int n);}
!lit{@functionImplementations}
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
int fact(int n)
{
    return (n <= 1) ? 1 : n * fact(n-1);
}
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

!flushlit

Running

pp test.md

outputs

pp: stack-work/mylib.c: openBinaryFile: does not exist (No such file or directory)

Is there something I'm doing wrong ?

Incidentally, the error message would be much more useful with an additional line number.

ngirard commented 4 years ago

The problem comes from the fact, that pp doesn't create the stack-work directory if it doesn't exist.

This is not the default behavior of the other LP systems I've tried (e.g. Org-mode).

I'd suggest changing the default behavior.

CDSoft commented 4 years ago

In fact this is intentional. I prefer crashing when a directory is not found instead of saying nothing when a file is created in the wrong misspelled directory. It's always possible to create a directory explicitly: !sh(mkdir -p some_directory). The tests documents are meant to be rendered by make which is supposed to (indirectly) create the stack-work directory.