public inbox archive for pandoc-discuss@googlegroups.com
 help / color / mirror / Atom feed
From: "'William Lupton' via pandoc-discuss" <pandoc-discuss-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org>
To: pandoc-discuss-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org
Subject: Re: Bold figure caption prefix in docx output with filter
Date: Tue, 13 Jun 2023 14:56:48 +0100	[thread overview]
Message-ID: <CAEe_xxgZwgmFNJ+s60WJvnvXfk4kGg8UWPoqV2cEPPg_uBev8w@mail.gmail.com> (raw)
In-Reply-To: <534b2214-42e6-4be9-8b0e-537509f5be3an-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org>

[-- Attachment #1: Type: text/plain, Size: 5376 bytes --]

I think that the main thing here is that you need to operate on the Figure
rather than the Image. Also note that image and figure captions are
different:

   - An image caption is an Inlines list;
   https://pandoc.org/lua-filters.html#type-image
   - A figure caption is a Caption object, which has a long (Blocks list)
   caption with option short (Inlines list) caption;
   https://pandoc.org/lua-filters.html#type-figure

I'm not quite sure when or if you should use the short figure caption, but
am pretty sure that you do need to set the long figure caption.

Finally, a plug for the https://github.com/pandoc-ext/logging module, which
can help to shed light on the AST structure. With this document (I guessed
your input format):

![Figure 1: Cat](Cat.png)

...and with this lua filter (derived from yours):

local logging = require 'logging'

function Figure(fig)
    logging.temp('figure', fig)
end

function Image(img)
    logging.temp('image', img)
    local caption = pandoc.utils.stringify(img.caption)
    if (string.find(caption, 'Fig') ~= nil) then
        img.caption[1] = pandoc.Strong(img.caption[1])
        img.caption[3] = pandoc.Str(string.gsub(img.caption[3].text, ":",
"."))
        img.caption[3] = pandoc.Strong(img.caption[3])
        local fig_num_string = string.sub(
            pandoc.utils.stringify(img.caption[3]),1,2)
        local fig_num = math.floor(tonumber(fig_num_string))
        if (fig_num > 6) then
            img.caption[3] = pandoc.Strong("S" .. tostring(8-fig_num) ..
'.')
        end
        img.caption.long = pandoc.Strong('A')
        img.caption = pandoc.Strong('A')
    end
    logging.temp('->', img)
    return img
end

...you get this output:

% pandoc figure.md -L figure.lua
(#) image Image {
  attr: Attr {
    attributes: AttributeList {}
    classes: List {}
    identifier: ""
  }
  caption: Inlines[5] {
    [1] Str "Figure"
    [2] Space
    [3] Str "1:"
    [4] Space
    [5] Str "Cat"
  }
  src: "Cat.png"
  title: ""
}
(#) -> Image {
  attr: Attr {
    attributes: AttributeList {}
    classes: List {}
    identifier: ""
  }
  caption: Inlines[1] {
    [1] Strong {
      content: Inlines[1] {
        [1] Str "A"
      }
    }
  }
  src: "Cat.png"
  title: ""
}
(#) figure Figure {
  attr: Attr {
    attributes: AttributeList {}
    classes: List {}
    identifier: ""
  }
  caption: {
    long: Blocks[1] {
      [1] Plain {
        content: Inlines[5] {
          [1] Str "Figure"
          [2] Space
          [3] Str "1:"
          [4] Space
          [5] Str "Cat"
        }
      }
    }
  }
  content: Blocks[1] {
    [1] Plain {
      content: Inlines[1] {
        [1] Image {
          attr: Attr {
            attributes: AttributeList {}
            classes: List {}
            identifier: ""
          }
          caption: Inlines[1] {
            [1] Strong {
              content: Inlines[1] {
                [1] Str "A"
              }
            }
          }
          src: "Cat.png"
          title: ""
        }
      }
    }
  }
}
<figure>
<img src="Cat.png" alt="A" />
<figcaption>Figure 1: Cat</figcaption>
</figure>

On Tue, 13 Jun 2023 at 14:16, Stephan Boltzmann <stephan2boltzmann-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
wrote:

> Hello everybody out there using Pandoc,
>
> The following Lua (used with RMarkdown in RStudio) filter should put "*Figure
> n.*" in bold at the beginning of every figure caption, but it doesn't
> change my output:
>
> function Image (img)
>   if FORMAT:match 'docx' then
>     caption = pandoc.utils.stringify(img.caption)
>     if (string.find(caption, 'Fig') ~= nil) then
>       img.caption[1] = pandoc.Strong(img.caption[1])
>       img.caption[3] = pandoc.Str(string.gsub(img.caption[3].text, ":",
> "."))
>       img.caption[3] = pandoc.Strong(img.caption[3])
>       fig_num_string =
> string.sub(pandoc.utils.stringify(img.caption[3]),1,2)
>       fig_num = math.floor(tonumber(fig_num_string))
>       if (fig_num > 6) then
>         img.caption[3] = pandoc.Strong("S" .. tostring(8-fig_num) .. '.')
>       end
>       img.caption.long = pandoc.Strong('A')
>       img.caption = pandoc.Strong('A')
>     end
>   end
>   print(pandoc.utils.stringify(img.caption.long))
>   return img
> end
>
> By putting print statements, I can partially verify that the filter
> operates on the correct elements, but it doesn't change the output.
>
> --
> 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/534b2214-42e6-4be9-8b0e-537509f5be3an%40googlegroups.com
> <https://groups.google.com/d/msgid/pandoc-discuss/534b2214-42e6-4be9-8b0e-537509f5be3an%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/CAEe_xxgZwgmFNJ%2Bs60WJvnvXfk4kGg8UWPoqV2cEPPg_uBev8w%40mail.gmail.com.

[-- Attachment #2: Type: text/html, Size: 7830 bytes --]

  parent reply	other threads:[~2023-06-13 13:56 UTC|newest]

Thread overview: 3+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-06-13 13:16 Stephan Boltzmann
     [not found] ` <534b2214-42e6-4be9-8b0e-537509f5be3an-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org>
2023-06-13 13:56   ` 'William Lupton' via pandoc-discuss [this message]
     [not found]     ` <CAEe_xxgZwgmFNJ+s60WJvnvXfk4kGg8UWPoqV2cEPPg_uBev8w-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2023-06-14 12:35       ` Stephan Boltzmann

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=CAEe_xxgZwgmFNJ+s60WJvnvXfk4kGg8UWPoqV2cEPPg_uBev8w@mail.gmail.com \
    --to=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).