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: 'William Lupton' via pandoc-discuss
	<pandoc-discuss-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org>
Subject: Re: Markdown/HTML: Convert CSS styles to ODT styles (enhancement)
Date: Mon,  6 Nov 2023 18:23:23 +0000	[thread overview]
Message-ID: <ZUkvGy7Q8PsGmaM6@localhost> (raw)
In-Reply-To: <CAEe_xxg-6qcmSgvqtHCZgBMBG3UyMhLyLai1xU2Aa39n+ZJfvQ-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>

The problem is that the ODT format does not permit to include formatting instructions in the document body. See the flat ODT document below (conversion from `With _emphasis_.`, abridged):

```
<?xml version="1.0" encoding="utf-8" ?>
<office:document-content>
  <office:styles/> 
  <office:automatic-styles>
    <style:style style:name="T1" style:family="text">
      <style:text-properties fo:font-style="italic" style:font-style-asian="italic" style:font-style-complex="italic" />
    </style:style>
  </office:automatic-styles>
  <office:body>
    <office:text>
      <text:p text:style-name="Text_20_body">With
      <text:span text:style-name="T1">emphasis</text:span>.</text:p>
    </office:text>
  </office:body>
</office:document-content>
```

All predefined styles (removed for conciseness) are stored in <office:styles>. When we apply direct formatting in LibreOffice, a new style is automatically created in <office:automatic-styles> with the formatting instructions. Pandoc rightly replicates this behaviour when converting. There are no direct formatting instructions in <office:body>, only predefined and automatic styles.

Part of the solution is to use a filter to enclose the spans with class "rose" in <text:span> elements with the attribute `text:style-name="custom_rose"`. Here is a basic implementation:

``` custom-odt-style.lua
function Span(span)
  if span.classes:includes('rose') then
    return {
      pandoc.RawInline('opendocument', '<text:span text:style-name="custom_rose">'),
      span,
      pandoc.RawInline('opendocument', '</text:span>')
    }
  end
end
```

Then, one has to add a style definition in the ODT file. Please correct me if I am wrong, but I think that this is currently not possible with a filter (it would require a function to decode ZIP archives in pandoc.zip). However, an external script could extract the file content.xml from the ODT file (which is a ZIP archive) produced by Pandoc, add the right <style:style> element in <office:styles>, and update the ODT with the new content.xml. The following bash script would do the job:

``` add-style-to-odt.sh
#!/bin/bash

7z x "$1" content.xml

sed -i 's%<office:styles>%<office:styles><style:style style:name="custom_rose" style:family="text" style:parent-style-name="Text_20_body"><style:text-properties fo:background-color="#ff99ff"/></style:style>%' content.xml

7z a "$1" content.xml && rm content.xml
```

The invocation would be someting like: pandoc -o myfile.odt -L custom-odt-style.lua myfile.md && ./add-style-to-odt.sh myfile.odt


Le Monday 06 November 2023 à 04:04:06PM, 'William Lupton' via pandoc-discuss a écrit :
> This isn't an answer to your question, but it reminds me of a similar Typst
> discussion: [1]https://github.com/jgm/pandoc/issues/8988. This issue is closed
> but I still intend (at some point) to act on jgm's suggestions (this hasn't
> been urgent for me because my custom writer is fine for now).
> 
> So anyway, couldn't there be a similar approach for ODT or for any other
> non-HTML output format? an ODT-specific filter could set odt-style attributes
> that would be honored by the ODT writer in some appropriate ODT-specific way.
> 
> On Mon, 6 Nov 2023 at 15:23, Kelly “STrRedWolf” Price <[2]strredwolf-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
> wrote:
> 
>     Hello all.  Using Pandoc to help convert my fiction (written in Markdown)
>     into ODT format so I can combine and publish... but in writing, I found a
>     specific use case.
> 
>     I need colored text.
> 
>     For instance, if I define a CSS stylesheet file to color said text, I can
>     use this Markdown:
> 
>     [Are the good guys really good if they use it for cover for evil?]{.rose}
> 
>     I can work around it a bit by exporting to HTML
>     (markdown_phpextra+bracketed_spans) and opening that into LibreOffice, but
>     that opens a whole can of LibreOffice worms relating to web vs PDF/print
>     formatting.
> 
>     Is there a way for Pandoc to translate the CSS stylesheet into ODT styles,
>     and apply said styles as wanted?
> 
>     --
>     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 [3]pandoc-discuss+unsubscribe-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org
>     To view this discussion on the web visit [4]https://groups.google.com/d/
>     msgid/pandoc-discuss/
>     9b60d1f7-098c-4e8e-a801-764d0b754ef0n%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 [5]pandoc-discuss+unsubscribe-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org
> To view this discussion on the web visit [6]https://groups.google.com/d/msgid/
> pandoc-discuss/
> CAEe_xxg-6qcmSgvqtHCZgBMBG3UyMhLyLai1xU2Aa39n%2BZJfvQ%40mail.gmail.com.
> 
> References:
> 
> [1] https://github.com/jgm/pandoc/issues/8988
> [2] mailto:strredwolf-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org
> [3] mailto:pandoc-discuss+unsubscribe-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org
> [4] https://groups.google.com/d/msgid/pandoc-discuss/9b60d1f7-098c-4e8e-a801-764d0b754ef0n%40googlegroups.com?utm_medium=email&utm_source=footer
> [5] mailto:pandoc-discuss+unsubscribe-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org
> [6] https://groups.google.com/d/msgid/pandoc-discuss/CAEe_xxg-6qcmSgvqtHCZgBMBG3UyMhLyLai1xU2Aa39n%2BZJfvQ%40mail.gmail.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/ZUkvGy7Q8PsGmaM6%40localhost.


  parent reply	other threads:[~2023-11-06 18:23 UTC|newest]

Thread overview: 8+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-11-06 15:23 Kelly “STrRedWolf” Price
     [not found] ` <9b60d1f7-098c-4e8e-a801-764d0b754ef0n-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org>
2023-11-06 16:04   ` 'William Lupton' via pandoc-discuss
     [not found]     ` <CAEe_xxg-6qcmSgvqtHCZgBMBG3UyMhLyLai1xU2Aa39n+ZJfvQ-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2023-11-06 18:23       ` Bastien DUMONT [this message]
2023-11-07 14:30   ` jcr
     [not found]     ` <8f4c5470-82f5-44c8-8f17-3f807ccdbd11n-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org>
2023-11-07 15:28       ` Kelly Price
     [not found]         ` <CAKzFY7T9oPjduCwp32o2UB8wOrMOUJhu2k0yUfdJBrMv-BKRdA-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2023-11-07 16:21           ` jcr
     [not found]             ` <62ec21c7-f152-42b1-8b24-b78f8f56a2cen-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org>
2023-11-07 16:33               ` Kelly Price
     [not found]                 ` <CAKzFY7RU4+aa=cWL1z7dwDjGu7bWWei3xe=Lg4txT5jngy+bRA-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2023-11-07 19:10                   ` 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=ZUkvGy7Q8PsGmaM6@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).