Hi Albert,

Merry Christmas to you!

Your suggestion seemed really promising, but when I try to create a filter using the couple of bits of code you'd suggested, I get a compilation error. Here's the filter that I came up with:

function Plain (plain)

local done_marker = pandoc.List{pandoc.Str '[X]', pandoc.Space()}
local prefix = pandoc.List{plain.content[1], plain.content[2]}

      if prefix == done_marker then
        plain.content:remove(2) -- remove space
        plain.content:remove(1) -- remove checkbox
        pandoc.Strikeout(plain.content)
        plain.content = done_marker .. pandoc.Strikeout(plain.content)
      end

return plain
end

Unfortunately when I try to run pandoc with this filter I get the following error:

Error running filter C:\Users\Balaji\AppData\Roaming\pandoc\filters\strikethrough.lua:
...\Balaji\AppData\Roaming\pandoc\filters\strikethrough.lua:10: bad argument #2 to 'concat' (table expected, got Inline)


As you might be able to guess from the fact that I switched to Python when trying this earlier, I have really no expertise in Lua. I tried to use table.insert in place of concat, and now the filter does not throw an error but it does not seem to do anything either.

Any suggestions?

On Saturday, 24 December 2022 at 18:27:04 UTC+8 Albert Krewinkel wrote:
We could do this by passing the full content to the strikeout constructor. We'd remove, then re-add the checkbox later:

plain.content:remove(2) -- remove space
plain.content:remove(1) -- remove checkbox
plain.content = done_marker ..
  pandoc.Strikeout(plain.content)



Am 24. Dezember 2022 09:37:58 MEZ schrieb "balaj...-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org" <balaj...-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>:
Thanks for the pointers Albert! It did help me get started. Unfortunately when I started looping through the Plain object, I realized that the individual strings were represented as separate elements so there did not seem to be an easy way to apply a strikethrough formatting for the entire sentence. The best I would be able to do was apply the strikethrough word-by-word but with that approach, the final HTML did not look very pleasing.

In the end, I wound up writing a small Python script that would modify a file with the pandoc native format directly (outside of pandoc) and then feed the modified native format file back into pandoc. After a couple of false starts with the regex and then the native output becoming invalid, I've got it working fairly well for my purposes.

On Thursday, 22 December 2022 at 20:21:19 UTC+8 Albert Krewinkel wrote:
"balaj...@gmail.com" <balaj...-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> writes:

> The specific scenario I'm looking at is a Markdown file such as this:
>
> ### Todo
> - [ ] Foo
> - [X] Quux Qux

This is an interesting case because it is more complex than it seems.
The reason is pandoc's `task_list` extension that causes pandoc to
handle these checkboxes specially, converting them to [Str "☐", Space]
and [Str "☒", Space]. So we'll have to match on that in our filter.

A good approach would be to write a filter for Plain, like so:

``` lua
function Plain (plain)
-- modify the object here
return plain
end
```

Pandoc will then do all necessary document traversals automatically,
the function gets applied to all `Plain` elements in the document.

To check for the prefix, we'd do something like

``` lua
local done_marker = pandoc.List{pandoc.Str '☒', pandoc.Space()}
local prefix = pandoc.List{plain.content[1], plain.content[2]}
if prefix == done_marker then
-- modify content
end
```

I hope that's enough to get you started. Happy hacking!


--
Albert Krewinkel
GPG: 8eed e3e2 e8c5 6f18 81fe e836 388d c0b2 1f63 1124

--
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/5257c49e-968d-40bf-a398-ae104a53c5c8n%40googlegroups.com.