emacs-orgmode
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [O] Modifying the exporter


From: Nicolas Goaziou
Subject: Re: [O] Modifying the exporter
Date: Wed, 13 Feb 2013 15:03:00 +0100

Florian Beck <address@hidden> writes:

> Ok, I took some time to extract a minimal example. It works fine, but
> on a very low level (see below).
>
> Again, the goal is to add an optional argument to sectioning command.
> The best way I could come up with is this (I omit the
> `fb/org-export-pdf' function):
>
> #+BEGIN_SRC emacs-lisp
> (defun fb/org-export-modify-headline (headline string)
>   (if (string-match
>        (rx
>       string-start "\\"
>       (group-n 1 (0+ "sub"))
>       (group-n 2 (or "part" "chapter" "section" "paragraph"))
>       (group-n 3 (zero-or-one "\*"))
>       "{" (group-n 4 (minimal-match (0+ (not (any "}"))))) "}")
>        string)
>       (let* ((level (match-string 1 string))
>            (type (match-string 2 string))
>            (stars (match-string 3 string))
>            (title (match-string 4 string))
>            (toc-title (org-element-property :toc-title headline))
>            (new-hl
>             (format "\\%s%s%s%s{%s}"
>                     (or level "")
>                     type
>                     (or stars "")
>                     (if toc-title (format "[%s]" toc-title) "")
>                     title)))
>       (replace-match new-hl t t string 0))
>     string))

Why don't you simply replace (or add, if needed) optional argument from
sectioning command with `replace-regexp-in-string' instead of building
the whole string again? Like the following (untested):

#+begin_src emacs-lisp
(defun fb/org-latex-headline (headline contents info)
    (let ((original-hl (org-export-with-backend 'latex headline contents info))
          (toc-title (org-element-property :toc-title headline)))
      (cond ((not toc-title) original-hl)
            ((string-match "\\`\\.*?\\*?\\[\\([^]]\\)\\]" original-hl)
             (replace-match toc-title nil nil original-hl 1))
            (t (replace-regexp-in-string
                "\\`\\.*?\\*?" (concat "\\&" toc-title) original-hl)))))
#+end_src

> As you can see, I pull apart the string and then put it back together.
> (Relatively straightforward in this case, much more involved for, say,
> links.)

Writing translators for headlines links and tables is usually a major
undertaking when creating a new back-end. That's why there are so many
tools to operate on these elements in ox.el.

Anyway, this is not bad, as you forked a 3k locs back-end with about 30
locs.

> In a perfect world, I would have access to these elements and the format
> string, so I could either modify them before calling
> `org-export-with-backend' or assemble the string myself.

In your perfect world, there would be billions of variables, depending
on the element, the back-end and the task. Customization is still
important, so I offer generic tools when variables are not enough.

Note that I might implement this feature at one point, but I still have
to think about its specifications.


Regards,

-- 
Nicolas Goaziou



reply via email to

[Prev in Thread] Current Thread [Next in Thread]