dnl ---------------------------------------------------------------------------# dnl fence.m4 dnl dnl Fence pre-formated text or code into Markdown and Gemtext documents dnl dnl Both Markdown extensions and Gemini use backticks to fence 'raw' text dnl blocks. m4 uses backticks to quote text. This file simplifies managing dnl text that would otherwise be subject to macro quoting rules. dnl dnl This file provides four macros to resolve this conflict: dnl dnl * DELIMITER -- insert three backticks delimiter dnl * FENCE -- wraps its argument inside a backtick fence dnl * CODE -- wraps its arguement with backticks for inline code dnl * CODEBLOCK -- forms a code block where the first argument is placed dnl after the leading backticks and the second argument is dnl the code dnl dnl In some circumstances, changing m4's quote characters will make for dnl a better solution. dnl dnl Note, the implementation uses "-<-<" and ">->-" as temporary m4 quote dnl characters. dnl dnl Examples: dnl dnl FENCE(foo) => dnl ``` dnl foo dnl ``` dnl dnl CODEBLOCK(sh, `echo foo') => dnl ```sh dnl echo foo dnl ``` dnl dnl CODE(`x = 3') => dnl `x = 3` dnl '' dnl dnl Use in combination `undivert' to include code files: dnl dnl CODEBLOCK(c, `undivert(`hellow-world.c')') dnl dnl Use in combination with `syscmd`: dnl dnl FENCE(`syscmd(`ls')') dnl dnl dnl Usage: dnl dnl Use the 'include()' macro to import this macros into your m4 file. dnl dnl Author: axs@sdf.org dnl dnl ---------------------------------------------------------------------------# dnl dnl Write backticks, handling the conflict with m4 quoting dnl dnl Following advice from Michael Breen, we: dnl * Redefine the quote characters dnl * Write the backticks dnl * Surpress the apostrophies dnl * Revert the quote characters to the orginal state dnl dnl see: https://mbreen.com/m4.html dnl define(`DELIMITER', `changequote(`-<-<',`>->-')```dnl''' changequote`'')dnl dnl dnl ---------------------------------------------------------------------------# dnl dnl Create a pre-formatted text block dnl define(`FENCE', `dnl DELIMITER() $1`'dnl DELIMITER() ')dnl dnl ---------------------------------------------------------------------------# dnl dnl Create a code block dnl define(`CODEBLOCK', `dnl DELIMITER()$1 $2 DELIMITER() ')dnl dnl ---------------------------------------------------------------------------# dnl dnl Inline code dnl define(`CODE', `changequote(`-<-<',`>->-')`$1`dnl'' changequote`'')dnl dnl dnl ---------------------------------------------------------------------------#