Re: [O] Accessing the communication channel from a link exporter
John Kitchin writes: > 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. Thank you. I'll try to adapt this to my use case.
Re: [O] Accessing the communication channel from a link exporter
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:@@ " bf-media-url-base fname) (format "@@html:%s@@ " 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
Re: [O] Accessing the communication channel from a link exporter
> 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 signature.asc Description: PGP signature
Re: [O] Accessing the communication channel from a link exporter
I think this is the kind of thing you can use a filter for, or a function in the org-export-before-processing-hook to change the paths prior to export. Arun Isaac writes: >> Out of curiosity, what kind of link are you using, that is dependant >> about context ? > > Actually, I don't need the context of the link in the org document. I > need some properties defined in the plist of the component in > org-publish-project-alist. So, I use the info communication channel to > access these properties. > > I maintain a few websites with org mode. When I publish an image link > with org, the exported HTML contains the full filesystem path of the > image. The page wouldn't work if I published it on the web. My link type > needs to know the path of the web server's docroot to remove that > component from the full filesystem path. This path is defined in one of > the properties in org-publish-project-alist, and I need the info > communication channel to access it. -- 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
Re: [O] Accessing the communication channel from a link exporter
> Out of curiosity, what kind of link are you using, that is dependant > about context ? Actually, I don't need the context of the link in the org document. I need some properties defined in the plist of the component in org-publish-project-alist. So, I use the info communication channel to access these properties. I maintain a few websites with org mode. When I publish an image link with org, the exported HTML contains the full filesystem path of the image. The page wouldn't work if I published it on the web. My link type needs to know the path of the web server's docroot to remove that component from the full filesystem path. This path is defined in one of the properties in org-publish-project-alist, and I need the info communication channel to access it. signature.asc Description: PGP signature
Re: [O] Accessing the communication channel from a link exporter
Hello, Arun Isaac writes: > When adding a new hyperlink type using `org-add-link-type', how do I > access the info communication channel from the link exporter function? You cannot. The :export link parameter is orthogonal to the export back-end. The latter only kicks in once the former forfeits. > Not being able to access the communication channel limits what I can do > with `org-add-link-type', and I end up creating a derived backend with > my own link transcoder function. Is that the recommended way to do it? That's the idea, yes. Out of curiosity, what kind of link are you using, that is dependant about context ? Regards, -- Nicolas Goaziou
[O] Accessing the communication channel from a link exporter
When adding a new hyperlink type using `org-add-link-type', how do I access the info communication channel from the link exporter function? Not being able to access the communication channel limits what I can do with `org-add-link-type', and I end up creating a derived backend with my own link transcoder function. Is that the recommended way to do it? Regards, Arun Isaac. signature.asc Description: PGP signature