public inbox archive for pandoc-discuss@googlegroups.com
 help / color / mirror / Atom feed
* Lua Filter: Get to parent of current element?
@ 2023-05-10 13:02 ThomasH
       [not found] ` <b4305519-9dbf-4254-a3d7-7b9e1dab9d6en-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org>
  0 siblings, 1 reply; 4+ messages in thread
From: ThomasH @ 2023-05-10 13:02 UTC (permalink / raw)
  To: pandoc-discuss


[-- Attachment #1.1: Type: text/plain, Size: 714 bytes --]

Hi,

is there a way to get to the parent in the Pandoc AST from the current 
element in a Lua filter?
I would like to distinguish treatment of elements depending on their 
context in the syntax tree, e.g. handle a 'span' element differently if it 
is a child of a 'cell' element in a table.

Thanks, T.

-- 
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-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org
To view this discussion on the web visit https://groups.google.com/d/msgid/pandoc-discuss/b4305519-9dbf-4254-a3d7-7b9e1dab9d6en%40googlegroups.com.

[-- Attachment #1.2: Type: text/html, Size: 1081 bytes --]

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: Lua Filter: Get to parent of current element?
       [not found] ` <b4305519-9dbf-4254-a3d7-7b9e1dab9d6en-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org>
@ 2023-05-10 13:27   ` Bastien DUMONT
  2023-05-10 14:57   ` Albert Krewinkel
  1 sibling, 0 replies; 4+ messages in thread
From: Bastien DUMONT @ 2023-05-10 13:27 UTC (permalink / raw)
  To: pandoc-discuss-/JYPxA39Uh5TLH3MbocFFw

You cannot get directly the parent of an element, but you can use a particular filter on the content of an element. Here is an example that emphasize spans with class 'to-emphasize' in a BlockQuote in a particular way:

```
local spans_in_quote = {
  Span = function(span)
    if span.classes:includes('to-emphasize') then
      local _, pos = span.classes:find('to-emphasize')
      span.classes:remove(pos)
      return pandoc.Underline(span)
    end
  end
}

local function Span(span)
  if span.classes:includes('to-emphasize') then
    return pandoc.Emph(span)
  end
end

local function BlockQuote(quote)
  return quote:walk(spans_in_quote)
end

return {
  { BlockQuote = BlockQuote },
  { Span = Span }
}
```

