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.
next prev 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).