This reminds me of a thing I ran into with a filter a while ago. The docs say that by default (or at least when the second argument is true) `pandoc.json.decode()` will parse strings as Markdown (or at least that was how I understood it) so I thought that in a tree leaves would be parsed as MD much as in metadata if the second argument is true or missing. Obviously this is not the case. No big deal since this was in a filter ("variable" expansion BTW, what else? :-) I could just use `pandoc.read()` but it did leave me wondering: how and when does `pandoc.json.decode()` parse its argument into AST elements?

FWIW I also came up with another solution: look for the metadata keys `var-data` and `var-trees` as well as for `vars` so I can have this in in-document metadata:

``````yaml
---
vars:
  foo: '*foo*'
...
``````

this in a defaults file:

``````yaml
metadata:
  var-trees:
    - this
    - that
``````

and these in three different metadata files:

``````yaml
var-data:
  bar: '**bar**'
this:
  this: '*this*'
that:
  that: '*that*'
``````

I hope you get the idea!

BTW I've come up with a quite effective way to merge values which are iterable with `pairs()` regardless of whether they are actual tables or `Attr.attributes` objects or the like, and just "ignore" non-iterable values, be they nil or whatever:

``````lua
local function merge_maps(...)
  local tab = table.pack(...)
  local merged = { }
  for i = 1, tab.n do
    pcall(function()
      for k, v in pairs(tab[i]) do
        merged[k] = v
      end
    end)
  end
  return merged
end
``````

Thanks to the `pcall` the loop will just go on to the next item in `tab` if the current item isn't iterable, without any need for code which tries to inspect the type or tag or whatever of the current item: if `pairs` lives the item is merged, and if `pairs` dies it is just "skipped", so all the "validation" is offloaded to `pairs`.

/bpj




Den fre 29 sep. 2023 23:15Albert Krewinkel <albert+pandoc-9EawChwDxG8hFhg+JK9F0w@public.gmane.org> skrev:

Martin Post <martinpostberlin-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> writes:

> In a Pandoc document’s YAML metadata block, or in a Pandoc metadata file, I can do this:
>
> variable1: __content__
>
> …and it will be rendered as <strong>content</strong> for HTML.
>
> Doing this in a Pandoc DEFAULTS file:
>
> metadata:
>   variable1: __content__
>
> …will render $variable1$ as “__content__”
>
> So – is it possible to have metadata in a defaults file interpreted as Markdown?

I think the only way would be to write a Lua filter that convert strings
to Inlines.

E.g.:


    local strings2md
    strings2md = function (meta)
      for key, value in pairs(meta) do
        if pandoc.utils.type(value) == 'string' then
          -- Convert strings to Markdown
          local blocks = pandoc.read(value).blocks
          meta[key] = pandoc.utils.blocks_to_inlines(blocks)
        elseif pandoc.utils.type(value) == 'List' then
          -- Recurse on lists
          meta[key] = strings2md(value)
        end
      end

      return meta
    end

    Meta = strings2md


--
Albert Krewinkel
GPG: 8eed e3e2 e8c5 6f18 81fe  e836 388d c0b2 1f63 1124

--
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@googlegroups.com.
To view this discussion on the web visit https://groups.google.com/d/msgid/pandoc-discuss/87r0mgof6d.fsf%40zeitkraut.de.

--
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/CADAJKhC6T%3DUHG49Rtd40nYsQFgfMxuiwyjqK3A%2B9CQ0QwjYXzQ%40mail.gmail.com.