Tim Hansinger <[email protected]> writes:

> [...] it is not a different behavior in macOS but an doom emacs
> behavior if plantuml is activated in the init.el.

The Backlash Mystery has been solved! :)

Great work, along with in-depth, zero-magic investigation, Tim!

> checking for @start... / @end... makes more sense I guess

Oh, yes!  You are right.

Instead of only capturing the inner body, we need to capture also what
follows after "@start" and "@end".  Something along the lines of:

(rx
    ;; TODO Beginning of string.
    ;; TODO Match whitespace, if present.
    ;; TODO Match "@start".
    ;; TODO Match and capture the kind, e.g. "regex", "salt", etc.
    (literal default-start)
    
    ;; DONE Okay "as is", I think
    (group (zero-or-more anything))
    
    ;; TODO Match "@end".
    ;; TODO Match and capture the kind, e.g. "regex", "salt", etc.
    ;; TODO Match whitespace, if present.
    ;; TODO Match the end of string.
    (literal default-end))

;; TODO Check in Lisp we have the same string after "@start" and "@end"
;; [Regular languages cannot do that.]

> Could you give me more info / and example on that? What
> prologue/epilogue do you mean?

Sorry for not being clearer.

In the current Org code, `org-babel-plantuml-make-body' calls
`org-babel-expand-body:generic' which is implemented as:

   (let ((pro (cdr (assq :prologue params)))
         (epi (cdr (assq :epilogue params))))
     (mapconcat #'identity
                (append (when pro (list pro))
                        var-lines
                        (list body)
                        (when epi (list epi)))
                "\n"))

Notice how it adds prologue/epilogue.

In your code, if I remember correctly, `org-babel-expand-body:generic'
was not always called, and your code did not touch prologue/epilogue.
Thus, in some cases prologue/epilogue would have been ignored.

More generally, we want to avoid diverging code paths.  The code I wrote
is a possible starting point.  In it, we extract the inner body, then
call all the other functions "as usual", and finally add back what the
initial inner body extraction removed.  The key idea is to have a single
code path, instead of "if the body is wrapped, then do X ourselves, else
use the standard function for doing X".

Is this any clearer than my old explanation? :)

Rudy
-- 
"The introduction of suitable abstractions is our only mental aid to
organize and master complexity."  --- Edsger Wybe Dijkstra, 1930-2002

Rudolf Adamkovič <[email protected]> [he/him]
http://adamkovic.org

Reply via email to