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: Help with Lua filter for markdown to LaTeX with Pandoc
Date: Sat, 25 Mar 2023 14:38:39 +0000	[thread overview]
Message-ID: <ZB8HbxE9qj++aouD@localhost> (raw)
In-Reply-To: <79ac7814-9558-4d49-a682-cf31f970d27dn-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org>

First, you need to replace `\\hl{` with `\\colorbox{declared-color}{` (mind the double backslash). Then Span.lua can be replaced with the following filter acting on emphasized (italicized) pieces of text:

in-red.lua:
```
function Emph (emph)
  local content = emph.content
  if #content == 1
    and content[1].t == 'Span'
    and content[1].classes:includes 'mark-red' then
    return {
      pandoc.RawInline('latex', '\\colorbox{lightred}{'),
      content[1],
      pandoc.RawInline('latex', '}')
    }
  end
end
```

Here, I replaced "mark" with "mark-red" as you suggested because I don't remove the Span element, in case it contains other classes or attributes that should be processed by other filters or by Pandoc itself. If the Span was kept with the "mark" class, Pandoc would wrap it in the \hl macro afterwards.

Le Saturday 25 March 2023 à 05:42:45AM, Pa Sc a écrit :
> In markdown (written in Obsidian.md) I use a plugin/theme so that `*==text==*`
> is rendered as red instead of italic and highlighted.
> 
> I use this lua-filter to convert regular `==highlighting==` to LaTeX `\hl
> {highlighting}` which works perfectly: (I somehow require these two files, I
> can't remember why)
> 
> **highlight.lua**:
> ```
>     --[[
>     Add support for a custom inline syntax.
>     This pandoc Lua filter allows to add a custom markup syntax
>     extension. It is designed to be adjustable; it should not be
>     necessary to modify the code below the separator line.
>     The example here allows to add highlighted text by enclosing the
>     text with `==` on each side. Pandoc supports this for HTML output
>     out of the box. Other outputs will need additional filters.
>     Copyright: © 2022 Albert Krewinkel
>     License: MIT
>     ]]
>    
>     -- Lua pattern matching the opening markup string.
>     local opening = [[==]]
>    
>     -- Lua pattern matching the closing markup string.
>     local closing = [[==]]
>    
>     -- Toggle whether the opening markup may be followed by whitespace.
>     local nospace = true
>    
>     -- Function converting the enclosed inlines to their internal pandoc
>     -- representation.
>     local function markup_inlines (inlines)
>       return pandoc.Span(inlines, {class="mark"})
>     end
>    
>     ------------------------------------------------------------------------
>    
>     local function is_space (inline)
>       return inline and
>         (inline.t == 'Space' or
>          inline.t == 'LineBreak' or
>          inline.t == 'SoftBreak')
>     end
>    
>     function Inlines (inlines)
>       local result = pandoc.Inlines{}
>       local markup = nil
>       local start = nil
>       for i, inline in ipairs(inlines) do
>         if inline.tag == 'Str' then
>           if not markup then
>             local first = inline.text:match('^' .. opening .. '(.*)')
>             if first then
>               start = inline -- keep element around in case the
>                              -- markup is not closed. Check if the
>                              -- closing pattern is already in this
>                              -- string.
>               local selfclosing = first:match('(.*)' .. closing .. '$')
>               if selfclosing then
>                 result:insert(markup_inlines{pandoc.Str(selfclosing)})
>               elseif nospace and first == '' and is_space(inlines[i+1]) then
>                 -- the opening pattern is followed by a space, but the
>                 -- config disallows this.
>                 result:insert(inline)
>               else
>                 markup = pandoc.Inlines{pandoc.Str(first)}
>               end
>             else
>               result:insert(inline)
>             end
>           else
>             local last = inline.text:match('(.*)' .. closing .. '$')
>             if last then
>               markup:insert(pandoc.Str(last))
>               result:insert(markup_inlines(markup))
>               markup = nil
>             else
>               markup:insert(inline)
>             end
>           end
>         else
>           local acc = markup or result
>           acc:insert(inline)
>         end
>       end
>    
>       -- keep unterminated markup
>       if markup then
>         markup:remove(1) -- the stripped-down first element
>         result:insert(start)
>         result:extend(markup)
>       end
>       return result
>     end
>    
>     local function markup_inlines (inlines)   return {pandoc.RawInline('tex', '
> \\hl{')} .. inlines .. {pandoc.RawInline('tex', '}')} end
> ```
> 
> **Span.lua**:
> ```
>     function Span (span)
>       if span.classes:includes 'mark' then
>         return {pandoc.RawInline('latex', '\\hl{')} ..
>           span.content ..
>           {pandoc.RawInline('latex', '}')}
>       end
>     end
> ```
> This works great, I got this here: [https://gist.github.com/tarleb/
> a0646da1834318d4f71a780edaf9f870](https://gist.github.com/tarleb/
> a0646da1834318d4f71a780edaf9f870)
> 
> However, for my other usecase I'd like it to be able to render `*==this kind of
> highlighting==*` as `\colorbox{lightred}{this new kind of highlighting}`
> 
> I've tried replacing the `\\hl{` with `\colorbox{declared-color}{` but that
> didn't work.
> 
> I was wondering if it had something to do with the class? But renaming that
> class from `mark` to `mark-red` didn't work either.
> 
> Any advice or ideas? Thanks!
> 
> --
> 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 [1]pandoc-discuss+unsubscribe-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org
> To view this discussion on the web visit [2]https://groups.google.com/d/msgid/
> pandoc-discuss/79ac7814-9558-4d49-a682-cf31f970d27dn%40googlegroups.com.
> 
> References:
> 
> [1] mailto:pandoc-discuss+unsubscribe-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org
> [2] https://groups.google.com/d/msgid/pandoc-discuss/79ac7814-9558-4d49-a682-cf31f970d27dn%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/ZB8HbxE9qj%2B%2BaouD%40localhost.


  parent reply	other threads:[~2023-03-25 14:38 UTC|newest]

Thread overview: 10+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-03-25 12:42 Pa Sc
     [not found] ` <79ac7814-9558-4d49-a682-cf31f970d27dn-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org>
2023-03-25 14:38   ` Bastien DUMONT [this message]
2023-03-25 22:01     ` Pa Sc
     [not found]       ` <bb3c6fab-dee9-48c4-81e4-7db67bc6931an-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org>
2023-03-25 22:40         ` Bastien DUMONT
2023-03-25 22:44           ` Pa Sc
     [not found]             ` <6a7dabf5-1fda-4825-9d21-193b63363937n-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org>
2023-03-25 23:08               ` Bastien DUMONT
2023-03-26  9:42                 ` Pa Sc
     [not found]                   ` <aded6fcf-0720-4fea-a873-af2cacfb8281n-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org>
2023-03-26  9:53                     ` Bastien DUMONT
2023-03-26 10:33                       ` Pa Sc
     [not found]                         ` <39893365-8248-4286-ae04-560895d69212n-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org>
2023-03-26 18:51                           ` Bastien DUMONT

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=ZB8HbxE9qj++aouD@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).