A couple of things:
  1. This seems a good moment to mention that my https://github.com/wlupton/pandoc-lua-logging has moved to https://github.com/pandoc-ext/logging (it's redirected automatically)

  2. Its logging.lua module contains this wrapper around pandoc.utils.type() (sorry for the rather non-obvious ({Inline=1, Block=1})[typ] idiom ... I no longer think that this is a particularly good idea!)
logging.type = function(value)
    -- this can return 'Inlines', 'Blocks', 'Inline', 'Block' etc., or
    -- anything that built-in type() can return, namely 'nil', 'number',
    -- 'string', 'boolean', 'table', 'function', 'thread', or 'userdata'
    local typ = pandoc.utils.type(value)

    -- it seems that it can also return strings like 'pandoc Row'; replace
    -- spaces with periods
    -- XXX I'm not sure that this is done consistently, e.g. I don't think
    --     it's done for pandoc.Attr or pandoc.List?
    typ = typ:gsub(' ', '.')

    -- map Inline and Block to the tag name
    -- XXX I guess it's intentional that it doesn't already do this?
    return ({Inline=1, Block=1})[typ] and value.tag or typ
end


On Sat, 13 May 2023 at 10:00, ThomasH <therch-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> wrote:
Great, thanks.

On Friday, May 12, 2023 at 7:41:50 PM UTC+2 Albert Krewinkel wrote:

ThomasH <the...-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> writes:

> I want to detect the types of the inline elements of a paragraph. I
> understand there is pandoc.utils.type() that basically does that, but
> when I run
>
> function Para(para)
>     for i = 1,#para.content,1 do
>         print(tostring(pandoc.utils.type(para.content[i])))
>     end
> end
>
> all that is printed is "Inline" for all elements, not specific types
> like Str, Span, Link or Image. How can I get at the specific types?

The trick here is that we are using Haskell terminology: Inline is a
*type*, and Str, Span, Link, etc. are *constructors* for this type. In
Lua (and JSON) contexts, the property that identifies the name of the
constructor of a value is called a "tag". Try this:

``` lua
function Para(para)
for i = 1,#para.content do
print(para.content[i].tag))
end
end
```

The `.t` property is an alias for `.tag` and can be used as well.

I have plans to change the behavior of `pandoc.utils.type` and to make
the function return two results. The first result would stay as-is, with
the second result containing the constructor name. But I need to run
more tests to ensure that this won't lead to performance degradation.


--
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-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org.
To view this discussion on the web visit https://groups.google.com/d/msgid/pandoc-discuss/f31b8b9b-f30e-45c6-91d5-caddb494f5b0n%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/CAEe_xxj%2BmWtBs2%3DPF31Dh24VEApmG8ZAY%2B_GpWfBFEwCVPpMuw%40mail.gmail.com.