Hi,
> `org-export--prepare-file-contents' is called from the including > document, so you can get its path with (buffer-file-name > (buffer-base-buffer)). > > However, we need to handle the case where the including buffer is not > associated to a file, i.e., the Sexp above returns nil. > I noticed that (buffer-file-name (buffer-base-buffer)) will always return nil because `org-export--prepare-file-contents` is called in `org-export-include-keyword` after a call to `with-temp-buffer`. Two possible solutions to this issue would be either 1. passing the includer-file as an extra parameter to `org-export--prepare-file-contents` and then using `file-relative-name` to generate a relative path, or alternatively 2 . passing the matched string that points to the file to be included. Example: #+INCLUDE: "directory/file.org" Here, if file.org contains a link [[other/image.png]], then all one has to do is append the (file-name-directory matched) to the old-path. In this example this would result in directory/other/image.png. This second solution does not require a call to (buffer-file-name (buffer-base-buffer)), but seems hackish in the sense that we would pass 2 redundant arguments to `org-export-prepare-file-contents`: both the expanded and the non-expanded include-file filename. Perhaps I'm missing a simpler 3rd solution? > It would be nice to add a comment explaining what we are going to do. > Of course. ;; Adapt all file links within the included document that ;; contain relative paths in order to make these paths ;; relative to the base document, or absolute > I suggest the following inner part: > > (when (string= "file" (org-element-property :type link)) > (let* ((old-path (org-element-property :path link)) > (new-path (expand-file-name old-path (file-name-directory > file)))) I noticed that the call to delete here will break `org-element-adopt-elements` later on since the real buffer positions will be changed and we are still querying for old, invalid positions stored in link. > ;; (delete-region (org-element-property :begin link) > ;; (org-element-property :end link)) > (insert (let ((new (org-element-copy link))) If we opt for solution 1 then new-path could be made relative here > ;; (org-element-put-property new :path new-path) (org-element-put-property new :path (if includer-file (file-relative-name new-path (file-name-directory includer-file)) new-path)) > (when (org-element-property :contents-begin link) > (org-element-adopt-elements new > (buffer-substring (org-element-property :contents-begin > link) > (org-element-property :contents-end > link)))) Deleting immediately before the insertion works. (delete-region (org-element-property :begin link) (org-element-property :end link)) > (org-element-interpret-data new))))) > > Also, would you mind adding a test in "text-ox.el", within > `test-org-export/expand-include'? I will attempt to write them once the implementation is completed. Thanks for the support. Regards, Daniel > Regards, > > -- > Nicolas Goaziou