Changes for version 0.09 - 2026-10-01
- Joining. cfg__get_joined() on a hash with a single joiner printed an array reference between the pairs; that joiner is now used there too. Incompatible: permitted_joiners_modulo works as documented: the permitted remainders of the number of emitted joiners modulo scalar @joiners (a list, or one remainder), e.g. [0] for "joiners come in pairs".
- Output targets. Incompatible: the output targets are one stack in the configuration, Fab/output_target_stack (its last entry is the current target), so groups restore it like any other key. out__target_section() pushes, like #target_section; the new out__end_section() pops, like #end_section.
- Direct output. With an empty target stack, text goes directly to Fab/output_handle (default STDOUT). Fab/output_postpone decides when output is postponed into _main:body: at_first_promise (the default, so include__text() of a file without directives works like cat), at_start (incompatible: the only behaviour up to 0.08), or error (a promise in direct output dies with the new E_PROMISE_IN_DIRECT_OUTPUT). The new out__flush() prints the postponed output.
- Input. A blank line at the start of a chunk (at the start of the input, or after a directive line) is no longer dropped.
- TODO. Reading input from a filehandle; detecting the end of a job.
- Tests. t/50_peano.t does all its arithmetic through Fab's assembly. Tests of deferred directive syntax are removed. Tests which inspect _main:body after plain text set Fab/output_postpone to at_start.
- t/18-output.t Direct and postponed output, the target stack
Modules
A powerful, general-purpose document expansion framework (currently Control Flow, Loops, and Caching are unimplemented {???})