emacs-orgmode@gnu.org archives
 help / color / mirror / code / Atom feed
From: John Kitchin <jkitchin@andrew.cmu.edu>
To: Arun Isaac <arunisaac@systemreboot.net>
Cc: org-mode-email <emacs-orgmode@gnu.org>
Subject: Re: Accessing the communication channel from a link exporter
Date: Fri, 02 Sep 2016 12:33:30 -0400	[thread overview]
Message-ID: <m2vayeqn1h.fsf@Johns-MacBook-Air.local> (raw)
In-Reply-To: <cu7a8fqwc3l.fsf@systemreboot.net>

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

  reply	other threads:[~2016-09-02 16:33 UTC|newest]

Thread overview: 7+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-08-31 11:57 Accessing the communication channel from a link exporter Arun Isaac
2016-09-01 16:39 ` Nicolas Goaziou
2016-09-01 18:27   ` Arun Isaac
2016-09-02 12:30     ` John Kitchin
2016-09-02 15:33       ` Arun Isaac
2016-09-02 16:33         ` John Kitchin [this message]
2016-09-03 18:35           ` Arun Isaac

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

  List information: https://www.orgmode.org/

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=m2vayeqn1h.fsf@Johns-MacBook-Air.local \
    --to=jkitchin@andrew.cmu.edu \
    --cc=arunisaac@systemreboot.net \
    --cc=emacs-orgmode@gnu.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.
Code repositories for project(s) associated with this public inbox

	https://git.savannah.gnu.org/cgit/emacs/org-mode.git

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 read-only IMAP folder(s) and NNTP newsgroup(s).