[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [O] Accessing the communication channel from a link exporter
From: |
John Kitchin |
Subject: |
Re: [O] Accessing the communication channel from a link exporter |
Date: |
Fri, 02 Sep 2016 12:33:30 -0400 |
User-agent: |
mu4e 0.9.16; emacs 25.1.50.1 |
then the preprocessing hook sounds better. You can just replace the
links with generated html, and then export the buffer.
For example, here is a function that goes through an org file and
replaces links that are file times with image or urls, and copies the
file contents to a media-directory.
(defun bf-process-links (backend)
"Modify links to change paths and copy files to `media-dir'.
Argument BACKEND the export backend."
(org-mode)
(let* ((links (nreverse (org-element-map (org-element-parse-buffer) 'link
#'identity))))
(loop for link in links
do
(let* ((type (org-element-property :type link))
(path (org-element-property :path link))
(beg (org-element-property :begin link))
(end (org-element-property :end link))
(fname (car (last (split-string path "/")))))
(cond
((string= type "file")
(copy-file path (concat bf-media-directory fname) t)
(setf (buffer-substring beg end)
(if (string-match "png\\|svg" (or (file-name-extension
(org-element-property
:path link))
""))
(format
"@@html:<img src=\"%s%s\">@@ "
bf-media-url-base fname)
(format
"@@html:<a href=\"%s%s\">%s</a>@@ "
bf-media-url-base fname fname)))))))))
This function just wraps an export with a temporary definition of the
before processing hook, which runs the function on a copy of the
org-buffer you are creating.
(defun bf-get-HTML ()
"Return the body html of the headline at point."
(let ((org-export-before-processing-hook '(bf-process-links))
(async nil)
(subtreep t)
(visible-only nil)
(body-only t)
(ext-plist '())
;; (bf-link-counter 0)
;; (url-list (bf-get-link-urls))
(html))
(org-html-export-as-html async subtreep visible-only body-only ext-plist)
;; now get the output into the org output
(switch-to-buffer "*Org HTML Export*")
(end-of-buffer)
(setq html (buffer-string))
(kill-buffer "*Org HTML Export*")
html))
No doubt you could make more complicated ;)
Arun Isaac writes:
>> I think this is the kind of thing you can use a filter for
>
> But, it gets more complicated than that. I have XMP metadata (license,
> caption, etc.) stored in the image files as well. And, in order to
> export that, I need the path to the source image file. So, my image link
> exporter needs the :base-directory to find the source image file. If I
> try to get the XMP metadata from the published image file, then I
> introduce a race condition with the export of the org file becoming
> dependent on the image file already being published.
>
> Perhaps, filters could be useful. I need to think about it. So far, I
> have generally stayed away from filters because they can only get the
> HTML as text, and have to use some kind of regex to operate on it. HTML
> is structured data, and it would have been good if it was available in
> some kind of S-form tree structure. It would have saved me the trouble
> of parsing the HTML, and I could have used a library like xmlgen to
> generate it.
>
> Regards,
> Arun Isaac
--
Professor John Kitchin
Doherty Hall A207F
Department of Chemical Engineering
Carnegie Mellon University
Pittsburgh, PA 15213
412-268-7803
@johnkitchin
http://kitchingroup.cheme.cmu.edu