public inbox archive for pandoc-discuss@googlegroups.com
 help / color / mirror / Atom feed
From: Bastien DUMONT <bastien.dumont-VwIFZPTo/vqsTnJN9+BGXg@public.gmane.org>
To: pandoc-discuss-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org
Subject: Re: How to manipulate with Block elements with Lua filters
Date: Tue, 11 Jan 2022 20:56:50 +0000	[thread overview]
Message-ID: <Yd3vEifRjimcUHBI@localhost> (raw)
In-Reply-To: <aea85ef4-af50-46e5-8e21-d677801cb971n-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org>

You should use it when you want to apply a filter inside specific blocs only. The applied filter is a table of key-value pairs, where the key is one of Pandoc's types and the value a function.

Whith this input file:

```.md

Here emphasis is _italics_.

::: {.change-emphasis}

Here emphasized and **bold** strings are _underlined_.

:::

It's _normal_ again.

```

And this filter:

```.lua

-- The filter to be applied inside "change-emphasis" divs.
-- Notice that as we are in a table, entries are separated by a comma.
local to_underline = {

  Emph = function(el)
    return pandoc.Underline(el.content)
  end,

  Strong = function(el)
    return pandoc.Underline(el.content)
  end

}

function Div(div)
  if div.classes:includes('change-emphasis', 1) then
    -- We return the transformed div.
    return pandoc.walk_block(div, to_underline)
  end
end

```

you will get:

pandoc -L test.lua test.md
<p>Here emphasis is <em>italics</em>.</p>
<div class="change-emphasis">
<p>Here emphasized and <u>bold</u> strings are <u>underlined</u>.</p>
</div>
<p>It’s <em>normal</em> again.</p>


Le Tuesday 11 January 2022 à 06:07:32AM, Tomáš Kruliš a écrit :
> Oh, so the `div` content is a `table` in lua terms? That didn't occured to me,
> even though it probably should ... I actually managed to replace it not as a
> `RawInline`, but `RawBlock`, like so:
> 
>  ```.{lua}
>   if elem.t == 'Div' and elem.classes[1] == "replace-me" then
>     content = pandoc.utils.stringify(elem.content)
>     return pandoc.RawBlock('html', '<note>' .. content.. '</note>')
>   else
>     return elem
>   end
> ```
> 
> But thank you for your solution, for me it was very educational!
> Another thing that I struggle with is to wrap my head around `walk_block`
> function. From the examples in the pandoc official page it is not much clearer
> to me. I think I now understand that they are used to iterate/filter over the
> contents of the block that is being walked over. But if the block element
> contains only String elements (paragraph with simple text), then also
> Str-filter functions are applied to it?
> Maybe my confusion can be voiced like this: When should I use
> `pandoc.walk_block` function to get what I want and cannot use something else?
> Explained not only with code, but also with commentary ...
> Dne pondělí 10. ledna 2022 v 19:46:37 UTC+1 uživatel BPJ napsal:
> 
>     It is neither possible nor needed to convert the whole block to HTML within
>     the filter; rather you should just inject the start and end tags:
> 
>     ``````lua
>     -- Create these only once, for speed and resources saving!
>     local pre = pandoc.RawBlock('html', '<note>')
>     local post = pandoc.RawBlock('html', '</note>')
> 
>     function Div (div)
>       -- The order of the classes shouldn't matter!
>       if div.classes:includes('replace-me') then
>         local content = div.content
>         table.insert(content, 1, pre)
>         table.insert(content, post)
>         return content
>       end
>       return nil
>     end
>     ``````
> 
>     Den mån 10 jan. 2022 15:33Tomáš Kruliš <tomas....@integromat.com> skrev:
> 
>         Hello,
> 
>         I would like to ask how you should, in general, detect and manipulate
>         with Pandoc `block` elements. Currently, I am trying to replace `<div
>         class='replace-me'>` tag with `<note>` tag in similar (highly
>         simplified) HTML file:
> 
>         ```.{html}
>         <html>
>         <body>
>         <p> First line. </p>
>         <div class="replace-me another-class"> This should carry on to
>         converted document. </div>
>         <p>End.</p>
>         </body>
>         </html>
>         ```
> 
>         I have tried to detect the `<div>` tag, use `walk_block` to get the
>         `<div>` content and put it in `<note>` tag, I also found a code using
>         `:walk` method. Lastly, I tried to convert `<div>` content to simple
>         string and concatenate that in `RawInline` type:
> 
>         ```.{lua}
>           if elem.t == 'Div' and elem.classes[1] == "replace-me" then
>             content = pandoc.utils.stringify(elem.content)
>             return pandoc.RawInline('html', '<note>' .. content.. '</note>')
>           else
>             return elem
>           end
>         ```
> 
>         But none of that is working. I would like to ask you, how to work in
>         general with `pandoc_walk` or `:walk` (are they the same?) and how to
>         deal with my specific situation?
>         Thank you very much for any help, I ope that afterwards I will be able
>         to help myself a little bit more :)
>         Regards Tomas
> 
>         --
>         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...-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org
>         To view this discussion on the web visit [1]https://groups.google.com/d
>         /msgid/pandoc-discuss/
>         590abdf0-6bc5-4f37-a978-a46ad5cff5a8n%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 [2]pandoc-discuss+unsubscribe-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org
> To view this discussion on the web visit [3]https://groups.google.com/d/msgid/
> pandoc-discuss/aea85ef4-af50-46e5-8e21-d677801cb971n%40googlegroups.com.
> 
> References:
> 
> [1] https://groups.google.com/d/msgid/pandoc-discuss/590abdf0-6bc5-4f37-a978-a46ad5cff5a8n%40googlegroups.com?utm_medium=email&utm_source=footer
> [2] mailto:pandoc-discuss+unsubscribe-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org
> [3] https://groups.google.com/d/msgid/pandoc-discuss/aea85ef4-af50-46e5-8e21-d677801cb971n%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/Yd3vEifRjimcUHBI%40localhost.


  parent reply	other threads:[~2022-01-11 20:56 UTC|newest]

Thread overview: 9+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-01-10 14:32 Tomáš Kruliš
     [not found] ` <590abdf0-6bc5-4f37-a978-a46ad5cff5a8n-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org>
2022-01-10 18:46   ` BPJ
     [not found]     ` <CADAJKhAzeK-kPd7yHWbtGX=363VvcgFUj8gt_vEMUXfGkBd+ug-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2022-01-11 14:07       ` Tomáš Kruliš
     [not found]         ` <aea85ef4-af50-46e5-8e21-d677801cb971n-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org>
2022-01-11 20:56           ` Bastien DUMONT [this message]
2022-01-11 21:25           ` Bastien DUMONT
2022-01-12  9:45           ` BPJ
     [not found]             ` <CADAJKhD6WVs3UxD0Dt0bYLA8mE4-A4n=QyyKrwkT=MYO+QNaVg-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2022-01-13 14:40               ` Tomáš Kruliš
2023-06-26 19:12       ` Ioan Muntean
     [not found]         ` <ae032a8d-4d0a-4608-b479-61965cee2793n-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org>
2023-07-05 15:44           ` BPJ

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=Yd3vEifRjimcUHBI@localhost \
    --to=bastien.dumont-vwifzpto/vqstnjn9+bgxg@public.gmane.org \
    --cc=pandoc-discuss-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
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).