Thank you very much. I will explore what you suggest. I'm glad I emailed, seems like I was going down the wrong path. Salomon On Fri, Apr 10, 2020, 1:10 PM Berry, Charles wrote: > Salomon, see inline comments below. > > HTH, > > Chuck > > > On Apr 10, 2020, at 7:56 AM, Salomon Turgman wrote: > > > > Hello all, > > > > Thanks in advance for any hints you can provide for this. I am trying to > create a derived back-end that handles a new type of block in org-mode. I > am trying to derive using the html export backend as a parent. > > > > Currently I am solving my problem like this: > > #+CAPTION[Manual control]: Simulation 1: Manual control of the tank > level. > > #+BEGIN_EXPORT html > >
Simulation 1: Manual control of the tank > level.
> >
> >
> > > >
> >
> > > > #+END_EXPORT > > > > This has a few downsides: > > 1. I have to specify the caption twice since export translator does not > handle captions. > > 2. I have to include substantial amounts of html. > > 3. I have keep track of references to simulations manually (simulation > 1, simulation 2, etc) > > 4. I have to include the identifier `main1` or `Main1` in several > locations in the snippet. > > > > I could solve some of this with an automated snippet insertion tool but > I thought that maybe I can get the export back-end to do most of the work > for me. > > > > So I am trying to derive as follows (in pseudo-elisp-code): > > (require 'ox) > > (require 'ox-html) > > > > (org-export-define-derived-backend 'textbook 'html > > :menu-entry > > '(?I "Export textbook section" > > ((?b "To buffer" org-html-export-as-html) > > (?I "To file" org-html-export-to-html) > > (?o "As HTML file and open" > > (lambda (a s v b) > > (if a (org-html-export-to-html t s v b) > > (org-open-file (org-html-export-to-html nil s v > b))))))) > > :translate-alist '((simulation . org-textbook-simulation))) > > From the `org-export-define-backend' docstring: > > "TRANSCODERS is an alist between object or element types and > functions handling them." > > But `simulation' is not such a type. So, this will not work. > > > > > (defun org-textbook-simulation (element contents info) > > (let* ((simnum (extract simnum value)) > > (caption (org-export-get-caption element)) > > (divid (extrac divid value)) > > (modid (convert divid into modid)) > > ) > > (format "
Simulation %simnum%: %Caption%.
> >
> >
> >
> >
> > " > > simnum caption divid modid divid))) > > > > With the hope that I can do something like this in my .org file: > > > > #+CAPTION[Manual control]: Simulation 1: Manual control of the tank > level. > > #+BEGIN_SIMULATION main1 > > Some other cool stuff here > > #+END_SIMULATION > > > I think an easier approach is to write a babel src-block that formats the > inputs you need and creates a value that is your desired output. > > Use `:var' header arguments to define the inputs. > > Use `:wrap html' to prevent the exporter from changing the output. > > Subsequent calls can use the `#+CALL' idiom. > > You can use any scripting language that suits you - elisp, python, shell, > R, ... --- for this purpose. > > If you are skilled in emacs-lisp you might write an `eval' macro instead > of a src block. > > > > > Am I on the right track here? Can someone point me to an example on how > to: > > 1. Keep track of the number of simulations for referencing? > > Using the babel approach, you would need a `:session' with a persistent > variable that would hold the count. You would need to initialize it in your > document so that subsequent exports will start counting at zero. > > > 2. Extract the caption properly? The above is just my guess. > > > IIRC, the info channel is not populated when babel runs, so you will need > to parse the src-block and extract the `:caption' element. I think you can > use a `:var cap=(find-caption)' idiom, where `find-caption' is a function > you write using `org-element-context' as a starting point. > > Or if the only need you have for the caption is within that src block just > use `:var cap="". > > > 3. Extract the divid value (main1) > > :var divid="main1" > > > > 4. And finally, how to get org to recognize the new SIMULATION block so > that it can apply `org-textbook-simulation`? Do I need to register this > type of block somewhere? Or is the name of the first member of the > :translate-alist translation pair have some special meaning? > > Don't go in that direction. Use babel or write an eval macro. > > [snip] >