The function BlockQuote is applied first and calls the filter spans_in_quote on the content of the BlockQuote. This filter transforms the Spans with the class 'to-emphasize' and remove that class so that it is not processed again by the Span function. After the BlockQuote function returns, the Span function is called on all Spans (including those inside the BlockQuote, that's why I removed the class 'to-emphasize'!).

Exemple of use:

pandoc -L test.lua <<< '
Normal [text]{.to-emphasize}.

> [Text]{.to-emphasize} in a quotation.

'
<p>Normal <em><span class="to-emphasize">text</span></em>.</p>
<blockquote>
<p><u><span>Text</span></u> in a quotation.</p>
</blockquote>

Le Wednesday 10 May 2023 à 06:02:18AM, ThomasH a écrit :
> Hi,
> 
> is there a way to get to the parent in the Pandoc AST from the current element
> in a Lua filter?
> I would like to distinguish treatment of elements depending on their context in
> the syntax tree, e.g. handle a 'span' element differently if it is a child of a
> 'cell' element in a table.
> 
> Thanks, T.
> 
> --
> 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 [1]pandoc-discuss+unsubscribe-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org
> To view this discussion on the web visit [2]https://groups.google.com/d/msgid/
> pandoc-discuss/b4305519-9dbf-4254-a3d7-7b9e1dab9d6en%40googlegroups.com.
> 
> References:
> 
> [1] mailto:pandoc-discuss+unsubscribe-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org
> [2] https://groups.google.com/d/msgid/pandoc-discuss/b4305519-9dbf-4254-a3d7-7b9e1dab9d6en%40googlegroups.com?utm_medium=email&utm_source=footer

-- 
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-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org
To view this discussion on the web visit https://groups.google.com/d/msgid/pandoc-discuss/ZFub2OlhnMQdR4zM%40localhost.


^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: Lua Filter: Get to parent of current element?
       [not found] ` <b4305519-9dbf-4254-a3d7-7b9e1dab9d6en-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org>
  2023-05-10 13:27   ` Bastien DUMONT
@ 2023-05-10 14:57   ` Albert Krewinkel
       [not found]     ` <87sfc4ql6b.fsf-9EawChwDxG8hFhg+JK9F0w@public.gmane.org>
  1 sibling, 1 reply; 4+ messages in thread
From: Albert Krewinkel @ 2023-05-10 14:57 UTC (permalink / raw)
  To: pandoc-discuss-/JYPxA39Uh5TLH3MbocFFw


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

> is there a way to get to the parent in the Pandoc AST from the
> current element in a Lua filter?
> I would like to distinguish treatment of elements depending on their
> context in the syntax tree, e.g. handle a 'span' element differently
> if it is a child of a 'cell' element in a table.

This is currently not supported in Lua; panflute (Python) filters do
enable that though.

What Lua does support though is to change the order in which elements
are traversed, as well as the option to stop processing of a subtree.
See https://pandoc.org/lua-filters.html#traversal-order

E.g., to handle all Spans in a table differently you'd use

    traverse = 'topdown'

    function Table (tbl)
      return tbl:walk(my_filter_for_table_spans), false
    end

    function Span (span)
      -- default span processing
      return span
    end

It's a bit of a brain-twister (and can be slower than normal filters)
but it enables most of the actions that one would otherwise use the
parent element for.


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


^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: Lua Filter: Get to parent of current element?
       [not found]     ` <87sfc4ql6b.fsf-9EawChwDxG8hFhg+JK9F0w@public.gmane.org>
@ 2023-05-10 16:59       ` ThomasH
  0 siblings, 0 replies; 4+ messages in thread
From: ThomasH @ 2023-05-10 16:59 UTC (permalink / raw)
  To: pandoc-discuss


[-- Attachment #1.1: Type: text/plain, Size: 1769 bytes --]

Great, thanks both of you, I get the idea, will try that.

T.

On Wednesday, May 10, 2023 at 5:08:06 PM UTC+2 Albert Krewinkel wrote:

>
> ThomasH <the...-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> writes:
>
> > is there a way to get to the parent in the Pandoc AST from the
> > current element in a Lua filter?
> > I would like to distinguish treatment of elements depending on their
> > context in the syntax tree, e.g. handle a 'span' element differently
> > if it is a child of a 'cell' element in a table.
>
> This is currently not supported in Lua; panflute (Python) filters do
> enable that though.
>
> What Lua does support though is to change the order in which elements
> are traversed, as well as the option to stop processing of a subtree.
> See https://pandoc.org/lua-filters.html#traversal-order
>
> E.g., to handle all Spans in a table differently you'd use
>
> traverse = 'topdown'
>
> function Table (tbl)
> return tbl:walk(my_filter_for_table_spans), false
> end
>
> function Span (span)
> -- default span processing
> return span
> end
>
> It's a bit of a brain-twister (and can be slower than normal filters)
> but it enables most of the actions that one would otherwise use the
> parent element for.
>
>
> -- 
> 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-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org
To view this discussion on the web visit https://groups.google.com/d/msgid/pandoc-discuss/eb2115c3-ee11-4f82-bb49-6fd423d9365fn%40googlegroups.com.

[-- Attachment #1.2: Type: text/html, Size: 2813 bytes --]

^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2023-05-10 16:59 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2023-05-10 13:02 Lua Filter: Get to parent of current element? ThomasH
     [not found] ` <b4305519-9dbf-4254-a3d7-7b9e1dab9d6en-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org>
2023-05-10 13:27   ` Bastien DUMONT
2023-05-10 14:57   ` Albert Krewinkel
     [not found]     ` <87sfc4ql6b.fsf-9EawChwDxG8hFhg+JK9F0w@public.gmane.org>
2023-05-10 16:59       ` ThomasH

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).