1.  You have two lists, the original/old one and the new one.
2.  Push elements from the old list onto the new list until you get to the first element which should go into the new nested div.
3.  Create a third list and
push elements from the old list onto that list until you get to the last
element which should go into the div.
4.  Create a div from the third
list.
5.  Push the div onto the new list.
6.  Either repeat steps 2–5 or resume pushing elements from the old
list onto the new list until you get to the last element.

``````lua
function Pandoc(doc)
  local old = doc.blocks
  local new = pandoc.Blocks({ })
  local div = false
  local i = 0
  local elem = nil
  while i < #old do
    i = i + 1
    elem = old[i]
    if test_div_start_condition(elem) then
      div = pandoc.Blocks({ elem })
    elseif test_div_end_condition(elem) then
      if div then
        div[#div + 1] = elem
        new[#new + 1] = pandoc.Div(div, { class = 'foo', bar = 'baz' })
        div = nil
        -- -- If this is the only div
        -- while i < #old do
        --   i = i + 1
        --   new[#new + 1] = = old[i]
        -- end
      else
        new[#new + 1] = elem
      end
    elseif div then
      div[#div + 1] = elem
    else
      new[#new + 1] = elem
    end
  end
  doc.blocks = new
  return doc
end
``````


Den tis 20 juni 2023 02:16H <agents-FcZObrvlYduBUy7/sJONFg@public.gmane.org> skrev:
On June 19, 2023 6:11:35 PM EDT, H <agents@meddatainc.com> wrote:
>What is the "best" way of wrapping parts of an existing document in
><div></div> in a filter?
>
>Using insert.table(existingtable, pandoc.Div(existingtextblocks)) does
>not work since the existing text blocks get duplicated in the output.
>
>I see two options but there might be others:
>
>- Surround existing text blocks with pandoc.RawInline(1, 'html,
>'<div>') and pandoc.RawInLine('html', '</div>').
>
>- Create a new table and use insert.table(newtable,
>pandoc.Div(existingtextblock)) and also insert the rest of the
>document.
>
>Are there other options?

Replying to my own question, it seems the most "elegant" way of accomplishing this requires this to be done be in two stages:

- First, delete the blocks in question from the block list table, eg doc.blocks.
- Second, insert them into the same table using pandoc.Div().

Unfortunately it seems table.delete() does not accept a list of blocks, only one block at a time, pandoc.Div, on the other hand, accepts a table. Here is a code example when I was trying it out:

local temp = {}
for i = 3, 1, -1 do
  table.insert(temp, table.remove(doc.blocks, 5))
end

table.insert(doc.blocks, 2, pandoc.Div(temp))

The above code removes blocks 5 through 7 from doc.blocks, then inserts them, in the same order but surrounded by <div></div>, in position 2.

If there is a better way of accomplishing this, I would appreciate hearing it.

--
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@googlegroups.com.
To view this discussion on the web visit https://groups.google.com/d/msgid/pandoc-discuss/AC708553-331A-45D3-A618-EAA8BB7784A5%40meddatainc.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 pandoc-discuss+unsubscribe-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org.
To view this discussion on the web visit https://groups.google.com/d/msgid/pandoc-discuss/CADAJKhBZGdihMMgb%3D2_9rT04RsobJyu%2B48HxtO5755ADPcnZBQ%40mail.gmail.com.