May I suggest to use this filter: https://github.com/cdivita/pandoc-curly-switch ?

The following syntax is supported for defining variables placeholders:

Variable can be referenced using an object-like notation, using any of the supported syntax. The exclamation marks syntax is suggested for LaTeX blocks (if you use them).

From the tests I've made it works fine also with metadata specified through the command line.

Cheers,

Claudio

Il giorno venerdì 13 gennaio 2023 alle 01:13:41 UTC+1 hbor...@gmail.com ha scritto:
On Thursday, January 12, 2023 at 9:36:04 AM UTC-8 BPJ wrote:


Den tors 12 jan. 2023 18:00Howard Borchew <hbor...-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> skrev:
Hello,

There is an example lua filter in pandoc.org called:
"Replacing placeholders with their metadata value"

This does exactly what I need but for one exception:
If I set a metadata value on the pandoc command line with --metadata=KEY[:VALUE]
then the placeholder is not replaced with anything and not the command line VALUE
using this example lua filter.

Probably because if you set the metadata value on the command line it is just a raw string, not a list of inlines as the filter and pandoc.Span expect.



Is there an easy fix for this?

Set the variables in a metadata block in the document or in a metadata file.


The document is under revision control and I want to change placeholders from the command line at the time of running pandoc. 
 

I am pasting the example from https://pandoc.org/lua-filters.html below.

Thanks,
Howard
----
local vars = {}

function get_vars (meta)
  for k, v in pairs(meta) do
    if pandoc.utils.type(v) == 'Inlines' then
      vars["%" .. k .. "%"] = {table.unpack(v)}
    end
  end
end

It could be expanded to wrap a raw string value in a Str and an Inlines, and to convert a Blocks value to an Inlines with pandoc.utils.blocks_to_inlines.


I don't quite get your suggestion: I presume the list gets to get_vars through the argument meta and meta is iterated over in key(k)/value(v) pairs in the for-do loop.
Only when passing the value(v) type=="Inlines" check does a placeholder %key% and value(v) get added to the vars table.
While iterating over pairs(meta) would the for-do loop encounter the --metadata KEY[VALUE] items that were set by the command line switch?
Is it then simply a matter to pass that type check and add it to vars (type is raw string keyword?).



function replace (el)
  if vars[el.text] then
    return pandoc.Span(vars[el.text])
  else
    return el
  end
end

return {{Meta = get_vars}, {Str = replace}}

My take is to use a Code or CodeBlock with class .var and the variable name as text. More to type but more robust.


If I can get the command line KEY[VALUE] table items into vars above, I don't think this replace function would need to change.

Can you show some examples what you have in mind? Code or CodeBlock? 

--
You received this message because you are subscribed to the Google Groups "pandoc-discuss" group.
To unsubscribe from this group and stop receiving emails from it, send an email to pandoc-discus...-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org.
To view this discussion on the web visit https://groups.google.com/d/msgid/pandoc-discuss/8db3a838-8431-4b75-aac1-94bc29fac675n%40googlegroups.com.

--
You received this message because you are subscribed to the Google Groups "pandoc-discuss" group.
To unsubscribe from this group and stop receiving emails from it, send an email to pandoc-discuss+unsubscribe-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org.
To view this discussion on the web visit https://groups.google.com/d/msgid/pandoc-discuss/1d02199c-86ad-4730-9458-419babd9fab3n%40googlegroups.com.