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 21:25:30 +0000 [thread overview]
Message-ID: <Yd31yvv71qtrABKF@localhost> (raw)
In-Reply-To: <aea85ef4-af50-46e5-8e21-d677801cb971n-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org>
And yes, top-level functions for Str will apply inside the block too. If you wan't to "protect" strings in this block, I would suggest the following:
```.md
All this will be changed.
::: {.protected}
Here not.
:::
All this will be changed.
```
```.lua
function Str(el)
el.text = 'changed'
return el
end
local protect = {
Str = function(el)
return pandoc.RawInline('protected', el.text)
end
}
local function protect_protected(div)
if div.classes:includes('protected', 1) then
return pandoc.walk_block(div, protect)
end
end
local function Str(str)
str.text = 'changed'
return str
end
local function to_str_again(rawinline)
if rawinline.format == 'protected' then
return pandoc.Str(rawinline.text)
end
end
-- Here we change the execution order of the functions
return {
{ Div = protect_protected },
{ Str = Str },
{ RawInline = to_str_again }
}
```
pandoc -L test.lua test.md
<p>changed changed changed changed changed</p>
<div class="protected">
<p>Here not.</p>
</div>
<p>changed changed changed changed changed</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/Yd31yvv71qtrABKF%40localhost.
next prev parent reply other threads:[~2022-01-11 21:25 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
2022-01-11 21:25 ` Bastien DUMONT [this message]
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=Yd31yvv71qtrABKF@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).