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 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.


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