* [Feature Request] Let publishing-function decide :output-file and whether publishing is needed
@ 2015-07-25 8:38 Ruben Maher
2015-07-28 13:21 ` Rasmus
2015-08-02 16:24 ` Nicolas Goaziou
0 siblings, 2 replies; 5+ messages in thread
From: Ruben Maher @ 2015-07-25 8:38 UTC (permalink / raw)
To: emacs-orgmode
[-- Attachment #1: Type: text/plain, Size: 1978 bytes --]
Hi list,
I've been working on a derived exporter to publish a static blog, and
I've run into some issues. Say that `:publishing-directory' is
"~/public_html" and I have `:base-directory' with an Org file foo.org.
foo.org has option keywords like this:
#+title: foo.org
#+date: <2015-07-25 Sat 17:21:41>
My derived exporter visits each Org file to get information from the
keywords, and would export foo.org like so: foo.org ->
~/public_html/2015/07/25/foo/index.html, using something like
#+begin_src elisp
(let ((pub-dir
(file-name-as-directory
(concat (expand-file-name pub-dir)
(format-time-string "%Y/%m/%d/" date)
(file-name-base filename)))))
(org-publish-org-to
'rkm-html filename
(concat "." (or (plist-get plist :html-extension)
org-html-extension "html"))
(org-combine-plists plist '(:output-file "index")) pub-dir))
#+end_src
I have achieved this using the attached diff, which tells
`org-export-output-file-name' to respect the property `:output-file' in
the communications channel.
This works pretty well, except that now `org-publish-needed-p' will
always return t when called by `org-publish-file' in ox-publish.el.
As far as I can tell this would be less trivial to change. The call to
org-publish-needed-p would have to move from here (in
`org-publish-file'):
#+begin_src elisp
;; Allow chain of publishing functions.
(dolist (f publishing-function)
(when (org-publish-needed-p filename pub-dir f tmp-pub-dir base-dir)
(let ((output (funcall f project-plist filename tmp-pub-dir)))
(org-publish-update-timestamp filename pub-dir f base-dir)
(run-hook-with-args 'org-publish-after-publishing-hook
filename
output))))
#+end_src
...to the actual publishing function.
I believe a change like this would go a ways to making publishing
backends more extensible for Org users.
Please tell me your thoughts.
[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: 0001-org-export-output-file-name-respect-output-file.patch --]
[-- Type: text/x-diff, Size: 2723 bytes --]
From 13c92b87b728da134a73ef173be8957453ef90a6 Mon Sep 17 00:00:00 2001
From: Ruben Maher <r@rkm.id.au>
Date: Sat, 25 Jul 2015 16:54:28 +0930
Subject: [PATCH] org-export-output-file-name: respect :output-file
There is a property :output-file defined in the communications channel
but it is ignored by `org-export-output-file-name'.
* lisp/ox.el (org-export-output-file-name): Add optional argument
EXT-PLIST, and try to get `base-name' from its property `:output-file'
if SUBTREEP is nil or there was no EXPORT_FILE_NAME at point.
* lisp/ox-publish.el (org-publish-org-to): Provide PLIST when calling
`org-export-output-file-name'.
---
---
lisp/ox-publish.el | 2 +-
lisp/ox.el | 10 +++++++++-
2 files changed, 10 insertions(+), 2 deletions(-)
diff --git a/lisp/ox-publish.el b/lisp/ox-publish.el
index 951f0fe..25086cd 100644
--- a/lisp/ox-publish.el
+++ b/lisp/ox-publish.el
@@ -579,7 +579,7 @@ Return output file name."
(work-buffer (or visitingp (find-file-noselect filename))))
(prog1 (with-current-buffer work-buffer
(let ((output-file
- (org-export-output-file-name extension nil pub-dir))
+ (org-export-output-file-name extension nil pub-dir plist))
(body-p (plist-get plist :body-only)))
(org-export-to-file backend output-file
nil nil nil body-p
diff --git a/lisp/ox.el b/lisp/ox.el
index b06211b..110094b 100644
--- a/lisp/ox.el
+++ b/lisp/ox.el
@@ -5892,7 +5892,8 @@ or FILE."
(or (and (functionp post-process) (funcall post-process file))
file))))))
-(defun org-export-output-file-name (extension &optional subtreep pub-dir)
+(defun org-export-output-file-name
+ (extension &optional subtreep pub-dir ext-plist)
"Return output file's name according to buffer specifications.
EXTENSION is a string representing the output file extension,
@@ -5905,6 +5906,9 @@ of subtree at point.
When optional argument PUB-DIR is set, use it as the publishing
directory.
+With optional argument SUBTREEP nil and EXT-PLIST non-nil, try to get
+the value of `:output-file' from EXT-PLIST.
+
Return file name as a string."
(let* ((visited-file (buffer-file-name (buffer-base-buffer)))
(base-name
@@ -5917,6 +5921,10 @@ Return file name as a string."
(save-excursion
(ignore-errors (org-back-to-heading) (point)))
"EXPORT_FILE_NAME" t))
+ ;; SUBTREEP is nil or there was no EXPORT_FILE_NAME at
+ ;; point. Try to get the file name from EXT-PLIST if
+ ;; it is there.
+ (plist-get ext-plist :output-file)
;; File name may be extracted from buffer's associated
;; file, if any.
(and visited-file (file-name-nondirectory visited-file))
--
2.4.5
^ permalink raw reply related [flat|nested] 5+ messages in thread
* Re: [Feature Request] Let publishing-function decide :output-file and whether publishing is needed
2015-07-25 8:38 [Feature Request] Let publishing-function decide :output-file and whether publishing is needed Ruben Maher
@ 2015-07-28 13:21 ` Rasmus
2015-08-22 1:29 ` Ruben Maher
2015-08-02 16:24 ` Nicolas Goaziou
1 sibling, 1 reply; 5+ messages in thread
From: Rasmus @ 2015-07-28 13:21 UTC (permalink / raw)
To: emacs-orgmode
Hi Ruben,
Thanks for your patch.
Ruben Maher <r@rkm.id.au> writes:
> I've been working on a derived exporter to publish a static blog, and
> I've run into some issues. Say that `:publishing-directory' is
> "~/public_html" and I have `:base-directory' with an Org file foo.org.
>
> foo.org has option keywords like this:
>
> #+title: foo.org
> #+date: <2015-07-25 Sat 17:21:41>
OK. That's nice.
> I have achieved this using the attached diff, which tells
> `org-export-output-file-name' to respect the property `:output-file' in
> the communications channel.
OK. I did not test your patch, but can you please test and indicate
whether the following features work as expected with your patch:
- automatic sitemap.
- linking org files (foo.org links to bar.org).
- async export (since you change org-export-output-file-name)
Some quick thoughts. Perhaps it would be better to allow either a
user-supplied function that takes an org parse tree or an org file
location and returns an output name. Alternatively, maybe you could
provide a way to format file names in :publish-direction via a
format-string (e.g. keywords, date etc).
> From 13c92b87b728da134a73ef173be8957453ef90a6 Mon Sep 17 00:00:00 2001
> From: Ruben Maher <r@rkm.id.au>
> Date: Sat, 25 Jul 2015 16:54:28 +0930
> Subject: [PATCH] org-export-output-file-name: respect :output-file
>
> There is a property :output-file defined in the communications channel
> but it is ignored by `org-export-output-file-name'.
>
> * lisp/ox.el (org-export-output-file-name): Add optional argument
> EXT-PLIST, and try to get `base-name' from its property `:output-file'
> if SUBTREEP is nil or there was no EXPORT_FILE_NAME at point.
Nicolas would have to say whether this is OK. I don't know the details
here well enough.
Rasmus
--
May the Force be with you
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [Feature Request] Let publishing-function decide :output-file and whether publishing is needed
2015-07-25 8:38 [Feature Request] Let publishing-function decide :output-file and whether publishing is needed Ruben Maher
2015-07-28 13:21 ` Rasmus
@ 2015-08-02 16:24 ` Nicolas Goaziou
2015-08-22 1:32 ` Ruben Maher
1 sibling, 1 reply; 5+ messages in thread
From: Nicolas Goaziou @ 2015-08-02 16:24 UTC (permalink / raw)
To: Ruben Maher; +Cc: emacs-orgmode
Hello,
Ruben Maher <r@rkm.id.au> writes:
> I've been working on a derived exporter to publish a static blog, and
> I've run into some issues. Say that `:publishing-directory' is
> "~/public_html" and I have `:base-directory' with an Org file foo.org.
>
> foo.org has option keywords like this:
>
> #+title: foo.org
> #+date: <2015-07-25 Sat 17:21:41>
>
>
> My derived exporter visits each Org file to get information from the
> keywords, and would export foo.org like so: foo.org ->
> ~/public_html/2015/07/25/foo/index.html, using something like
>
>
> #+begin_src elisp
> (let ((pub-dir
> (file-name-as-directory
> (concat (expand-file-name pub-dir)
> (format-time-string "%Y/%m/%d/" date)
> (file-name-base filename)))))
> (org-publish-org-to
> 'rkm-html filename
> (concat "." (or (plist-get plist :html-extension)
> org-html-extension "html"))
> (org-combine-plists plist '(:output-file "index")) pub-dir))
> #+end_src
Can't you simply use org-publish-after-publishing-hook to copy the
published file elsewhere?
Or, if you write your own exporter, do it à la "ox-latex.el", i.e.,
publish in :base-directory and move it elsewhere with
`org-publish-attachment'?
>
> I have achieved this using the attached diff, which tells
> `org-export-output-file-name' to respect the property `:output-file' in
> the communications channel.
This doesn't sound right: if you know the file name beforehand, you
don't need to call `org-export-output-file-name' in the first place.
Regards,
--
Nicolas Goaziou
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [Feature Request] Let publishing-function decide :output-file and whether publishing is needed
2015-07-28 13:21 ` Rasmus
@ 2015-08-22 1:29 ` Ruben Maher
0 siblings, 0 replies; 5+ messages in thread
From: Ruben Maher @ 2015-08-22 1:29 UTC (permalink / raw)
To: emacs-orgmode
Rasmus <rasmus@gmx.us> writes:
> OK. I did not test your patch, but can you please test and indicate
> whether the following features work as expected with your patch:
>
> - automatic sitemap.
> - linking org files (foo.org links to bar.org).
> - async export (since you change org-export-output-file-name)
>
> Some quick thoughts. Perhaps it would be better to allow either a
> user-supplied function that takes an org parse tree or an org file
> location and returns an output name. Alternatively, maybe you could
> provide a way to format file names in :publish-direction via a
> format-string (e.g. keywords, date etc).
Thanks for your feedback! Regrettably I no longer have time to work on this right now (just started another semester at university) but I will investigate this option when I get back to it in the future.
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [Feature Request] Let publishing-function decide :output-file and whether publishing is needed
2015-08-02 16:24 ` Nicolas Goaziou
@ 2015-08-22 1:32 ` Ruben Maher
0 siblings, 0 replies; 5+ messages in thread
From: Ruben Maher @ 2015-08-22 1:32 UTC (permalink / raw)
To: emacs-orgmode
Nicolas Goaziou <mail@nicolasgoaziou.fr> writes:
> Can't you simply use org-publish-after-publishing-hook to copy the
> published file elsewhere?
>
> Or, if you write your own exporter, do it à la "ox-latex.el", i.e.,
> publish in :base-directory and move it elsewhere with
> `org-publish-attachment'?
>
>>
>> I have achieved this using the attached diff, which tells
>> `org-export-output-file-name' to respect the property `:output-file'
>> in the communications channel.
>
> This doesn't sound right: if you know the file name beforehand, you
> don't need to call `org-export-output-file-name' in the first place.
Thanks for taking the time to make suggestions! Unfortunately I have no longer have time to work on this at the moment (university), but as soon as I can get back to it I will investigate this option.
^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2015-08-22 1:32 UTC | newest]
Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2015-07-25 8:38 [Feature Request] Let publishing-function decide :output-file and whether publishing is needed Ruben Maher
2015-07-28 13:21 ` Rasmus
2015-08-22 1:29 ` Ruben Maher
2015-08-02 16:24 ` Nicolas Goaziou
2015-08-22 1:32 ` Ruben Maher
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).